Don't understand -r

Can anyone explain to me why, with RUBYOPT="-rubgems", this works:

    $ ruby -e'require "ansi"; "x".ansi(:red)'

But,

    $ ruby -ransi -e'"x".ansi(:red)'

gives an error `ruby: no such file to load -- ansi (LoadError)`. Even
if I do:

    $ ruby -rubygems -ransi -e'"x".ansi(:red)'

it still doesn't work.

What happens for

$ ruby -r rubygems -r ansi -e '"x".ansi(:red)'

And what version btw.?

Cheers

robert

···

On Fri, Oct 7, 2011 at 3:05 AM, Intransition <transfire@gmail.com> wrote:

Can anyone explain to me why, with RUBYOPT="-rubgems", this works:

$ ruby -e'require "ansi"; "x".ansi(:red)'

But,

$ ruby -ransi -e'"x".ansi(:red)'

gives an error `ruby: no such file to load -- ansi (LoadError)`. Even
if I do:

$ ruby -rubygems -ransi -e'"x".ansi(:red)'

it still doesn't work.

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

The -r option uses two C functions, add_modules and require_libraries
in ruby.c.
add_modules adds each argument of -r to internal req_list
then eventually require_libraries loads them all in series.

ubygems.rb redefines Kernel#require method whose implementation is
rb_f_require in eval.c.
It does not affect how -r works.

btw, RUBYOPT is evaluated *after* parsing options (so -T can forbit it)

···

2011/10/7 Intransition <transfire@gmail.com>:

$ ruby -ransi -e'"x".ansi(:red)'
$ ruby -rubygems -ransi -e'"x".ansi(:red)'

--
OZAWA Sakuro

"I think we can agree, the past is over." - George W. Bush

Thomas Sawyer wrote in post #1025489:

Can anyone explain to me why, with RUBYOPT="-rubgems"

The difference is not whether you provide -rubygems on the command line
or in an environment variable. The difference is whether you use -ransi
or -e'require "ansi"'

Note that none of these work:

$ ruby -rbundler -e 'puts "hello"'
ruby: no such file to load -- bundler (LoadError)
$ ruby -rubygems -rbundler -e 'puts "hello"'
ruby: no such file to load -- bundler (LoadError)
$ env RUBYOPT="-rubygems" ruby -rbundler -e 'puts "hello"'
ruby: no such file to load -- bundler (LoadError)

But it works this way if you have -rubygems:

