diff options
author | Noah Lindner <nwlindner@gmail.com> | 2014-02-08 15:35:12 -0800 |
---|---|---|
committer | Noah Lindner <nwlindner@gmail.com> | 2014-02-08 15:59:08 -0800 |
commit | 4fa8c8b52f2ee7155b18cee2f3fc978075c68db1 (patch) | |
tree | d4cbb5da120045c28b38cd2db299ac85c130c5bd | |
parent | 3c2fe5ccc5e51c0c3133f471cb3f0ee882fabf54 (diff) | |
download | rails-4fa8c8b52f2ee7155b18cee2f3fc978075c68db1.tar.gz rails-4fa8c8b52f2ee7155b18cee2f3fc978075c68db1.tar.bz2 rails-4fa8c8b52f2ee7155b18cee2f3fc978075c68db1.zip |
Fixed an issue where reloading of removed dependencies would cause an unexpected circular dependency error
-rw-r--r-- | activesupport/lib/active_support/dependencies.rb | 8 | ||||
-rw-r--r-- | activesupport/test/dependencies_test.rb | 12 |
2 files changed, 20 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/dependencies.rb b/activesupport/lib/active_support/dependencies.rb index 6be19771f5..7ea3ff7d3f 100644 --- a/activesupport/lib/active_support/dependencies.rb +++ b/activesupport/lib/active_support/dependencies.rb @@ -665,6 +665,14 @@ module ActiveSupport #:nodoc: constants = normalized.split('::') to_remove = constants.pop + # Remove the file path from the loaded list. + file_path = search_for_file(const.underscore) + if file_path + expanded = File.expand_path(file_path) + expanded.sub!(/\.rb\z/, '') + self.loaded.delete(expanded) + end + if constants.empty? parent = Object else diff --git a/activesupport/test/dependencies_test.rb b/activesupport/test/dependencies_test.rb index 00bec5bd9d..4ca63b3417 100644 --- a/activesupport/test/dependencies_test.rb +++ b/activesupport/test/dependencies_test.rb @@ -948,6 +948,18 @@ class DependenciesTest < ActiveSupport::TestCase Object.class_eval { remove_const :A if const_defined?(:A) } end + def test_access_unloaded_constants_for_reload + with_autoloading_fixtures do + assert_kind_of Module, A + assert_kind_of Class, A::B # Necessary to load A::B for the test + ActiveSupport::Dependencies.mark_for_unload(A::B) + ActiveSupport::Dependencies.remove_unloadable_constants! + + A::B # Make sure no circular dependency error + end + end + + def test_autoload_once_paths_should_behave_when_recursively_loading with_loading 'dependencies', 'autoloading_fixtures' do ActiveSupport::Dependencies.autoload_once_paths = [ActiveSupport::Dependencies.autoload_paths.last] |