yaoc 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 60a0299fcfe56955d503d23ff8d92b69d2f9aee4
4
- data.tar.gz: 4946c343a774f4d278298671f781d61ad647fe02
3
+ metadata.gz: 2324f744d79c8b4447ce737b2eb4530c2ea22e49
4
+ data.tar.gz: 4f455b5e33867e51b06c248896f42eb24b5bac70
5
5
  SHA512:
6
- metadata.gz: 27acb99f506e5220e00b16bfd691df573fd1ae1c860c9d0ec9e0a0b229c2a95500884b44e0561b0fcfc61dc2105c608459db1c1d1aafbb0b0bb43b0726e6f37f
7
- data.tar.gz: 4bcd3ceecda4be8ce9b9c381991c1230249dd0d2c0d912ed91f86d6c356e90174a3e4bbe3294c7710d59a73cc8f0e15f8bf8f97f01eeaf96418ee2fbbc0e7c1f
6
+ metadata.gz: 8292da0e6c0ccfd4259c457c10da22351df4cc7b9081ada86cdf6ea3945ad0e69bccd7a26767243176193c9a0b7a0585be9f4c60c3886ff2e30005c8852b2cbc
7
+ data.tar.gz: 5744c15c87cdf05a21fef126b4747a94a23100d6dd82287cb6ac56058068a28750e45284537130b1aa146c35cdad293f6b0fb9658958c5485c1d09e24145ba8d
data/README.md CHANGED
@@ -18,7 +18,7 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- Uptodate doc's look into the specs.
21
+ For uptodate doc's take a look into the specs.
22
22
 
23
23
  ### The resulting classes have hash enabled constructors?
24
24
 
@@ -39,12 +39,12 @@ mapper = Yaoc::ObjectMapper.new(User, OldUser).tap do |mapper|
39
39
 
40
40
  rule to: :firstname,
41
41
  from: :fullname,
42
- converter: ->(source, result){ fill_result_with_value(result, :firstname, source.fullname.split().first) },
43
- reverse_converter: ->(source, result){ fill_result_with_value(result, :fullname, "#{source.firstname} #{source.lastname}") }
42
+ converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :firstname, source.fullname.split().first) },
43
+ reverse_converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :fullname, "#{source.firstname} #{source.lastname}") }
44
44
 
45
45
  rule to: :lastname,
46
46
  from: :fullname,
47
- converter: ->(source, result){ fill_result_with_value(result, :lastname, source.fullname.split().last ) },
47
+ converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :lastname, source.fullname.split().last ) },
48
48
  reverse_converter: ->(source, result){ result }
49
49
 
50
50
  rule to: :id
@@ -104,12 +104,12 @@ mapper = Yaoc::ObjectMapper.new(source, reverse_source).tap do |mapper|
104
104
 
105
105
  rule to: :firstname,
106
106
  from: :fullname,
107
- converter: ->(source, result){ fill_result_with_value(result, :firstname, source.fullname.split().first ) },
108
- reverse_converter: ->(source, result){ fill_result_with_value(result, :fullname, "#{source.firstname} #{source.lastname}") }
107
+ converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :firstname, source.fullname.split().first ) },
108
+ reverse_converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :fullname, "#{source.firstname} #{source.lastname}") }
109
109
 
110
110
  rule to: :lastname,
111
111
  from: :fullname,
112
- converter: ->(source, result){ fill_result_with_value(result, :lastname, source.fullname.split().last) },
112
+ converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :lastname, source.fullname.split().last) },
113
113
  reverse_converter: ->(source, result){ result }
114
114
 
115
115
  rule to: :id
@@ -147,6 +147,16 @@ puts "\n" * 5
147
147
  OldUser3 = Struct.new(:id, :fullname, :r_role)
148
148
  User3 = Struct.new(:id, :firstname, :lastname, :role)
149
149
 
150
+ # alternative to proc for converter
151
+ converter = Yaoc::TransformationCommand.create(to: 1,
152
+ from: :fullname,
153
+ deferred: false,
154
+ fetcher_proc: ->(source, fetcher, from){source.fullname.split().first} )
155
+
156
+ reverse_converter = Yaoc::TransformationCommand.create(to: 1,
157
+ from: :first_and_lastname,
158
+ deferred: false,
159
+ fetcher_proc: ->(source, fetcher, from){ "#{source.firstname} #{source.lastname}"} )
150
160
 
