Feature #19006
closedInconsistent behaviour of autoload in wrapped script
Description
Suppose I have two files, foo.rb
and bar.rb
:
# foo.rb
puts "loading Foo..."
module Foo
autoload :Bar, "foo/bar"
end
and
# foo/bar.rb
puts "loading Foo::Bar..."
module Foo
module Bar
end
end
I can require "foo"
and access both Foo
and Foo::Bar
:
require "foo"
# loading Foo...
#=> true
Foo::Bar
# loading Foo::Bar...
#=> Foo::Bar
However, if I load foo
under a wrap module with load
:
MyModule = Module.new
load "./foo.rb", MyModule
# loading Foo...
#=> true
... I'm now unable to access Foo::Bar
anywhere, because whereas the constant is autoloaded from MyModule::Foo::Bar
, it is required from the top-level as Foo::Bar
:
MyModule::Foo::Bar
# loading Foo::Bar
#=> uninitialized constant MyModule::Foo::Bar (NameError)
This means that autoload
is basically useless inside anything loaded with the wrap
argument to load
, because the file being autoloaded can't know in advance what the base namespace will be.
I would argue that it makes much more sense to apply the wrap module (top_wrapper
) to any autoloaded file loaded when top_wrapper
is set. In the example above, this would mean that accessing MyModule::Foo::Bar
would work, since MyModule
would apply when the autoload triggers to load foo/bar
.