From e532531939a610c3a1ba4594d325b10a0c9b4546 Mon Sep 17 00:00:00 2001 From: Robin Dupret Date: Mon, 6 Feb 2017 14:27:08 +0100 Subject: [PATCH] Deprecate the top-level `HashWithIndifferentAccess` contant This constant was kept for the sake of backward compatibility; it is still available under `ActiveSupport::HashWithIndifferentAccess`. Furthermore, since Ruby 2.5 (https://bugs.ruby-lang.org/issues/11547) won't support top level constant lookup, people would have to update their code anyway. --- .../active_record/attribute_methods/dirty.rb | 6 ++--- activesupport/CHANGELOG.md | 6 +++++ .../hash_with_indifferent_access.rb | 18 ++++++++++++++- activesupport/test/core_ext/hash_ext_test.rb | 23 +++++++++++++++++++ 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/activerecord/lib/active_record/attribute_methods/dirty.rb b/activerecord/lib/active_record/attribute_methods/dirty.rb index 31c1e687dc..6aa414ba6b 100644 --- a/activerecord/lib/active_record/attribute_methods/dirty.rb +++ b/activerecord/lib/active_record/attribute_methods/dirty.rb @@ -50,7 +50,7 @@ def reload(*) super.tap do @previous_mutation_tracker = nil clear_mutation_trackers - @changed_attributes = HashWithIndifferentAccess.new + @changed_attributes = ActiveSupport::HashWithIndifferentAccess.new end end @@ -70,13 +70,13 @@ def changes_internally_applied # :nodoc: def changes_applied @previous_mutation_tracker = mutation_tracker - @changed_attributes = HashWithIndifferentAccess.new + @changed_attributes = ActiveSupport::HashWithIndifferentAccess.new clear_mutation_trackers end def clear_changes_information @previous_mutation_tracker = nil - @changed_attributes = HashWithIndifferentAccess.new + @changed_attributes = ActiveSupport::HashWithIndifferentAccess.new forget_attribute_assignments clear_mutation_trackers end diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index 2fb7f29d73..788ea88752 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,9 @@ +* Deprecated the top level `HashWithIndifferentAccess` constant. + + Only `ActiveSupport::HashWithIndifferentAccess` should be used now. + + *Robin Dupret* (#27925) + * Deprecate `.halt_callback_chains_on_return_false`. *Rafael Mendonça França* diff --git a/activesupport/lib/active_support/hash_with_indifferent_access.rb b/activesupport/lib/active_support/hash_with_indifferent_access.rb index 79e7feaf47..8638667082 100644 --- a/activesupport/lib/active_support/hash_with_indifferent_access.rb +++ b/activesupport/lib/active_support/hash_with_indifferent_access.rb @@ -316,4 +316,20 @@ def set_defaults(target) # :doc: end end -HashWithIndifferentAccess = ActiveSupport::HashWithIndifferentAccess +class HashWithIndifferentAccess < ActiveSupport::HashWithIndifferentAccess + def initialize(*) + ActiveSupport::Deprecation.warn "HashWithIndifferentAccess is deprecated!" \ + "Use ActiveSupport::HashWithIndifferentAccess instead." + super + end + + def self.inherited(*) + ActiveSupport::Deprecation.warn "HashWithIndifferentAccess is deprecated!" \ + "Use ActiveSupport::HashWithIndifferentAccess instead." + super + end + + def encode_with(coder) + coder.represent_object(nil, ActiveSupport::HashWithIndifferentAccess.new(self)) + end +end diff --git a/activesupport/test/core_ext/hash_ext_test.rb b/activesupport/test/core_ext/hash_ext_test.rb index 05813ad388..042bb60a22 100644 --- a/activesupport/test/core_ext/hash_ext_test.rb +++ b/activesupport/test/core_ext/hash_ext_test.rb @@ -8,6 +8,8 @@ require "active_support/inflections" class HashExtTest < ActiveSupport::TestCase + HashWithIndifferentAccess = ActiveSupport::HashWithIndifferentAccess + class IndifferentHash < ActiveSupport::HashWithIndifferentAccess end @@ -1078,6 +1080,25 @@ def test_new_with_to_hash_conversion_copies_default_proc assert_equal 1, hash[:a] assert_equal 3, hash[:b] end + + def test_top_level_hash_with_indifferent_access_is_deprecated + assert_deprecated do + ::HashWithIndifferentAccess.new + end + end + + def test_top_level_hash_with_indifferent_access_can_be_extended + assert_deprecated do + Class.new(::HashWithIndifferentAccess) + end + end + + def test_yaml_encoding_outputs_an_activesupport_namespaced_constant + ActiveSupport::Deprecation.silence do + instance = ::HashWithIndifferentAccess.new + assert_includes instance.to_yaml, "ActiveSupport::HashWithIndifferentAccess" + end + end end class IWriteMyOwnXML @@ -1123,6 +1144,8 @@ def test_to_param_orders_by_key_in_ascending_order end class HashToXmlTest < ActiveSupport::TestCase + HashWithIndifferentAccess = ActiveSupport::HashWithIndifferentAccess + def setup @xml_options = { root: :person, skip_instruct: true, indent: 0 } end