disposable 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +31 -29
  4. data/CHANGES.md +5 -0
  5. data/Gemfile +1 -1
  6. data/disposable.gemspec +0 -1
  7. data/lib/disposable/twin/coercion.rb +4 -1
  8. data/lib/disposable/twin/property/struct.rb +3 -1
  9. data/lib/disposable/version.rb +1 -1
  10. data/test/callback_group_test.rb +27 -27
  11. data/test/callbacks_test.rb +44 -44
  12. data/test/expose_test.rb +16 -16
  13. data/test/persisted_test.rb +30 -30
  14. data/test/rescheme_test.rb +22 -22
  15. data/test/skip_getter_test.rb +14 -14
  16. data/test/twin/builder_test.rb +3 -3
  17. data/test/twin/changed_test.rb +36 -36
  18. data/test/twin/coercion_test.rb +61 -23
  19. data/test/twin/collection_test.rb +46 -46
  20. data/test/twin/composition_test.rb +20 -20
  21. data/test/twin/default_test.rb +15 -15
  22. data/test/twin/expose_test.rb +15 -15
  23. data/test/twin/feature_test.rb +10 -10
  24. data/test/twin/from_collection_test.rb +4 -4
  25. data/test/twin/from_test.rb +3 -3
  26. data/test/twin/hash_test.rb +38 -38
  27. data/test/twin/inherit_test.rb +7 -7
  28. data/test/twin/inheritance_test.rb +6 -6
  29. data/test/twin/parent_test.rb +5 -5
  30. data/test/twin/property_processor_test.rb +3 -3
  31. data/test/twin/readable_test.rb +9 -9
  32. data/test/twin/save_test.rb +44 -44
  33. data/test/twin/setup_test.rb +25 -25
  34. data/test/twin/skip_unchanged_test.rb +6 -6
  35. data/test/twin/struct/coercion_test.rb +4 -4
  36. data/test/twin/struct_test.rb +41 -38
  37. data/test/twin/sync_test.rb +29 -29
  38. data/test/twin/twin_test.rb +14 -14
  39. data/test/twin/unnest_test.rb +7 -7
  40. data/test/twin/virtual_test.rb +3 -3
  41. data/test/twin/writeable_test.rb +8 -8
  42. metadata +3 -18
@@ -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
@@ -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?.must_equal false
33
- album.persisted?.must_equal false
34
- ex_song.persisted?.must_equal true
35
- song.persisted?.must_equal false
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?.must_equal false
39
- twin.changed?(:persisted?).must_equal false
40
- twin.artist.persisted?.must_equal false
41
- twin.artist.changed?(:persisted?).must_equal false
42
- twin.songs[0].persisted?.must_equal true
43
- twin.songs[0].changed?(:persisted?).must_equal false
44
- twin.songs[1].persisted?.must_equal false
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?.must_equal true
50
- album.persisted?.must_equal true
51
- ex_song.persisted?.must_equal true
52
- song.persisted?.must_equal true
53
-
54
- twin.persisted?.must_equal true
55
- twin.changed?(:persisted?).must_equal true
56
- twin.artist.persisted?.must_equal true
57
- twin.artist.changed?(:persisted?).must_equal true
58
- twin.songs[0].persisted?.must_equal true
59
- twin.songs[0].changed?(:persisted?).must_equal false
60
- twin.songs[1].persisted?.must_equal true
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?.must_equal false
69
+ expect(twin.created?).must_equal false
70
70
  twin.save
71
- twin.created?.must_equal true
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?.must_equal false
77
+ expect(twin.created?).must_equal false
78
78
  twin.save
79
- twin.created?.must_equal false
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
@@ -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
@@ -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?.must_equal false
118
- twin.artist.changed?.must_equal false
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
@@ -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
@@ -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?.must_equal false
42
+ expect(twin.changed?(:name)).must_equal false
43
+ expect(twin.changed?).must_equal false
44
44
 
45
- twin.songs[0].changed?.must_equal false
46
- twin.songs[0].changed?(:title).must_equal false
47
- twin.songs[1].changed?.must_equal false
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?.must_equal false
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?.must_equal false
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?.must_equal true
65
+ expect(twin.changed?(:name)).must_equal true
66
+ expect(twin.changed?).must_equal true
67
67
 
