diff options
author | Rafael França <rafaelmfranca@gmail.com> | 2016-12-14 12:31:09 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-14 12:31:09 -0500 |
commit | 4ae8595ca25045dd216d9a25e0cdf57da0b9a1ec (patch) | |
tree | 1ca91603eec3dfb31763ba16da0ac8429ad75f44 /activesupport | |
parent | 44c4b87d0dc5c2b68bdb73220ecc9f7416c20509 (diff) | |
parent | 11e05defecde965e0eb1929f1b0f1f992be39a6b (diff) | |
download | rails-4ae8595ca25045dd216d9a25e0cdf57da0b9a1ec.tar.gz rails-4ae8595ca25045dd216d9a25e0cdf57da0b9a1ec.tar.bz2 rails-4ae8595ca25045dd216d9a25e0cdf57da0b9a1ec.zip |
Merge pull request #27354 from Shopify/fix-constantize-and-prepended-modules
Fix constantize edge case involving prepend, autoloading and name conflicts
Diffstat (limited to 'activesupport')
4 files changed, 16 insertions, 1 deletions
diff --git a/activesupport/lib/active_support/inflector/methods.rb b/activesupport/lib/active_support/inflector/methods.rb index ef3df1240d..fa063af3f4 100644 --- a/activesupport/lib/active_support/inflector/methods.rb +++ b/activesupport/lib/active_support/inflector/methods.rb @@ -274,7 +274,7 @@ module ActiveSupport # Go down the ancestors to check if it is owned directly. The check # stops when we reach Object or the end of ancestors tree. - constant = constant.ancestors.inject do |const, ancestor| + constant = constant.ancestors.inject(constant) do |const, ancestor| break const if ancestor == Object break ancestor if ancestor.const_defined?(name, false) const diff --git a/activesupport/test/autoloading_fixtures/prepend.rb b/activesupport/test/autoloading_fixtures/prepend.rb new file mode 100644 index 0000000000..3134d1df2b --- /dev/null +++ b/activesupport/test/autoloading_fixtures/prepend.rb @@ -0,0 +1,8 @@ +class SubClassConflict +end + +class Prepend + module PrependedModule + end + prepend PrependedModule +end diff --git a/activesupport/test/autoloading_fixtures/prepend/sub_class_conflict.rb b/activesupport/test/autoloading_fixtures/prepend/sub_class_conflict.rb new file mode 100644 index 0000000000..090dda3043 --- /dev/null +++ b/activesupport/test/autoloading_fixtures/prepend/sub_class_conflict.rb @@ -0,0 +1,2 @@ +class Prepend::SubClassConflict +end diff --git a/activesupport/test/constantize_test_cases.rb b/activesupport/test/constantize_test_cases.rb index af2db8c991..32b720bcbb 100644 --- a/activesupport/test/constantize_test_cases.rb +++ b/activesupport/test/constantize_test_cases.rb @@ -73,6 +73,11 @@ module ConstantizeTestCases yield("RaisesNoMethodError") end end + + with_autoloading_fixtures do + yield("Prepend::SubClassConflict") + assert_equal "constant", defined?(Prepend::SubClassConflict) + end end def run_safe_constantize_tests_on |