representable 2.4.0.rc3 → 2.4.0.rc4

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 (99) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +7 -2
  3. data/Rakefile +6 -0
  4. data/lib/representable.rb +21 -17
  5. data/lib/representable/binding.rb +3 -2
  6. data/lib/representable/definition.rb +1 -1
  7. data/lib/representable/deprecations.rb +31 -5
  8. data/lib/representable/deserializer.rb +24 -34
  9. data/lib/representable/hash/collection.rb +9 -2
  10. data/lib/representable/hash_methods.rb +2 -2
  11. data/lib/representable/parse_strategies.rb +6 -7
  12. data/lib/representable/pipeline.rb +12 -1
  13. data/lib/representable/pipeline_factories.rb +9 -2
  14. data/lib/representable/serializer.rb +3 -3
  15. data/lib/representable/version.rb +1 -1
  16. data/test-with-deprecations/as_test.rb +65 -0
  17. data/test-with-deprecations/benchmarking.rb +83 -0
  18. data/test-with-deprecations/binding_test.rb +46 -0
  19. data/test-with-deprecations/blaaaaaaaa_test.rb +69 -0
  20. data/test-with-deprecations/cached_test.rb +147 -0
  21. data/test-with-deprecations/class_test.rb +119 -0
  22. data/test-with-deprecations/coercion_test.rb +52 -0
  23. data/test-with-deprecations/config/inherit_test.rb +135 -0
  24. data/test-with-deprecations/config_test.rb +122 -0
  25. data/test-with-deprecations/decorator_scope_test.rb +28 -0
  26. data/test-with-deprecations/decorator_test.rb +96 -0
  27. data/test-with-deprecations/default_test.rb +34 -0
  28. data/test-with-deprecations/defaults_options_test.rb +93 -0
  29. data/test-with-deprecations/definition_test.rb +264 -0
  30. data/test-with-deprecations/example.rb +310 -0
  31. data/test-with-deprecations/examples/object.rb +31 -0
  32. data/test-with-deprecations/exec_context_test.rb +93 -0
  33. data/test-with-deprecations/features_test.rb +70 -0
  34. data/test-with-deprecations/filter_test.rb +57 -0
  35. data/test-with-deprecations/for_collection_test.rb +74 -0
  36. data/test-with-deprecations/generic_test.rb +116 -0
  37. data/test-with-deprecations/getter_setter_test.rb +21 -0
  38. data/test-with-deprecations/hash_bindings_test.rb +87 -0
  39. data/test-with-deprecations/hash_test.rb +160 -0
  40. data/test-with-deprecations/heritage_test.rb +62 -0
  41. data/test-with-deprecations/if_test.rb +79 -0
  42. data/test-with-deprecations/include_exclude_test.rb +88 -0
  43. data/test-with-deprecations/inherit_test.rb +159 -0
  44. data/test-with-deprecations/inline_test.rb +272 -0
  45. data/test-with-deprecations/instance_test.rb +266 -0
  46. data/test-with-deprecations/is_representable_test.rb +77 -0
  47. data/test-with-deprecations/json_test.rb +355 -0
  48. data/test-with-deprecations/lonely_test.rb +239 -0
  49. data/test-with-deprecations/mongoid_test.rb +31 -0
  50. data/test-with-deprecations/nested_test.rb +115 -0
  51. data/test-with-deprecations/object_test.rb +60 -0
  52. data/{test/---deserialize-pipeline_test.rb → test-with-deprecations/parse_pipeline_test.rb} +29 -2
  53. data/test-with-deprecations/parse_strategy_test.rb +279 -0
  54. data/{test → test-with-deprecations}/pass_options_test.rb +0 -0
  55. data/test-with-deprecations/pipeline_test.rb +277 -0
  56. data/test-with-deprecations/populator_test.rb +105 -0
  57. data/test-with-deprecations/prepare_test.rb +67 -0
  58. data/test-with-deprecations/private_options_test.rb +18 -0
  59. data/test-with-deprecations/reader_writer_test.rb +19 -0
  60. data/test-with-deprecations/realistic_benchmark.rb +115 -0
  61. data/test-with-deprecations/render_nil_test.rb +21 -0
  62. data/test-with-deprecations/represent_test.rb +88 -0
  63. data/test-with-deprecations/representable_test.rb +511 -0
  64. data/test-with-deprecations/schema_test.rb +148 -0
  65. data/test-with-deprecations/serialize_deserialize_test.rb +33 -0
  66. data/test-with-deprecations/skip_test.rb +81 -0
  67. data/test-with-deprecations/stringify_hash_test.rb +41 -0
  68. data/test-with-deprecations/test_helper.rb +135 -0
  69. data/test-with-deprecations/test_helper_test.rb +25 -0
  70. data/test-with-deprecations/uncategorized_test.rb +67 -0
  71. data/test-with-deprecations/user_options_test.rb +15 -0
  72. data/test-with-deprecations/wrap_test.rb +152 -0
  73. data/test-with-deprecations/xml_bindings_test.rb +62 -0
  74. data/test-with-deprecations/xml_test.rb +503 -0
  75. data/test-with-deprecations/yaml_test.rb +162 -0
  76. data/test/as_test.rb +3 -3
  77. data/test/cached_test.rb +2 -2
  78. data/test/class_test.rb +5 -5
  79. data/test/exec_context_test.rb +2 -2
  80. data/test/filter_test.rb +1 -1
  81. data/test/getter_setter_test.rb +4 -4
  82. data/test/if_test.rb +2 -2
  83. data/test/include_exclude_test.rb +88 -0
  84. data/test/instance_test.rb +15 -15
  85. data/test/lonely_test.rb +18 -2
  86. data/test/object_test.rb +4 -4
  87. data/test/parse_pipeline_test.rb +64 -0
  88. data/test/parse_strategy_test.rb +3 -3
  89. data/test/pipeline_test.rb +8 -12
  90. data/test/prepare_test.rb +2 -3
  91. data/test/reader_writer_test.rb +3 -3
  92. data/test/representable_test.rb +12 -48
  93. data/test/serialize_deserialize_test.rb +9 -9
  94. data/test/skip_test.rb +11 -11
  95. data/test/test_helper.rb +2 -0
  96. data/test/uncategorized_test.rb +10 -10
  97. data/test/user_options_test.rb +15 -0
  98. data/test/wrap_test.rb +1 -1
  99. metadata +65 -4