151
161
  mapper = Yaoc::ObjectMapper.new(User3, OldUser3).tap do |mapper|
152
162
  mapper.add_mapping do
@@ -161,8 +171,8 @@ mapper = Yaoc::ObjectMapper.new(User3, OldUser3).tap do |mapper|
161
171
  rule to: 1,
162
172
  from: :fullname,
163
173
 
164
- converter: ->(source, result){ fill_result_with_value(result, 1, source.fullname.split().first) },
165
- reverse_converter: ->(source, result){ fill_result_with_value(result, 1, "#{source.firstname} #{source.lastname}") }
174
+ converter: converter,
175
+ reverse_converter: reverse_converter
166
176
 
167
177
  rule to: 2,
168
178
  from: :fullname,
@@ -187,6 +197,7 @@ new_user3.lastname = "name"
187
197
 
188
198
  puts mapper.dump(new_user3)
189
199
 
200
+
190
201
  #<struct OldUser3 id=1, fullname="myfirst mysecond", r_role="admin">
191
202
  #<struct User3 id=1, firstname="myfirst", lastname="mysecond", role="admin">
192
203
  #<struct OldUser3 id=1, fullname="no name", r_role="admin">
@@ -16,12 +16,12 @@ mapper = Yaoc::ObjectMapper.new(User, OldUser).tap do |mapper|
16
16
 
17
17
  rule to: :firstname,
18
18
  from: :fullname,
19
- converter: ->(source, result){ fill_result_with_value(result, :firstname, source.fullname.split().first) },
20
- reverse_converter: ->(source, result){ fill_result_with_value(result, :fullname, "#{source.firstname} #{source.lastname}") }
19
+ converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :firstname, source.fullname.split().first) },
20
+ reverse_converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :fullname, "#{source.firstname} #{source.lastname}") }
21
21
 
22
22
  rule to: :lastname,
23
23
  from: :fullname,
24
- converter: ->(source, result){ fill_result_with_value(result, :lastname, source.fullname.split().last ) },
24
+ converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :lastname, source.fullname.split().last ) },
25
25
  reverse_converter: ->(source, result){ result }
26
26
 
27
27
  rule to: :id
@@ -34,12 +34,12 @@ mapper = Yaoc::ObjectMapper.new(source, reverse_source).tap do |mapper|
34
34
 
35
35
  rule to: :firstname,
36
36
  from: :fullname,
37
- converter: ->(source, result){ fill_result_with_value(result, :firstname, source.fullname.split().first ) },
38
- reverse_converter: ->(source, result){ fill_result_with_value(result, :fullname, "#{source.firstname} #{source.lastname}") }
37
+ converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :firstname, source.fullname.split().first ) },
38
+ reverse_converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :fullname, "#{source.firstname} #{source.lastname}") }
39
39
 
40
40
  rule to: :lastname,
41
41
  from: :fullname,
42
- converter: ->(source, result){ fill_result_with_value(result, :lastname, source.fullname.split().last) },
42
+ converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :lastname, source.fullname.split().last) },
43
43
  reverse_converter: ->(source, result){ result }
44
44
 
45
45
  rule to: :id
@@ -11,6 +11,16 @@ OldUser3 = Struct.new(:id, :fullname, :r_role)
11
11
  User3 = Struct.new(:id, :firstname, :lastname, :role)
12
12
 
13
13
 
14
+ converter = Yaoc::TransformationCommand.create(to: 1,
15
+ from: :fullname,
16
+ deferred: false,
17
+ fetcher_proc: ->(source, fetcher, from){source.fullname.split().first} )
18
+
19
+ reverse_converter = Yaoc::TransformationCommand.create(to: 1,
20
+ from: :first_and_lastname,
21
+ deferred: false,
22
+ fetcher_proc: ->(source, fetcher, from){ "#{source.firstname} #{source.lastname}"} )
23
+
14
24
  mapper = Yaoc::ObjectMapper.new(User3, OldUser3).tap do |mapper|
15
25
  mapper.add_mapping do
16
26
  fetcher :public_send
@@ -24,8 +34,8 @@ mapper = Yaoc::ObjectMapper.new(User3, OldUser3).tap do |mapper|
24
34
  rule to: 1,
25
35
  from: :fullname,
