representable 1.8.5 → 2.0.0.rc1
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 +4 -4
- data/.travis.yml +1 -1
- data/CHANGES.md +36 -0
- data/Gemfile +3 -3
- data/README.md +62 -2
- data/Rakefile +1 -1
- data/lib/representable.rb +32 -109
- data/lib/representable/TODO.getting_serious +7 -1
- data/lib/representable/autoload.rb +10 -0
- data/lib/representable/binding.rb +20 -16
- data/lib/representable/bindings/xml_bindings.rb +0 -1
- data/lib/representable/coercion.rb +23 -31
- data/lib/representable/config.rb +45 -46
- data/lib/representable/declarative.rb +78 -0
- data/lib/representable/decorator.rb +39 -10
- data/lib/representable/definition.rb +40 -33
- data/lib/representable/deserializer.rb +2 -0
- data/lib/representable/for_collection.rb +25 -0
- data/lib/representable/hash.rb +4 -8
- data/lib/representable/hash/collection.rb +2 -9
- data/lib/representable/hash_methods.rb +0 -7
- data/lib/representable/inheritable.rb +50 -0
- data/lib/representable/json.rb +3 -9
- data/lib/representable/json/collection.rb +1 -3
- data/lib/representable/json/hash.rb +4 -9
- data/lib/representable/mapper.rb +8 -5
- data/lib/representable/parse_strategies.rb +1 -0
- data/lib/representable/pipeline.rb +14 -0
- data/lib/representable/represent.rb +6 -0
- data/lib/representable/version.rb +1 -1
- data/lib/representable/xml.rb +3 -18
- data/lib/representable/xml/collection.rb +2 -4
- data/lib/representable/xml/hash.rb +2 -10
- data/lib/representable/yaml.rb +1 -20
- data/representable.gemspec +2 -2
- data/test/class_test.rb +5 -10
- data/test/coercion_test.rb +31 -92
- data/test/config/inherit_test.rb +128 -0
- data/test/config_test.rb +114 -80
- data/test/definition_test.rb +107 -64
- data/test/features_test.rb +41 -0
- data/test/filter_test.rb +59 -0
- data/test/for_collection_test.rb +74 -0
- data/test/inherit_test.rb +44 -3
- data/test/inheritable_test.rb +97 -0
- data/test/inline_test.rb +0 -18
- data/test/instance_test.rb +0 -19
- data/test/json_test.rb +9 -44
- data/test/lonely_test.rb +1 -0
- data/test/parse_strategy_test.rb +30 -0
- data/test/represent_test.rb +88 -0
- data/test/representable_test.rb +3 -50
- data/test/schema_test.rb +123 -0
- data/test/test_helper.rb +1 -1
- data/test/xml_test.rb +34 -38
- metadata +25 -15
- data/lib/representable/decorator/coercion.rb +0 -4
- data/lib/representable/readable_writeable.rb +0 -29
- data/test/inheritance_test.rb +0 -22
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
# tests Inheritable:: classes (the #inherit! method). This can be moved to uber if necessary.
|
4
|
+
|
5
|
+
class ConfigInheritableTest < MiniTest::Spec
|
6
|
+
class CloneableObject
|
7
|
+
include Representable::Cloneable
|
8
|
+
|
9
|
+
# same instance returns same clone.
|
10
|
+
def clone
|
11
|
+
@clone ||= super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
# Inheritable::Array
|
17
|
+
it do
|
18
|
+
parent = Representable::Inheritable::Array.new([1,2,3])
|
19
|
+
child = Representable::Inheritable::Array.new([4])
|
20
|
+
|
21
|
+
child.inherit!(parent).must_equal([4,1,2,3])
|
22
|
+
end
|
23
|
+
|
24
|
+
# Inheritable::Hash
|
25
|
+
Inheritable = Representable::Inheritable
|
26
|
+
describe "Inheritable::Hash" do
|
27
|
+
it do
|
28
|
+
parent = Inheritable::Hash[
|
29
|
+
:volume => volume = Uber::Options::Value.new(9),
|
30
|
+
:genre => "Powermetal",
|
31
|
+
:only_parent => only_parent = Representable::Inheritable::Array["Pumpkin Box"],
|
32
|
+
:in_both => in_both = Representable::Inheritable::Array["Roxanne"],
|
33
|
+
:hash => {:type => :parent},
|
34
|
+
:clone => parent_clone = CloneableObject.new # cloneable is in both hashes.
|
35
|
+
]
|
36
|
+
child = Inheritable::Hash[
|
37
|
+
:genre => "Metal",
|
38
|
+
:pitch => 99,
|
39
|
+
:in_both => Representable::Inheritable::Array["Generator"],
|
40
|
+
:hash => {:type => :child},
|
41
|
+
:clone => child_clone = CloneableObject.new
|
42
|
+
]
|
43
|
+
|
44
|
+
child.inherit!(parent)
|
45
|
+
|
46
|
+
# order:
|
47
|
+
child.to_a.must_equal [
|
48
|
+
[:genre, "Powermetal"], # parent overrides child
|
49
|
+
[:pitch, 99], # parent doesn't define pitch
|
50
|
+
[:in_both, ["Generator", "Roxanne"]], # Inheritable array gets "merged".
|
51
|
+
[:hash, {:type => :parent}], # normal hash merge: parent overwrites child value.
|
52
|
+
[:clone, parent_clone.clone],
|
53
|
+
[:volume, volume],
|
54
|
+
[:only_parent, ["Pumpkin Box"]],
|
55
|
+
]
|
56
|
+
|
57
|
+
# clone
|
58
|
+
child[:only_parent].object_id.wont_equal parent[:only_parent].object_id
|
59
|
+
child[:clone].object_id.wont_equal parent[:clone].object_id
|
60
|
+
|
61
|
+
# still a hash:
|
62
|
+
child.must_equal(
|
63
|
+
:genre => "Powermetal",
|
64
|
+
:pitch => 99,
|
65
|
+
:in_both => ["Generator", "Roxanne"],
|
66
|
+
:hash => {:type => :parent},
|
67
|
+
:clone => parent_clone.clone,
|
68
|
+
:volume => volume,
|
69
|
+
:only_parent => ["Pumpkin Box"]
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
# nested:
|
74
|
+
it do
|
75
|
+
parent = Inheritable::Hash[
|
76
|
+
:details => Inheritable::Hash[
|
77
|
+
:title => title = "Man Of Steel",
|
78
|
+
:length => length = Representable::Definition.new(:length) # Cloneable.
|
79
|
+
]]
|
80
|
+
|
81
|
+
child = Inheritable::Hash[].inherit!(parent)
|
82
|
+
child[:details][:track] = 1
|
83
|
+
|
84
|
+
parent.must_equal({:details => {:title => "Man Of Steel", :length => length}})
|
85
|
+
|
86
|
+
child.keys.must_equal [:details]
|
87
|
+
child[:details].keys.must_equal [:title, :length, :track]
|
88
|
+
child[:details][:title].must_equal "Man Of Steel"
|
89
|
+
child[:details][:track].must_equal 1
|
90
|
+
child[:details][:length].name.must_equal "length"
|
91
|
+
|
92
|
+
# clone
|
93
|
+
child[:details][:title].object_id.must_equal title.object_id
|
94
|
+
child[:details][:length].object_id.wont_equal length.object_id
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/test/inline_test.rb
CHANGED
@@ -208,24 +208,6 @@ class InlineTest < MiniTest::Spec
|
|
208
208
|
end
|
209
209
|
|
210
210
|
|
211
|
-
describe "deprecate mixing :extend and inline representers" do # TODO: remove in 2.0.
|
212
|
-
representer! do
|
213
|
-
rpr_module = Module.new do
|
214
|
-
include Representable::Hash
|
215
|
-
property :title
|
216
|
-
end
|
217
|
-
property :song, :extend => rpr_module do
|
218
|
-
property :artist
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
it do OpenStruct.new(:song => OpenStruct.new(:title => "The Fever And The Sound", :artist => "Strung Out")).extend(representer).
|
223
|
-
to_hash.
|
224
|
-
must_equal({"song"=>{"artist"=>"Strung Out", "title"=>"The Fever And The Sound"}})
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
|
229
211
|
describe "include module in inline representers" do
|
230
212
|
representer! do
|
231
213
|
extension = Module.new do
|
data/test/instance_test.rb
CHANGED
@@ -247,25 +247,6 @@ class InstanceTest < BaseTest
|
|
247
247
|
end
|
248
248
|
|
249
249
|
|
250
|
-
describe "instance: true" do
|
251
|
-
representer!(:inject => :song_representer) do
|
252
|
-
property :song,
|
253
|
-
:extend => song_representer, :instance => true
|
254
|
-
end
|
255
|
-
|
256
|
-
it "uses Binding#get instead of creating an instance, but deprecates" do
|
257
|
-
album= Struct.new(:song).new(song = Song.new(1, "The Answer Is Still No"))
|
258
|
-
|
259
|
-
album.
|
260
|
-
extend(representer).
|
261
|
-
from_hash("song" => {"title" => "Invincible"}).
|
262
|
-
song.must_equal Song.new(1, "Invincible")
|
263
|
-
|
264
|
-
album.song.object_id.must_equal song.object_id
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
|
269
250
|
describe "new syntax for instance: true" do
|
270
251
|
representer!(:inject => :song_representer) do
|
271
252
|
property :song, :pass_options => true,
|
data/test/json_test.rb
CHANGED
@@ -22,41 +22,6 @@ module JsonTest
|
|
22
22
|
end
|
23
23
|
|
24
24
|
|
25
|
-
describe ".from_json" do
|
26
|
-
it "is delegated to #from_json" do
|
27
|
-
block = lambda {|*args|}
|
28
|
-
@Band.any_instance.expects(:from_json).with("{document}", "options") # FIXME: how to NOT expect block?
|
29
|
-
@Band.from_json("{document}", "options", &block)
|
30
|
-
end
|
31
|
-
|
32
|
-
it "yields new object and options to block" do
|
33
|
-
@Band.class_eval { attr_accessor :new_name }
|
34
|
-
@band = @Band.from_json("{}", :new_name => "Diesel Boy") do |band, options|
|
35
|
-
band.new_name= options[:new_name]
|
36
|
-
end
|
37
|
-
assert_equal "Diesel Boy", @band.new_name
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
describe ".from_hash" do
|
43
|
-
it "is delegated to #from_hash not passing the block" do
|
44
|
-
block = lambda {|*args|}
|
45
|
-
@Band.any_instance.expects(:from_hash).with("{document}", "options") # FIXME: how to NOT expect block?
|
46
|
-
@Band.from_hash("{document}", "options", &block)
|
47
|
-
end
|
48
|
-
|
49
|
-
it "yields new object and options to block" do
|
50
|
-
@Band.class_eval { attr_accessor :new_name }
|
51
|
-
@band = @Band.from_hash({}, :new_name => "Diesel Boy") do |band, options|
|
52
|
-
band.new_name= options[:new_name]
|
53
|
-
end
|
54
|
-
|
55
|
-
assert_equal "Diesel Boy", @band.new_name
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
|
60
25
|
describe "#from_json" do
|
61
26
|
before do
|
62
27
|
@band = @Band.new
|
@@ -204,7 +169,7 @@ module JsonTest
|
|
204
169
|
end
|
205
170
|
|
206
171
|
it "#from_json creates correct accessors" do
|
207
|
-
band = Band.from_json({:name => "Bombshell Rocks"}.to_json)
|
172
|
+
band = Band.new.from_json({:name => "Bombshell Rocks"}.to_json)
|
208
173
|
assert_equal "Bombshell Rocks", band.name
|
209
174
|
end
|
210
175
|
|
@@ -230,7 +195,7 @@ module JsonTest
|
|
230
195
|
end
|
231
196
|
|
232
197
|
it "#from_json creates one Item instance" do
|
233
|
-
album = Album.from_json('{"label":{"name":"Fat Wreck"}}')
|
198
|
+
album = Album.new.from_json('{"label":{"name":"Fat Wreck"}}')
|
234
199
|
assert_equal "Fat Wreck", album.label.name
|
235
200
|
end
|
236
201
|
|
@@ -267,7 +232,7 @@ module JsonTest
|
|
267
232
|
end
|
268
233
|
|
269
234
|
it "respects :as in #from_json" do
|
270
|
-
song = Song.from_json({:songName => "Run To The Hills"}.to_json)
|
235
|
+
song = Song.new.from_json({:songName => "Run To The Hills"}.to_json)
|
271
236
|
assert_equal "Run To The Hills", song.name
|
272
237
|
end
|
273
238
|
|
@@ -288,17 +253,17 @@ module JsonTest
|
|
288
253
|
|
289
254
|
describe "#from_json" do
|
290
255
|
it "uses default when property nil in doc" do
|
291
|
-
album = @Album.from_json({}.to_json)
|
256
|
+
album = @Album.new.from_json({}.to_json)
|
292
257
|
assert_equal "30 Years Live", album.name
|
293
258
|
end
|
294
259
|
|
295
260
|
it "uses value from doc when present" do
|
296
|
-
album = @Album.from_json({:name => "Live At The Wireless"}.to_json)
|
261
|
+
album = @Album.new.from_json({:name => "Live At The Wireless"}.to_json)
|
297
262
|
assert_equal "Live At The Wireless", album.name
|
298
263
|
end
|
299
264
|
|
300
265
|
it "uses value from doc when empty string" do
|
301
|
-
album = @Album.from_json({:name => ""}.to_json)
|
266
|
+
album = @Album.new.from_json({:name => ""}.to_json)
|
302
267
|
assert_equal "", album.name
|
303
268
|
end
|
304
269
|
end
|
@@ -333,7 +298,7 @@ end
|
|
333
298
|
end
|
334
299
|
|
335
300
|
it "#from_json creates correct accessors" do
|
336
|
-
cd = CD.from_json({:songs => ["Out in the cold", "Microphone"]}.to_json)
|
301
|
+
cd = CD.new.from_json({:songs => ["Out in the cold", "Microphone"]}.to_json)
|
337
302
|
assert_equal ["Out in the cold", "Microphone"], cd.songs
|
338
303
|
end
|
339
304
|
|
@@ -364,7 +329,7 @@ end
|
|
364
329
|
|
365
330
|
describe "#from_json" do
|
366
331
|
it "pushes collection items to array" do
|
367
|
-
cd = Compilation.from_json({:bands => [
|
332
|
+
cd = Compilation.new.from_json({:bands => [
|
368
333
|
{:name => "Cobra Skulls"},
|
369
334
|
{:name => "Diesel Boy"}]}.to_json)
|
370
335
|
assert_equal ["Cobra Skulls", "Diesel Boy"], cd.bands.map(&:name).sort
|
@@ -388,7 +353,7 @@ end
|
|
388
353
|
end
|
389
354
|
|
390
355
|
it "respects :as in #from_json" do
|
391
|
-
songs = Songs.from_json({:songList => ["Out in the cold", "Microphone"]}.to_json)
|
356
|
+
songs = Songs.new.from_json({:songList => ["Out in the cold", "Microphone"]}.to_json)
|
392
357
|
assert_equal ["Out in the cold", "Microphone"], songs.tracks
|
393
358
|
end
|
394
359
|
|
data/test/lonely_test.rb
CHANGED
data/test/parse_strategy_test.rb
CHANGED
@@ -83,6 +83,24 @@ class ParseStrategySyncTest < BaseTest
|
|
83
83
|
end
|
84
84
|
|
85
85
|
|
86
|
+
# Sync errors, when model and incoming are not in sync.
|
87
|
+
describe ":sync with error" do
|
88
|
+
representer! do
|
89
|
+
property :song, :parse_strategy => :sync do
|
90
|
+
property :title
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# object.song is nil whereas the document contains one.
|
95
|
+
it do
|
96
|
+
assert_raises Representable::DeserializeError do
|
97
|
+
OpenStruct.new.extend(representer).from_hash({"song" => {"title" => "Perpetual"}})
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
|
86
104
|
# Lonely Collection
|
87
105
|
for_formats(
|
88
106
|
:hash => [Representable::Hash::Collection, [{"title"=>"Resist Stance"}], [{"title"=>"Suffer"}]],
|
@@ -219,6 +237,18 @@ class ParseStrategyLambdaTest < MiniTest::Spec
|
|
219
237
|
property :title
|
220
238
|
end
|
221
239
|
|
240
|
+
# property with instance: lambda, using representable's setter. # TODO: that should be handled better via my api.
|
241
|
+
describe "property parse_strategy: lambda, representable: false" do
|
242
|
+
representer! do
|
243
|
+
property :title,
|
244
|
+
:instance => lambda { |fragment, options| fragment.to_s }, # this will still call song.title= "8675309".
|
245
|
+
:representable => false # don't call object.from_hash
|
246
|
+
end
|
247
|
+
|
248
|
+
let (:song) { Song.new(nil, nil) }
|
249
|
+
it { song.extend(representer).from_hash("title" => 8675309).title.must_equal "8675309" }
|
250
|
+
end
|
251
|
+
|
222
252
|
|
223
253
|
describe "collection" do
|
224
254
|
representer!(:inject => :song_representer) do
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RepresentTest < MiniTest::Spec
|
4
|
+
let (:songs) { [song, Song.new("Can't Take Them All")] }
|
5
|
+
let (:song) { Song.new("Days Go By") }
|
6
|
+
|
7
|
+
for_formats(
|
8
|
+
:hash => [Representable::Hash, out=[{"name" => "Days Go By"}, {"name"=>"Can't Take Them All"}], out],
|
9
|
+
:json => [Representable::JSON, out="[{\"name\":\"Days Go By\"},{\"name\":\"Can't Take Them All\"}]", out],
|
10
|
+
# :xml => [Representable::XML, out="<a><song></song><song></song></a>", out]
|
11
|
+
) do |format, mod, output, input|
|
12
|
+
|
13
|
+
# Representer.represents detects collection.
|
14
|
+
describe "Module#to_/from_#{format}" do
|
15
|
+
let (:format) { format }
|
16
|
+
|
17
|
+
let (:representer) {
|
18
|
+
Module.new do
|
19
|
+
include mod
|
20
|
+
property :name
|
21
|
+
|
22
|
+
collection_representer :class => Song # TODOOOOOOOOOOOO: test without Song and fix THIS FUCKINGNoMethodError: undefined method `name=' for {"name"=>"Days Go By"}:Hash ERROR!!!!!!!!!!!!!!!
|
23
|
+
end
|
24
|
+
}
|
25
|
+
|
26
|
+
it { render(representer.represent(songs)).must_equal_document output }
|
27
|
+
it { parse(representer.represent([]), input).must_equal songs }
|
28
|
+
end
|
29
|
+
|
30
|
+
# Decorator.represents detects collection.
|
31
|
+
describe "Decorator#to_/from_#{format}" do
|
32
|
+
let (:format) { format }
|
33
|
+
let (:representer) {
|
34
|
+
Class.new(Representable::Decorator) do
|
35
|
+
include mod
|
36
|
+
property :name
|
37
|
+
|
38
|
+
collection_representer :class => Song
|
39
|
+
end
|
40
|
+
}
|
41
|
+
|
42
|
+
it { render(representer.represent(songs)).must_equal_document output }
|
43
|
+
it { parse(representer.represent([]), input).must_equal songs }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
for_formats(
|
49
|
+
:hash => [Representable::Hash, out={"name" => "Days Go By"}, out],
|
50
|
+
:json => [Representable::JSON, out="{\"name\":\"Days Go By\"}", out],
|
51
|
+
# :xml => [Representable::XML, out="<a><song></song><song></song></a>", out]
|
52
|
+
) do |format, mod, output, input|
|
53
|
+
|
54
|
+
# Representer.represents detects singular.
|
55
|
+
describe "Module#to_/from_#{format}" do
|
56
|
+
let (:format) { format }
|
57
|
+
|
58
|
+
let (:representer) {
|
59
|
+
Module.new do
|
60
|
+
include mod
|
61
|
+
property :name
|
62
|
+
|
63
|
+
collection_representer :class => Song
|
64
|
+
end
|
65
|
+
}
|
66
|
+
|
67
|
+
it { render(representer.represent(song)).must_equal_document output }
|
68
|
+
it { parse(representer.represent(Song.new), input).must_equal song }
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
# Decorator.represents detects singular.
|
73
|
+
describe "Decorator#to_/from_#{format}" do
|
74
|
+
let (:format) { format }
|
75
|
+
let (:representer) {
|
76
|
+
Class.new(Representable::Decorator) do
|
77
|
+
include mod
|
78
|
+
property :name
|
79
|
+
|
80
|
+
collection_representer :class => Song
|
81
|
+
end
|
82
|
+
}
|
83
|
+
|
84
|
+
it { render(representer.represent(song)).must_equal_document output }
|
85
|
+
it { parse(representer.represent(Song.new), input).must_equal song }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/test/representable_test.rb
CHANGED
@@ -27,34 +27,7 @@ class RepresentableTest < MiniTest::Spec
|
|
27
27
|
|
28
28
|
|
29
29
|
describe "#representable_attrs" do
|
30
|
-
it "responds to #representable_attrs" do
|
31
|
-
assert_equal 1, Band.representable_attrs.size
|
32
|
-
assert_equal "name", Band.representable_attrs.first.name
|
33
|
-
end
|
34
|
-
|
35
30
|
describe "in module" do
|
36
|
-
it "returns definitions" do
|
37
|
-
assert_equal 1, BandRepresentation.representable_attrs.size
|
38
|
-
assert_equal "name", BandRepresentation.representable_attrs.first.name
|
39
|
-
end
|
40
|
-
|
41
|
-
it "inherits to including modules xxx " do
|
42
|
-
assert_equal 2, PunkBandRepresentation.representable_attrs.size
|
43
|
-
assert_equal "name", PunkBandRepresentation.representable_attrs[:name].name
|
44
|
-
assert_equal "street_cred", PunkBandRepresentation.representable_attrs[:street_cred].name
|
45
|
-
end
|
46
|
-
|
47
|
-
it "inherits to including class" do
|
48
|
-
band = Class.new do
|
49
|
-
include Representable
|
50
|
-
include PunkBandRepresentation
|
51
|
-
end
|
52
|
-
|
53
|
-
assert_equal 2, band.representable_attrs.size
|
54
|
-
assert_equal "name", band.representable_attrs[:name].name
|
55
|
-
assert_equal "street_cred", band.representable_attrs[:street_cred].name
|
56
|
-
end
|
57
|
-
|
58
31
|
it "allows including the concrete representer module later" do
|
59
32
|
vd = class VD
|
60
33
|
attr_accessor :name, :street_cred
|
@@ -78,20 +51,6 @@ class RepresentableTest < MiniTest::Spec
|
|
78
51
|
# vd.name = "Van Halen"
|
79
52
|
# assert_equal "{\"name\":\"Van Halen\"}", vd.to_json
|
80
53
|
#end
|
81
|
-
|
82
|
-
it "doesn't share inherited properties between family members" do
|
83
|
-
parent = Module.new do
|
84
|
-
include Representable
|
85
|
-
property :id
|
86
|
-
end
|
87
|
-
|
88
|
-
child = Module.new do
|
89
|
-
include Representable
|
90
|
-
include parent
|
91
|
-
end
|
92
|
-
|
93
|
-
assert parent.representable_attrs.first.object_id != child.representable_attrs.first.object_id, "definitions shouldn't be identical"
|
94
|
-
end
|
95
54
|
end
|
96
55
|
end
|
97
56
|
|
@@ -173,8 +132,8 @@ class RepresentableTest < MiniTest::Spec
|
|
173
132
|
end
|
174
133
|
|
175
134
|
it "creates correct Definition" do
|
176
|
-
assert_equal "albums", RockBand.representable_attrs
|
177
|
-
assert RockBand.representable_attrs
|
135
|
+
assert_equal "albums", RockBand.representable_attrs.get(:albums).name
|
136
|
+
assert RockBand.representable_attrs.get(:albums).array?
|
178
137
|
end
|
179
138
|
end
|
180
139
|
|
@@ -185,13 +144,6 @@ class RepresentableTest < MiniTest::Spec
|
|
185
144
|
end
|
186
145
|
|
187
146
|
|
188
|
-
describe "#definition_class" do
|
189
|
-
it "returns Definition class" do
|
190
|
-
assert_equal Representable::Definition, Band.send(:definition_class)
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
|
195
147
|
# DISCUSS: i don't like the JSON requirement here, what about some generic test module?
|
196
148
|
class PopBand
|
197
149
|
include Representable::JSON
|
@@ -211,6 +163,7 @@ class RepresentableTest < MiniTest::Spec
|
|
211
163
|
assert_equal 2, @band.groupies
|
212
164
|
end
|
213
165
|
|
166
|
+
|
214
167
|
it "accepts :exclude option" do
|
215
168
|
@band.from_hash({"name"=>"No One's Choice", "groupies"=>2}, {:exclude => [:groupies]})
|
216
169
|
assert_equal "No One's Choice", @band.name
|