Fixed issue where a source hash key can be used in translating multiple properties

This commit is contained in:
Daniel Lee 2021-06-17 14:05:59 -07:00
parent ae55d8ed75
commit e295a0df57
3 changed files with 24 additions and 1 deletions

View File

@ -42,6 +42,7 @@ Any violations of this scheme are considered to be bugs.
* [#531](https://github.com/hashie/hashie/pull/531): Fixed [slice doesn't work using symbols](https://github.com/hashie/hashie/issues/529) using hash with `IndifferentAccess` extension - [@gnomex](https://github.com/gnomex).
* [#533](https://github.com/hashie/hashie/pull/533): Fixed `NoMethodError: undefined method `to_json'` at `hashie/dash_spec` - [@gnomex](https://github.com/gnomex).
* [#537](https://github.com/hashie/hashie/pull/537): Fixed inconsistencies with handling defaults in `Dash` with and without `IgnoreUnclared` mixed in - [@michaelherold](https://github.com/michaelherold).
* [#547](https://github.com/hashie/hashie/pull/547): Fixed issue where a source hash key can be used in translating multiple properties - [@danwa5](https://github.com/danwa5).
* Your contribution here.
### Security

View File

@ -153,7 +153,12 @@ module Hashie
def []=(property, value)
if self.class.translation_exists? property
send("#{property}=", value)
super(property, value) if self.class.properties.include?(property)
if self.class.transformation_exists? property
super property, self.class.transformed_property(property, value)
elsif self.class.properties.include?(property)
super(property, value)
end
elsif self.class.transformation_exists? property
super property, self.class.transformed_property(property, value)
elsif property_exists? property

View File

@ -157,6 +157,23 @@ describe Hashie::Trash do
end
end
describe 'translating multiple properties from the same source hash key' do
class AnotherDataModel < Hashie::Trash
property :first_name, transform_with: ->(n) { n.upcase }
property :first_name_short, from: :first_name, transform_with: ->(n) { n[0, 3] }
end
subject { AnotherDataModel.new(first_name: 'Cathy') }
it 'translates the first key with the given lambda' do
expect(subject.first_name).to eq('CATHY')
end
it 'translates the second key with the given lambda and the initial value of the first key' do
expect(subject.first_name_short).to eq('Cat')
end
end
describe 'uses with or transform_with interchangeably' do
class TrashLambdaTestTransformWith < Hashie::Trash
property :first_name, from: :firstName, transform_with: ->(value) { value.reverse }