simple_attribute_mapper 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.9.2"
4
+ - "1.9.3"
5
+ - jruby-19mode # JRuby in 1.9 mode
6
+ - rbx-19mode
7
+ script: bundle exec rspec spec
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # SimpleAttributeMapper
2
2
 
3
+ [![Build Status](https://travis-ci.org/house9/simple_attribute_mapper.png)](https://travis-ci.org/house9/simple_attribute_mapper) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/house9/simple_attribute_mapper)
4
+
3
5
  Maps attributes values from one object to another
4
6
 
5
7
  ## Installation
@@ -23,7 +25,7 @@ class Person
23
25
  include Virtus
24
26
 
25
27
  attribute :first_name, String
26
- atrribute :last_name, String
28
+ attribute :last_name, String
27
29
  attribute :email, String
28
30
  attribute :home_phone, String
29
31
  attribute :mailing_address, String
@@ -49,7 +51,14 @@ specify additional mappings, i.e. user_name -> email
49
51
  user = User.find(0000)
50
52
  user.user_name # => "test@example.com"
51
53
  mapper = SimpleAttributeMapper::Mapper.new({:user_name => :email})
52
- person = mapper.map(user, Person) # returns a new instance of Person
54
+
55
+ # map returns a new instance of Person
56
+ person = mapper.map(user, Person)
57
+ person.email # => "test@example.com"
58
+
59
+ # map_attributes will map onto an existing instance
60
+ person = Person.new({email: "foo@bar.com"})
61
+ person = mapper.map_attributes(user, person)
53
62
  person.email # => "test@example.com"
54
63
  ```
55
64
 
@@ -63,7 +72,7 @@ SimpleAttributeMapper.configure do |config|
63
72
  config << SimpleAttributeMapper.from(User).to(Person).with({:user_name => :email}).with({:phone_number => :home_phone})
64
73
  end
65
74
 
66
- # use later in application to map
75
+ # use later in application to map
67
76
  user = User.find(0000)
68
77
  person = SimpleAttributeMapper.map(user, Person)
69
78
 
@@ -7,13 +7,16 @@ module SimpleAttributeMapper
7
7
  attr_reader :mappings
8
8
 
9
9
  def map(source, target_class)
10
+ map_attributes(source, target_class.new)
11
+ end
12
+
13
+ def map_attributes(source, target_instance)
10
14
  raise UnMappableError.new("source has no attributes") unless source.respond_to?(:attributes)
11
15
 
12
- target = target_class.new
13
- map_matching_attributes(source, target)
14
- map_specified_attributes(source, target)
16
+ map_matching_attributes(source, target_instance)
17
+ map_specified_attributes(source, target_instance)
15
18
 
16
- target
19
+ target_instance
17
20
  end
18
21
 
19
22
  def map_matching_attributes(source, target)
@@ -1,3 +1,3 @@
1
1
  module SimpleAttributeMapper
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -21,6 +21,14 @@ module SimpleAttributeMapper
21
21
  end
22
22
 
23
23
  def self.map(source_instance, target_class)
24
+ mapper_for(source_instance, target_class).map(source_instance, target_class)
25
+ end
26
+
27
+ def self.map_attributes(source_instance, target_instance)
28
+ mapper_for(source_instance, target_instance.class).map_attributes(source_instance, target_instance)
29
+ end
30
+
31
+ def self.mapper_for(source_instance, target_class)
24
32
  if self.configuration.maps.length == 0
25
33
  raise ConfigurationError.new("There are no mappings configured, check the documentation for configuration steps")
26
34
  end
@@ -30,7 +38,6 @@ module SimpleAttributeMapper
30
38
  raise ConfigurationError.new("There are no mappings configured for '#{source_instance.class}' -> '#{target_class}'")
31
39
  end
32
40
 
33
- mapper = Mapper.new(mappings[0].mappings)
34
- mapper.map(source_instance, target_class)
41
+ Mapper.new(mappings[0].mappings)
35
42
  end
36
43
  end
@@ -47,6 +47,17 @@ describe SimpleAttributeMapper do
47
47
  target_instance.abc.should == "ABC"
48
48
  target_instance.target_baz.should == "BAZ"
49
49
  end
50
+
51
+ it "maps attributes on instance" do
52
+ maps = [ SimpleAttributeMapper.from(source).to(target).with({source_baz: :target_baz}) ]
53
+ SimpleAttributeMapper.configuration.stub(:maps).and_return(maps)
54
+ source_instance = source.new(foo: "FOO", abc: "ABC", source_baz: "BAZ")
55
+ target_instance = target.new(abc: "ABC", target_baz: "ORIGINAL")
56
+ target_instance = SimpleAttributeMapper.map_attributes(source_instance, target_instance)
57
+ target_instance.bar.should be_nil
58
+ target_instance.abc.should == "ABC"
59
+ target_instance.target_baz.should == "BAZ"
60
+ end
50
61
  end
51
62
 
52
63
  describe "configure" do
@@ -134,7 +145,7 @@ describe SimpleAttributeMapper::Mapper do
134
145
  SimpleAttributeMapper::Mapper.new.should be_an_instance_of(SimpleAttributeMapper::Mapper)
135
146
  end
136
147
 
137
- describe "map" do
148
+ describe "map and map_attributes" do
138
149
  class Country
139
150
  include Virtus
140
151
 
@@ -183,6 +194,14 @@ describe SimpleAttributeMapper::Mapper do
183
194
  bar.baz.should == "BAZ"
184
195
  end
185
196
 
197
+ it "maps attributes on an existing instance" do
198
+ mapper = SimpleAttributeMapper::Mapper.new
199
+ foo = Foo.new({baz: "BAZ"})
200
+ bar = Bar.new({baz: "ORIGINAL"})
201
+ bar = mapper.map_attributes(foo, bar)
202
+ bar.baz.should == "BAZ"
203
+ end
204
+
186
205
  context "mapping nested attributes" do
187
206
  it "maps 1 level deep" do
188
207
  mapper = SimpleAttributeMapper::Mapper.new({[:address, :city] => :city})
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_attribute_mapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-25 00:00:00.000000000 Z
12
+ date: 2013-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -52,6 +52,7 @@ extensions: []
52
52
  extra_rdoc_files: []
53
53
  files:
54
54
  - .gitignore
55
+ - .travis.yml
55
56
  - Gemfile
56
57
  - LICENSE.txt
57
58
  - README.md
@@ -87,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
88
  version: '0'
88
89
  requirements: []
89
90
  rubyforge_project:
90
- rubygems_version: 1.8.23
91
+ rubygems_version: 1.8.24
91
92
  signing_key:
92
93
  specification_version: 3
93
94
  summary: See the README for more information