mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Detect missing_constants calls from removed modules and fail accordingly.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4780 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
2b37d59976
commit
924ef18d4b
3 changed files with 21 additions and 0 deletions
|
@ -1,5 +1,7 @@
|
|||
*SVN*
|
||||
|
||||
* Detect missing_constants calls from removed modules and fail accordingly. [Nicholas Seckar]
|
||||
|
||||
* Stop using defined? in Dependencies.qualified_const_defined? since defined? may invoke const_missing. [Nicholas Seckar]
|
||||
|
||||
* Dependencies can autoload directories of nested classes. [Jeremy Kemper]
|
||||
|
|
|
@ -182,6 +182,10 @@ module Dependencies #:nodoc:
|
|||
# If we have an anonymous module, all we can do is attempt to load from Object.
|
||||
from_mod = Object if from_mod.name.empty?
|
||||
|
||||
unless qualified_const_defined?(from_mod.name) && from_mod.name.constantize.object_id == from_mod.object_id
|
||||
raise ArgumentError, "A copy of #{from_mod} has been removed from the module tree but is still active!"
|
||||
end
|
||||
|
||||
raise ArgumentError, "Expected #{from_mod} is not missing constant #{const_name}!" if from_mod.const_defined?(const_name)
|
||||
|
||||
qualified_name = qualified_name_for from_mod, const_name
|
||||
|
|
|
@ -372,4 +372,19 @@ class DependenciesTest < Test::Unit::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
def test_removal_from_tree_should_be_detected
|
||||
with_loading 'dependencies' do
|
||||
root = Dependencies.autoload_paths.first
|
||||
c = ServiceOne
|
||||
Dependencies.clear
|
||||
assert ! defined?(ServiceOne)
|
||||
begin
|
||||
Dependencies.load_missing_constant(c, :FakeMissing)
|
||||
flunk "Expected exception"
|
||||
rescue ArgumentError => e
|
||||
assert_match %r{ServiceOne has been removed from the module tree}i, e.message
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue