1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

detect circular constant autoloading

Nowadays circular autoloads do not work, but the user gets a NameError
that says some constant is undefined. That's puzzling, because he is
normally trying to autoload a constant he knows can be autoloaded.
With this check we can give a better error message.
This commit is contained in:
Xavier Noria 2012-08-28 20:27:59 +02:00
parent 844e944465
commit b33700f558
4 changed files with 27 additions and 4 deletions

View file

@ -479,10 +479,17 @@ module ActiveSupport #:nodoc:
file_path = search_for_file(path_suffix)
if file_path && ! loaded.include?(File.expand_path(file_path).sub(/\.rb\z/, '')) # We found a matching file to load
require_or_load file_path
raise LoadError, "Expected #{file_path} to define #{qualified_name}" unless from_mod.const_defined?(const_name, false)
return from_mod.const_get(const_name)
if file_path
expanded = File.expand_path(file_path)
expanded.sub!(/\.rb/, '')
if loaded.include?(expanded)
raise "Circular dependency detected while autoloading constant #{qualified_name}"
else
require_or_load(expanded)
raise LoadError, "Expected #{file_path} to define #{qualified_name}" unless from_mod.const_defined?(const_name, false)
return from_mod.const_get(const_name)
end
elsif mod = autoload_module!(from_mod, const_name, qualified_name, path_suffix)
return mod
elsif (parent = from_mod.parent) && parent != from_mod &&

View file

@ -0,0 +1,6 @@
silence_warnings do
Circular2
end
class Circular1
end

View file

@ -0,0 +1,4 @@
Circular1
class Circular2
end

View file

@ -145,6 +145,12 @@ class DependenciesTest < ActiveSupport::TestCase
end
end
def test_circular_autoloading_detection
with_autoloading_fixtures do
assert_raise(RuntimeError, "Circular dependency detected while autoloading constant Circular1") { Circular1 }
end
end
def test_module_loading
with_autoloading_fixtures do
assert_kind_of Module, A