diff options
author | Daniel Doubrovkine (dB.) @dblockdotorg <dblock@dblock.org> | 2014-07-09 13:28:48 -0400 |
---|---|---|
committer | Daniel Doubrovkine (dB.) @dblockdotorg <dblock@dblock.org> | 2014-07-09 13:28:48 -0400 |
commit | 85cf9f283b9dd97219a1910a553c072e39211188 (patch) | |
tree | 75128411a27d72108bc5fb4da8727dfb2d9a081b | |
parent | 8b4ffbd6aa2ff9e6aeccd8181c82a85ffd1eea7a (diff) | |
parent | 1fd096fd704fd63d3e5bcdc2281f8cbe14815a52 (diff) | |
download | hashie-85cf9f283b9dd97219a1910a553c072e39211188.tar.gz |
Merge pull request #191 from gregory/coercion_bug
Fixed Coercion bug when included in Trash
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | lib/hashie/extensions/coercion.rb | 13 | ||||
-rw-r--r-- | spec/hashie/extensions/coercion_spec.rb | 17 |
3 files changed, 26 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index af196fa..b6d0458 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * [#179](https://github.com/intridea/hashie/pull/179): Mash#values_at will convert each key before doing the lookup - [@nahiluhmot](https://github.com/nahiluhmot). * [#184](https://github.com/intridea/hashie/pull/184): Allow ranges on Rash to match all Numeric types - [@medcat](https://github.com/medcat). * [#187](https://github.com/intridea/hashie/pull/187): Automatically require version - [@medcat](https://github.com/medcat). +* [#190](https://github.com/intridea/hashie/issues/190): Fixed `coerce_key` with `from` Trash feature and Coercion extension - [@gregory](https://github.com/gregory). * Your contribution here. ## 3.1 (6/25/2014) diff --git a/lib/hashie/extensions/coercion.rb b/lib/hashie/extensions/coercion.rb index 4486ae9..dea6e92 100644 --- a/lib/hashie/extensions/coercion.rb +++ b/lib/hashie/extensions/coercion.rb @@ -2,16 +2,19 @@ module Hashie module Extensions module Coercion def self.included(base) - base.extend ClassMethods base.send :include, InstanceMethods + base.extend ClassMethods # NOTE: we wanna make sure we first define set_value_with_coercion before extending + + base.send :alias_method, :'set_value_without_coercion', :[]= + base.send :alias_method, :[]=, :'set_value_with_coercion' end module InstanceMethods - def []=(key, value) + def set_value_with_coercion(key, value) into = self.class.key_coercion(key) || self.class.value_coercion(value) - return super(key, value) unless value && into - return super(key, coerce_or_init(into).call(value)) unless into.is_a?(Enumerable) + return set_value_without_coercion(key, value) unless value && into + return set_value_without_coercion(key, coerce_or_init(into).call(value)) unless into.is_a?(Enumerable) if into.class >= Hash key_coerce = coerce_or_init(into.flatten[0]) @@ -22,7 +25,7 @@ module Hashie value = into.class.new(value.map { |v| value_coerce.call(v) }) end - super(key, value) + set_value_without_coercion(key, value) end def coerce_or_init(type) diff --git a/spec/hashie/extensions/coercion_spec.rb b/spec/hashie/extensions/coercion_spec.rb index d73e884..40cc8e1 100644 --- a/spec/hashie/extensions/coercion_spec.rb +++ b/spec/hashie/extensions/coercion_spec.rb @@ -156,6 +156,23 @@ describe Hashie::Extensions::Coercion do expect(tweet[:user]).to be_a(UserMash) end end + + context 'when used with a Trash' do + class UserTrash < Hashie::Trash + property :email + end + class TweetTrash < Hashie::Trash + include Hashie::Extensions::Coercion + + property :user, from: :user_data + coerce_key :user, UserTrash + end + + it 'coerces with instance initialization' do + tweet = TweetTrash.new(user_data: { email: 'foo@bar.com' }) + expect(tweet[:user]).to be_a(UserTrash) + end + end end describe '#coerce_value' do |