$ ruby -e 'require "bundler"; puts "hello"'
-e:1:in `require': no such file to load -- bundler (LoadError)
  from -e:1
$ ruby -rubygems -e 'require "bundler"; puts "hello"'
hello
$ env RUBYOPT="-rubygems" ruby -e 'require "bundler"; puts "hello"'hello
hello

This is with ruby 1.8.7 (2010-08-16 patchlevel 302) [x86_64-linux]

I imagine it's because rubygems redefines Kernel#require, but using -r
on the command line calls the internal require function directly. If -r
doesn't do a full method dispatch, then rubygems can't override what it
does.

···

--
Posted via http://www.ruby-forum.com/\.

Ah, just like autoload. Thank you for figuring this out.

I suppose I will report this on redmine. I don't see how it can be
construed as anything but broken behavior. but then again I've only
brought up the problem with autoload for, oh I don't know, something
like FIVE YEARS to no avail.

btw, my original usecase, that led me this, was an attempt to run
minitest-based tests through a custom report format.

    $ ruby -r'minitest/tapy' test/test-*.rb

that I can't do this is ANNOYING AS HELL, to say the least.

···

On Oct 7, 5:11 am, Brian Candler <b.cand...@pobox.com> wrote:

I imagine it's because rubygems redefines Kernel#require, but using -r
on the command line calls the internal require function directly. If -r
doesn't do a full method dispatch, then rubygems can't override what it
does.

hmm... if -T is the only reason for this, then -T should be
preprocessed.

···

On Oct 7, 3:20 am, OZAWA Sakuro <sak...@2238club.org> wrote:

btw, RUBYOPT is evaluated *after* parsing options (so -T can forbit it)

I tried on 1.8.7 and 1.9.3

···

On Oct 7, 2:48 am, Robert Klemme <shortcut...@googlemail.com> wrote:

And what version btw.?

I suppose I will report this on redmine. I don't see how it can be
construed as anything but broken behavior. but then again I've only
brought up the problem with autoload for, oh I don't know, something
like FIVE YEARS to no avail.

It has come up before and been rejected. You might not want to waste your time.

btw, my original usecase, that led me this, was an attempt to run
minitest-based tests through a custom report format.

   $ ruby -r'minitest/tapy' test/test-*.rb

IIRC, the TestTask in rake allows you to add extra commandline options. I use my own from hoe, so I'm not that familiar with it.

···

On Oct 7, 2011, at 05:30 , Intransition wrote:

Thomas Sawyer wrote in post #1025570:

btw, my original usecase, that led me this, was an attempt to run
minitest-based tests through a custom report format.

    $ ruby -r'minitest/tapy' test/test-*.rb

And the problem is that this doesn't work because rubygems isn't
installed, or something else?

For me, -r works with rubygems in 1.9.2:

$ sudo gem192 install haml
Successfully installed haml-3.1.3
...
$ ruby192 -rhaml -e 'p Haml.constants'
[:ROOT_DIR, :Util, :Version, :VERSION, :Helpers, :Buffer, :Shared,
:Parser, :Compiler, :Filters, :Error, :SyntaxError, :Engine]

$ ruby192 -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]

···

--
Posted via http://www.ruby-forum.com/\.

Yes, I have been informed that with 1.9.x, rubygems is always loaded
so RUBYOPT="-rubygems" is no longer even needed. That fixes the issue
for loading from gems. It remains however a limitation for any custom
load manager, like the one I use.

A simpler example of the limitation would be load monitor --overriding
require to log everything request.

  $ cat req.rb
  puts "Custom Require"

  module Kernel
    alias :require0 :require

    def require(*a)
      puts "Kernel#require"
      p a
      require0(*a)
    end

    class << self
      alias :require0 :require

      def require(*a)
        puts "Kernel.require"
        p a
        require0(*a)
      end
    end
  end

Now if we do:

  $ export RUBYOPT="-rreq.rb"

Then the difference between:

  ruby -rhaml -e'p Haml.constants'

and

  ruby -e'require "haml"; p Haml.constants'

is apparent.

···

On Oct 8, 5:24 am, Brian Candler <b.cand...@pobox.com> wrote:

Thomas Sawyer wrote in post #1025570:

> btw, my original usecase, that led me this, was an attempt to run
> minitest-based tests through a custom report format.

> $ ruby -r'minitest/tapy' test/test-*.rb

And the problem is that this doesn't work because rubygems isn't
installed, or something else?

For me, -r works with rubygems in 1.9.2:

$ sudo gem192 install haml
Successfully installed haml-3.1.3
...
$ ruby192 -rhaml -e 'p Haml.constants'
[:ROOT_DIR, :Util, :Version, :VERSION, :Helpers, :Buffer, :Shared,
:Parser, :Compiler, :Filters, :Error, :SyntaxError, :Engine]

$ ruby192 -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]

Thomas Sawyer wrote in post #1025738:

Then the difference between:

  ruby -rhaml -e'p Haml.constants'

and

  ruby -e'require "haml"; p Haml.constants'

is apparent.

Indeed. But is it a problem for minitest/tapy? If so, why?

···

--
Posted via http://www.ruby-forum.com/\.

Well at first I was going to have `minitap/tapy` defined with:

    MiniTest::Unit.runner = MiniTest::TapY.new

So one could, for example, run tests and get the TAP-Y output via:

  $ ruby -rminitest/tapy test/some-test.rb

During development I use my custom load manger (Roll), rather then
Rubygems, so it could not find 'minitest/tapy' due to forementioned
problem. But since then I decided that this wasn't a good way to
handle things for minitap, so that particular use is no longer
important. Nonetheless it made it clear to me that my load manager had
a problematic edge case due to -r implementation and the order RUBYOPT
is applied.

···

On Oct 8, 5:13 pm, Brian Candler <b.cand...@pobox.com> wrote:

Thomas Sawyer wrote in post #1025738:

> Then the difference between:

> ruby -rhaml -e'p Haml.constants'

> and

> ruby -e'require "haml"; p Haml.constants'

> is apparent.

Indeed. But is it a problem for minitest/tapy? If so, why?