README.md in yaoc-0.0.2 vs README.md in yaoc-0.0.3

- old
+ new

@@ -22,21 +22,21 @@ ```ruby require 'yaoc' -User = Struct.new(:id, :name) do +User = Struct.new(:id, :firstname, :lastname, :role) do def initialize(params={}) super() params.each do |attr, value| self.public_send("#{attr}=", value) end if params end end -OldUser = Struct.new(:id, :fullname) do +OldUser = Struct.new(:id, :fullname, :r_role) do def initialize(params={}) super() params.each do |attr, value| self.public_send("#{attr}=", value) @@ -45,28 +45,103 @@ end mapper = Yaoc::ObjectMapper.new(User, OldUser).tap do |mapper| mapper.add_mapping do fetcher :public_send - rule to: :name, from: :fullname + rule to: :role, from: :r_role + + rule to: :firstname, + from: :fullname, + converter: ->(source, result){ result.merge({firstname: + source.fullname.split().first }) }, + reverse_converter: ->(source, result){ result.merge({fullname: + "#{source.firstname} #{source.lastname}" }) } + + rule to: :lastname, + from: :fullname, + converter: ->(source, result){ result.merge({lastname: source.fullname.split().last }) }, + reverse_converter: ->(source, result){ result } + rule to: :id + + # or + # rule to: [:id, :foo, :bar, ...], from: [:rid, :rfoo], converter: [->(){}] + end end -old_user = OldUser.new({id: 1, fullname: "myname" }) +old_user = OldUser.new({id: 1, fullname: "myfirst mysecond", r_role: "admin" }) new_user = mapper.load(old_user) - puts old_user puts new_user -new_user.name = "no name" +new_user.firstname = "no" +new_user.lastname = "name" puts mapper.dump(new_user) -#<struct OldUser id=1, fullname="myname"> -#<struct User id=1, name="myname"> -#<struct OldUser id=1, fullname="no name"> +#<struct OldUser id=1, fullname="myfirst mysecond", r_role="admin"> +#<struct User id=1, firstname="myfirst", lastname="mysecond", role="admin"> +#<struct OldUser id=1, fullname="no name", r_role="admin"> + +# the resulting class has no hash enabled constructor? + +puts "\n" * 5 + +OldUser2 = Struct.new(:id, :fullname, :r_role) + +User2 = Struct.new(:id, :firstname, :lastname, :role) + +reverse_source = ->(attrs){ + OldUser2.new.tap do |old_user| + attrs.each_pair do |key, value| + old_user.public_send "#{key}=", value + end + end +} + +source = ->(attrs){ + User2.new.tap do |old_user| + attrs.each_pair do |key, value| + old_user.public_send "#{key}=", value + end + end +} + +mapper = Yaoc::ObjectMapper.new(source, reverse_source).tap do |mapper| + mapper.add_mapping do + fetcher :public_send + rule to: :role, from: :r_role + + rule to: :firstname, + from: :fullname, + converter: ->(source, result){ result.merge({firstname: source.fullname.split().first }) }, + reverse_converter: ->(source, result){ result.merge({fullname: "#{source.firstname} #{source.lastname}" }) } + + rule to: :lastname, + from: :fullname, + converter: ->(source, result){ result.merge({lastname: source.fullname.split().last }) }, + reverse_converter: ->(source, result){ result } + + rule to: :id + end +end + +old_user2 = OldUser2.new(1, "myfirst mysecond", "admin" ) +new_user2 = mapper.load(old_user) + +puts old_user2 +puts new_user2 + +new_user2.firstname = "no" +new_user2.lastname = "name" + +puts mapper.dump(new_user2) + +#<struct OldUser2 id=1, fullname="myfirst mysecond", r_role="admin"> +#<struct User2 id=1, firstname="myfirst", lastname="mysecond", role="admin"> +#<struct OldUser2 id=1, fullname="no name", r_role="admin"> ``` ## Contributing