representable 3.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +17 -0
  3. data/CHANGES.md +25 -0
  4. data/Gemfile +4 -12
  5. data/LICENSE +1 -1
  6. data/README.md +6 -6
  7. data/Rakefile +1 -6
  8. data/TODO +1 -3
  9. data/TODO-4.0.md +72 -0
  10. data/lib/representable.rb +19 -25
  11. data/lib/representable/binding.rb +32 -12
  12. data/lib/representable/cached.rb +1 -1
  13. data/lib/representable/coercion.rb +8 -6
  14. data/lib/representable/config.rb +13 -3
  15. data/lib/representable/debug.rb +23 -15
  16. data/lib/representable/declarative.rb +12 -7
  17. data/lib/representable/decorator.rb +1 -1
  18. data/lib/representable/definition.rb +7 -3
  19. data/lib/representable/deserializer.rb +5 -4
  20. data/lib/representable/for_collection.rb +1 -1
  21. data/lib/representable/hash.rb +9 -2
  22. data/lib/representable/hash/allow_symbols.rb +9 -11
  23. data/lib/representable/hash/binding.rb +1 -0
  24. data/lib/representable/hash/collection.rb +4 -2
  25. data/lib/representable/hash_methods.rb +3 -2
  26. data/lib/representable/insert.rb +1 -1
  27. data/lib/representable/json.rb +8 -7
  28. data/lib/representable/json/collection.rb +3 -0
  29. data/lib/representable/object.rb +1 -1
  30. data/lib/representable/object/binding.rb +5 -1
  31. data/lib/representable/option.rb +19 -0
  32. data/lib/representable/pipeline.rb +3 -2
  33. data/lib/representable/pipeline_factories.rb +4 -2
  34. data/lib/representable/populator.rb +1 -1
  35. data/lib/representable/represent.rb +1 -0
  36. data/lib/representable/serializer.rb +3 -2
  37. data/lib/representable/version.rb +1 -1
  38. data/lib/representable/virtus_coercion.rb +38 -0
  39. data/lib/representable/xml.rb +12 -10
  40. data/lib/representable/xml/binding.rb +19 -13
  41. data/lib/representable/xml/namespace.rb +122 -0
  42. data/lib/representable/yaml.rb +6 -2
  43. data/lib/representable/yaml/binding.rb +1 -0
  44. data/representable.gemspec +8 -9
  45. data/test/as_test.rb +7 -7
  46. data/test/binding_test.rb +14 -14
  47. data/test/cached_test.rb +59 -49
  48. data/test/class_test.rb +9 -9
  49. data/test/coercion_test.rb +33 -22
  50. data/test/config/inherit_test.rb +14 -14
  51. data/test/config_test.rb +20 -20
  52. data/test/decorator_scope_test.rb +4 -4
  53. data/test/decorator_test.rb +33 -20
  54. data/test/default_test.rb +8 -8
  55. data/test/defaults_options_test.rb +3 -3
  56. data/test/definition_test.rb +38 -40
  57. data/test/{example.rb → examples/example.rb} +0 -1
  58. data/test/examples/object.rb +1 -5
  59. data/test/exec_context_test.rb +8 -8
  60. data/test/features_test.rb +6 -6
  61. data/test/filter_test.rb +8 -8
  62. data/test/for_collection_test.rb +10 -10
  63. data/test/generic_test.rb +13 -13
  64. data/test/getter_setter_test.rb +5 -5
  65. data/test/hash_bindings_test.rb +1 -1
  66. data/test/hash_test.rb +45 -23
  67. data/test/heritage_test.rb +16 -13
  68. data/test/if_test.rb +9 -9
  69. data/test/include_exclude_test.rb +14 -14
  70. data/test/inherit_test.rb +18 -18
  71. data/test/inline_test.rb +24 -24
  72. data/test/instance_test.rb +31 -31
  73. data/test/is_representable_test.rb +10 -10
  74. data/test/json_test.rb +29 -7
  75. data/test/lonely_test.rb +31 -31
  76. data/test/nested_test.rb +13 -13
  77. data/test/object_test.rb +9 -9
  78. data/test/option_test.rb +36 -0
  79. data/test/parse_pipeline_test.rb +3 -5
  80. data/test/pipeline_test.rb +50 -50
  81. data/test/populator_test.rb +18 -18
  82. data/test/prepare_test.rb +4 -4
  83. data/test/private_options_test.rb +2 -2
  84. data/test/reader_writer_test.rb +2 -2
  85. data/test/render_nil_test.rb +2 -2
  86. data/test/represent_test.rb +14 -14
  87. data/test/representable_test.rb +34 -36
  88. data/test/schema_test.rb +8 -11
  89. data/test/serialize_deserialize_test.rb +2 -2
  90. data/test/skip_test.rb +14 -14
  91. data/test/stringify_hash_test.rb +3 -3
  92. data/test/test_helper.rb +26 -14
  93. data/test/uncategorized_test.rb +10 -10
  94. data/test/user_options_test.rb +4 -4
  95. data/test/virtus_coercion_test.rb +52 -0
  96. data/test/wrap_test.rb +19 -19
  97. data/test/xml_bindings_test.rb +0 -4
  98. data/test/xml_namespace_test.rb +186 -0
  99. data/test/xml_test.rb +103 -43
  100. data/test/yaml_test.rb +51 -26
  101. metadata +101 -39
  102. data/.travis.yml +0 -7
  103. data/lib/representable/TODO.getting_serious +0 -11
  104. data/lib/representable/autoload.rb +0 -10
  105. data/test/mongoid_test.rb +0 -31
data/test/object_test.rb CHANGED
@@ -18,23 +18,23 @@ class ObjectTest < MiniTest::Spec
18
18
  # TODO: collection
19
19
  end
20
20
 
21
- let (:source) { Song.new("The King Is Dead", Album.new("Ruiner", [Song.new("In Vino Veritas II")])) }
22
- let (:target) { Song.new }
21
+ let(:source) { Song.new("The King Is Dead", Album.new("Ruiner", [Song.new("In Vino Veritas II")])) }
22
+ let(:target) { Song.new }
23
23
 
24
24
  it do
25
25
  representer.prepare(target).from_object(source)
26
26
 
27
- target.title.must_equal "The King Is Dead"
28
- target.album.name.must_equal "RUINER"
29
- target.album.songs[0].title.must_equal "IN VINO VERITAS II"
27
+ _(target.title).must_equal "The King Is Dead"
28
+ _(target.album.name).must_equal "RUINER"
29
+ _(target.album.songs[0].title).must_equal "IN VINO VERITAS II"
30
30
  end
31
31
 
32
32
  # ignore nested object when nil
33
33
  it do
34
34
  representer.prepare(Song.new("The King Is Dead")).from_object(Song.new)
35
35
 
36
- target.title.must_equal nil # scalar property gets overridden when nil.
37
- target.album.must_equal nil # nested property stays nil.
36
+ _(target.title).must_be_nil # scalar property gets overridden when nil.
37
+ _(target.album).must_be_nil # nested property stays nil.
38
38
  end
39
39
 
40
40
  # to_object
@@ -53,8 +53,8 @@ class ObjectTest < MiniTest::Spec
53
53
 
54
54
  it do
55
55
  representer.prepare(source).to_object
56
- source.album.name.must_equal "Live"
57
- source.album.songs[0].title.must_equal 1
56
+ _(source.album.name).must_equal "Live"
57
+ _(source.album.songs[0].title).must_equal 1
58
58
  end
59
59
  end
60
60
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class OptionTest < MiniTest::Spec
6
+ class Callable
7
+ include Uber::Callable
8
+ def call(*); "callable" end
9
+ end
10
+
11
+ class MyRepresenter < Representable::Decorator
12
+ include Representable::JSON
13
+
14
+ property :static, getter: "static"
15
+ property :symbol, getter: :symbol
16
+ property :proc, getter: ->(*) { "proc" }
17
+ property :callable, getter: Callable.new
18
+ end
19
+
20
+ Album = Struct.new(:static) do
21
+ def symbol(*); "symbol" end
22
+ end
23
+
24
+ let(:album_representer) { MyRepresenter.new(Album.new) }
25
+
26
+ describe ::Representable::Option do
27
+ it "supports all types of callables (method, proc, static etc)" do
28
+ _(album_representer.to_hash).must_equal({
29
+ "static" => "static",
30
+ "symbol" => "symbol",
31
+ "proc" => "proc",
32
+ "callable" => "callable",
33
+ })
34
+ end
35
+ end
36
+ end
@@ -22,12 +22,12 @@ class ParsePipelineTest < MiniTest::Spec
22
22
 
