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:
parent
844e944465
commit
b33700f558
4 changed files with 27 additions and 4 deletions
|
@ -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
|
||||
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 &&
|
||||
|
|
6
activesupport/test/autoloading_fixtures/circular1.rb
Normal file
6
activesupport/test/autoloading_fixtures/circular1.rb
Normal file
|
@ -0,0 +1,6 @@
|
|||
silence_warnings do
|
||||
Circular2
|
||||
end
|
||||
|
||||
class Circular1
|
||||
end
|
4
activesupport/test/autoloading_fixtures/circular2.rb
Normal file
4
activesupport/test/autoloading_fixtures/circular2.rb
Normal file
|
@ -0,0 +1,4 @@
|
|||
Circular1
|
||||
|
||||
class Circular2
|
||||
end
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue