representable 3.0.0 → 3.2.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.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +23 -0
- data/CHANGES.md +33 -0
- data/Gemfile +4 -12
- data/LICENSE +1 -1
- data/README.md +12 -13
- data/Rakefile +1 -6
- data/TODO +1 -3
- data/TODO-4.0.md +72 -0
- data/lib/representable/binding.rb +32 -12
- data/lib/representable/cached.rb +1 -1
- data/lib/representable/coercion.rb +8 -6
- data/lib/representable/config.rb +13 -3
- data/lib/representable/debug.rb +23 -15
- data/lib/representable/declarative.rb +12 -7
- data/lib/representable/decorator.rb +1 -1
- data/lib/representable/definition.rb +7 -3
- data/lib/representable/deserializer.rb +5 -4
- data/lib/representable/for_collection.rb +1 -1
- data/lib/representable/hash/allow_symbols.rb +9 -11
- data/lib/representable/hash/binding.rb +1 -0
- data/lib/representable/hash/collection.rb +4 -2
- data/lib/representable/hash.rb +9 -2
- data/lib/representable/hash_methods.rb +3 -2
- data/lib/representable/insert.rb +1 -1
- data/lib/representable/json/collection.rb +3 -0
- data/lib/representable/json.rb +8 -7
- data/lib/representable/object/binding.rb +5 -1
- data/lib/representable/object.rb +1 -1
- data/lib/representable/option.rb +19 -0
- data/lib/representable/pipeline.rb +3 -2
- data/lib/representable/pipeline_factories.rb +4 -2
- data/lib/representable/populator.rb +1 -1
- data/lib/representable/represent.rb +1 -0
- data/lib/representable/serializer.rb +3 -2
- data/lib/representable/version.rb +1 -1
- data/lib/representable/xml/binding.rb +19 -13
- data/lib/representable/xml/namespace.rb +122 -0
- data/lib/representable/xml.rb +12 -10
- data/lib/representable/yaml/binding.rb +1 -0
- data/lib/representable/yaml.rb +6 -2
- data/lib/representable.rb +19 -25
- data/representable.gemspec +8 -9
- data/test/as_test.rb +7 -7
- data/test/binding_test.rb +14 -14
- data/test/cached_test.rb +59 -49
- data/test/class_test.rb +9 -9
- data/test/coercion_test.rb +33 -22
- data/test/config/inherit_test.rb +14 -14
- data/test/config_test.rb +20 -20
- data/test/decorator_scope_test.rb +4 -4
- data/test/decorator_test.rb +33 -20
- data/test/default_test.rb +8 -8
- data/test/defaults_options_test.rb +3 -3
- data/test/definition_test.rb +38 -40
- data/test/{example.rb → examples/example.rb} +0 -1
- data/test/examples/object.rb +1 -5
- data/test/exec_context_test.rb +8 -8
- data/test/features_test.rb +6 -6
- data/test/filter_test.rb +8 -8
- data/test/for_collection_test.rb +10 -10
- data/test/generic_test.rb +13 -13
- data/test/getter_setter_test.rb +5 -5
- data/test/hash_bindings_test.rb +1 -1
- data/test/hash_test.rb +45 -23
- data/test/heritage_test.rb +16 -13
- data/test/if_test.rb +9 -9
- data/test/include_exclude_test.rb +14 -14
- data/test/inherit_test.rb +18 -18
- data/test/inline_test.rb +24 -24
- data/test/instance_test.rb +31 -31
- data/test/is_representable_test.rb +10 -10
- data/test/json_test.rb +29 -7
- data/test/lonely_test.rb +31 -31
- data/test/nested_test.rb +13 -13
- data/test/object_test.rb +9 -9
- data/test/option_test.rb +36 -0
- data/test/parse_pipeline_test.rb +3 -5
- data/test/pipeline_test.rb +50 -50
- data/test/populator_test.rb +18 -18
- data/test/prepare_test.rb +4 -4
- data/test/private_options_test.rb +2 -2
- data/test/reader_writer_test.rb +2 -2
- data/test/render_nil_test.rb +2 -2
- data/test/represent_test.rb +14 -14
- data/test/representable_test.rb +34 -36
- data/test/schema_test.rb +8 -11
- data/test/serialize_deserialize_test.rb +2 -2
- data/test/skip_test.rb +14 -14
- data/test/stringify_hash_test.rb +3 -3
- data/test/test_helper.rb +26 -14
- data/test/uncategorized_test.rb +10 -10
- data/test/user_options_test.rb +4 -4
- data/test/wrap_test.rb +19 -19
- data/test/xml_bindings_test.rb +0 -4
- data/test/xml_namespace_test.rb +186 -0
- data/test/xml_test.rb +103 -43
- data/test/yaml_test.rb +51 -26
- metadata +42 -35
- data/.travis.yml +0 -7
- data/lib/representable/TODO.getting_serious +0 -11
- data/lib/representable/autoload.rb +0 -10
- data/test/mongoid_test.rb +0 -31
data/test/populator_test.rb
CHANGED
@@ -16,11 +16,11 @@ class PopulatorTest < Minitest::Spec
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
let
|
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 =
|
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
|
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.
|
73
|
-
album.song.uid.
|
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
|
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.
|
99
|
-
album.songs[1].uid.
|
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
|
data/test/prepare_test.rb
CHANGED
@@ -24,11 +24,11 @@ class PrepareTest < BaseTest
|
|
24
24
|
:representable => false # don't call #to_hash.
|
25
25
|
end
|
26
26
|
|
27
|
-
let
|
27
|
+
let(:hit) { Struct.new(:song).new(song).extend(representer) }
|
28
28
|
|
29
29
|
it "calls prepare:, nothing else" do
|
30
30
|
# render(hit).must_equal_document(output)
|
31
|
-
hit.to_hash.must_equal({"song" => PreparerClass.new(song)})
|
31
|
+
_(hit.to_hash).must_equal({"song" => PreparerClass.new(song)})
|
32
32
|
end
|
33
33
|
|
34
34
|
|
@@ -54,13 +54,13 @@ class PrepareTest < BaseTest
|
|
54
54
|
:representable => false # don't call #to_hash.
|
55
55
|
end
|
56
56
|
|
57
|
-
let
|
57
|
+
let(:hit) { Struct.new(:song).new.extend(representer) }
|
58
58
|
|
59
59
|
it "calls prepare:, nothing else" do
|
60
60
|
# render(hit).must_equal_document(output)
|
61
61
|
hit.from_hash("song" => {})
|
62
62
|
|
63
|
-
hit.song.must_equal(PreparerClass.new(String.new))
|
63
|
+
_(hit.song).must_equal(PreparerClass.new(String.new))
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
@@ -8,11 +8,11 @@ class PrivateOptionsTest < MiniTest::Spec # TODO: move me to separate file.
|
|
8
8
|
|
9
9
|
it "render: doesn't modify options" do
|
10
10
|
representer.new(nil).to_hash(options)
|
11
|
-
options.must_equal({exclude: "name"})
|
11
|
+
_(options).must_equal({exclude: "name"})
|
12
12
|
end
|
13
13
|
|
14
14
|
it "parse: doesn't modify options" do
|
15
15
|
representer.new(nil).from_hash(options)
|
16
|
-
options.must_equal({exclude: "name"})
|
16
|
+
_(options).must_equal({exclude: "name"})
|
17
17
|
end
|
18
18
|
end
|
data/test/reader_writer_test.rb
CHANGED
@@ -10,10 +10,10 @@ class ReaderWriterTest < BaseTest
|
|
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(user_options: {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
|
17
|
-
subject.from_hash({"title" => "15) The Wars End"}).name.must_equal "The Wars End"
|
17
|
+
_(subject.from_hash({"title" => "15) The Wars End"}).name).must_equal "The Wars End"
|
18
18
|
end
|
19
19
|
end
|
data/test/render_nil_test.rb
CHANGED
@@ -8,7 +8,7 @@ class RenderNilTest < MiniTest::Spec
|
|
8
8
|
property :title, render_nil: true
|
9
9
|
end
|
10
10
|
|
11
|
-
it { Song.new.extend(representer).to_hash.must_equal({"title"=>nil}) }
|
11
|
+
it { _(Song.new.extend(representer).to_hash).must_equal({"title"=>nil}) }
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "with :extend it shouldn't extend nil" do
|
@@ -16,6 +16,6 @@ class RenderNilTest < MiniTest::Spec
|
|
16
16
|
property :title, render_nil: true, extend: Class
|
17
17
|
end
|
18
18
|
|
19
|
-
it { Song.new.extend(representer).to_hash.must_equal({"title"=>nil}) }
|
19
|
+
it { _(Song.new.extend(representer).to_hash).must_equal({"title"=>nil}) }
|
20
20
|
end
|
21
21
|
end
|
data/test/represent_test.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class RepresentTest < MiniTest::Spec
|
4
|
-
let
|
5
|
-
let
|
4
|
+
let(:songs) { [song, Song.new("Can't Take Them All")] }
|
5
|
+
let(:song) { Song.new("Days Go By") }
|
6
6
|
|
7
7
|
for_formats(
|
8
8
|
:hash => [Representable::Hash, out=[{"name" => "Days Go By"}, {"name"=>"Can't Take Them All"}], out],
|
@@ -12,9 +12,9 @@ class RepresentTest < MiniTest::Spec
|
|
12
12
|
|
13
13
|
# Representer.represents detects collection.
|
14
14
|
describe "Module#to_/from_#{format}" do
|
15
|
-
let
|
15
|
+
let(:format) { format }
|
16
16
|
|
17
|
-
let
|
17
|
+
let(:representer) {
|
18
18
|
Module.new do
|
19
19
|
include mod
|
20
20
|
property :name
|
@@ -24,13 +24,13 @@ class RepresentTest < MiniTest::Spec
|
|
24
24
|
}
|
25
25
|
|
26
26
|
it { render(representer.represent(songs)).must_equal_document output }
|
27
|
-
it { parse(representer.represent([]), input).must_equal songs }
|
27
|
+
it { _(parse(representer.represent([]), input)).must_equal songs }
|
28
28
|
end
|
29
29
|
|
30
30
|
# Decorator.represents detects collection.
|
31
31
|
describe "Decorator#to_/from_#{format}" do
|
32
|
-
let
|
33
|
-
let
|
32
|
+
let(:format) { format }
|
33
|
+
let(:representer) {
|
34
34
|
Class.new(Representable::Decorator) do
|
35
35
|
include mod
|
36
36
|
property :name
|
@@ -40,7 +40,7 @@ class RepresentTest < MiniTest::Spec
|
|
40
40
|
}
|
41
41
|
|
42
42
|
it { render(representer.represent(songs)).must_equal_document output }
|
43
|
-
it("ficken") { parse(representer.represent([]), input).must_equal songs }
|
43
|
+
it("ficken") { _(parse(representer.represent([]), input)).must_equal songs }
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -53,9 +53,9 @@ class RepresentTest < MiniTest::Spec
|
|
53
53
|
|
54
54
|
# Representer.represents detects singular.
|
55
55
|
describe "Module#to_/from_#{format}" do
|
56
|
-
let
|
56
|
+
let(:format) { format }
|
57
57
|
|
58
|
-
let
|
58
|
+
let(:representer) {
|
59
59
|
Module.new do
|
60
60
|
include mod
|
61
61
|
property :name
|
@@ -65,14 +65,14 @@ class RepresentTest < MiniTest::Spec
|
|
65
65
|
}
|
66
66
|
|
67
67
|
it { render(representer.represent(song)).must_equal_document output }
|
68
|
-
it { parse(representer.represent(Song.new), input).must_equal song }
|
68
|
+
it { _(parse(representer.represent(Song.new), input)).must_equal song }
|
69
69
|
end
|
70
70
|
|
71
71
|
|
72
72
|
# Decorator.represents detects singular.
|
73
73
|
describe "Decorator#to_/from_#{format}" do
|
74
|
-
let
|
75
|
-
let
|
74
|
+
let(:format) { format }
|
75
|
+
let(:representer) {
|
76
76
|
Class.new(Representable::Decorator) do
|
77
77
|
include mod
|
78
78
|
property :name
|
@@ -82,7 +82,7 @@ class RepresentTest < MiniTest::Spec
|
|
82
82
|
}
|
83
83
|
|
84
84
|
it { render(representer.represent(song)).must_equal_document output }
|
85
|
-
it { parse(representer.represent(Song.new), input).must_equal song }
|
85
|
+
it { _(parse(representer.represent(Song.new), input)).must_equal song }
|
86
86
|
end
|
87
87
|
end
|
88
88
|
end
|
data/test/representable_test.rb
CHANGED
@@ -76,8 +76,6 @@ class RepresentableTest < MiniTest::Spec
|
|
76
76
|
end
|
77
77
|
|
78
78
|
it "allows mixing in multiple representers" do
|
79
|
-
require 'representable/json'
|
80
|
-
require 'representable/xml'
|
81
79
|
class Bodyjar
|
82
80
|
include Representable::XML
|
83
81
|
include Representable::JSON
|
@@ -134,8 +132,8 @@ class RepresentableTest < MiniTest::Spec
|
|
134
132
|
|
135
133
|
# test ::inherited.
|
136
134
|
it do
|
137
|
-
BaseClass.respond_to?(:other).must_equal false
|
138
|
-
SubClass.respond_to?(:other).must_equal true
|
135
|
+
_(BaseClass.respond_to?(:other)).must_equal false
|
136
|
+
_(SubClass.respond_to?(:other)).must_equal true
|
139
137
|
end
|
140
138
|
|
141
139
|
module DifferentIncluded
|
@@ -166,13 +164,13 @@ class RepresentableTest < MiniTest::Spec
|
|
166
164
|
it "doesn't modify options hash" do
|
167
165
|
options = {}
|
168
166
|
representer.property(:title, options)
|
169
|
-
options.must_equal({})
|
167
|
+
_(options).must_equal({})
|
170
168
|
end
|
171
169
|
|
172
170
|
representer! {}
|
173
171
|
|
174
172
|
it "returns the Definition instance" do
|
175
|
-
representer.property(:name).must_be_kind_of Representable::Definition
|
173
|
+
_(representer.property(:name)).must_be_kind_of Representable::Definition
|
176
174
|
end
|
177
175
|
end
|
178
176
|
|
@@ -226,7 +224,7 @@ class RepresentableTest < MiniTest::Spec
|
|
226
224
|
@band = Class.new(Band) { property :name; collection :founders, :writeable => false; attr_accessor :founders }.new
|
227
225
|
@band.from_hash("name" => "Iron Maiden", "groupies" => 2, "founders" => ["Steve Harris"])
|
228
226
|
assert_equal "Iron Maiden", @band.name
|
229
|
-
|
227
|
+
assert_nil @band.founders
|
230
228
|
end
|
231
229
|
|
232
230
|
it "always returns the represented" do
|
@@ -235,7 +233,7 @@ class RepresentableTest < MiniTest::Spec
|
|
235
233
|
|
236
234
|
it "includes false attributes" do
|
237
235
|
@band.from_hash({"groupies"=>false})
|
238
|
-
|
236
|
+
refute @band.groupies
|
239
237
|
end
|
240
238
|
|
241
239
|
it "ignores properties not present in the incoming document" do
|
@@ -263,7 +261,7 @@ class RepresentableTest < MiniTest::Spec
|
|
263
261
|
|
264
262
|
@band = Band.new.extend(repr)
|
265
263
|
@band.send(config.first, config.last)
|
266
|
-
|
264
|
+
assert_nil @band.name, "Failed in #{format}"
|
267
265
|
end
|
268
266
|
end
|
269
267
|
|
@@ -302,14 +300,14 @@ class RepresentableTest < MiniTest::Spec
|
|
302
300
|
end
|
303
301
|
|
304
302
|
it "#to_hash propagates to nested objects" do
|
305
|
-
OpenStruct.new(track: OpenStruct.new(nr: 1, length: OpenStruct.new(seconds: nil))).extend(representer).extend(Representable::Debug).
|
306
|
-
to_hash(user_options: {nr: 9}).must_equal({"track"=>{"nr"=>9, "length"=>{seconds: 9}}})
|
303
|
+
_(OpenStruct.new(track: OpenStruct.new(nr: 1, length: OpenStruct.new(seconds: nil))).extend(representer).extend(Representable::Debug).
|
304
|
+
to_hash(user_options: {nr: 9})).must_equal({"track"=>{"nr"=>9, "length"=>{seconds: 9}}})
|
307
305
|
end
|
308
306
|
|
309
307
|
it "#from_hash propagates to nested objects" do
|
310
308
|
song = OpenStruct.new.extend(representer).from_hash({"track"=>{"nr" => "replace me", "length"=>{"seconds"=>"replacing"}}}, user_options: {nr: 9})
|
311
|
-
song.track.nr.must_equal 9
|
312
|
-
song.track.length.seconds.must_equal 9
|
309
|
+
_(song.track.nr).must_equal 9
|
310
|
+
_(song.track.length.seconds).must_equal 9
|
313
311
|
end
|
314
312
|
end
|
315
313
|
end
|
@@ -366,12 +364,12 @@ class RepresentableTest < MiniTest::Spec
|
|
366
364
|
end
|
367
365
|
|
368
366
|
it "executes lambda in represented instance context" do
|
369
|
-
Song.new("Carnage").instance_eval do
|
367
|
+
_(Song.new("Carnage").instance_eval do
|
370
368
|
def compute_representer(name)
|
371
369
|
UpcaseRepresenter
|
372
370
|
end
|
373
371
|
self
|
374
|
-
end.extend(representer).to_hash.must_equal({"name" => "CARNAGE"})
|
372
|
+
end.extend(representer).to_hash).must_equal({"name" => "CARNAGE"})
|
375
373
|
end
|
376
374
|
end
|
377
375
|
|
@@ -384,8 +382,8 @@ class RepresentableTest < MiniTest::Spec
|
|
384
382
|
|
385
383
|
it "uses object from :instance but still extends it" do
|
386
384
|
song = Song.new.extend(representer).from_hash("name" => "Eric's Had A Bad Day")
|
387
|
-
song.name.must_equal obj
|
388
|
-
song.name.must_be_kind_of mod
|
385
|
+
_(song.name).must_equal obj
|
386
|
+
_(song.name).must_be_kind_of mod
|
389
387
|
end
|
390
388
|
end
|
391
389
|
|
@@ -400,8 +398,8 @@ class RepresentableTest < MiniTest::Spec
|
|
400
398
|
end
|
401
399
|
|
402
400
|
it "uses lambda when parsing" do
|
403
|
-
Song.new.extend(representer).from_hash({"name" => "You Make Me Thick"}).name.must_equal "you make me thick"
|
404
|
-
Song.new.extend(representer).from_hash({"name" => "Stepstranger"}).name.must_equal "stepstranger" # DISCUSS: we compare "".is_a?(UpcaseString)
|
401
|
+
_(Song.new.extend(representer).from_hash({"name" => "You Make Me Thick"}).name).must_equal "you make me thick"
|
402
|
+
_(Song.new.extend(representer).from_hash({"name" => "Stepstranger"}).name).must_equal "stepstranger" # DISCUSS: we compare "".is_a?(UpcaseString)
|
405
403
|
end
|
406
404
|
|
407
405
|
describe "with :class lambda" do
|
@@ -412,12 +410,12 @@ class RepresentableTest < MiniTest::Spec
|
|
412
410
|
|
413
411
|
it "creates instance from :class lambda when parsing" do
|
414
412
|
song = OpenStruct.new.extend(representer).from_hash({"name" => "Quitters Never Win"})
|
415
|
-
song.name.must_be_kind_of UpcaseString
|
416
|
-
song.name.must_equal "QUITTERS NEVER WIN"
|
413
|
+
_(song.name).must_be_kind_of UpcaseString
|
414
|
+
_(song.name).must_equal "QUITTERS NEVER WIN"
|
417
415
|
|
418
416
|
song = OpenStruct.new.extend(representer).from_hash({"name" => "Still Failing?"})
|
419
|
-
song.name.must_be_kind_of String
|
420
|
-
song.name.must_equal "still failing?"
|
417
|
+
_(song.name).must_be_kind_of String
|
418
|
+
_(song.name).must_equal "still failing?"
|
421
419
|
end
|
422
420
|
end
|
423
421
|
end
|
@@ -429,12 +427,12 @@ class RepresentableTest < MiniTest::Spec
|
|
429
427
|
end
|
430
428
|
|
431
429
|
it "uses lambda for each item when rendering" do
|
432
|
-
Album.new([UpcaseString.new("Dean Martin"), "Charlie Still Smirks"]).extend(representer).to_hash.must_equal("songs"=>["DEAN MARTIN", "charlie still smirks"])
|
430
|
+
_(Album.new([UpcaseString.new("Dean Martin"), "Charlie Still Smirks"]).extend(representer).to_hash).must_equal("songs"=>["DEAN MARTIN", "charlie still smirks"])
|
433
431
|
end
|
434
432
|
|
435
433
|
it "uses lambda for each item when parsing" do
|
436
434
|
album = Album.new.extend(representer).from_hash("songs"=>["DEAN MARTIN", "charlie still smirks"])
|
437
|
-
album.songs.must_equal ["dean martin", "charlie still smirks"] # DISCUSS: we compare "".is_a?(UpcaseString)
|
435
|
+
_(album.songs).must_equal ["dean martin", "charlie still smirks"] # DISCUSS: we compare "".is_a?(UpcaseString)
|
438
436
|
end
|
439
437
|
|
440
438
|
describe "with :class lambda" do
|
@@ -445,18 +443,18 @@ class RepresentableTest < MiniTest::Spec
|
|
445
443
|
|
446
444
|
it "creates instance from :class lambda for each item when parsing" do
|
447
445
|
album = Album.new.extend(representer).from_hash("songs"=>["Still Failing?", "charlie still smirks"])
|
448
|
-
album.songs.must_equal ["still failing?", "CHARLIE STILL SMIRKS"]
|
446
|
+
_(album.songs).must_equal ["still failing?", "CHARLIE STILL SMIRKS"]
|
449
447
|
end
|
450
448
|
end
|
451
449
|
end
|
452
450
|
|
453
451
|
describe ":decorator" do
|
454
|
-
let
|
455
|
-
let
|
456
|
-
let
|
452
|
+
let(:extend_rpr) { Module.new { include Representable::Hash; collection :songs, :extend => SongRepresenter } }
|
453
|
+
let(:decorator_rpr) { Module.new { include Representable::Hash; collection :songs, :decorator => SongRepresenter } }
|
454
|
+
let(:songs) { [Song.new("Bloody Mary")] }
|
457
455
|
|
458
456
|
it "is aliased to :extend" do
|
459
|
-
Album.new(songs).extend(extend_rpr).to_hash.must_equal Album.new(songs).extend(decorator_rpr).to_hash
|
457
|
+
_(Album.new(songs).extend(extend_rpr).to_hash).must_equal Album.new(songs).extend(decorator_rpr).to_hash
|
460
458
|
end
|
461
459
|
end
|
462
460
|
|
@@ -472,22 +470,22 @@ class RepresentableTest < MiniTest::Spec
|
|
472
470
|
end
|
473
471
|
|
474
472
|
describe "::prepare" do
|
475
|
-
let
|
476
|
-
let
|
473
|
+
let(:song) { Song.new("Still Friends In The End") }
|
474
|
+
let(:album) { Album.new([song]) }
|
477
475
|
|
478
476
|
describe "module including Representable" do
|
479
477
|
it "uses :extend strategy" do
|
480
478
|
album_rpr = Module.new { include Representable::Hash; collection :songs, :class => Song, :extend => SongRepresenter}
|
481
479
|
|
482
|
-
album_rpr.prepare(album).to_hash.must_equal({"songs"=>[{"name"=>"Still Friends In The End"}]})
|
483
|
-
album.must_respond_to :to_hash
|
480
|
+
_(album_rpr.prepare(album).to_hash).must_equal({"songs"=>[{"name"=>"Still Friends In The End"}]})
|
481
|
+
_(album).must_respond_to :to_hash
|
484
482
|
end
|
485
483
|
end
|
486
484
|
|
487
485
|
describe "Decorator subclass" do
|
488
486
|
it "uses :decorate strategy" do
|
489
|
-
AlbumRepresentation.prepare(album).to_hash.must_equal({"songs"=>[{"name"=>"Still Friends In The End"}]})
|
490
|
-
album.wont_respond_to :to_hash
|
487
|
+
_(AlbumRepresentation.prepare(album).to_hash).must_equal({"songs"=>[{"name"=>"Still Friends In The End"}]})
|
488
|
+
_(album).wont_respond_to :to_hash
|
491
489
|
end
|
492
490
|
end
|
493
491
|
end
|
data/test/schema_test.rb
CHANGED
@@ -58,13 +58,13 @@ class SchemaTest < MiniTest::Spec
|
|
58
58
|
end
|
59
59
|
|
60
60
|
describe "3-level deep with features" do
|
61
|
-
let
|
61
|
+
let(:label) { OpenStruct.new(:name => "Epitaph", :location => OpenStruct.new(:city => "Sanfran", :name => "DON'T SHOW ME!")) }
|
62
62
|
|
63
63
|
# Module does correctly include features in inlines.
|
64
|
-
it { band.extend(Module).to_hash.must_equal({"label"=>{"name"=>"Epitaph", "location"=>{"city"=>"Sanfran"}}, "genre"=>"Punkrock"}) }
|
64
|
+
it { _(band.extend(Module).to_hash).must_equal({"label"=>{"name"=>"Epitaph", "location"=>{"city"=>"Sanfran"}}, "genre"=>"Punkrock"}) }
|
65
65
|
|
66
66
|
# Decorator does correctly include features in inlines.
|
67
|
-
it { Decorator.new(band).to_hash.must_equal({"label"=>{"name"=>"Epitaph", "location"=>{"city"=>"Sanfran"}}, "genre"=>"Punkrock"}) }
|
67
|
+
it { _(Decorator.new(band).to_hash).must_equal({"label"=>{"name"=>"Epitaph", "location"=>{"city"=>"Sanfran"}}, "genre"=>"Punkrock"}) }
|
68
68
|
end
|
69
69
|
|
70
70
|
|
@@ -77,14 +77,14 @@ class SchemaTest < MiniTest::Spec
|
|
77
77
|
|
78
78
|
# puts Decorator.representable_attrs[:definitions].inspect
|
79
79
|
|
80
|
-
let
|
81
|
-
let
|
80
|
+
let(:label) { OpenStruct.new(:name => "Fat Wreck", :city => "San Francisco", :employees => [OpenStruct.new(:name => "Mike")], :location => OpenStruct.new(:city => "Sanfran")) }
|
81
|
+
let(:band) { OpenStruct.new(:genre => "Punkrock", :label => label) }
|
82
82
|
|
83
83
|
|
84
84
|
# it { FlatlinersDecorator.new( OpenStruct.new(label: OpenStruct.new) ).
|
85
85
|
# to_hash.must_equal({}) }
|
86
86
|
it do
|
87
|
-
Decorator.new(band).to_hash.must_equal({"genre"=>"Punkrock", "label"=>{"name"=>"Fat Wreck", "location"=>{"city"=>"Sanfran"}}})
|
87
|
+
_(Decorator.new(band).to_hash).must_equal({"genre"=>"Punkrock", "label"=>{"name"=>"Fat Wreck", "location"=>{"city"=>"Sanfran"}}})
|
88
88
|
end
|
89
89
|
|
90
90
|
|
@@ -103,7 +103,7 @@ class SchemaTest < MiniTest::Spec
|
|
103
103
|
end
|
104
104
|
|
105
105
|
it do
|
106
|
-
InheritDecorator.new(band).to_hash.must_equal({"genre"=>"Punkrock", "label"=>{"name"=>"Fat Wreck", "city"=>"San Francisco", "location"=>{"city"=>"Sanfran"}}})
|
106
|
+
_(InheritDecorator.new(band).to_hash).must_equal({"genre"=>"Punkrock", "label"=>{"name"=>"Fat Wreck", "city"=>"San Francisco", "location"=>{"city"=>"Sanfran"}}})
|
107
107
|
end
|
108
108
|
|
109
109
|
|
@@ -116,11 +116,8 @@ class SchemaTest < MiniTest::Spec
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
-
require "pp"
|
120
|
-
pp InheritFromDecorator.representable_attrs.get(:label)[:extend].(nil).representable_attrs
|
121
|
-
|
122
119
|
it do
|
123
|
-
InheritFromDecorator.new(band).to_hash.must_equal({"genre"=>"Punkrock", "label"=>{"name"=>"Fat Wreck", "city"=>"San Francisco", "employees"=>[{"name"=>"Mike"}], "location"=>{"city"=>"Sanfran"}}})
|
120
|
+
_(InheritFromDecorator.new(band).to_hash).must_equal({"genre"=>"Punkrock", "label"=>{"name"=>"Fat Wreck", "city"=>"San Francisco", "employees"=>[{"name"=>"Mike"}], "location"=>{"city"=>"Sanfran"}}})
|
124
121
|
end
|
125
122
|
end
|
126
123
|
|
@@ -13,7 +13,7 @@ class SerializeDeserializeTest < BaseTest
|
|
13
13
|
}
|
14
14
|
end
|
15
15
|
|
16
|
-
it { subject.from_hash({"song" => Object}, user_options: {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
|
@@ -28,6 +28,6 @@ class SerializeDeserializeTest < BaseTest
|
|
28
28
|
|
29
29
|
before { subject.song = "Arrested In Shanghai" }
|
30
30
|
|
31
|
-
it { subject.to_hash(user_options: {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
|
data/test/skip_test.rb
CHANGED
@@ -14,7 +14,7 @@ class SkipParseTest < MiniTest::Spec
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
let
|
17
|
+
let(:song) { OpenStruct.new.extend(representer) }
|
18
18
|
|
19
19
|
# do parse.
|
20
20
|
it do
|
@@ -24,13 +24,13 @@ class SkipParseTest < MiniTest::Spec
|
|
24
24
|
"airplays" => [{"station" => "JJJ"}]
|
25
25
|
}, user_options: { skip?: true })
|
26
26
|
|
27
|
-
song.title.must_equal "Victim Of Fate"
|
28
|
-
song.band.name.must_equal "Mute 98"
|
29
|
-
song.airplays[0].station.must_equal "JJJ"
|
27
|
+
_(song.title).must_equal "Victim Of Fate"
|
28
|
+
_(song.band.name).must_equal "Mute 98"
|
29
|
+
_(song.airplays[0].station).must_equal "JJJ"
|
30
30
|
end
|
31
31
|
|
32
32
|
# skip parsing.
|
33
|
-
let
|
33
|
+
let(:airplay) { OpenStruct.new(station: "JJJ") }
|
34
34
|
|
35
35
|
it do
|
36
36
|
song.from_hash({
|
@@ -39,9 +39,9 @@ class SkipParseTest < MiniTest::Spec
|
|
39
39
|
"airplays" => [{}, {"station" => "JJJ"}, {}],
|
40
40
|
}, user_options: { skip?: true })
|
41
41
|
|
42
|
-
song.title.
|
43
|
-
song.band.
|
44
|
-
song.airplays.must_equal [airplay]
|
42
|
+
_(song.title).must_be_nil
|
43
|
+
_(song.band).must_be_nil
|
44
|
+
_(song.airplays).must_equal [airplay]
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -59,23 +59,23 @@ class SkipRenderTest < MiniTest::Spec
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
let
|
63
|
-
let
|
62
|
+
let(:song) { OpenStruct.new(title: "Black Night", band: OpenStruct.new(name: "Time Again")).extend(representer) }
|
63
|
+
let(:skip_song) { OpenStruct.new(title: "Time Bomb", band: OpenStruct.new(name: "Rancid")).extend(representer) }
|
64
64
|
|
65
65
|
# do render.
|
66
|
-
it { song.to_hash(user_options: { skip?: true }).must_equal({"title"=>"Black Night", "band"=>{"name"=>"Time Again"}}) }
|
66
|
+
it { _(song.to_hash(user_options: { skip?: true })).must_equal({"title"=>"Black Night", "band"=>{"name"=>"Time Again"}}) }
|
67
67
|
# skip.
|
68
|
-
it { skip_song.to_hash(user_options: { skip?: true }).must_equal({"title"=>"Time Bomb"}) }
|
68
|
+
it { _(skip_song.to_hash(user_options: { skip?: true })).must_equal({"title"=>"Time Bomb"}) }
|
69
69
|
|
70
70
|
# do render all collection items.
|
71
71
|
it do
|
72
72
|
song = OpenStruct.new(airplays: [OpenStruct.new(station: "JJJ"), OpenStruct.new(station: "ABC")]).extend(representer)
|
73
|
-
song.to_hash(user_options: { skip?: true }).must_equal({"airplays"=>[{"station"=>"JJJ"}, {"station"=>"ABC"}]})
|
73
|
+
_(song.to_hash(user_options: { skip?: true })).must_equal({"airplays"=>[{"station"=>"JJJ"}, {"station"=>"ABC"}]})
|
74
74
|
end
|
75
75
|
|
76
76
|
# skip middle item.
|
77
77
|
it do
|
78
78
|
song = OpenStruct.new(airplays: [OpenStruct.new(station: "JJJ"), OpenStruct.new(station: "Radio Dreyeckland"), OpenStruct.new(station: "ABC")]).extend(representer)
|
79
|
-
song.to_hash(user_options: { skip?: true }).must_equal({"airplays"=>[{"station"=>"JJJ"}, {"station"=>"ABC"}]})
|
79
|
+
_(song.to_hash(user_options: { skip?: true })).must_equal({"airplays"=>[{"station"=>"JJJ"}, {"station"=>"ABC"}]})
|
80
80
|
end
|
81
81
|
end
|
data/test/stringify_hash_test.rb
CHANGED
@@ -17,11 +17,11 @@ describe "#from_hash" do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it "parses symbols, too" do
|
20
|
-
OpenStruct.new.extend(representer).from_hash({:song => {:title => "Der Optimist"}}).song.title.must_equal "Der Optimist"
|
20
|
+
_(OpenStruct.new.extend(representer).from_hash({:song => {:title => "Der Optimist"}}).song.title).must_equal "Der Optimist"
|
21
21
|
end
|
22
22
|
|
23
23
|
it "still parses strings" do
|
24
|
-
OpenStruct.new.extend(representer).from_hash({"song" => {"title" => "Der Optimist"}}).song.title.must_equal "Der Optimist"
|
24
|
+
_(OpenStruct.new.extend(representer).from_hash({"song" => {"title" => "Der Optimist"}}).song.title).must_equal "Der Optimist"
|
25
25
|
end
|
26
26
|
|
27
27
|
describe "with :wrap" do
|
@@ -33,7 +33,7 @@ describe "#from_hash" do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
it "parses symbols, too" do
|
36
|
-
OpenStruct.new.extend(representer).from_hash({:album => {:song => {:title => "Der Optimist"}}}).song.title.must_equal "Der Optimist"
|
36
|
+
_(OpenStruct.new.extend(representer).from_hash({:album => {:song => {:title => "Der Optimist"}}}).song.title).must_equal "Der Optimist"
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|