disposable 0.4.3 → 0.5.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 +29 -0
- data/.gitignore +1 -0
- data/CHANGES.md +23 -0
- data/Gemfile +5 -12
- data/README.md +2 -2
- data/disposable.gemspec +6 -9
- data/lib/disposable/rescheme.rb +1 -3
- data/lib/disposable/twin.rb +7 -0
- data/lib/disposable/twin/coercion.rb +11 -3
- data/lib/disposable/twin/default.rb +3 -3
- data/lib/disposable/twin/property/struct.rb +3 -1
- data/lib/disposable/twin/setup.rb +1 -1
- data/lib/disposable/twin/sync.rb +1 -1
- data/lib/disposable/version.rb +1 -1
- data/test/callback_group_test.rb +29 -30
- data/test/callbacks_test.rb +49 -49
- data/test/expose_test.rb +16 -16
- data/test/persisted_test.rb +30 -30
- data/test/rescheme_test.rb +22 -22
- data/test/skip_getter_test.rb +14 -14
- data/test/test_helper.rb +9 -6
- data/test/twin/builder_test.rb +3 -3
- data/test/twin/changed_test.rb +38 -38
- data/test/twin/coercion_test.rb +75 -38
- data/test/twin/collection_test.rb +48 -48
- data/test/twin/composition_test.rb +20 -20
- data/test/twin/default_test.rb +15 -15
- data/test/twin/expose_test.rb +15 -15
- data/test/twin/feature_test.rb +10 -10
- data/test/twin/from_collection_test.rb +4 -4
- data/test/twin/from_test.rb +3 -3
- data/test/twin/hash_test.rb +78 -31
- data/test/twin/inherit_test.rb +7 -7
- data/test/twin/inheritance_test.rb +6 -6
- data/test/twin/option_test.rb +1 -1
- data/test/twin/parent_test.rb +6 -6
- data/test/twin/property_processor_test.rb +5 -5
- data/test/twin/readable_test.rb +9 -9
- data/test/twin/save_test.rb +44 -44
- data/test/twin/setup_test.rb +25 -25
- data/test/twin/skip_unchanged_test.rb +6 -6
- data/test/twin/struct/coercion_test.rb +36 -0
- data/test/twin/struct_test.rb +41 -38
- data/test/twin/sync_option_test.rb +2 -2
- data/test/twin/sync_test.rb +29 -29
- data/test/twin/twin_test.rb +25 -15
- data/test/twin/unnest_test.rb +7 -7
- data/test/twin/virtual_test.rb +3 -3
- data/test/twin/writeable_test.rb +8 -8
- metadata +25 -57
- data/.travis.yml +0 -13
- data/gemfiles/Gemfile.rails-2.3 +0 -7
- data/gemfiles/Gemfile.rails-3.0 +0 -7
- data/gemfiles/Gemfile.rails-3.2 +0 -7
- data/gemfiles/Gemfile.rails-4.0 +0 -8
- data/gemfiles/Gemfile.rails-4.1 +0 -7
data/test/expose_test.rb
CHANGED
@@ -24,8 +24,8 @@ class ExposeTest < MiniTest::Spec
|
|
24
24
|
|
25
25
|
describe "readers" do
|
26
26
|
it do
|
27
|
-
subject.id.must_equal 1
|
28
|
-
subject.title.must_equal "Dick Sandwich"
|
27
|
+
expect(subject.id).must_equal 1
|
28
|
+
expect(subject.title).must_equal "Dick Sandwich"
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -35,10 +35,10 @@ class ExposeTest < MiniTest::Spec
|
|
35
35
|
subject.id = 3
|
36
36
|
subject.title = "Eclipse"
|
37
37
|
|
38
|
-
subject.id.must_equal 3
|
39
|
-
subject.title.must_equal "Eclipse"
|
40
|
-
album.id.must_equal 3
|
41
|
-
album.name.must_equal "Eclipse"
|
38
|
+
expect(subject.id).must_equal 3
|
39
|
+
expect(subject.title).must_equal "Eclipse"
|
40
|
+
expect(album.id).must_equal 3
|
41
|
+
expect(album.name).must_equal "Eclipse"
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -69,9 +69,9 @@ class ExposeCompositionTest < MiniTest::Spec
|
|
69
69
|
|
70
70
|
|
71
71
|
describe "readers" do
|
72
|
-
it { subject.id.must_equal 2 }
|
73
|
-
it { subject.band_id.must_equal 1 }
|
74
|
-
it { subject.name.must_equal "Dick Sandwich" }
|
72
|
+
it { expect(subject.id).must_equal 2 }
|
73
|
+
it { expect(subject.band_id).must_equal 1 }
|
74
|
+
it { expect(subject.name).must_equal "Dick Sandwich" }
|
75
75
|
end
|
76
76
|
|
77
77
|
|
@@ -81,12 +81,12 @@ class ExposeCompositionTest < MiniTest::Spec
|
|
81
81
|
subject.band_id = 4
|
82
82
|
subject.name = "Eclipse"
|
83
83
|
|
84
|
-
subject.id.must_equal 3
|
85
|
-
subject.band_id.must_equal 4
|
86
|
-
subject.name.must_equal "Eclipse"
|
87
|
-
band.id.must_equal 4
|
88
|
-
album.id.must_equal 3
|
89
|
-
album.name.must_equal "Eclipse"
|
84
|
+
expect(subject.id).must_equal 3
|
85
|
+
expect(subject.band_id).must_equal 4
|
86
|
+
expect(subject.name).must_equal "Eclipse"
|
87
|
+
expect(band.id).must_equal 4
|
88
|
+
expect(album.id).must_equal 3
|
89
|
+
expect(album.name).must_equal "Eclipse"
|
90
90
|
end
|
91
91
|
end
|
92
|
-
end
|
92
|
+
end
|
data/test/persisted_test.rb
CHANGED
@@ -29,36 +29,36 @@ class PersistedTest < MiniTest::Spec
|
|
29
29
|
album = Album.new(artist: artist, songs: [ex_song, song])
|
30
30
|
|
31
31
|
|
32
|
-
artist.persisted
|
33
|
-
album.persisted
|
34
|
-
ex_song.persisted
|
35
|
-
song.persisted
|
32
|
+
expect(artist.persisted?).must_equal false
|
33
|
+
expect(album.persisted?).must_equal false
|
34
|
+
expect(ex_song.persisted?).must_equal true
|
35
|
+
expect(song.persisted?).must_equal false
|
36
36
|
|
37
37
|
twin = AlbumTwin.new(album)
|
38
|
-
twin.persisted
|
39
|
-
twin.changed?(:persisted?).must_equal false
|
40
|
-
twin.artist.persisted
|
41
|
-
twin.artist.changed?(:persisted?).must_equal false
|
42
|
-
twin.songs[0].persisted
|
43
|
-
twin.songs[0].changed?(:persisted?).must_equal false
|
44
|
-
twin.songs[1].persisted
|
45
|
-
twin.songs[1].changed?(:persisted?).must_equal false
|
38
|
+
expect(twin.persisted?).must_equal false
|
39
|
+
expect(twin.changed?(:persisted?)).must_equal false
|
40
|
+
expect(twin.artist.persisted?).must_equal false
|
41
|
+
expect(twin.artist.changed?(:persisted?)).must_equal false
|
42
|
+
expect(twin.songs[0].persisted?).must_equal true
|
43
|
+
expect(twin.songs[0].changed?(:persisted?)).must_equal false
|
44
|
+
expect(twin.songs[1].persisted?).must_equal false
|
45
|
+
expect(twin.songs[1].changed?(:persisted?)).must_equal false
|
46
46
|
|
47
47
|
twin.save
|
48
48
|
|
49
|
-
artist.persisted
|
50
|
-
album.persisted
|
51
|
-
ex_song.persisted
|
52
|
-
song.persisted
|
53
|
-
|
54
|
-
twin.persisted
|
55
|
-
twin.changed?(:persisted?).must_equal true
|
56
|
-
twin.artist.persisted
|
57
|
-
twin.artist.changed?(:persisted?).must_equal true
|
58
|
-
twin.songs[0].persisted
|
59
|
-
twin.songs[0].changed?(:persisted?).must_equal false
|
60
|
-
twin.songs[1].persisted
|
61
|
-
twin.songs[1].changed?(:persisted?).must_equal true
|
49
|
+
expect(artist.persisted?).must_equal true
|
50
|
+
expect(album.persisted?).must_equal true
|
51
|
+
expect(ex_song.persisted?).must_equal true
|
52
|
+
expect(song.persisted?).must_equal true
|
53
|
+
|
54
|
+
expect(twin.persisted?).must_equal true
|
55
|
+
expect(twin.changed?(:persisted?)).must_equal true
|
56
|
+
expect(twin.artist.persisted?).must_equal true
|
57
|
+
expect(twin.artist.changed?(:persisted?)).must_equal true
|
58
|
+
expect(twin.songs[0].persisted?).must_equal true
|
59
|
+
expect(twin.songs[0].changed?(:persisted?)).must_equal false
|
60
|
+
expect(twin.songs[1].persisted?).must_equal true
|
61
|
+
expect(twin.songs[1].changed?(:persisted?)).must_equal true
|
62
62
|
end
|
63
63
|
|
64
64
|
|
@@ -66,17 +66,17 @@ class PersistedTest < MiniTest::Spec
|
|
66
66
|
it do
|
67
67
|
twin = AlbumTwin.new(Album.new)
|
68
68
|
|
69
|
-
twin.created
|
69
|
+
expect(twin.created?).must_equal false
|
70
70
|
twin.save
|
71
|
-
twin.created
|
71
|
+
expect(twin.created?).must_equal true
|
72
72
|
end
|
73
73
|
|
74
74
|
it do
|
75
75
|
twin = AlbumTwin.new(Album.create)
|
76
76
|
|
77
|
-
twin.created
|
77
|
+
expect(twin.created?).must_equal false
|
78
78
|
twin.save
|
79
|
-
twin.created
|
79
|
+
expect(twin.created?).must_equal false
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -98,4 +98,4 @@ class PersistedTest < MiniTest::Spec
|
|
98
98
|
# twin.updated?.must_equal true
|
99
99
|
# end
|
100
100
|
# end
|
101
|
-
end
|
101
|
+
end
|
data/test/rescheme_test.rb
CHANGED
@@ -37,22 +37,22 @@ class ReschemeTest < MiniTest::Spec
|
|
37
37
|
)
|
38
38
|
|
39
39
|
# include: works.
|
40
|
-
decorator.new(nil).hello.must_equal "hello"
|
41
|
-
decorator.new(nil).ciao.must_equal "ciao"
|
40
|
+
expect(decorator.new(nil).hello).must_equal "hello"
|
41
|
+
expect(decorator.new(nil).ciao).must_equal "ciao"
|
42
42
|
|
43
|
-
decorator.representable_attrs.get(:id).inspect.must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>"
|
44
|
-
decorator.representable_attrs.get(:title).inspect.must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :deserializer=>{:skip_parse=>\"skip lambda\"}, :name=>\"title\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"skip lambda\"}>"
|
43
|
+
expect(decorator.representable_attrs.get(:id).inspect).must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>"
|
44
|
+
expect(decorator.representable_attrs.get(:title).inspect).must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :deserializer=>{:skip_parse=>\"skip lambda\"}, :name=>\"title\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"skip lambda\"}>"
|
45
45
|
|
46
46
|
songs = decorator.representable_attrs.get(:songs)
|
47
47
|
options = songs.instance_variable_get(:@options)
|
48
48
|
options[:nested].extend(Declarative::Inspect)
|
49
|
-
options.inspect.must_equal "{:readable=>false, :deserializer=>{:skip_parse=>\"another lambda\", :music=>true, :writeable=>false}, :nested=>#<Class:>, :extend=>#<Class:>, :name=>\"songs\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"another lambda\", :music=>true, :writeable=>false}"
|
49
|
+
expect(options.inspect).must_equal "{:readable=>false, :deserializer=>{:skip_parse=>\"another lambda\", :music=>true, :writeable=>false}, :nested=>#<Class:>, :extend=>#<Class:>, :name=>\"songs\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"another lambda\", :music=>true, :writeable=>false}"
|
50
50
|
|
51
51
|
# nested works.
|
52
|
-
options[:nested].new(nil).hello.must_equal "hello"
|
53
|
-
options[:nested].new(nil).ciao.must_equal "ciao"
|
52
|
+
expect(options[:nested].new(nil).hello).must_equal "hello"
|
53
|
+
expect(options[:nested].new(nil).ciao).must_equal "ciao"
|
54
54
|
|
55
|
-
options[:nested].representable_attrs.get(:name).inspect.must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"a crazy cool instance method\"}>"
|
55
|
+
expect(options[:nested].representable_attrs.get(:name).inspect).must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"a crazy cool instance method\"}>"
|
56
56
|
end
|
57
57
|
|
58
58
|
# :options_from and :include is optional
|
@@ -61,8 +61,8 @@ class ReschemeTest < MiniTest::Spec
|
|
61
61
|
definitions_from: lambda { |nested| nested.definitions }
|
62
62
|
)
|
63
63
|
|
64
|
-
decorator.representable_attrs.get(:id).inspect.must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>"
|
65
|
-
decorator.representable_attrs.get(:title).inspect.must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :deserializer=>{:skip_parse=>\"skip lambda\"}, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>"
|
64
|
+
expect(decorator.representable_attrs.get(:id).inspect).must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>"
|
65
|
+
expect(decorator.representable_attrs.get(:title).inspect).must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :deserializer=>{:skip_parse=>\"skip lambda\"}, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>"
|
66
66
|
end
|
67
67
|
|
68
68
|
|
@@ -73,9 +73,9 @@ class ReschemeTest < MiniTest::Spec
|
|
73
73
|
exclude_options: [:deserializer]
|
74
74
|
)
|
75
75
|
|
76
|
-
decorator.representable_attrs.get(:id).inspect.must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>"
|
77
|
-
decorator.representable_attrs.get(:title).inspect.must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>"
|
78
|
-
decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect.must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>"
|
76
|
+
expect(decorator.representable_attrs.get(:id).inspect).must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>"
|
77
|
+
expect(decorator.representable_attrs.get(:title).inspect).must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>"
|
78
|
+
expect(decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect).must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>"
|
79
79
|
end
|
80
80
|
|
81
81
|
|
@@ -85,8 +85,8 @@ class ReschemeTest < MiniTest::Spec
|
|
85
85
|
definitions_from: lambda { |nested| nested.definitions },
|
86
86
|
) { |dfn| dfn.merge!(amazing: true) }
|
87
87
|
|
88
|
-
decorator.representable_attrs.get(:id).inspect.must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[], :amazing=>true}>"
|
89
|
-
decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect.must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[], :amazing=>true}>"
|
88
|
+
expect(decorator.representable_attrs.get(:id).inspect).must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[], :amazing=>true}>"
|
89
|
+
expect(decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect).must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[], :amazing=>true}>"
|
90
90
|
end
|
91
91
|
|
92
92
|
it "recursive: false only copies first level" do
|
@@ -97,8 +97,8 @@ class ReschemeTest < MiniTest::Spec
|
|
97
97
|
exclude_options: [:deserializer]
|
98
98
|
)
|
99
99
|
|
100
|
-
decorator.representable_attrs.get(:title).inspect.must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>"
|
101
|
-
decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect.must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>"
|
100
|
+
expect(decorator.representable_attrs.get(:title).inspect).must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>"
|
101
|
+
expect(decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect).must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>"
|
102
102
|
end
|
103
103
|
|
104
104
|
describe ":exclude_properties" do
|
@@ -121,8 +121,8 @@ class ReschemeTest < MiniTest::Spec
|
|
121
121
|
exclude_properties: [:id]
|
122
122
|
)
|
123
123
|
|
124
|
-
decorator.definitions.keys.must_equal ["songs"]
|
125
|
-
decorator.definitions.get(:songs).representer_module.definitions.keys.must_equal ["name"]
|
124
|
+
expect(decorator.definitions.keys).must_equal ["songs"]
|
125
|
+
expect(decorator.definitions.get(:songs).representer_module.definitions.keys).must_equal ["name"]
|
126
126
|
end
|
127
127
|
end
|
128
128
|
end
|
@@ -145,8 +145,8 @@ class TwinReschemeTest < MiniTest::Spec
|
|
145
145
|
artist = decorator.representable_attrs.get(:artist)
|
146
146
|
options = artist.instance_variable_get(:@options)
|
147
147
|
nested_extend = options[:nested]
|
148
|
-
options.extend(Declarative::Inspect).inspect.must_equal "{:private_name=>:artist, :nested=>#<Class:>, :name=>\"artist\", :extend=>#<Class:>, :parse_filter=>[], :render_filter=>[]}"
|
148
|
+
expect(options.extend(Declarative::Inspect).inspect).must_equal "{:private_name=>:artist, :nested=>#<Class:>, :name=>\"artist\", :extend=>#<Class:>, :parse_filter=>[], :render_filter=>[]}"
|
149
149
|
assert nested_extend < Representable::Decorator
|
150
|
-
nested_extend.representable_attrs.get(:name).inspect.must_equal "#<Representable::Definition ==>name @options={:private_name=>:name, :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>"
|
150
|
+
expect(nested_extend.representable_attrs.get(:name).inspect).must_equal "#<Representable::Definition ==>name @options={:private_name=>:name, :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>"
|
151
151
|
end
|
152
|
-
end
|
152
|
+
end
|
data/test/skip_getter_test.rb
CHANGED
@@ -26,20 +26,20 @@ class SkipGetterTest < MiniTest::Spec
|
|
26
26
|
album = Album.new("Wild Frontier", Artist.new("Gary Moore"))
|
27
27
|
twin = AlbumTwin.new(album)
|
28
28
|
|
29
|
-
twin.title.must_equal "reitnorF dliW"
|
30
|
-
twin.artist.name.must_equal "GARY MOORE"
|
29
|
+
expect(twin.title).must_equal "reitnorF dliW"
|
30
|
+
expect(twin.artist.name).must_equal "GARY MOORE"
|
31
31
|
|
32
32
|
twin.sync # does NOT call getter.
|
33
33
|
|
34
|
-
album.title.must_equal "Wild Frontier"
|
35
|
-
album.artist.name.must_equal "Gary Moore"
|
34
|
+
expect(album.title).must_equal "Wild Frontier"
|
35
|
+
expect(album.artist.name).must_equal "Gary Moore"
|
36
36
|
|
37
37
|
# nested hash.
|
38
38
|
nested_hash = nil
|
39
39
|
twin.sync do |hash|
|
40
40
|
nested_hash = hash
|
41
41
|
end
|
42
|
-
nested_hash.must_equal({"title"=>"Wild Frontier", "artist"=>{"name"=>"Gary Moore"}})
|
42
|
+
expect(nested_hash).must_equal({"title"=>"Wild Frontier", "artist"=>{"name"=>"Gary Moore"}})
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -68,8 +68,8 @@ class SkipSetterTest < MiniTest::Spec
|
|
68
68
|
it do
|
69
69
|
twin = AlbumTwin.new(Album.new("Wild Frontier", Artist.new("Gary Moore")))
|
70
70
|
|
71
|
-
twin.title.must_equal "Wild Frontier"
|
72
|
-
twin.artist.name.must_equal "Gary Moore"
|
71
|
+
expect(twin.title).must_equal "Wild Frontier"
|
72
|
+
expect(twin.artist.name).must_equal "Gary Moore"
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -111,18 +111,18 @@ class SkipGetterAndSetterWithChangedTest < MiniTest::Spec
|
|
111
111
|
twin = AlbumTwin.new(album) # does not call getter (Changed).
|
112
112
|
|
113
113
|
|
114
|
-
twin.title.must_equal "reitnorF dliW"
|
115
|
-
twin.artist.name.must_equal "GARY MOORE"
|
114
|
+
expect(twin.title).must_equal "reitnorF dliW"
|
115
|
+
expect(twin.artist.name).must_equal "GARY MOORE"
|
116
116
|
|
117
|
-
twin.changed
|
118
|
-
twin.artist.changed
|
117
|
+
expect(twin.changed?).must_equal false
|
118
|
+
expect(twin.artist.changed?).must_equal false
|
119
119
|
|
120
120
|
twin.title = "Self-Entitled"
|
121
121
|
twin.artist.name = "Nofx"
|
122
122
|
|
123
123
|
twin.sync # does NOT call getter.
|
124
124
|
|
125
|
-
album.title.must_equal "deltitnE-fleS"
|
126
|
-
album.artist.name.must_equal "Nof"
|
125
|
+
expect(album.title).must_equal "deltitnE-fleS"
|
126
|
+
expect(album.artist.name).must_equal "Nof"
|
127
127
|
end
|
128
|
-
end
|
128
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
require "disposable"
|
2
2
|
require "minitest/autorun"
|
3
|
-
require "pp"
|
4
3
|
require "representable/debug"
|
4
|
+
# require "pp"
|
5
5
|
require "declarative/testing"
|
6
6
|
|
7
|
+
require "disposable/twin/coercion"
|
8
|
+
DRY_TYPES_CONSTANT = Disposable::Twin::Coercion::DRY_TYPES_CONSTANT
|
9
|
+
DRY_TYPES_INT_CONSTANT = Disposable::Twin::Coercion::DRY_TYPES_VERSION < Gem::Version.new("0.13.0") ? 'Int' : 'Integer'
|
10
|
+
|
7
11
|
class Track
|
8
12
|
def initialize(options={})
|
9
13
|
@title = options[:title]
|
@@ -12,7 +16,6 @@ class Track
|
|
12
16
|
attr_reader :title
|
13
17
|
end
|
14
18
|
|
15
|
-
|
16
19
|
# require 'active_record'
|
17
20
|
# require 'database_cleaner'
|
18
21
|
# DatabaseCleaner.strategy = :truncation
|
@@ -39,18 +42,18 @@ ActiveRecord::Base.establish_connection(
|
|
39
42
|
ActiveRecord::Schema.define do
|
40
43
|
create_table :artists do |table|
|
41
44
|
table.column :name, :string
|
42
|
-
table.timestamps
|
45
|
+
table.timestamps null: false
|
43
46
|
end
|
44
47
|
create_table :songs do |table|
|
45
48
|
table.column :title, :string
|
46
49
|
table.column :artist_id, :integer
|
47
50
|
table.column :album_id, :integer
|
48
|
-
table.timestamps
|
51
|
+
table.timestamps null: false
|
49
52
|
end
|
50
53
|
create_table :albums do |table|
|
51
54
|
table.column :name, :string
|
52
55
|
table.column :artist_id, :integer
|
53
|
-
table.timestamps
|
56
|
+
table.timestamps null: false
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
@@ -71,7 +74,7 @@ module Disposable
|
|
71
74
|
end
|
72
75
|
|
73
76
|
def saved?
|
74
|
-
@saved
|
77
|
+
defined?(@saved) ? @saved : nil
|
75
78
|
end
|
76
79
|
end
|
77
80
|
end
|
data/test/twin/builder_test.rb
CHANGED
@@ -26,7 +26,7 @@ class BuilderTest < MiniTest::Spec
|
|
26
26
|
end
|
27
27
|
|
28
28
|
|
29
|
-
it { Twin.build(Model::Song.new).must_be_instance_of Twin }
|
30
|
-
it { Twin.build(Model::Hit.new).must_be_instance_of Hit }
|
31
|
-
it { Twin.build(Model::Evergreen.new, evergreen: true).must_be_instance_of Evergreen }
|
29
|
+
it { expect(Twin.build(Model::Song.new)).must_be_instance_of Twin }
|
30
|
+
it { expect(Twin.build(Model::Hit.new)).must_be_instance_of Hit }
|
31
|
+
it { expect(Twin.build(Model::Evergreen.new, evergreen: true)).must_be_instance_of Evergreen }
|
32
32
|
end
|
data/test/twin/changed_test.rb
CHANGED
@@ -39,19 +39,19 @@ class ChangedWithSetupTest < MiniTest::Spec
|
|
39
39
|
|
40
40
|
# setup: changed? is always false
|
41
41
|
it do
|
42
|
-
twin.changed?(:name).must_equal false
|
43
|
-
twin.changed
|
42
|
+
expect(twin.changed?(:name)).must_equal false
|
43
|
+
expect(twin.changed?).must_equal false
|
44
44
|
|
45
|
-
twin.songs[0].changed
|
46
|
-
twin.songs[0].changed?(:title).must_equal false
|
47
|
-
twin.songs[1].changed
|
48
|
-
twin.songs[1].changed?(:title).must_equal false
|
45
|
+
expect(twin.songs[0].changed?).must_equal false
|
46
|
+
expect(twin.songs[0].changed?(:title)).must_equal false
|
47
|
+
expect(twin.songs[1].changed?).must_equal false
|
48
|
+
expect(twin.songs[1].changed?(:title)).must_equal false
|
49
49
|
|
50
|
-
twin.songs[1].composer.changed?(:name).must_equal false
|
51
|
-
twin.songs[1].composer.changed
|
50
|
+
expect(twin.songs[1].composer.changed?(:name)).must_equal false
|
51
|
+
expect(twin.songs[1].composer.changed?).must_equal false
|
52
52
|
|
53
|
-
twin.artist.changed?(:name).must_equal false
|
54
|
-
twin.artist.changed
|
53
|
+
expect(twin.artist.changed?(:name)).must_equal false
|
54
|
+
expect(twin.artist.changed?).must_equal false
|
55
55
|
end
|
56
56
|
|
57
57
|
# only when a property is assigned, it's changed.
|
@@ -62,46 +62,46 @@ class ChangedWithSetupTest < MiniTest::Spec
|
|
62
62
|
twin.songs[1].composer.name= "Ingemar Jansson & Mikael Danielsson"
|
63
63
|
twin.artist.name = "No Fun At All"
|
64
64
|
|
65
|
-
twin.changed?(:name).must_equal true
|
66
|
-
twin.changed
|
65
|
+
expect(twin.changed?(:name)).must_equal true
|
66
|
+
expect(twin.changed?).must_equal true
|
67
67
|
|
68
|
-
twin.songs[0].changed
|
69
|
-
twin.songs[0].changed?(:title).must_equal true
|
70
|
-
twin.songs[1].changed
|
71
|
-
twin.songs[1].changed?(:title).must_equal true
|
68
|
+
expect(twin.songs[0].changed?).must_equal true
|
69
|
+
expect(twin.songs[0].changed?(:title)).must_equal true
|
70
|
+
expect(twin.songs[1].changed?).must_equal true
|
71
|
+
expect(twin.songs[1].changed?(:title)).must_equal true
|
72
72
|
|
73
|
-
twin.songs[1].composer.changed?(:name).must_equal true
|
74
|
-
twin.songs[1].composer.changed
|
73
|
+
expect(twin.songs[1].composer.changed?(:name)).must_equal true
|
74
|
+
expect(twin.songs[1].composer.changed?).must_equal true
|
75
75
|
|
76
|
-
twin.artist.changed?(:name).must_equal true
|
77
|
-
twin.artist.changed
|
76
|
+
expect(twin.artist.changed?(:name)).must_equal true
|
77
|
+
expect(twin.artist.changed?).must_equal true
|
78
78
|
|
79
79
|
# you can also ask for nested twins by name.
|
80
|
-
twin.changed?(:songs).must_equal true
|
81
|
-
twin.songs[0].changed?(:composer).must_equal false
|
82
|
-
twin.songs[1].changed?(:composer).must_equal true
|
83
|
-
twin.changed?(:artist).must_equal true
|
80
|
+
expect(twin.changed?(:songs)).must_equal true
|
81
|
+
expect(twin.songs[0].changed?(:composer)).must_equal false
|
82
|
+
expect(twin.songs[1].changed?(:composer)).must_equal true
|
83
|
+
expect(twin.changed?(:artist)).must_equal true
|
84
84
|
end
|
85
85
|
|
86
86
|
# nested changes should propagate up.
|
87
87
|
it do
|
88
|
-
twin.changed
|
88
|
+
expect(twin.changed?).must_equal false
|
89
89
|
|
90
90
|
twin.songs[1].composer.name = "Nofx"
|
91
91
|
|
92
|
-
twin.changed
|
92
|
+
expect(twin.changed?).must_equal true
|
93
93
|
|
94
94
|
assert twin.songs.changed?
|
95
|
-
twin.songs[1].changed
|
96
|
-
twin.songs[0].changed
|
95
|
+
expect(twin.songs[1].changed?).must_equal true
|
96
|
+
expect(twin.songs[0].changed?).must_equal false
|
97
97
|
|
98
|
-
twin.artist.changed
|
98
|
+
expect(twin.artist.changed?).must_equal false
|
99
99
|
end
|
100
100
|
|
101
101
|
# setting identical value doesn't change.
|
102
102
|
it do
|
103
103
|
twin.name = "The Rest Is Silence"
|
104
|
-
twin.changed
|
104
|
+
expect(twin.changed?).must_equal false
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
@@ -114,23 +114,23 @@ class ChangedWithCoercionTest < MiniTest::Spec
|
|
114
114
|
include Changed
|
115
115
|
include Coercion
|
116
116
|
|
117
|
-
property :released, type:
|
117
|
+
property :released, type: DRY_TYPES_CONSTANT::Bool | DRY_TYPES_CONSTANT::Nil
|
118
118
|
end
|
119
119
|
|
120
120
|
it do
|
121
121
|
twin = SongTwin.new(Song.new)
|
122
|
-
twin.changed?(:released).must_equal false
|
122
|
+
expect(twin.changed?(:released)).must_equal false
|
123
123
|
twin.released = 'true'
|
124
|
-
twin.released.must_equal true
|
125
|
-
twin.changed?(:released).must_equal true
|
124
|
+
expect(twin.released).must_equal true
|
125
|
+
expect(twin.changed?(:released)).must_equal true
|
126
126
|
end
|
127
127
|
|
128
128
|
it do
|
129
129
|
twin = SongTwin.new(Song.new(true))
|
130
|
-
twin.changed?(:released).must_equal false
|
130
|
+
expect(twin.changed?(:released)).must_equal false
|
131
131
|
twin.released = 'true' # it coerces, then assigns, then compares, which makes this NOT changed.
|
132
|
-
twin.changed?(:released).must_equal false
|
132
|
+
expect(twin.changed?(:released)).must_equal false
|
133
133
|
twin.released = 'false'
|
134
|
-
twin.changed?(:released).must_equal true
|
134
|
+
expect(twin.changed?(:released)).must_equal true
|
135
135
|
end
|
136
|
-
end
|
136
|
+
end
|