23
23
  it do
24
24
  representer.new(album = Album.new).from_hash("songs"=>nil)
25
- album.songs.must_equal []
25
+ _(album.songs).must_equal []
26
26
  end
27
27
 
28
28
  it do
29
29
  representer.new(album = Album.new).from_hash("songs"=>[{"title" => "Business Conduct"}])
30
- album.songs.must_equal [Song.new("Business Conduct")]
30
+ _(album.songs).must_equal [Song.new("Business Conduct")]
31
31
  end
32
32
  end
33
33
 
@@ -45,7 +45,6 @@ class ParsePipelineTest < MiniTest::Spec
45
45
  end
46
46
 
47
47
  def instance!(*options)
48
- puts "@@@@@ #{options.inspect}"
49
48
  Song.new
50
49
  end
51
50
 
@@ -58,7 +57,6 @@ class ParsePipelineTest < MiniTest::Spec
58
57
  skip "TODO: implement :parse_pipeline and :render_pipeline, and before/after/replace semantics"
59
58
  album = Album.new
60
59
  Representer.new(album).from_hash({"artist"=>{"email"=>"yo"}, "songs"=>[{"title"=>"Affliction"}, {"title"=>"Dream Beater"}]})
61
- album.songs.must_equal([Song.new("Affliction"), Song.new("Dream Beater")])
62
- puts album.inspect
60
+ _(album.songs).must_equal([Song.new("Affliction"), Song.new("Dream Beater")])
63
61
  end
64
62
  end
@@ -24,15 +24,15 @@ class PipelineTest < MiniTest::Spec
24
24
  AssignFragment = ->(input, options) { options[:fragment] = input }
25
25
 
26
26
  it "linear" do
27
- P[SkipParse, Setter].("doc", {fragment: 1}).must_equal "Setter(doc)"
27
+ _(P[SkipParse, Setter].("doc", {fragment: 1})).must_equal "Setter(doc)"
28
28
 
29
29
 
30
30
  # parse style.
31
- P[AssignFragment, SkipParse, CreateObject, Prepare].("Bla", {}).must_equal "Prepare(#<OpenStruct>)"
31
+ _(P[AssignFragment, SkipParse, CreateObject, Prepare].("Bla", {})).must_equal "Prepare(#<OpenStruct>)"
32
32
 
33
33
 
34
34
  # render style.
35
- P[Getter, StopOnNil, SkipRender, Prepare, Setter].(nil, {}).
35
+ _(P[Getter, StopOnNil, SkipRender, Prepare, Setter].(nil, {})).
36
36
  must_equal "Setter(Prepare(Yo))"
37
37
 
38
38
  # pipeline = Representable::Pipeline[SkipParse , SetResult, ModifyResult]
@@ -46,8 +46,8 @@ class PipelineTest < MiniTest::Spec
46
46
 
47
47
 
48
48
  pipeline = Representable::Pipeline[SkipParse, Stopping, Prepare]
49
- pipeline.(nil, fragment: "oy!").must_equal "Prepare()"
50
- pipeline.(nil, fragment: "stop!").must_equal Representable::Pipeline::Stop
49
+ _(pipeline.(nil, fragment: "oy!")).must_equal "Prepare()"
50
+ _(pipeline.(nil, fragment: "stop!")).must_equal Representable::Pipeline::Stop
51
51
  end
52
52
 
53
53
  describe "Collect" do
@@ -55,11 +55,11 @@ class PipelineTest < MiniTest::Spec
55
55
  Add = ->(input, options) { "#{input}+" }
56
56
  let(:pipeline) { R::Collect[Reverse, Add] }
57
57
 
