representable 2.3.0 → 2.4.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +47 -0
- data/Gemfile +5 -0
- data/README.md +33 -0
- data/lib/representable.rb +60 -73
- data/lib/representable/binding.rb +37 -194
- data/lib/representable/cached.rb +10 -46
- data/lib/representable/coercion.rb +8 -8
- data/lib/representable/config.rb +15 -75
- data/lib/representable/debug.rb +41 -59
- data/lib/representable/declarative.rb +34 -53
- data/lib/representable/decorator.rb +11 -40
- data/lib/representable/definition.rb +14 -15
- data/lib/representable/deprecations.rb +90 -0
- data/lib/representable/deserializer.rb +87 -82
- data/lib/representable/for_collection.rb +5 -3
- data/lib/representable/hash.rb +5 -3
- data/lib/representable/hash/binding.rb +6 -15
- data/lib/representable/hash/collection.rb +10 -6
- data/lib/representable/hash_methods.rb +5 -5
- data/lib/representable/insert.rb +31 -0
- data/lib/representable/json.rb +7 -3
- data/lib/representable/json/hash.rb +1 -1
- data/lib/representable/object/binding.rb +5 -5
- data/lib/representable/parse_strategies.rb +37 -3
- data/lib/representable/pipeline.rb +37 -5
- data/lib/representable/pipeline_factories.rb +88 -0
- data/lib/representable/serializer.rb +38 -44
- data/lib/representable/version.rb +1 -1
- data/lib/representable/xml.rb +4 -0
- data/lib/representable/xml/binding.rb +25 -31
- data/lib/representable/xml/collection.rb +5 -3
- data/lib/representable/xml/hash.rb +7 -2
- data/lib/representable/yaml.rb +6 -3
- data/lib/representable/yaml/binding.rb +4 -4
- data/representable.gemspec +3 -3
- data/test/---deserialize-pipeline_test.rb +37 -0
- data/test/binding_test.rb +7 -7
- data/test/cached_test.rb +31 -19
- data/test/coercion_test.rb +2 -2
- data/test/config/inherit_test.rb +13 -12
- data/test/config_test.rb +12 -67
- data/test/decorator_test.rb +4 -5
- data/test/default_test.rb +34 -0
- data/test/defaults_options_test.rb +93 -0
- data/test/definition_test.rb +19 -39
- data/test/exec_context_test.rb +1 -1
- data/test/filter_test.rb +18 -20
- data/test/getter_setter_test.rb +1 -8
- data/test/hash_bindings_test.rb +13 -13
- data/test/heritage_test.rb +62 -0
- data/test/if_test.rb +1 -0
- data/test/inherit_test.rb +5 -3
- data/test/instance_test.rb +3 -4
- data/test/json_test.rb +3 -59
- data/test/lonely_test.rb +47 -3
- data/test/nested_test.rb +8 -2
- data/test/pipeline_test.rb +259 -0
- data/test/populator_test.rb +76 -0
- data/test/realistic_benchmark.rb +39 -7
- data/test/render_nil_test.rb +21 -0
- data/test/represent_test.rb +2 -2
- data/test/representable_test.rb +33 -103
- data/test/schema_test.rb +5 -15
- data/test/serialize_deserialize_test.rb +2 -2
- data/test/skip_test.rb +1 -1
- data/test/test_helper.rb +6 -0
- data/test/uncategorized_test.rb +67 -0
- data/test/xml_bindings_test.rb +6 -6
- data/test/xml_test.rb +6 -6
- metadata +33 -13
- data/lib/representable/apply.rb +0 -13
- data/lib/representable/inheritable.rb +0 -71
- data/lib/representable/mapper.rb +0 -83
- data/lib/representable/populator.rb +0 -56
- data/test/inheritable_test.rb +0 -97
data/test/config/inherit_test.rb
CHANGED
@@ -16,20 +16,21 @@ class ConfigInheritTest < MiniTest::Spec
|
|
16
16
|
|
17
17
|
# end
|
18
18
|
module GenreModule
|
19
|
-
include Representable
|
19
|
+
include Representable::Hash
|
20
20
|
property :genre
|
21
21
|
end
|
22
22
|
|
23
23
|
|
24
24
|
# in Decorator ------------------------------------------------
|
25
25
|
class Decorator < Representable::Decorator
|
26
|
+
include Representable::Hash
|
26
27
|
property :title
|
27
28
|
property :artist do
|
28
29
|
property :id
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
|
-
it { Decorator.
|
33
|
+
it { Decorator.definitions.keys.must_equal ["title", "artist"] }
|
33
34
|
|
34
35
|
# in inheriting Decorator
|
35
36
|
|
@@ -37,7 +38,7 @@ class ConfigInheritTest < MiniTest::Spec
|
|
37
38
|
property :location
|
38
39
|
end
|
39
40
|
|
40
|
-
it { InheritingDecorator.
|
41
|
+
it { InheritingDecorator.definitions.keys.must_equal ["title", "artist", "location"] }
|
41
42
|
it { assert_cloned(InheritingDecorator, Decorator, "title") }
|
42
43
|
it do
|
43
44
|
InheritingDecorator.representable_attrs.get(:artist).representer_module.object_id.wont_equal Decorator.representable_attrs.get(:artist).representer_module.object_id
|
@@ -50,7 +51,7 @@ class ConfigInheritTest < MiniTest::Spec
|
|
50
51
|
property :location
|
51
52
|
end
|
52
53
|
|
53
|
-
it { InheritingAndIncludingDecorator.
|
54
|
+
it { InheritingAndIncludingDecorator.definitions.keys.must_equal ["title", "artist", "genre", "location"] }
|
54
55
|
it { assert_cloned(InheritingAndIncludingDecorator, GenreModule, :genre) }
|
55
56
|
|
56
57
|
|
@@ -60,7 +61,7 @@ class ConfigInheritTest < MiniTest::Spec
|
|
60
61
|
property :title
|
61
62
|
end
|
62
63
|
|
63
|
-
it { Module.
|
64
|
+
it { Module.definitions.keys.must_equal ["title"] }
|
64
65
|
|
65
66
|
|
66
67
|
# in module including module
|
@@ -71,7 +72,7 @@ class ConfigInheritTest < MiniTest::Spec
|
|
71
72
|
property :location
|
72
73
|
end
|
73
74
|
|
74
|
-
it { SubModule.
|
75
|
+
it { SubModule.definitions.keys.must_equal ["title", "location"] }
|
75
76
|
it { assert_cloned(SubModule, Module, :title) }
|
76
77
|
|
77
78
|
# including preserves order
|
@@ -83,7 +84,7 @@ class ConfigInheritTest < MiniTest::Spec
|
|
83
84
|
property :location
|
84
85
|
end
|
85
86
|
|
86
|
-
it { IncludingModule.
|
87
|
+
it { IncludingModule.definitions.keys.must_equal ["genre", "title", "location"] }
|
87
88
|
|
88
89
|
|
89
90
|
# included in class -------------------------------------------
|
@@ -92,7 +93,7 @@ class ConfigInheritTest < MiniTest::Spec
|
|
92
93
|
include IncludingModule
|
93
94
|
end
|
94
95
|
|
95
|
-
it { Class.
|
96
|
+
it { Class.definitions.keys.must_equal ["genre", "title", "location"] }
|
96
97
|
it { assert_cloned(Class, IncludingModule, :title) }
|
97
98
|
it { assert_cloned(Class, IncludingModule, :location) }
|
98
99
|
it { assert_cloned(Class, IncludingModule, :genre) }
|
@@ -104,7 +105,7 @@ class ConfigInheritTest < MiniTest::Spec
|
|
104
105
|
include IncludingModule
|
105
106
|
end
|
106
107
|
|
107
|
-
it { DefiningClass.
|
108
|
+
it { DefiningClass.definitions.keys.must_equal ["street_cred", "genre", "title", "location"] }
|
108
109
|
|
109
110
|
# in class
|
110
111
|
class RepresenterClass
|
@@ -112,7 +113,7 @@ class ConfigInheritTest < MiniTest::Spec
|
|
112
113
|
property :title
|
113
114
|
end
|
114
115
|
|
115
|
-
it { RepresenterClass.
|
116
|
+
it { RepresenterClass.definitions.keys.must_equal ["title"] }
|
116
117
|
|
117
118
|
|
118
119
|
# in inheriting class
|
@@ -121,7 +122,7 @@ class ConfigInheritTest < MiniTest::Spec
|
|
121
122
|
property :location
|
122
123
|
end
|
123
124
|
|
124
|
-
it { InheritingClass.
|
125
|
+
it { InheritingClass.definitions.keys.must_equal ["title", "location"] }
|
125
126
|
it { assert_cloned(InheritingClass, RepresenterClass, :title) }
|
126
127
|
|
127
128
|
# in inheriting class and including
|
@@ -130,5 +131,5 @@ class ConfigInheritTest < MiniTest::Spec
|
|
130
131
|
include GenreModule
|
131
132
|
end
|
132
133
|
|
133
|
-
it { InheritingAndIncludingClass.
|
134
|
+
it { InheritingAndIncludingClass.definitions.keys.must_equal ["title", "location", "genre"] }
|
134
135
|
end
|
data/test/config_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class ConfigTest < MiniTest::Spec
|
4
|
-
subject { Representable::Config.new }
|
4
|
+
subject { Representable::Config.new(Representable::Definition) }
|
5
5
|
PunkRock = Class.new
|
6
6
|
Definition = Representable::Definition
|
7
7
|
|
@@ -10,15 +10,15 @@ class ConfigTest < MiniTest::Spec
|
|
10
10
|
assert_equal nil, subject.wrap_for("Punk", nil)
|
11
11
|
end
|
12
12
|
|
13
|
-
it "infers a printable class name if set to true" do
|
14
|
-
|
15
|
-
|
16
|
-
end
|
13
|
+
# it "infers a printable class name if set to true" do
|
14
|
+
# subject.wrap = true
|
15
|
+
# assert_equal "punk_rock", subject.wrap_for(PunkRock, nil)
|
16
|
+
# end
|
17
17
|
|
18
|
-
it "can be set explicitely" do
|
19
|
-
|
20
|
-
|
21
|
-
end
|
18
|
+
# it "can be set explicitely" do
|
19
|
+
# subject.wrap = "Descendents"
|
20
|
+
# assert_equal "Descendents", subject.wrap_for(PunkRock, nil)
|
21
|
+
# end
|
22
22
|
end
|
23
23
|
|
24
24
|
describe "#[]" do
|
@@ -42,7 +42,7 @@ class ConfigTest < MiniTest::Spec
|
|
42
42
|
describe "returns" do
|
43
43
|
it do
|
44
44
|
# #add returns Definition.`
|
45
|
-
subject = Representable::Config.new.add(:title, {:me => true})
|
45
|
+
subject = Representable::Config.new(Representable::Definition).add(:title, {:me => true})
|
46
46
|
|
47
47
|
subject.must_be_kind_of Representable::Definition
|
48
48
|
subject[:me].must_equal true
|
@@ -76,7 +76,7 @@ class ConfigTest < MiniTest::Spec
|
|
76
76
|
|
77
77
|
|
78
78
|
describe "#remove" do
|
79
|
-
subject { Representable::Config.new }
|
79
|
+
subject { Representable::Config.new(Representable::Definition) }
|
80
80
|
|
81
81
|
it do
|
82
82
|
subject.add(:title, {:me => true})
|
@@ -109,7 +109,7 @@ class ConfigTest < MiniTest::Spec
|
|
109
109
|
end
|
110
110
|
|
111
111
|
describe "#get" do
|
112
|
-
subject { Representable::Config.new }
|
112
|
+
subject { Representable::Config.new(Representable::Definition) }
|
113
113
|
|
114
114
|
it do
|
115
115
|
title = subject.add(:title, {})
|
@@ -119,59 +119,4 @@ class ConfigTest < MiniTest::Spec
|
|
119
119
|
subject.get(:length).must_equal length
|
120
120
|
end
|
121
121
|
end
|
122
|
-
|
123
|
-
|
124
|
-
describe "#inherit!" do
|
125
|
-
let (:title) { Definition.new(:title) }
|
126
|
-
let (:length) { Definition.new(:length) }
|
127
|
-
let (:stars) { Definition.new(:stars) }
|
128
|
-
|
129
|
-
it do
|
130
|
-
parent = Representable::Config.new
|
131
|
-
parent.add(:title, {:alias => "Callname"})
|
132
|
-
parent[:features][Object] = true
|
133
|
-
# DISCUSS: build Inheritable::Hash automatically in options? is there a gem for that?
|
134
|
-
parent.options[:additional_features] = Representable::Inheritable::Hash[Object => true]
|
135
|
-
|
136
|
-
subject.inherit!(parent)
|
137
|
-
|
138
|
-
# add to inherited config:
|
139
|
-
subject.add(:stars, {})
|
140
|
-
subject[:features][Module] = true
|
141
|
-
subject.options[:additional_features][Module] = true
|
142
|
-
|
143
|
-
subject[:features].must_equal({Object => true, Module => true})
|
144
|
-
|
145
|
-
parent.options[:additional_features].must_equal({Object => true})
|
146
|
-
subject.options[:additional_features].must_equal({Object => true, Module => true})
|
147
|
-
|
148
|
-
# test Definition interface:
|
149
|
-
|
150
|
-
# definitions.size.must_equal([subject.get(:title), subject.get(:stars)])
|
151
|
-
subject.get(:title).object_id.wont_equal parent.get(:title).object_id
|
152
|
-
# subject.get(:stars).object_id.must_equal stars.object_id
|
153
|
-
end
|
154
|
-
|
155
|
-
# Config with Inheritable::Array
|
156
|
-
it "xx" do
|
157
|
-
parent = Representable::Config.new
|
158
|
-
parent.options[:links] = Representable::Inheritable::Array.new
|
159
|
-
parent.options[:links] << "//1"
|
160
|
-
|
161
|
-
subject.options[:links] = Representable::Inheritable::Array.new
|
162
|
-
subject.options[:links] << "//2"
|
163
|
-
|
164
|
-
subject.inherit!(parent)
|
165
|
-
subject.options[:links].must_equal ["//2", "//1"]
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
describe "#features" do
|
170
|
-
it do
|
171
|
-
subject[:features][Object] = true
|
172
|
-
subject[:features][Module] = true
|
173
|
-
|
174
|
-
subject.features.must_equal [Object, Module]
|
175
|
-
end
|
176
|
-
end
|
177
122
|
end
|
data/test/decorator_test.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DecoratorTest < MiniTest::Spec
|
4
|
-
# TODO: Move to global place since it's used twice.
|
5
4
|
class SongRepresentation < Representable::Decorator
|
6
5
|
include Representable::JSON
|
7
6
|
property :name
|
@@ -79,7 +78,7 @@ class InheritanceWithDecoratorTest < MiniTest::Spec
|
|
79
78
|
class Twin
|
80
79
|
extend Uber::InheritableAttr
|
81
80
|
inheritable_attr :representer_class
|
82
|
-
self.representer_class = Representable::Decorator
|
81
|
+
self.representer_class = Class.new(Representable::Decorator){ include Representable::Hash }
|
83
82
|
end
|
84
83
|
|
85
84
|
class Album < Twin
|
@@ -90,8 +89,8 @@ class InheritanceWithDecoratorTest < MiniTest::Spec
|
|
90
89
|
end
|
91
90
|
|
92
91
|
it do
|
93
|
-
Twin.representer_class.
|
94
|
-
Album.representer_class.
|
95
|
-
Song.representer_class.
|
92
|
+
Twin.representer_class.definitions.size.must_equal 0
|
93
|
+
Album.representer_class.definitions.size.must_equal 1
|
94
|
+
Song.representer_class.definitions.size.must_equal 0
|
96
95
|
end
|
97
96
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class DefaultTest < MiniTest::Spec
|
4
|
+
Song = Struct.new(:id, :title)
|
5
|
+
|
6
|
+
representer! do
|
7
|
+
property :id
|
8
|
+
property :title, default: "Huber Breeze" #->(options) { options[:default] }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#from_hash" do
|
12
|
+
let (:song) { Song.new.extend(representer) }
|
13
|
+
|
14
|
+
it { song.from_hash({}).must_equal Song.new(nil, "Huber Breeze") }
|
15
|
+
# default doesn't apply when empty string.
|
16
|
+
it { song.from_hash({"title"=>""}).must_equal Song.new(nil, "") }
|
17
|
+
it { song.from_hash({"title"=>nil}).must_equal Song.new(nil, nil) }
|
18
|
+
it { song.from_hash({"title"=>"Blindfold"}).must_equal Song.new(nil, "Blindfold") }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#to_json" do
|
22
|
+
it "uses :default when not available from object" do
|
23
|
+
Song.new.extend(representer).to_hash.must_equal({"title"=>"Huber Breeze"})
|
24
|
+
end
|
25
|
+
|
26
|
+
it "uses value from represented object when present" do
|
27
|
+
Song.new(nil, "After The War").extend(representer).to_hash.must_equal({"title"=>"After The War"})
|
28
|
+
end
|
29
|
+
|
30
|
+
it "uses value from represented object when emtpy string" do
|
31
|
+
Song.new(nil, "").extend(representer).to_hash.must_equal({"title"=>""})
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DefaultsOptionsTest < BaseTest
|
4
|
+
let (:format) { :hash }
|
5
|
+
let (:song) { Struct.new(:title, :author_name, :song_volume, :description).new("Revolution", "Some author", 20, nil) }
|
6
|
+
let (:prepared) { representer.prepare song }
|
7
|
+
|
8
|
+
describe "hash options combined with dynamic options" do
|
9
|
+
representer! do
|
10
|
+
defaults render_nil: true do |name|
|
11
|
+
{ as: name.to_s.upcase }
|
12
|
+
end
|
13
|
+
|
14
|
+
property :title
|
15
|
+
property :author_name
|
16
|
+
property :description
|
17
|
+
property :song_volume
|
18
|
+
end
|
19
|
+
|
20
|
+
it { render(prepared).must_equal_document({"TITLE" => "Revolution", "AUTHOR_NAME" => "Some author", "DESCRIPTION" => nil, "SONG_VOLUME" => 20}) }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "with only dynamic property options" do
|
24
|
+
representer! do
|
25
|
+
defaults do |name|
|
26
|
+
{ as: name.to_s.upcase }
|
27
|
+
end
|
28
|
+
|
29
|
+
property :title
|
30
|
+
property :author_name
|
31
|
+
property :description
|
32
|
+
property :song_volume
|
33
|
+
end
|
34
|
+
|
35
|
+
it { render(prepared).must_equal_document({"TITLE" => "Revolution", "AUTHOR_NAME" => "Some author", "SONG_VOLUME" => 20}) }
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "with only hashes" do
|
39
|
+
representer! do
|
40
|
+
defaults render_nil: true
|
41
|
+
|
42
|
+
property :title
|
43
|
+
property :author_name
|
44
|
+
property :description
|
45
|
+
property :song_volume
|
46
|
+
end
|
47
|
+
|
48
|
+
it { render(prepared).must_equal_document({"title" => "Revolution", "author_name" => "Some author", "description" => nil, "song_volume" => 20}) }
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "direct defaults hash" do
|
52
|
+
representer! do
|
53
|
+
defaults render_nil: true
|
54
|
+
|
55
|
+
property :title
|
56
|
+
property :author_name
|
57
|
+
property :description
|
58
|
+
property :song_volume
|
59
|
+
end
|
60
|
+
|
61
|
+
it { render(prepared).must_equal_document({"title" => "Revolution", "author_name" => "Some author", "description" => nil, "song_volume" => 20}) }
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "direct defaults hash with dynamic options" do
|
65
|
+
representer! do
|
66
|
+
defaults render_nil: true do |name|
|
67
|
+
{ as: name.to_s.upcase }
|
68
|
+
end
|
69
|
+
|
70
|
+
property :title
|
71
|
+
property :author_name
|
72
|
+
property :description
|
73
|
+
property :song_volume
|
74
|
+
end
|
75
|
+
|
76
|
+
it { render(prepared).must_equal_document({"TITLE" => "Revolution", "AUTHOR_NAME" => "Some author", "DESCRIPTION" => nil, "SONG_VOLUME" => 20}) }
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "prioritizes specific options" do
|
80
|
+
representer! do
|
81
|
+
defaults render_nil: true do |name|
|
82
|
+
{ as: name.to_s.upcase }
|
83
|
+
end
|
84
|
+
|
85
|
+
property :title
|
86
|
+
property :author_name
|
87
|
+
property :description, render_nil: false
|
88
|
+
property :song_volume, as: :volume
|
89
|
+
end
|
90
|
+
|
91
|
+
it { render(prepared).must_equal_document({"TITLE" => "Revolution", "AUTHOR_NAME" => "Some author", "volume" => 20}) }
|
92
|
+
end
|
93
|
+
end
|
data/test/definition_test.rb
CHANGED
@@ -14,14 +14,15 @@ class DefinitionTest < MiniTest::Spec
|
|
14
14
|
options[:parse_filter] << 1
|
15
15
|
|
16
16
|
# default variables
|
17
|
-
options[:as].must_equal
|
17
|
+
options[:as].must_equal nil
|
18
18
|
options[:extend].must_equal Module
|
19
19
|
end
|
20
|
+
definition.name.must_equal "song"
|
20
21
|
|
21
22
|
#
|
22
23
|
definition[:awesome].must_equal true
|
23
|
-
definition[:parse_filter].
|
24
|
-
definition[:render_filter].
|
24
|
+
definition[:parse_filter].must_equal Representable::Pipeline[1]
|
25
|
+
definition[:render_filter].must_equal Representable::Pipeline[]
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
@@ -62,8 +63,8 @@ class DefinitionTest < MiniTest::Spec
|
|
62
63
|
|
63
64
|
definition[:awesome].must_equal true
|
64
65
|
definition[:something].must_equal true
|
65
|
-
definition[:render_filter].
|
66
|
-
definition[:parse_filter].
|
66
|
+
definition[:render_filter].must_equal Representable::Pipeline[1]
|
67
|
+
definition[:parse_filter].must_equal Representable::Pipeline[]
|
67
68
|
end
|
68
69
|
|
69
70
|
describe "with :parse_filter" do
|
@@ -73,12 +74,12 @@ class DefinitionTest < MiniTest::Spec
|
|
73
74
|
it do
|
74
75
|
merged = definition.merge!(:parse_filter => 2)[:parse_filter]
|
75
76
|
|
76
|
-
merged.
|
77
|
-
merged.
|
77
|
+
merged.must_be_kind_of Representable::Pipeline
|
78
|
+
merged.size.must_equal 2
|
78
79
|
end
|
79
80
|
|
80
81
|
# :parse_filter can also be array.
|
81
|
-
it { definition.merge!(:parse_filter => [2, 3])[:parse_filter].
|
82
|
+
it { definition.merge!(:parse_filter => [2, 3])[:parse_filter].size.must_equal 3 }
|
82
83
|
end
|
83
84
|
|
84
85
|
# does not change arguments
|
@@ -100,7 +101,7 @@ class DefinitionTest < MiniTest::Spec
|
|
100
101
|
|
101
102
|
# #inspect
|
102
103
|
describe "#inspect" do
|
103
|
-
it { Definition.new(:songs).inspect.must_equal "#<Representable::Definition ==>songs @options={:parse_filter=>[], :render_filter=>[]
|
104
|
+
it { Definition.new(:songs).inspect.must_equal "#<Representable::Definition ==>songs @options={:name=>\"songs\", :parse_filter=>[], :render_filter=>[]}>" }
|
104
105
|
end
|
105
106
|
|
106
107
|
|
@@ -154,6 +155,14 @@ class DefinitionTest < MiniTest::Spec
|
|
154
155
|
assert_equal :"songs=", @def.setter
|
155
156
|
end
|
156
157
|
|
158
|
+
describe "nested: FIXME" do
|
159
|
+
it do
|
160
|
+
dfn = Representable::Definition.new(:songs, nested: Module)
|
161
|
+
assert dfn.typed?
|
162
|
+
dfn[:extend].(nil).must_equal Module
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
157
166
|
|
158
167
|
describe "#clone" do
|
159
168
|
subject { Representable::Definition.new(:title, :volume => 9, :clonable => Uber::Options::Value.new(1)) }
|
@@ -170,34 +179,6 @@ class DefinitionTest < MiniTest::Spec
|
|
170
179
|
assert_equal @def[:volume], 9
|
171
180
|
assert_equal cloned[:volume], 8
|
172
181
|
end
|
173
|
-
|
174
|
-
# cloning of Cloneables in @options.
|
175
|
-
it do
|
176
|
-
definition = Representable::Definition.new(:title)
|
177
|
-
definition.merge!(deserializer: Representable::Inheritable::Hash.new)
|
178
|
-
|
179
|
-
clone = definition.clone
|
180
|
-
clone[:deserializer].merge!(b: 2)
|
181
|
-
|
182
|
-
definition[:deserializer].object_id.wont_equal clone[:deserializer].object_id
|
183
|
-
end
|
184
|
-
|
185
|
-
# pipeline gets cloned properly
|
186
|
-
describe "pipeline cloning" do
|
187
|
-
subject { Definition.new(:title, :render_filter => 1) }
|
188
|
-
|
189
|
-
it ("yy")do
|
190
|
-
cloned = subject.clone
|
191
|
-
|
192
|
-
cloned.merge!(:render_filter => 2)
|
193
|
-
|
194
|
-
subject.instance_variable_get(:@options)[:render_filter].must_equal [1]
|
195
|
-
cloned.instance_variable_get(:@options)[:render_filter].must_equal [1,2]
|
196
|
-
|
197
|
-
subject[:render_filter].instance_variable_get(:@value).must_equal [1]
|
198
|
-
cloned[:render_filter].instance_variable_get(:@value).must_equal [1,2]
|
199
|
-
end
|
200
|
-
end
|
201
182
|
end
|
202
183
|
end
|
203
184
|
|
@@ -225,8 +206,7 @@ class DefinitionTest < MiniTest::Spec
|
|
225
206
|
describe "#create_binding" do
|
226
207
|
it "executes the block (without special context)" do
|
227
208
|
definition = Representable::Definition.new(:title, :binding => lambda { |*args| @binding = Representable::Binding.new(*args) })
|
228
|
-
definition.create_binding
|
229
|
-
@binding.instance_variable_get(:@parent_decorator).must_equal object
|
209
|
+
definition.create_binding.must_equal @binding
|
230
210
|
end
|
231
211
|
end
|
232
212
|
|