26
36
 
27
- converter: ->(source, result){ fill_result_with_value(result, 1, source.fullname.split().first) },
28
- reverse_converter: ->(source, result){ fill_result_with_value(result, 1, "#{source.firstname} #{source.lastname}") }
37
+ converter: converter,
38
+ reverse_converter: reverse_converter
29
39
 
30
40
  rule to: 2,
31
41
  from: :fullname,
data/lib/yaoc.rb CHANGED
@@ -1,5 +1,10 @@
1
1
  require "yaoc/version"
2
+
3
+ Dir[File.join(File.expand_path(__dir__ ), "yaoc/helper/*.rb")].each { |f| require f }
4
+
2
5
  require 'yaoc/mapping_base'
6
+ require 'yaoc/transformation_command'
7
+ require 'yaoc/transformation_deferred_command'
3
8
  require 'yaoc/mapping_to_class'
4
9
 
5
10
  Dir[File.join(File.expand_path(__dir__ ), "yaoc/strategies/*.rb")].each { |f| require f }
@@ -7,8 +12,6 @@ Dir[File.join(File.expand_path(__dir__ ), "yaoc/strategies/*.rb")].each { |f| re
7
12
  require 'yaoc/converter_builder'
8
13
  require 'yaoc/object_mapper'
9
14
 
10
- Dir[File.join(File.expand_path(__dir__ ), "yaoc/helper/*.rb")].each { |f| require f }
11
-
12
15
  module Yaoc
13
16
 
14
17
  end
@@ -36,20 +36,19 @@ module Yaoc
36
36
  end
37
37
 
38
38
  def converter_to_proc(to, from, converter, is_collection, deferred)
39
- ->(source, result){
40
- get_value_with = ->{
41
- object_to_convert = source.public_send(fetcher, from)
42
-
43
- if is_collection
44
- object_to_convert.map(&converter)
45
- else
46
- converter_as_proc = converter.to_proc
47
- converter_as_proc.call(object_to_convert)
48
- end
49
- }
50
-
51
- fill_result_from_proc(result, to, get_value_with, deferred)
39
+
40
+ get_value_with = ->(source, fetcher, from){
41
+ object_to_convert = source.public_send(fetcher, from)
42
+
43
+ if is_collection
44
+ object_to_convert.map(&converter)
45
+ else
46
+ converter_as_proc = converter.to_proc
47
+ converter_as_proc.call(object_to_convert)
48
+ end
52
49
  }
50
+
51
+ TransformationCommand.create(to: to, from: from, deferred: deferred, fetcher_proc: get_value_with)
53
52
  end
54
53
 
55
54
  end
@@ -83,6 +82,10 @@ module Yaoc
83
82
  build_commands.reverse
84
83
  end
85
84
  end
85
+
86
+ def noop
87
+ ->(_, result){ result }
88
+ end
86
89
  end
87
90
 
88
91
 
@@ -1,3 +1,5 @@
1
+ require 'delegate'
2
+
1
3
  module Yaoc
2
4
  module Helper
3
5
  class ToProcDelegator < SimpleDelegator
@@ -25,25 +25,6 @@ module Yaoc
25
25
  end
26
26
  end
27
27
 
28
- def fill_result_with_value(result, key, value)
29
- result.tap{|taped_result| taped_result[key] = value}
30
- end
31
-
32
- def fill_result_from_proc(result, key, proc, deferred=false)
33
- value = if deferred
34
- deferrer_strategy(proc)
35
- else
36
- proc.call
37
- end
38
-
39
- fill_result_with_value(result, key, value)
40
- end
41
-
42
- def deferrer_strategy(proc)
43
- Yaoc::Helper::ToProcDelegator.new(proc)
44
- end
45
-
46
-
47
28
  def converter_methods
48
29
  self.class.converter_methods
49
30
  end
@@ -54,16 +35,6 @@ module Yaoc
54
35
 
55
36
  module ClassMethods
56
37
 
57
- def converter_proc(to, from, deferred=false)
58
- -> (to_convert, result){
59
- get_value_with = ->{
60
- to_convert.public_send(fetcher, from)
61
- }
62
-
63
- fill_result_from_proc(result, to, get_value_with, deferred)
64
- }
65
- end
66
-
67
38
  def mapping_strategy=(new_strat)
68
39
  @mapping_strategy = new_strat
69
40
  end
@@ -74,7 +45,7 @@ module Yaoc
74
45
 
75
46
  def map(to: nil, from: to, converter: nil, lazy_loading: false)
76
47
  class_private_module(:Mapping).tap do |mod|
77
- method_implementation = converter || converter_proc(to, from, lazy_loading)
48
+ method_implementation = TransformationCommand.create(to: to, from: from, deferred: lazy_loading, conversion_proc: converter)
78
49
 
79
50
  mod.send :define_method, "map_#{"%04d" %[converter_methods.count]}_#{from}_to_#{to}".to_sym, method_implementation
80
51
  include mod
@@ -105,5 +76,6 @@ module Yaoc
105
76
  end
106
77
 
107
78
  end
79
+
108
80
  end
109
81
  end
@@ -6,16 +6,20 @@ module Yaoc
6
6
  apply_commands!
7
7
  end
8
8
 
9
- def rule(to: nil, from: to, converter: nil,
9
+ def rule(to: nil,
10
+ from: to,
11
+ converter: nil,
10
12
  reverse_to: from,
11
13
  reverse_from: to,
12
14
  reverse_converter: nil,
13
15
  object_converter: nil,
16
+ reverse_object_converter: object_converter,
14
17
  is_collection: nil,
15
18
  lazy_loading: nil,
16
19
  reverse_lazy_loading: lazy_loading)
17
20
 
18
21
  object_converter = Array(object_converter)
22
+ reverse_object_converter = Array(reverse_object_converter)
19
23
 
20
24
  converter_builder.rule(
21
25
  to: to,
@@ -30,7 +34,7 @@ module Yaoc
30
34
  to: reverse_to,
31
35
  from: reverse_from,
32
36
  converter: reverse_converter,
33
- object_converter: object_converter.map(&:reverse_converter),
37
+ object_converter: reverse_object_converter.map(&:reverse_converter),
34
38
  is_collection: is_collection,
35
39
  lazy_loading: reverse_lazy_loading
36
40
  )
@@ -51,6 +55,11 @@ module Yaoc
51
55
  def reverse_strategy(new_strategy)
52
56
  reverse_converter_builder.strategy = new_strategy
53
57
  end
58
+
59
+ def noop
60
+ ->(_, result){ result }
61
+ end
62
+
54
63
  end
55
64
 
56
65
  class ObjectMapper
@@ -0,0 +1,53 @@
1
+ module Yaoc
2
+ class TransformationCommand
3
+
4
+ protected
5
+ attr_accessor :to, :from, :fetcher , :proc, :value_fetcher_proc
6
+
7
+ public
8
+
9
+ def self.deferred_source
10
+ TransformationDeferredCommand
11
+ end
12
+
13
+ def self.default_source
14
+ TransformationCommand
15
+ end
16
+
17
+ def self.create(to: nil, from: nil, deferred: false, conversion_proc: nil, fetcher_proc: nil)
18
+ # will be executed in mapper object instance context later through :define_method
19
+ tc_source = deferred ? deferred_source : default_source
20
+
21
+ -> (to_convert, result){
22
+ tc_source.new(to: to, from: from, fetch_method: fetcher, conversion_proc: conversion_proc, fetcher_proc: fetcher_proc).call(to_convert, result)
23
+ }
24
+ end
25
+
26
+ def self.fill_result_with_value(result, key, value)
27
+ result.tap{|taped_result| taped_result[key] = value}
28
+ end
29
+
30
+ def initialize(to: nil, from: nil, fetch_method: nil, conversion_proc: nil, fetcher_proc: nil)
31
+ self.to = to
32
+ self.from = from
33
+ self.proc = conversion_proc
34
+ self.fetcher = fetch_method
35
+ self.value_fetcher_proc = fetcher_proc || ->(to_convert, fetcher, from){ to_convert.public_send(fetcher, from)}
36
+ end
37
+
38
+ def call(to_convert, result)
39
+
40
+ unless proc.nil?
41
+ instance_exec(to_convert, result, &proc)
42
+ else
43
+ TransformationCommand.fill_result_with_value(result, to, value(to_convert))
44
+ end
45
+
46
+ end
47
+
48
+ def value(to_convert)
49
+ value_fetcher_proc.call(to_convert, fetcher, from)
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,17 @@
1
+ module Yaoc
2
+ class TransformationDeferredCommand < TransformationCommand
3
+
4
+ def value(time_saved_to_convert)
5
+ proc = ->{
6
+ value_fetcher_proc.call(time_saved_to_convert, fetcher, from)
7
+ }
8
+
9
+ TransformationDeferredCommand.deferrer_strategy(proc)
10
+ end
11
+
12
+ def self.deferrer_strategy(proc)
13
+ Yaoc::Helper::ToProcDelegator.new(proc)
14
+ end
15
+
16
+ end
17
+ end
data/lib/yaoc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Yaoc
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -12,8 +12,8 @@ feature "Map objects", %q{
12
12
  fetcher :public_send
13
13
  reverse_fetcher :public_send
14
14
  rule to: :name,
15
- converter: ->(source, result){ fill_result_with_value(result, :name, "#{source[:name]} Hello World") },
16
- reverse_converter: ->(source, result){ fill_result_with_value(result, :name, source.name) }
15
+ converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :name, "#{source[:name]} Hello World") },
16
+ reverse_converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :name, source.name) }
17
17
  rule to: :role, from: :fullrolename