data/test/lonely_test.rb CHANGED
@@ -112,7 +112,7 @@ class LonelyRepresenterTest < MiniTest::Spec
112
112
  end
113
113
 
114
114
 
115
- it { [1,2].extend(representer).to_hash(one: One, two: Two).must_equal(["One: 1", "Two: 2"]) }
115
+ it { [1,2].extend(representer).to_hash(user_options: {one: One, two: Two}).must_equal(["One: 1", "Two: 2"]) }
116
116
  end
117
117
 
118
118
 
@@ -158,7 +158,7 @@ class LonelyRepresenterTest < MiniTest::Spec
158
158
  assert_equal({"two" => Song.new("Can't Take Them All")}, {}.extend(representer).from_json(json, :exclude => [:one]))
159
159
  end
160
160
 
161
- it "xxxrespects :include" do
161
+ it "respects :include" do
162
162
  assert_equal({"one" => Song.new("Days Go By")}, {}.extend(representer).from_json(json, :include => [:one]))
163
163
  end
164
164
  end
@@ -221,3 +221,19 @@ class LonelyRepresenterTest < MiniTest::Spec
221
221
  end
222
222
  end
223
223
  end
224
+
225
+
226
+ # describe "Hash::Collection with :include" do
227
+ class CollectionWithIncludeTest < MiniTest::Spec
228
+ Song = Struct.new(:id, :title)
229
+
230
+ representer!(decorator: true, module: Representable::Hash::Collection) do
231
+ items do
232
+ property :id
233
+ property :title
234
+ end
235
+ end
236
+
237
+ it { representer.new([Song.new(1, "ACAB")]).to_hash.must_equal([{"id"=>1, "title"=>"ACAB"}]) }
238
+ it { representer.new([Song.new(1, "ACAB")]).to_hash(include: [:title]).must_equal([{"title"=>"ACAB"}]) }
239
+ end
data/test/object_test.rb CHANGED
@@ -8,10 +8,10 @@ class ObjectTest < MiniTest::Spec
8
8
  representer!(module: Representable::Object) do
