representable 3.0.0 → 3.1.0

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.
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