18
18
  rule to: :id
19
19
  rule to: [:foo, :bar]
@@ -49,6 +49,7 @@ feature "Map objects reusing other existing converters", %q{
49
49
  rule to: :roles,
50
50
  from: :o_roles,
51
51
  object_converter: other_converter,
52
+ reverse_object_converter: other_converter,
52
53
  is_collection: is_col
53
54
  end
54
55
  end
@@ -161,6 +161,17 @@ describe Yaoc::ConverterBuilder do
161
161
  lazy_loading: true
162
162
  end
163
163
  end
164
+
165
+ it "supports a do nothing" do
166
+ expected_args = default_map_args.clone.merge({converter: kind_of(Proc)})
167
+
168
+ expect(converter_class).to receive(:map).ordered.with(expected_args)
169
+
170
+ subject.add_mapping do
171
+ rule to: :id,
172
+ converter: noop
173
+ end
174
+ end
164
175
  end
165
176
 
166
177
  describe "#converter" do
@@ -181,4 +192,10 @@ describe Yaoc::ConverterBuilder do
181
192
  end
182
193
  end
183
194
 
195
+ describe "#noop" do
196
+ it "returns the input" do
197
+ expect(subject.noop.call(:some_thing, :expected_value)).to eq :expected_value
198
+ end
199
+ end
200
+
184
201
  end
@@ -41,6 +41,12 @@ describe Yaoc::Helper::ToProcDelegator do
41
41
 
42
42
  end
43
43
 
44
+ describe '#class' do
45
+ it 'is the lazy loaded object class' do
46
+ expect(subject.class).to eq Array
47
+ end
48
+ end
49
+
44
50
  describe '#nil?' do
45
51
  it "returns true when delegate value is nil" do
46
52
  subject = Yaoc::Helper::ToProcDelegator.new(->{nil})
@@ -52,4 +58,29 @@ describe Yaoc::Helper::ToProcDelegator do
52
58
  end
53
59
  end
54
60
 
61
+ describe '#_initialisation_proc_loaded?' do
62
+ it "returns true, when __getobj__ was accessed" do
63
+ expect(subject._initialisation_proc_loaded?).to be_falsy
64
+ subject.__getobj__
65
+ expect(subject._initialisation_proc_loaded?).to be_truthy
66
+ end
67
+ end
68
+
69
+ describe '_needs_conversion?' do
70
+ it 'returns true when the object was loaded and __getobj__ is not nil' do
71
+ subject.__getobj__
72
+ expect(subject._needs_conversion?).to be_truthy
73
+ end
74
+
75
+ it 'returns false when the object was not' do
76
+ expect(subject._needs_conversion?).to be_falsy
77
+ end
78
+
79
+ it 'returns false when the object was loaded but is nil' do
80
+ subject.__getobj__
81
+ subject.__setobj__(nil)
82
+ expect(subject._needs_conversion?).to be_falsy
83
+ end
84
+ end
85
+
55
86
  end
@@ -32,31 +32,11 @@ describe Yaoc::MappingBase do
32
32
  {:foo=>:my_to_convert, :bar=>:my_result}]