68
- twin.songs[0].changed?.must_equal true
69
- twin.songs[0].changed?(:title).must_equal true
70
- twin.songs[1].changed?.must_equal true
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?.must_equal true
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?.must_equal true
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?.must_equal false
88
+ expect(twin.changed?).must_equal false
89
89
 
90
90
  twin.songs[1].composer.name = "Nofx"
91
91
 
92
- twin.changed?.must_equal true
92
+ expect(twin.changed?).must_equal true
93
93
 
94
94
  assert twin.songs.changed?
95
- twin.songs[1].changed?.must_equal true
96
- twin.songs[0].changed?.must_equal false
95
+ expect(twin.songs[1].changed?).must_equal true
96
+ expect(twin.songs[0].changed?).must_equal false
97
97
 
98
- twin.artist.changed?.must_equal false
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?.must_equal false
104
+ expect(twin.changed?).must_equal false
105
105
  end
106
106
  end
107
107
 
@@ -119,18 +119,18 @@ class ChangedWithCoercionTest < MiniTest::Spec
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
136
  end
@@ -37,9 +37,9 @@ class CoercionTest < MiniTest::Spec
37
37
  }
38
38
 
39
39
  it "NOT coerce values in setup" do
40
- subject.released_at.must_equal "31/03/1981"
41
- subject.hit.length.must_equal "312"
42
- subject.band.label.value.must_equal "9999.99"
40
+ expect(subject.released_at).must_equal "31/03/1981"
41
+ expect(subject.hit.length).must_equal "312"
42
+ expect(subject.band.label.value).must_equal "9999.99"
43
43
  end
44
44
 
45
45
 
@@ -49,11 +49,11 @@ class CoercionTest < MiniTest::Spec
49
49
  subject.hit.length = "312"
50
50
  subject.band.label.value = "9999.99"
51
51
 
52
- subject.released_at.must_be_kind_of DateTime
53
- subject.released_at.must_equal DateTime.parse("30/03/1981")
54
- subject.hit.length.must_equal 312
55
- subject.hit.good.must_be_nil
56
- subject.band.label.value.must_equal 9999.99
52
+ expect(subject.released_at).must_be_kind_of DateTime
53
+ expect(subject.released_at).must_equal DateTime.parse("30/03/1981")
54
+ expect(subject.hit.length).must_equal 312
55
+ expect(subject.hit.good).must_be_nil
56
+ expect(subject.band.label.value).must_equal 9999.99
57
57
  end
58
58
  end
59
59
 
@@ -69,9 +69,9 @@ class CoercionTest < MiniTest::Spec
69
69
  end
70
70
 
71
71
  it "coerce values in setup and when using a setter" do
72
- subject.id.must_equal 1
72
+ expect(subject.id).must_equal 1
73
73
  subject.id = "2"
74
- subject.id.must_equal 2
74
+ expect(subject.id).must_equal 2
75
75
  end
76
76
  end
77
77
 
@@ -85,8 +85,15 @@ class CoercionTest < MiniTest::Spec
85
85
  property :id, type: const_get("Types::Coercible::#{DRY_TYPES_INT_CONSTANT}"), nilify: true
86
86
  end
87
87
 
88
- describe "with Nilify" do
88
+ class TwinWithoutTypeWithNilify < Disposable::Twin
89
+ feature Coercion
90
+
91
+ property :date_of_birth, nilify: true
92
+ property :date_of_death_by_unicorns, type: DRY_TYPES_CONSTANT::Nil | DRY_TYPES_CONSTANT::Date
93
+ property :id, type: const_get("Types::Coercible::#{DRY_TYPES_INT_CONSTANT}"), nilify: true
94
+ end
89
95
 
96
+ describe "with Nilify" do
90
97
  subject do
