summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgregory <greg2502@gmail.com>2014-07-07 22:07:16 -0700
committergregory <greg2502@gmail.com>2014-07-08 08:10:14 -0700
commit1fd096fd704fd63d3e5bcdc2281f8cbe14815a52 (patch)
tree75128411a27d72108bc5fb4da8727dfb2d9a081b
parent8b4ffbd6aa2ff9e6aeccd8181c82a85ffd1eea7a (diff)
downloadhashie-1fd096fd704fd63d3e5bcdc2281f8cbe14815a52.tar.gz
Add failing spec + fix it
fixed update changelog
-rw-r--r--CHANGELOG.md1
-rw-r--r--lib/hashie/extensions/coercion.rb13
-rw-r--r--spec/hashie/extensions/coercion_spec.rb17
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