9
9
  property :title
10
10
 
11
- property :album, instance: lambda { |fragment, *| fragment.name.upcase!; fragment } do
11
+ property :album, instance: lambda { |options| options[:fragment].name.upcase!; options[:fragment] } do
12
12
  property :name
13
13
 
14
- collection :songs, instance: lambda { |fragment, *| fragment.title.upcase!; fragment } do
14
+ collection :songs, instance: lambda { |options| options[:fragment].title.upcase!; options[:fragment] } do
15
15
  property :title
16
16
  end
17
17
  end
@@ -42,10 +42,10 @@ class ObjectTest < MiniTest::Spec
42
42
  representer!(module: Representable::Object) do
43
43
  property :title
44
44
 
45
- property :album, render_filter: lambda { |object, *| object.name = "Live"; object } do
45
+ property :album, render_filter: lambda { |input, options|input.name = "Live";input } do
46
46
  property :name
47
47
 
48
- collection :songs, render_filter: lambda { |object, *| object[0].title = 1; object } do
48
+ collection :songs, render_filter: lambda { |input, options|input[0].title = 1;input } do
49
49
  property :title
50
50
  end
51
51
  end
@@ -0,0 +1,64 @@
1
+ require "test_helper"
2
+
3
+ class ParsePipelineTest < MiniTest::Spec
4
+ Album = Struct.new(:id, :artist, :songs)
5
+ Artist = Struct.new(:email)
6
+ Song = Struct.new(:title)
7
+
8
+ describe "transforming nil to [] when parsing" do
9
+ representer!(decorator: true) do
10
+ collection :songs,
11
+ parse_pipeline: ->(*) {
12
+ Representable::Pipeline.insert(
13
+ parse_functions, # original function list from Binding#parse_functions.
14
+ ->(input, options) { input.nil? ? [] : input }, # your new function (can be any callable object)..
15
+ replace: Representable::OverwriteOnNil # ..that replaces the original function.
16
+ )
17
+ },
18
+ class: Song do
19
+ property :title
20
+ end
21
+ end
22
+
23
+ it do
24
+ representer.new(album = Album.new).from_hash("songs"=>nil)
25
+ album.songs.must_equal []
26
+ end
27
+
28
+ it do
29
+ representer.new(album = Album.new).from_hash("songs"=>[{"title" => "Business Conduct"}])
30
+ album.songs.must_equal [Song.new("Business Conduct")]
31
+ end
32
+ end
33
+
34
+
35
+ # tests [Collect[Instance, Prepare, Deserialize], Setter]
36
+ class Representer < Representable::Decorator
37
+ include Representable::Hash
38
+
39
+ # property :artist, populator: Uber::Options::Value.new(ArtistPopulator.new), pass_options:true do
40
+ # property :email
41
+ # end
42
+ # DISCUSS: rename to populator_pipeline ?
43
+ collection :songs, parse_pipeline: ->(*) { [Collect[Instance, Prepare, Deserialize], Setter] }, instance: :instance!, exec_context: :decorator, pass_options: true do
44
+ property :title
45
+ end
46
+
47
+ def instance!(*options)
48
+ puts "@@@@@ #{options.inspect}"
49
+ Song.new
50
+ end
51
+
52
+ def songs=(array)
53
+ represented.songs=array
54
+ end
55
+ end
56
+
57
+ it do
58
+ skip "TODO: implement :parse_pipeline and :render_pipeline, and before/after/replace semantics"
59
+ album = Album.new
60
+ 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
63
+ end
64
+ end
@@ -208,7 +208,7 @@ class ParseStrategyFindOrInstantiateTest < BaseTest
208
208
  describe "property with dynamic :class" do
209
209
  representer!(:inject => :song_representer) do
210
210
  property :song, :parse_strategy => :find_or_instantiate, :extend => song_representer,