33
33
  end
34
34
 
35
- it "uses my converter when provided" do
35
+ it "delegates to TransformationCommand.create" do
36
+ expect(Yaoc::TransformationCommand).to receive(:create).with(to: :bar, from: :foo, deferred: false, conversion_proc: kind_of(Proc)).and_return(->(*){})
36
37
  subject.map(to: :bar, from: :foo, converter: ->(*){})
37
-
38
- expect(subject.new(:my_to_convert).call()).to eq [nil]
39
- end
40
-
41
- it 'supports deferred mappings' do
42
- subject.map(to: :bar, from: :foo, lazy_loading: true)
43
- object_to_convert = {foo: [:my_result]}
44
-
45
- expect(object_to_convert).not_to receive :fetch
46
-
47
- subject.new(object_to_convert).call()
48
38
  end
49
39
 
50
- it "returns results for deferred mappings" do
51
- subject.map(to: :bar, from: :foo, lazy_loading: true)
52
- object_to_convert = double("object_to_convert")
53
-
54
- result = subject.new(object_to_convert).call()
55
-
56
- expect(object_to_convert).to receive(:fetch).with(:foo).and_return([:my_result])
57
-
58
- expect(result.first[:bar].first).to eq :my_result
59
- end
60
40
  end
61
41
 
