Ensure all-caps nested consts marked as autoloaded

Previously, an autoloaded constant `HTML::SomeClass` would not be marked
as autoloaded by AS::Dependencies. This is because the
`#loadable_constants_for_path` method uses `String#camelize` on the
inferred file path, which in turn means that, unless otherwise directed,
AS::Dependencies watches for loaded constants in the `Html` namespace.

By passing the original qualified constant name to `#load_or_require`,
this inference step is avoided, and the new constant is picked up in the
correct namespace.
This commit is contained in:
Simon Coffey 2013-07-26 17:37:00 +01:00
parent 701664b56b
commit b4a9668626
4 changed files with 18 additions and 1 deletions

View File

@ -1,3 +1,8 @@
* Ensure that autoloaded constants in all-caps nestings are marked as
autoloaded.
*Simon Coffey*
* Add String#remove(pattern) as a short-hand for the common pattern of String#gsub(pattern, '')
*DHH*

View File

@ -459,7 +459,7 @@ module ActiveSupport #:nodoc:
if loaded.include?(expanded)
raise "Circular dependency detected while autoloading constant #{qualified_name}"
else
require_or_load(expanded)
require_or_load(expanded, qualified_name)
raise LoadError, "Unable to autoload constant #{qualified_name}, expected #{file_path} to define it" unless from_mod.const_defined?(const_name, false)
return from_mod.const_get(const_name)
end

View File

@ -0,0 +1,4 @@
module HTML
class SomeClass
end
end

View File

@ -647,6 +647,14 @@ class DependenciesTest < ActiveSupport::TestCase
Object.class_eval { remove_const :E }
end
def test_constants_in_capitalized_nesting_marked_as_autoloaded
with_autoloading_fixtures do
ActiveSupport::Dependencies.load_missing_constant(HTML, "SomeClass")
assert ActiveSupport::Dependencies.autoloaded?("HTML::SomeClass")
end
end
def test_unloadable
with_autoloading_fixtures do
Object.const_set :M, Module.new