Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Detect missing_constants calls from removed modules and fail accordin…

…gly.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4780 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
commit 924ef18d4bf8f82c18b8362f3e7aab9e60ba5826 1 parent 2b37d59
@seckar seckar authored
View
2  activesupport/CHANGELOG
@@ -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]
View
4 activesupport/lib/active_support/dependencies.rb
@@ -182,6 +182,10 @@ def load_missing_constant(from_mod, const_name)
# 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
View
15 activesupport/test/dependencies_test.rb
@@ -372,4 +372,19 @@ def test_const_missing_within_anonymous_module
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
Please sign in to comment.
Something went wrong with that request. Please try again.