62
42
  describe "#converter_methods" do
@@ -88,6 +88,29 @@ describe Yaoc::ObjectMapper do
88
88
  end
89
89
  end
90
90
 
91
+ it "allows to use another converter as reverse converter" do
92
+ reverse_converter_double = double("reverse converter")
93
+
94
+ expected_params = expected_default_params.merge(
95
+ object_converter: [],
96
+ )
97
+
98
+ expected_params_reverse = expected_default_params.merge(
99
+ object_converter: [reverse_converter_double]
100
+ )
101
+
102
+
103
+ expect(converter_builder).to receive(:rule).with(expected_params)
104
+ expect(reverse_converter_builder).to receive(:rule).with(expected_params_reverse)
105
+
106
+ expect(reverse_converter_double).to receive(:reverse_converter).and_return(reverse_converter_double)
107
+
108
+ subject.add_mapping do
109
+ rule to: :id,
110
+ reverse_object_converter: reverse_converter_double
111
+ end
112
+ end
113
+
91
114
  it "accepts a reverse mapping for from and to" do
92
115
  expected_params = expected_default_params.merge(
93
116
  to: :id_r,
@@ -207,4 +230,10 @@ describe Yaoc::ObjectMapper do
207
230
 
208
231
  end
209
232
 
233
+ describe "#noop" do
234
+ it "returns the input" do
235
+ expect(subject.noop.call(:some_thing, :expected_value)).to eq :expected_value
236
+ end
237
+ end
238
+
210
239
  end
@@ -32,7 +32,7 @@ describe Yaoc::Strategies::ToArrayMapping do
32
32
 
33
33
  it "uses my converter proc" do
34
34
  subject.map(to: 0, from: :id)
35
- subject.map(to: 3, from: :fullname, converter: ->(source, result){ fill_result_with_value(result, 3, "#{source.fetch(:name)} Hello World") })
35
+ subject.map(to: 3, from: :fullname, converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, 3, "#{source.fetch(:name)} Hello World") })
36
36
 
37
37
  ext_expectation = expected_array.clone
38
38
  ext_expectation[3] = "#{ext_expectation[1]} Hello World"
@@ -41,7 +41,7 @@ describe Yaoc::Strategies::ToHashMapping do
41
41
 
42
42
  it "uses my converter proc" do
43
43
  subject.map(to: :id)
44
- subject.map(to: :name, from: :fullname, converter: ->(source, result){ fill_result_with_value(result, :name, source.fetch(:name) + " Hello World") })
44
+ subject.map(to: :name, from: :fullname, converter: ->(source, result){ Yaoc::TransformationCommand.fill_result_with_value(result, :name, source.fetch(:name) + " Hello World") })
45
45
 
46
46
  ext_expectation = expected_hash.clone