211
- :class => lambda { |fragment, *args| fragment["class"] }
211
+ :class => lambda { |options| options[:fragment]["class"] }
212
212
  end
213
213
 
214
214
  let (:album) { Struct.new(:song).new.extend(representer) }
@@ -241,7 +241,7 @@ class ParseStrategyLambdaTest < MiniTest::Spec
241
241
  describe "property parse_strategy: lambda, representable: false" do
242
242
  representer! do
243
243
  property :title,
244
- :instance => lambda { |fragment, options| fragment.to_s }, # this will still call song.title= "8675309".
244
+ :instance => lambda { |options| options[:fragment].to_s }, # this will still call song.title= "8675309".
245
245
  :representable => false # don't call object.from_hash
246
246
  end
247
247
 
@@ -252,7 +252,7 @@ class ParseStrategyLambdaTest < MiniTest::Spec
252
252
 
253
253
  describe "collection" do
254
254
  representer!(:inject => :song_representer) do
255
- collection :songs, :parse_strategy => lambda { |fragment, i, options|
255
+ collection :songs, :parse_strategy => lambda { |options|
256
256
  songs << song = Song.new
257
257
  song
258
258
  }, :extend => song_representer
@@ -119,12 +119,11 @@ class PipelineTest < MiniTest::Spec
119
119
  R::GetValue,
120
120
  R::StopOnSkipable,
121
121
  R::StopOnNil,
122
- R::SkipRender,
123
122
  R::Decorate,
124
123
  R::Serialize,
125
124
  R::AssignName,
126
125
  R::WriteFragment
127
- ].extend(P::Debug).(nil, {represented: song_model, binding: artist, doc: doc, user_options: {}}).must_equal({"name" => "Diesel Boy"})
126
+ ].extend(P::Debug).(nil, {represented: song_model, binding: artist, doc: doc, options: {}}).must_equal({"name" => "Diesel Boy"})
128
127
 
129
128
  doc.must_equal({"artist"=>{"name"=>"Diesel Boy"}})
130
129
  end
@@ -135,13 +134,12 @@ class PipelineTest < MiniTest::Spec
135
134
  R::ReadFragment,
136
135
  R::StopOnNotFound,
137
136
  R::OverwriteOnNil,
138
- # R::SkipParse,
139
137
  R::AssignFragment,
140
- R::CreateObject,
138
+ R::CreateObject::Class,
141
139
  R::Decorate,
142
140
  R::Deserialize,
143
141
  R::SetValue,
144
- ].extend(P::Debug).(doc={"artist"=>{"name"=>"Doobie Brothers"}}, {represented: song_model, binding: artist, doc: doc, user_options: {}}).must_equal model=Artist.new("Doobie Brothers")
142
+ ].extend(P::Debug).(doc={"artist"=>{"name"=>"Doobie Brothers"}}, {represented: song_model, binding: artist, doc: doc, options: {}}).must_equal model=Artist.new("Doobie Brothers")
145
143
  song_model.artist.must_equal model
146
144
  end
147
145
 
@@ -149,7 +147,7 @@ class PipelineTest < MiniTest::Spec
149
147
  ######### collection :ratings
150
148
 
151
149
  let (:ratings) {
152
- dfn = R::Definition.new(:ratings, collection: true)
150
+ dfn = R::Definition.new(:ratings, collection: true, skip_render: ->(*) { false })
153
151
 
154
152
  R::Hash::Binding::Collection.new(dfn)
155
153
  }
@@ -163,7 +161,7 @@ class PipelineTest < MiniTest::Spec
163
161
  ],
164
162
  R::AssignName,
165
163
  R::WriteFragment
166
- ].extend(P::Debug).(nil, {represented: Album.new([1,2,3]), binding: ratings, doc: doc}).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])
167
165
 
168
166
  doc.must_equal({"ratings"=>[1,2,3]})
169
167
  end
@@ -180,13 +178,12 @@ class PipelineTest < MiniTest::Spec
180
178
  R::GetValue,
181
179
  R::StopOnSkipable,
182
180
  R::Collect[
183
- R::SkipRender,
184
181
  R::Decorate,
185
182
  R::Serialize,
186
183
  ],
187
184
  R::AssignName,