58
- it { pipeline.(["yo!", "oy!"], {}).must_equal ["!oy+", "!yo+"] }
58
+ it { _(pipeline.(["yo!", "oy!"], {})).must_equal ["!oy+", "!yo+"] }
59
59
 
60
60
  describe "Pipeline with Collect" do
61
61
  let(:pipeline) { P[Reverse, R::Collect[Reverse, Add]] }
62
- it { pipeline.(["yo!", "oy!"], {}).must_equal ["!yo+", "!oy+"] }
62
+ it { _(pipeline.(["yo!", "oy!"], {})).must_equal ["!yo+", "!oy+"] }
63
63
  end
64
64
  end
65
65
 
@@ -68,7 +68,7 @@ class PipelineTest < MiniTest::Spec
68
68
 
69
69
  ######### scalar property
70
70
 
71
- let (:title) {
71
+ let(:title) {
72
72
  dfn = R::Definition.new(:title)
73
73
 
74
74
  R::Hash::Binding.new(dfn)
@@ -76,26 +76,26 @@ class PipelineTest < MiniTest::Spec
76
76
 
77
77
  it "rendering scalar property" do
78
78
  doc = {}
79
- P[
79
+ _(P[
80
80
  R::GetValue,
81
81
  R::StopOnSkipable,
82
82
  R::AssignName,
83
83
  R::WriteFragment
84
- ].(nil, {represented: Song.new("Lime Green"), binding: title, doc: doc}).must_equal "Lime Green"
84
+ ].(nil, {represented: Song.new("Lime Green"), binding: title, doc: doc})).must_equal "Lime Green"
85
85
 
86
- doc.must_equal({"title"=>"Lime Green"})
86
+ _(doc).must_equal({"title"=>"Lime Green"})
87
87
  end
88
88
 
89
89
  it "parsing scalar property" do
90
- P[
90
+ _(P[
91
91
  R::AssignName,
92
92
  R::ReadFragment,
93
93
  R::StopOnNotFound,
94
94
  R::OverwriteOnNil,
95
95
  # R::SkipParse,
96
96
  R::SetValue,
97
- ].extend(P::Debug).(doc={"title"=>"Eruption"}, {represented: song=Song.new("Lime Green"), binding: title, doc: doc}).must_equal "Eruption"
98
- song.title.must_equal "Eruption"
97
+ ].extend(P::Debug).(doc={"title"=>"Eruption"}, {represented: song=Song.new("Lime Green"), binding: title, doc: doc})).must_equal "Eruption"
98
+ _(song.title).must_equal "Eruption"
99
99
  end
100
100
 
101
101
 
@@ -105,17 +105,17 @@ class PipelineTest < MiniTest::Spec
105
105
  property :name
106
106
  end
107
107
 
108
- let (:artist) {
108
+ let(:artist) {
109
109
  dfn = R::Definition.new(:artist, extend: ArtistRepresenter, class: Artist)
110
110
 
111
111
  R::Hash::Binding.new(dfn)
112
112
  }
113
113
 
114
- let (:song_model) { Song.new("Lime Green", Artist.new("Diesel Boy")) }
114
+ let(:song_model) { Song.new("Lime Green", Artist.new("Diesel Boy")) }
115
115
 
116
116
  it "rendering typed property" do
117
117
  doc = {}
118
- P[
118
+ _(P[
119
119
  R::GetValue,
120
120
  R::StopOnSkipable,
121
121
  R::StopOnNil,
@@ -123,13 +123,13 @@ class PipelineTest < MiniTest::Spec
123
123
  R::Serialize,
124
124
  R::AssignName,
125
125
  R::WriteFragment
126
- ].extend(P::Debug).(nil, {represented: song_model, binding: artist, doc: doc, options: {}}).must_equal({"name" => "Diesel Boy"})
126
+ ].extend(P::Debug).(nil, {represented: song_model, binding: artist, doc: doc, options: {}})).must_equal({"name" => "Diesel Boy"})
127
127
 
128
- doc.must_equal({"artist"=>{"name"=>"Diesel Boy"}})
128
+ _(doc).must_equal({"artist"=>{"name"=>"Diesel Boy"}})
129
129
  end
130
130
 
131
131
  it "parsing typed property" do
132
- P[
132
+ _(P[
133
133
  R::AssignName,
134
134
  R::ReadFragment,
135
135
  R::StopOnNotFound,
@@ -139,21 +139,21 @@ class PipelineTest < MiniTest::Spec
139
139
  R::Decorate,
140
140
  R::Deserialize,
141
141
  R::SetValue,
142
- ].extend(P::Debug).(doc={"artist"=>{"name"=>"Doobie Brothers"}}, {represented: song_model, binding: artist, doc: doc, options: {}}).must_equal model=Artist.new("Doobie Brothers")
143
- song_model.artist.must_equal model
142
+ ].extend(P::Debug).(doc={"artist"=>{"name"=>"Doobie Brothers"}}, {represented: song_model, binding: artist, doc: doc, options: {}})).must_equal model=Artist.new("Doobie Brothers")
143
+ _(song_model.artist).must_equal model
144
144
  end
145
145
 
146
146
 
147
147
  ######### collection :ratings
148
148
 
149
- let (:ratings) {
149
+ let(:ratings) {
150
150
  dfn = R::Definition.new(:ratings, collection: true, skip_render: ->(*) { false })
151
151
 
152
152
  R::Hash::Binding::Collection.new(dfn)
153
153
  }
154
154
  it "render scalar collection" do
155
155
  doc = {}
156
- P[
156
+ _(P[
157
157
  R::GetValue,
158
158
  R::StopOnSkipable,
159
159
  R::Collect[
@@ -161,20 +161,20 @@ class PipelineTest < MiniTest::Spec
161
161
  ],
162
162
  R::AssignName,
163
163
  R::WriteFragment
164
- ].extend(P::Debug).(nil, {represented: Album.new([1,2,3]), binding: ratings, doc: doc, options: {}}).must_equal([1,2,3])
164
+ ].extend(P::Debug).(nil, {represented: Album.new([1,2,3]), binding: ratings, doc: doc, options: {}})).must_equal([1,2,3])
165
165
 
166
- doc.must_equal({"ratings"=>[1,2,3]})
166
+ _(doc).must_equal({"ratings"=>[1,2,3]})
167
167
  end
168
168
 
169
169
  ######### collection :songs, extend: SongRepresenter
170
- let (:artists) {
170
+ let(:artists) {
171
171
  dfn = R::Definition.new(:artists, collection: true, extend: ArtistRepresenter, class: Artist)
172
172
 
173
173
  R::Hash::Binding::Collection.new(dfn)
174
174
  }
175
175
  it "render typed collection" do
176
176
  doc = {}
177
- P[
177
+ _(P[
178
178
  R::GetValue,
179
179
  R::StopOnSkipable,
180
180
  R::Collect[
@@ -183,16 +183,16 @@ class PipelineTest < MiniTest::Spec
183
183
  ],
184
184
  R::AssignName,
185
185
  R::WriteFragment
186
- ].extend(P::Debug).(nil, {represented: Album.new(nil, [Artist.new("Diesel Boy"), Artist.new("Van Halen")]), binding: artists, doc: doc, options: {}}).must_equal([{"name"=>"Diesel Boy"}, {"name"=>"Van Halen"}])
186
+ ].extend(P::Debug).(nil, {represented: Album.new(nil, [Artist.new("Diesel Boy"), Artist.new("Van Halen")]), binding: artists, doc: doc, options: {}})).must_equal([{"name"=>"Diesel Boy"}, {"name"=>"Van Halen"}])
187
187
 
188
- doc.must_equal({"artists"=>[{"name"=>"Diesel Boy"}, {"name"=>"Van Halen"}]})
188
+ _(doc).must_equal({"artists"=>[{"name"=>"Diesel Boy"}, {"name"=>"Van Halen"}]})
189
189
  end
190
190
 
191
- let (:album_model) { Album.new(nil, [Artist.new("Diesel Boy"), Artist.new("Van Halen")]) }
191
+ let(:album_model) { Album.new(nil, [Artist.new("Diesel Boy"), Artist.new("Van Halen")]) }
192
192
 
193
193
  it "parse typed collection" do
194
194
  doc = {"artists"=>[{"name"=>"Diesel Boy"}, {"name"=>"Van Halen"}]}
195
- P[
195
+ _(P[
196
196
  R::AssignName,
197
197
  R::ReadFragment,
198
198
  R::StopOnNotFound,
@@ -205,51 +205,51 @@ let (:album_model) { Album.new(nil, [Artist.new("Diesel Boy"), Artist.new("Van H
205
205
  R::Deserialize,
206
206
  ],
207
207
  R::SetValue,
208
- ].extend(P::Debug).(doc, {represented: album_model, binding: artists, doc: doc, options: {}}).must_equal([Artist.new("Diesel Boy"), Artist.new("Van Halen")])
208
+ ].extend(P::Debug).(doc, {represented: album_model, binding: artists, doc: doc, options: {}})).must_equal([Artist.new("Diesel Boy"), Artist.new("Van Halen")])
209
209
 
210
- album_model.artists.must_equal([Artist.new("Diesel Boy"), Artist.new("Van Halen")])
210
+ _(album_model.artists).must_equal([Artist.new("Diesel Boy"), Artist.new("Van Halen")])
211
211
  end
212
212
 
213
213
  # TODO: test with arrays, too, not "only" Pipeline instances.
214
214
  describe "#Insert Pipeline[], Function, replace: OldFunction" do
215
- let (:pipeline) { P[R::GetValue, R::StopOnSkipable, R::StopOnNil] }
215
+ let(:pipeline) { P[R::GetValue, R::StopOnSkipable, R::StopOnNil] }
216
216
 
217
217
  it "returns Pipeline instance when passing in Pipeline instance" do
218
- P::Insert.(pipeline, R::Default, replace: R::StopOnSkipable).must_be_instance_of(R::Pipeline)
218
+ _(P::Insert.(pipeline, R::Default, replace: R::StopOnSkipable)).must_be_instance_of(R::Pipeline)
219
219
  end
220
220
 
221
221
  it "replaces if exists" do
222
222
  # pipeline.insert!(R::Default, replace: R::StopOnSkipable)
223
- P::Insert.(pipeline, R::Default, replace: R::StopOnSkipable).must_equal P[R::GetValue, R::Default, R::StopOnNil]
224
- pipeline.must_equal P[R::GetValue, R::StopOnSkipable, R::StopOnNil]
223
+ _(P::Insert.(pipeline, R::Default, replace: R::StopOnSkipable)).must_equal P[R::GetValue, R::Default, R::StopOnNil]
224
+ _(pipeline).must_equal P[R::GetValue, R::StopOnSkipable, R::StopOnNil]
225
225
  end
226
226
 
227
227
  it "replaces Function instance" do
228
228
  pipeline = P[R::Prepare, R::StopOnSkipable, R::StopOnNil]
229
- P::Insert.(pipeline, R::Default, replace: R::Prepare).must_equal P[R::Default, R::StopOnSkipable, R::StopOnNil]
230
- pipeline.must_equal P[R::Prepare, R::StopOnSkipable, R::StopOnNil]
229
+ _(P::Insert.(pipeline, R::Default, replace: R::Prepare)).must_equal P[R::Default, R::StopOnSkipable, R::StopOnNil]
230
+ _(pipeline).must_equal P[R::Prepare, R::StopOnSkipable, R::StopOnNil]
231
231
  end
232
232
 
233
233
  it "does not replace when not existing" do
234
234
  P::Insert.(pipeline, R::Default, replace: R::Prepare)
235
- pipeline.must_equal P[R::GetValue, R::StopOnSkipable, R::StopOnNil]
235
+ _(pipeline).must_equal P[R::GetValue, R::StopOnSkipable, R::StopOnNil]
236
236
  end
237
237
 
238
238
  it "applies on nested Collect" do
239
239
  pipeline = P[R::GetValue, R::Collect[R::GetValue, R::StopOnSkipable], R::StopOnNil]
240
240
 
241
- P::Insert.(pipeline, R::Default, replace: R::StopOnSkipable).extend(P::Debug).inspect.must_equal "Pipeline[GetValue, Collect[GetValue, Default], StopOnNil]"
242
- pipeline.must_equal P[R::GetValue, R::Collect[R::GetValue, R::StopOnSkipable], R::StopOnNil]
241
+ _(P::Insert.(pipeline, R::Default, replace: R::StopOnSkipable).extend(P::Debug).inspect).must_equal "Pipeline[GetValue, Collect[GetValue, Default], StopOnNil]"
242
+ _(pipeline).must_equal P[R::GetValue, R::Collect[R::GetValue, R::StopOnSkipable], R::StopOnNil]
243
243
 
244
244
 
245
- P::Insert.(pipeline, R::Default, replace: R::StopOnNil).extend(P::Debug).inspect.must_equal "Pipeline[GetValue, Collect[GetValue, StopOnSkipable], Default]"
245
+ _(P::Insert.(pipeline, R::Default, replace: R::StopOnNil).extend(P::Debug).inspect).must_equal "Pipeline[GetValue, Collect[GetValue, StopOnSkipable], Default]"
246
246
  end
247
247
 
248
248
  it "applies on nested Collect with Function::CreateObject" do
249
249
  pipeline = P[R::GetValue, R::Collect[R::GetValue, R::CreateObject], R::StopOnNil]
250
250
 
251
- P::Insert.(pipeline, R::Default, replace: R::CreateObject).extend(P::Debug).inspect.must_equal "Pipeline[GetValue, Collect[GetValue, Default], StopOnNil]"
252
- pipeline.must_equal P[R::GetValue, R::Collect[R::GetValue, R::CreateObject], R::StopOnNil]
251
+ _(P::Insert.(pipeline, R::Default, replace: R::CreateObject).extend(P::Debug).inspect).must_equal "Pipeline[GetValue, Collect[GetValue, Default], StopOnNil]"
252
+ _(pipeline).must_equal P[R::GetValue, R::Collect[R::GetValue, R::CreateObject], R::StopOnNil]
253
253
  end
254
254
  end
255
255
 
@@ -257,8 +257,8 @@ let (:album_model) { Album.new(nil, [Artist.new("Diesel Boy"), Artist.new("Van H
257
257
  let(:pipeline) { P[R::GetValue, R::StopOnNil] }
258
258
 
259
259
  it do
260
- P::Insert.(pipeline, R::GetValue, delete: true).extend(P::Debug).inspect.must_equal "Pipeline[StopOnNil]"
261
- pipeline.extend(P::Debug).inspect.must_equal "Pipeline[GetValue, StopOnNil]"
260
+ _(P::Insert.(pipeline, R::GetValue, delete: true).extend(P::Debug).inspect).must_equal "Pipeline[StopOnNil]"
261
+ _(pipeline.extend(P::Debug).inspect).must_equal "Pipeline[GetValue, StopOnNil]"
262
262
  end
263
263
  end
264
264
 
@@ -266,8 +266,8 @@ let (:album_model) { Album.new(nil, [Artist.new("Diesel Boy"), Artist.new("Van H
266
266
  let(:pipeline) { P[R::GetValue, R::Collect[R::GetValue, R::StopOnSkipable], R::StopOnNil] }
267
267
 
268
268
  it do
269
- P::Insert.(pipeline, R::GetValue, delete: true).extend(P::Debug).inspect.must_equal "Pipeline[Collect[StopOnSkipable], StopOnNil]"
270
- pipeline.extend(P::Debug).inspect.must_equal "Pipeline[GetValue, Collect[GetValue, StopOnSkipable], StopOnNil]"
269
+ _(P::Insert.(pipeline, R::GetValue, delete: true).extend(P::Debug).inspect).must_equal "Pipeline[Collect[StopOnSkipable], StopOnNil]"
270
+ _(pipeline.extend(P::Debug).inspect).must_equal "Pipeline[GetValue, Collect[GetValue, StopOnSkipable], StopOnNil]"
271
271
  end
272
272
  end
273
273
  end
@@ -16,11 +16,11 @@ class PopulatorTest < Minitest::Spec
16
16
  end
17
17
  end
18
18
 
19
- let (:album) { Album.new([]) }
19
+ let(:album) { Album.new([]) }
20
20
 
21
21
  it do
22
22
  album.extend(representer).from_hash("songs"=>[{"id"=>1}, {"id"=>2}], "artist"=>{"name"=>"Waste"})
23
- album.inspect.must_equal "#<struct PopulatorTest::Album songs=[#<struct PopulatorTest::Song id=1>, #<struct PopulatorTest::Song id=2>], artist=#<struct PopulatorTest::Artist name=\"Waste\">>"
23
+ _(album.inspect).must_equal "#<struct PopulatorTest::Album songs=[#<struct PopulatorTest::Song id=1>, #<struct PopulatorTest::Song id=2>], artist=#<struct PopulatorTest::Artist name=\"Waste\">>"
24
24
  end
25
25
  end
26
26
 
@@ -37,7 +37,7 @@ class PopulatorFindOrInstantiateTest < Minitest::Spec
37
37
  end
38
38
  end
39
39
 
40
- Composer = Struct.new(:song)
40
+ Composer = Class.new
41
41
  Composer.class_eval do
42
42
  def song=(v)
43
43
  @song = v
@@ -55,22 +55,22 @@ class PopulatorFindOrInstantiateTest < Minitest::Spec
55
55
  end
56
56
  end
57
57
 
58
- let (:album) { Composer.new.extend(representer).extend(Representable::Debug) }
58
+ let(:album) { Composer.new.extend(representer).extend(Representable::Debug) }
59
59
 
60
60
  it "finds by :id and creates new without :id" do
61
61
  album.from_hash({"song"=>{"id" => 1, "title"=>"Resist Stance"}})
62
62
 
63
- album.song.title.must_equal "Resist Stance" # note how title is updated from "Resist Stan"
64
- album.song.id.must_equal 1
65
- album.song.uid.must_equal "abcd" # not changed via populator, indicating this is a formerly "persisted" object.
63
+ _(album.song.title).must_equal "Resist Stance" # note how title is updated from "Resist Stan"
64
+ _(album.song.id).must_equal 1
65
+ _(album.song.uid).must_equal "abcd" # not changed via populator, indicating this is a formerly "persisted" object.
66
66
  end
67
67
 
68
68
  it "creates new without :id" do
69
69
  album.from_hash({"song"=>{"title"=>"Lower"}})
70
70
 
71
- album.song.title.must_equal "Lower"
72
- album.song.id.must_equal nil
73
- album.song.uid.must_equal nil
71
+ _(album.song.title).must_equal "Lower"
72
+ _(album.song.id).must_be_nil
73
+ _(album.song.uid).must_be_nil
74
74
  end
75
75
  end
76
76
 
@@ -82,7 +82,7 @@ class PopulatorFindOrInstantiateTest < Minitest::Spec
82
82
  end
83
83
  end
84
84
 
85
- let (:album) { Struct.new(:songs).new([]).extend(representer) }
85
+ let(:album) { Struct.new(:songs).new([]).extend(representer) }
86
86
 
87
87
  it "finds by :id and creates new without :id" do
88
88
  album.from_hash({"songs"=>[
@@ -90,16 +90,16 @@ class PopulatorFindOrInstantiateTest < Minitest::Spec
90
90
  {"title"=>"Suffer"}
91
91
  ]})
92
92
 
93
- album.songs[0].title.must_equal "Resist Stance" # note how title is updated from "Resist Stan"
94
- album.songs[0].id.must_equal 1
95
- album.songs[0].uid.must_equal "abcd" # not changed via populator, indicating this is a formerly "persisted" object.
93
+ _(album.songs[0].title).must_equal "Resist Stance" # note how title is updated from "Resist Stan"
94
+ _(album.songs[0].id).must_equal 1
95
+ _(album.songs[0].uid).must_equal "abcd" # not changed via populator, indicating this is a formerly "persisted" object.
96
96
 
97
- album.songs[1].title.must_equal "Suffer"
98
- album.songs[1].id.must_equal nil
99
- album.songs[1].uid.must_equal nil
97
+ _(album.songs[1].title).must_equal "Suffer"
98
+ _(album.songs[1].id).must_be_nil
99
+ _(album.songs[1].uid).must_be_nil
100
100
  end
101
101
 
102
102
  # TODO: test with existing collection
103
103
  end
104
104
 
105
- end
105
+ end