summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Doubrovkine (dB.) @dblockdotorg <dblock@dblock.org>2020-06-10 09:40:10 -0400
committerdblock <dblock@dblock.org>2020-06-11 07:36:57 -0400
commit1f1efdb14cf586880e7fd1b6ed1d608256889c30 (patch)
treeff7b6e80f8ab7e708d22883bb288c34532c5d618
parent694f2e7e3899330b3a699ae8188c6f34ff75ba20 (diff)
parentb206fb8a79b626d8c4f6edf15caf0eda37e6845c (diff)
downloadhashie-1f1efdb14cf586880e7fd1b6ed1d608256889c30.tar.gz
Merge pull request #525 from yogeshjain999/indifferent-convert-change
Small amendments for Hash#merge with IndifferentAccess
-rw-r--r--CHANGELOG.md1
-rw-r--r--lib/hashie/extensions/indifferent_access.rb4
-rw-r--r--spec/hashie/extensions/indifferent_access_spec.rb39
3 files changed, 42 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 669eec8..fdd32e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,7 @@ Any violations of this scheme are considered to be bugs.
* [#521](https://github.com/hashie/hashie/pull/499): Do not convert keys that cannot be represented as symbols to `String` in `Mash` initialization - [@carolineartz](https://github.com/carolineartz).
* [#524](https://github.com/hashie/hashie/pull/524): Test with Ruby 2.7 - [@aried3r](https://github.com/aried3r).
+* [#525](https://github.com/hashie/hashie/pull/525): Use `indifferent_writer` in `IndifferentAccess#convert!` - [@yogeshjain999](https://github.com/yogeshjain999).
* Your contribution here.
### Deprecated
diff --git a/lib/hashie/extensions/indifferent_access.rb b/lib/hashie/extensions/indifferent_access.rb
index e3d2d63..f8176f5 100644
--- a/lib/hashie/extensions/indifferent_access.rb
+++ b/lib/hashie/extensions/indifferent_access.rb
@@ -74,7 +74,7 @@ module Hashie
# is injecting itself into member hashes.
def convert!
keys.each do |k| # rubocop:disable Performance/HashEachMethods
- regular_writer convert_key(k), indifferent_value(regular_delete(k))
+ indifferent_writer k, regular_delete(k)
end
self
end
@@ -133,7 +133,7 @@ module Hashie
def merge(*args)
result = super
- IndifferentAccess.inject!(result) if hash_lacking_indifference?(result)
+ return IndifferentAccess.inject!(result) if hash_lacking_indifference?(result)
result.convert!
end
diff --git a/spec/hashie/extensions/indifferent_access_spec.rb b/spec/hashie/extensions/indifferent_access_spec.rb
index fc03bc2..612f276 100644
--- a/spec/hashie/extensions/indifferent_access_spec.rb
+++ b/spec/hashie/extensions/indifferent_access_spec.rb
@@ -86,6 +86,45 @@ describe Hashie::Extensions::IndifferentAccess do
end
end
+ describe 'when overriding indifferent methods' do
+ let(:indifferent_hash) do
+ Class.new(::Hash) do
+ include Hashie::Extensions::IndifferentAccess
+
+ ALIASES = { cat: :grumpy }.freeze
+
+ # Override writer to maintain alias of the given key
+ def indifferent_writer(key, value)
+ indifferent_value = indifferent_value(value)
+
+ regular_writer convert_key(key), indifferent_value
+ regular_writer convert_key(ALIASES[key]), indifferent_value
+ end
+ alias_method :[]=, :indifferent_writer
+ end.new
+ end
+
+ it '#indifferent_writer' do
+ indifferent_hash[:cat] = 'meow'
+
+ expect(indifferent_hash[:cat]).to eq('meow')
+ expect(indifferent_hash['cat']).to eq('meow')
+
+ expect(indifferent_hash[:grumpy]).to eq('meow')
+ expect(indifferent_hash['grumpy']).to eq('meow')
+ end
+
+ it '#merge' do
+ merged_hash = indifferent_hash.merge(cat: 'meow')
+
+ expect(merged_hash[:cat]).to eq('meow')
+ expect(merged_hash['cat']).to eq('meow')
+
+ expect(merged_hash[:grumpy]).to eq('meow')
+ expect(merged_hash['grumpy']).to eq('meow')
+ end
+ end
+
describe 'when translating properties and ignoring undeclared' do
let(:value) { 'baz' }