91
98
  TwinWithNilify.new(OpenStruct.new(date_of_birth: '1990-01-12',
92
99
  date_of_death_by_unicorns: '2037-02-18',
@@ -94,23 +101,54 @@ class CoercionTest < MiniTest::Spec
94
101
  end
95
102
 
96
103
  it "coerce values correctly" do
97
- subject.date_of_birth.must_equal Date.parse('1990-01-12')
98
- subject.date_of_death_by_unicorns.must_equal Date.parse('2037-02-18')
104
+ expect(subject.date_of_birth).must_equal Date.parse('1990-01-12')
105
+ expect(subject.date_of_death_by_unicorns).must_equal Date.parse('2037-02-18')
99
106
  end
100
107
 
101
108
  it "coerce empty values to nil when using option nilify: true" do
102
109
  subject.date_of_birth = ""
103
- subject.date_of_birth.must_be_nil
110
+ expect(subject.date_of_birth).must_be_nil
104
111
  end
105
112
 
106
113
  it "coerce empty values to nil when using dry-types | operator" do
107
114
  subject.date_of_death_by_unicorns = ""
108
- subject.date_of_death_by_unicorns.must_be_nil
115
+ expect(subject.date_of_death_by_unicorns).must_be_nil
109
116
  end
110
117
 
111
118
  it "converts blank string to nil, without :type option" do
112
119
  subject.id = ""
113
- subject.id.must_be_nil
120
+ expect(subject.id).must_be_nil
121
+ end
122
+ end
123
+
124
+ describe "without Type With Nilify" do
125
+ let(:date_of_birth) { '1990-01-12' }
126
+ subject do
127
+ TwinWithoutTypeWithNilify.new(
128
+ OpenStruct.new(
129
+ date_of_birth: date_of_birth,
130
+ date_of_death_by_unicorns: '2037-02-18',
131
+ id: 1
132
+ )
133
+ )
134
+ end
135
+
136
+ it 'raise error for new dry-types v - work as expected for older versions' do
137
+ if Disposable::Twin::Coercion::DRY_TYPES_VERSION >= Gem::Version.new("1.0")
138
+ assert_raises(Dry::Types::CoercionError) { subject.date_of_birth }
139
+ assert_raises(Dry::Types::CoercionError) { subject.date_of_death_by_unicorns }
140
+ else
141
+ expect(subject.date_of_birth).must_equal '1990-01-12'
142
+ expect(subject.date_of_death_by_unicorns).must_equal Date.parse('2037-02-18')
143
+ end
144
+ end
145
+
146
+ describe 'when passing nil' do
147
+ let(:date_of_birth) { '' }
148
+
149
+ it 'coerce values correctly' do
150
+ expect(subject.date_of_birth).must_be_nil
151
+ end
114
152
  end
115
153
  end
116
154
  end
@@ -135,13 +173,13 @@ class CoercionTypingTest < MiniTest::Spec
135
173
  # with type: Dry::Types::Strict::String
136
174
  # assert_raises(Dry::Types::ConstraintError) { twin.title = nil }
137
175
  twin.title = nil
138
- twin.title.must_be_nil
176
+ expect(twin.title).must_be_nil
139
177
 
140
178
  twin.title = "Yo"
141
- twin.title.must_equal "Yo"
179
+ expect(twin.title).must_equal "Yo"
142
180
 
143
181
  twin.title = ""
144
- twin.title.must_equal ""
182
+ expect(twin.title).must_equal ""
145
183
 
146
184
  assert_raises(Dry::Types::ConstraintError) { twin.title = :bla }
147
185
  assert_raises(Dry::Types::ConstraintError) { twin.title = 1 }
@@ -167,16 +205,16 @@ class CoercionTypingTest < MiniTest::Spec
167
205
 
168
206
  # assert_raises(Dry::Types::ConstraintError) { twin.title = nil } # in form, we either have a blank string or the key's not present at all.
169
207
  twin.title = nil
170
- twin.title.must_be_nil
208
+ expect(twin.title).must_be_nil
171
209
 
172
210
  twin.title = "" # nilify blank strings
173
- twin.title.must_be_nil
211
+ expect(twin.title).must_be_nil
174
212
 
175
213
  twin.title = "Yo"
176
- twin.title.must_equal "Yo"
214
+ expect(twin.title).must_equal "Yo"
177
215
 
178
216
  # twin.enabled = " TRUE"
179
- # twin.enabled.must_equal true
217
+ #expect(twin.enabled).must_equal true
180
218
  end
181
219
  end
182
220