188
185
  R::WriteFragment
189
- ].extend(P::Debug).(nil, {represented: Album.new(nil, [Artist.new("Diesel Boy"), Artist.new("Van Halen")]), binding: artists, doc: doc, user_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"}])
190
187
 
191
188
  doc.must_equal({"artists"=>[{"name"=>"Diesel Boy"}, {"name"=>"Van Halen"}]})
192
189
  end
@@ -203,13 +200,12 @@ let (:album_model) { Album.new(nil, [Artist.new("Diesel Boy"), Artist.new("Van H
203
200
  # R::SkipParse,
204
201
  R::Collect[
205
202
  R::AssignFragment,
206
- R::SkipRender,
207
- R::CreateObject,
203
+ R::CreateObject::Class,
208
204
  R::Decorate,
209
205
  R::Deserialize,
210
206
  ],
211
207
  R::SetValue,
212
- ].extend(P::Debug).(doc, {represented: album_model, binding: artists, doc: doc, user_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")])
213
209
 
214
210
  album_model.artists.must_equal([Artist.new("Diesel Boy"), Artist.new("Van Halen")])
215
211
  end
data/test/prepare_test.rb CHANGED
@@ -18,10 +18,9 @@ class PrepareTest < BaseTest
18
18
  describe "#to_hash" do # TODO: introduce :representable option?
19
19
  representer! do
20
20
  property :song,
21
- :prepare => lambda { |obj, args| args.binding[:arbitrary].new(obj) },
21
+ :prepare => lambda { |options| options[:binding][:arbitrary].new(options[:input]) },
22
22
  :arbitrary => PreparerClass,
23
23
  :extend => true,
24
- :pass_options => true,
25
24
  :representable => false # don't call #to_hash.
26
25
  end
27
26
 
@@ -47,7 +46,7 @@ class PrepareTest < BaseTest
47
46
  describe "#from_hash" do
48
47
  representer! do
49
48
  property :song,
50
- :prepare => lambda { |obj, args| args.binding[:arbitrary].new(obj) },
49
+ :prepare => lambda { |options| options[:binding][:arbitrary].new(options[:input]) },
51
50
  :arbitrary => PreparerClass,
52
51
  #:extend => true, # TODO: typed: true would be better.
53
52
  :instance => String.new, # pass_fragment
@@ -3,14 +3,14 @@ require 'test_helper'
3
3
  class ReaderWriterTest < BaseTest
4
4
  representer! do
5
5
  property :name,
6
- :writer => lambda { |doc, args| doc["title"] = "#{args[:nr]}) #{name}" },
7
- :reader => lambda { |doc, args| self.name = doc["title"].split(") ").last }
6
+ :writer => lambda { |options| options[:doc]["title"] = "#{options[:user_options][:nr]}) #{options[:input]}" },
7
+ :reader => lambda { |options| self.name = options[:doc]["title"].split(") ").last }
8
8
  end
9
9
 
10
10
  subject { OpenStruct.new(:name => "Disorder And Disarray").extend(representer) }
11
11
 
12
12
  it "uses :writer when rendering" do
13
- subject.to_hash(:nr => 14).must_equal({"title" => "14) Disorder And Disarray"})
13
+ subject.to_hash(user_options: {nr: 14}).must_equal({"title" => "14) Disorder And Disarray"})
14
14
  end
15
15
 
16
16
  it "uses :reader when parsing" do
@@ -222,19 +222,6 @@ class RepresentableTest < MiniTest::Spec
222
222
  assert_equal 2, @band.groupies
223
223
  end
224
224
 
225
-
226
- it "accepts :exclude option" do
227
- @band.from_hash({"name"=>"No One's Choice", "groupies"=>2}, {:exclude => [:groupies]})
228
- assert_equal "No One's Choice", @band.name
229
- assert_equal nil, @band.groupies
230
- end
231
-
232
- it "accepts :include option" do
233
- @band.from_hash({"name"=>"No One's Choice", "groupies"=>2}, :include => [:groupies])
234
- assert_equal 2, @band.groupies
235
- assert_equal nil, @band.name
236
- end
237
-
238
225
  it "ignores non-writeable properties" do
239
226
  @band = Class.new(Band) { property :name; collection :founders, :writeable => false; attr_accessor :founders }.new
240
227
  @band.from_hash("name" => "Iron Maiden", "groupies" => 2, "founders" => ["Steve Harris"])
@@ -292,23 +279,23 @@ class RepresentableTest < MiniTest::Spec
292
279
 
293
280
  property :length, class: OpenStruct do
294
281
  def to_hash(options)
295
- {seconds: options[:nr]}
282
+ {seconds: options[:user_options][:nr]}
296
283
  end
297
284
 
298
285
  def from_hash(hash, options)
299
286
  super.tap do
300
- self.seconds = options[:nr]
287
+ self.seconds = options[:user_options][:nr]
301
288
  end
302
289
  end
303
290
  end
304
291
 
305
292
  def to_hash(options)
306
- super.merge({"nr" => options[:nr]})
293
+ super.merge({"nr" => options[:user_options][:nr]})
307
294
  end
308
295
 
309
296
  def from_hash(data, options)
310
297
  super.tap do
311
- self.nr = options[:nr]
298
+ self.nr = options[:user_options][:nr]
312
299
  end
313
300
  end
314
301
  end
@@ -316,11 +303,11 @@ class RepresentableTest < MiniTest::Spec
316
303
 
317
304
  it "#to_hash propagates to nested objects" do
318
305
  OpenStruct.new(track: OpenStruct.new(nr: 1, length: OpenStruct.new(seconds: nil))).extend(representer).extend(Representable::Debug).
319
- to_hash(nr: 9).must_equal({"track"=>{"nr"=>9, "length"=>{seconds: 9}}})
306
+ to_hash(user_options: {nr: 9}).must_equal({"track"=>{"nr"=>9, "length"=>{seconds: 9}}})
320
307
  end
321
308
 
322
309
  it "#from_hash propagates to nested objects" do
323
- song = OpenStruct.new.extend(representer).from_hash({"track"=>{"nr" => "replace me", "length"=>{"seconds"=>"replacing"}}}, :nr => 9)
310
+ song = OpenStruct.new.extend(representer).from_hash({"track"=>{"nr" => "replace me", "length"=>{"seconds"=>"replacing"}}}, user_options: {nr: 9})
324
311
  song.track.nr.must_equal 9
325
312
  song.track.length.seconds.must_equal 9
326
313
  end
@@ -338,16 +325,6 @@ class RepresentableTest < MiniTest::Spec
338
325
  assert_equal({"name"=>"No One's Choice", "groupies"=>2}, @band.to_hash)
339
326
  end
340
327
 
341
- it "accepts :exclude option" do
342
- hash = @band.to_hash({:exclude => [:groupies]})
343
- assert_equal({"name"=>"No One's Choice"}, hash)
344
- end
345
-
346
- it "accepts :include option" do
347
- hash = @band.to_hash({:include => [:groupies]})
348
- assert_equal({"groupies"=>2}, hash)
349
- end
350
-
351
328
  it "ignores non-readable properties" do
352
329
  @band = Class.new(Band) { property :name; collection :founder_ids, :readable => false; attr_accessor :founder_ids }.new
353
330
  @band.name = "Iron Maiden"
@@ -366,19 +343,6 @@ class RepresentableTest < MiniTest::Spec
366
343
  @band.groupies = false
367
344
  assert_equal({"name"=>"No One's Choice","groupies"=>false}, @band.to_hash)
368
345
  end
369
-
370
- it "does not propagate private options to nested objects" do
371
- cover_rpr = Module.new do
372
- include Representable::Hash
373
- property :title
374
- property :original, :extend => self
375
- end
376
-
377
- # FIXME: we should test all representable-options (:include, :exclude, ?)
378
-
379
- Class.new(OpenStruct).new(:title => "Roxanne", :original => Class.new(OpenStruct).new(:title => "Roxanne (Don't Put On The Red Light)")).extend(cover_rpr).
380
- to_hash(:include => [:original]).must_equal({"original"=>{"title"=>"Roxanne (Don't Put On The Red Light)"}})
381
- end
382
346
  end
383
347
 
384
348
 
@@ -427,7 +391,7 @@ class RepresentableTest < MiniTest::Spec
427
391
 
428
392
  describe "property with :extend" do
429
393
  representer! do
430
- property :name, :extend => lambda { |name, *| name.is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter }, :class => String
394
+ property :name, :extend => lambda { |options| options[:input].is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter }, :class => String
431
395
  end
432
396
 
433
397
  it "uses lambda when rendering" do
@@ -442,8 +406,8 @@ class RepresentableTest < MiniTest::Spec
442
406
 
443
407
  describe "with :class lambda" do
444
408
  representer! do
445
- property :name, :extend => lambda { |name, *| name.is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter },
446
- :class => lambda { |fragment, *| fragment == "Still Failing?" ? String : UpcaseString }
409
+ property :name, :extend => lambda { |options| options[:input].is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter },
410
+ :class => lambda { |options| options[:fragment] == "Still Failing?" ? String : UpcaseString }
447
411
  end
448
412
 
449
413
  it "creates instance from :class lambda when parsing" do
@@ -461,7 +425,7 @@ class RepresentableTest < MiniTest::Spec
461
425
 
462
426
  describe "collection with :extend" do
463
427
  representer! do
464
- collection :songs, :extend => lambda { |name, *| name.is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter }, :class => String
428
+ collection :songs, :extend => lambda { |options| options[:input].is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter }, :class => String
465
429
  end
466
430
 
467
431
  it "uses lambda for each item when rendering" do
@@ -475,8 +439,8 @@ class RepresentableTest < MiniTest::Spec
475
439
 
476
440
  describe "with :class lambda" do
477
441
  representer! do
478
- collection :songs, :extend => lambda { |name, *| name.is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter },
479
- :class => lambda { |fragment, *| fragment == "Still Failing?" ? String : UpcaseString }
442
+ collection :songs, :extend => lambda { |options| options[:input].is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter },
443
+ :class => lambda { |options| options[:input] == "Still Failing?" ? String : UpcaseString }
480
444
  end
481
445
 
482
446
  it "creates instance from :class lambda for each item when parsing" do
@@ -6,28 +6,28 @@ class SerializeDeserializeTest < BaseTest
6
6
  describe "deserialize" do
7
7
  representer! do
8
8
  property :song,
9
- :instance => lambda { |fragment, *| fragment.to_s.upcase },
10
- :prepare => lambda { |fragment, *| fragment },
11
- :deserialize => lambda { |object, fragment, args|
12
- "#{object} #{fragment} #{args.inspect}"
9
+ :instance => lambda { |options| options[:input].to_s.upcase },
10
+ :prepare => lambda { |options| options[:input] },
11
+ :deserialize => lambda { |options|
12
+ "#{options[:input]} #{options[:fragment]} #{options[:user_options].inspect}"
13
13
  }
14
14
  end
15
15
 
16
- it { subject.from_hash({"song" => Object}, {:volume => 9}).song.must_equal "OBJECT Object {:volume=>9}" }
16
+ it { subject.from_hash({"song" => Object}, user_options: {volume: 9}).song.must_equal "OBJECT Object {:volume=>9}" }
17
17
  end
18
18
 
19
19
  describe "serialize" do
20
20
  representer! do
21
21
  property :song,
22
22
  :representable => true,
23
- :prepare => lambda { |fragment, *| fragment },
24
- :serialize => lambda { |object, args|
25
- "#{object} #{args.inspect}"
23
+ :prepare => lambda { |options| options[:fragment] },
24
+ :serialize => lambda { |options|
25
+ "#{options[:input]} #{options[:user_options].inspect}"
26
26
  }
27
27
  end
28
28
 
29
29
  before { subject.song = "Arrested In Shanghai" }
30
30
 
31
- it { subject.to_hash({:volume => 9}).must_equal({"song"=>"Arrested In Shanghai {:volume=>9}"}) }
31
+ it { subject.to_hash(user_options: {volume: 9}).must_equal({"song"=>"Arrested In Shanghai {:volume=>9}"}) }
32
32
  end
33
33
  end