47
47
  ext_expectation[:name] += " Hello World"
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Yaoc::TransformationCommand do
4
+ subject{
5
+ Yaoc::TransformationCommand.new(to: :id, from: :name, fetch_method: :fetch)
6
+ }
7
+
8
+ let(:source){
9
+ {name: 'my_name'}
10
+ }
11
+
12
+ let(:result){
13
+ {}
14
+ }
15
+
16
+ describe '.create' do
17
+ subject{
18
+ Yaoc::TransformationCommand
19
+ }
20
+
21
+ it 'creates a proc' do
22
+ expect(subject.create(to: :to, from: :from)).to respond_to :call
23
+ end
24
+
25
+ it 'uses default_source when deferred is flase' do
26
+ expect(subject).to receive :default_source
27
+ subject.create(to: :to, from: :from)
28
+ end
29
+
30
+ it 'uses default_source when deferred is flase' do
31
+ expect(subject).to receive :deferred_source
32
+ subject.create(to: :to, from: :from, deferred: true)
33
+ end
34
+
35
+ end
36
+
37
+ describe '#call' do
38
+
39
+ it 'transfers data from source to result' do
40
+ subject.call(source, result)
41
+ expect(result[:id]).to eq source[:name]
42
+ end
43
+
44
+ it 'add the fetched value to result' do
45
+ new_result = subject.call(source, result)
46
+ expect(new_result).to eq result
47
+ end
48
+
49
+ it 'returns a result' do
50
+ new_result = subject.call(source, result)
51
+ expect(new_result).to eq result
52
+ end
53
+
54
+ end
55
+
56
+ describe '#value' do
57
+ subject {
58
+ Yaoc::TransformationCommand.new(to: :id, from: :name, fetch_method: :fetch, fetcher_proc: value_fetcher)
59
+ }
60
+
61
+ let(:value_fetcher) { double('value fetcher proc')}
62
+
63
+ it 'uses a given proc for value fetching' do
64
+ expect(value_fetcher).to receive(:call).with(source, :fetch, :name).and_return(:some_thing_to_store)
65
+
66
+ expect(subject.value(source)).to eq :some_thing_to_store
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Yaoc::TransformationDeferredCommand do
4
+ subject{
5
+ Yaoc::TransformationDeferredCommand.new(to: :id, from: :name, fetch_method: :fetch)
6
+ }
7
+
8
+ let(:source){
9
+ {name: 'my_name'}
10
+ }
11
+
12
+ let(:result){
13
+ {}
14
+ }
15
+
16
+ describe '#value' do
17
+ let(:value_fetcher) { double('value fetcher proc')}
18
+
19
+ it 'deferres access to source object' do
20
+ expect(source).not_to receive :fetch
21
+
22
+ subject.value(source)
23
+ end
24
+
25
+ it 'access to source object, when data is needed' do
26
+ expect(source).to receive :fetch
27
+
28
+ subject.value(source).to_s
29
+ end
30
+
31
+ end
32
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dieter Späth
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-28 00:00:00.000000000 Z
11
+ date: 2014-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -222,6 +222,8 @@ files:
222
222
  - lib/yaoc/object_mapper.rb
223
223
  - lib/yaoc/strategies/to_array_mapping.rb
224
224
  - lib/yaoc/strategies/to_hash_mapping.rb
225
+ - lib/yaoc/transformation_command.rb
226
+ - lib/yaoc/transformation_deferred_command.rb
225
227
  - lib/yaoc/version.rb
226
228
  - spec/acceptance/fill_existing_objects_spec.rb
227
229
  - spec/acceptance/map_objects_spec.rb
@@ -239,6 +241,8 @@ files:
239
241
  - spec/unit/lib/yaoc/object_mapper_spec.rb
240
242
  - spec/unit/lib/yaoc/strategies/to_array_mapping_spec.rb
241
243
  - spec/unit/lib/yaoc/strategies/to_hash_mapping_spec.rb
244
+ - spec/unit/lib/yaoc/transformation_command_spec.rb
245
+ - spec/unit/lib/yaoc/transformation_deferred_command_spec.rb
242
246
  - yaoc.gemspec
243
247
  homepage: https://github.com/slowjack2k/yaoc
244
248
  licenses:
@@ -281,3 +285,5 @@ test_files:
281
285
  - spec/unit/lib/yaoc/object_mapper_spec.rb
282
286
  - spec/unit/lib/yaoc/strategies/to_array_mapping_spec.rb
283
287
  - spec/unit/lib/yaoc/strategies/to_hash_mapping_spec.rb
288
+ - spec/unit/lib/yaoc/transformation_command_spec.rb
289
+ - spec/unit/lib/yaoc/transformation_deferred_command_spec.rb