Skip to content

Commit

Permalink
Added atribute aliases
Browse files Browse the repository at this point in the history
  • Loading branch information
etki committed Aug 3, 2017
1 parent 3196fa7 commit e35790b
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 3 deletions.
13 changes: 11 additions & 2 deletions lib/mapper/handler/entity/denormalizer.rb
Expand Up @@ -23,16 +23,25 @@ def denormalize(source, type, context = nil)
entity = type.factory.create(type, source, context)
type.attributes.values.each do |attribute|
next if attribute.virtual
[attribute.name.to_s, attribute.name].each do |name|
candidate_names(attribute).each do |name|
next unless source.key?(name)
set_object_attribute(entity, name, source[name])
value = source[name]
break set_object_attribute(entity, attribute.name, value)
end
end
entity
end

private

# @param [AMA::Entity::Mapper::Type::Attribute] attribute
# @return [Array<Symbol, String>]
def candidate_names(attribute)
[attribute.name, *attribute.aliases].flat_map do |candidate|
[candidate, candidate.to_s]
end
end

# @param [Hash] source
# @param [AMA::Entity::Mapper::Type] type
# @param [AMA::Entity::Mapper::Context] context
Expand Down
6 changes: 5 additions & 1 deletion lib/mapper/type/attribute.rb
Expand Up @@ -55,6 +55,9 @@ class Attribute
# @!attribute values
# @return [Array<Object>]
attr_accessor :values
# @!attribute aliases
# @return [Array<Symbol>]
attr_accessor :aliases

handler_namespace Handler::Attribute

Expand All @@ -71,7 +74,8 @@ def self.defaults
default: nil,
nullable: false,
values: [],
validator: nil
validator: nil,
aliases: []
}
end

Expand Down
23 changes: 23 additions & 0 deletions test/suite/unit/mapper/handler/entity/denormalizer.spec.rb
Expand Up @@ -17,10 +17,12 @@
{
value: double(
name: :value,
aliases: %i[item entity],
virtual: false
),
virtual: double(
name: :virtual,
aliases: [],
virtual: true
)
}
Expand Down Expand Up @@ -93,6 +95,27 @@
result = denormalizer.denormalize(data, type, context)
expect(result.instance_variables).not_to include(:@virtual)
end

it 'uses attribute aliases' do
data = { item: 12 }
result = denormalizer.denormalize(data, type, context)
expect(result.instance_variables).to include(:@value)
expect(result.instance_variable_get(:@value)).to eq(data[:item])
end

it 'uses attribute aliases in eabsence of exact match' do
data = { entity: 12 }
result = denormalizer.denormalize(data, type, context)
expect(result.instance_variables).to include(:@value)
expect(result.instance_variable_get(:@value)).to eq(data[:entity])
end

it 'uses attribute aliases in order of their declaration' do
data = { item: 12, entity: 13 }
result = denormalizer.denormalize(data, type, context)
expect(result.instance_variables).to include(:@value)
expect(result.instance_variable_get(:@value)).to eq(data[:item])
end
end

describe '.wrap' do
Expand Down

0 comments on commit e35790b

Please sign in to comment.