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.
Files changed (57) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +29 -0
  3. data/.gitignore +1 -0
  4. data/CHANGES.md +23 -0
  5. data/Gemfile +5 -12
  6. data/README.md +2 -2
  7. data/disposable.gemspec +6 -9
  8. data/lib/disposable/rescheme.rb +1 -3
  9. data/lib/disposable/twin.rb +7 -0
  10. data/lib/disposable/twin/coercion.rb +11 -3
  11. data/lib/disposable/twin/default.rb +3 -3
  12. data/lib/disposable/twin/property/struct.rb +3 -1
  13. data/lib/disposable/twin/setup.rb +1 -1
  14. data/lib/disposable/twin/sync.rb +1 -1
  15. data/lib/disposable/version.rb +1 -1
  16. data/test/callback_group_test.rb +29 -30
  17. data/test/callbacks_test.rb +49 -49
  18. data/test/expose_test.rb +16 -16
  19. data/test/persisted_test.rb +30 -30
  20. data/test/rescheme_test.rb +22 -22
  21. data/test/skip_getter_test.rb +14 -14
  22. data/test/test_helper.rb +9 -6
  23. data/test/twin/builder_test.rb +3 -3
  24. data/test/twin/changed_test.rb +38 -38
  25. data/test/twin/coercion_test.rb +75 -38
  26. data/test/twin/collection_test.rb +48 -48
  27. data/test/twin/composition_test.rb +20 -20
  28. data/test/twin/default_test.rb +15 -15
  29. data/test/twin/expose_test.rb +15 -15
  30. data/test/twin/feature_test.rb +10 -10
  31. data/test/twin/from_collection_test.rb +4 -4
  32. data/test/twin/from_test.rb +3 -3
  33. data/test/twin/hash_test.rb +78 -31
  34. data/test/twin/inherit_test.rb +7 -7
  35. data/test/twin/inheritance_test.rb +6 -6
  36. data/test/twin/option_test.rb +1 -1
  37. data/test/twin/parent_test.rb +6 -6
  38. data/test/twin/property_processor_test.rb +5 -5
  39. data/test/twin/readable_test.rb +9 -9
  40. data/test/twin/save_test.rb +44 -44
  41. data/test/twin/setup_test.rb +25 -25
  42. data/test/twin/skip_unchanged_test.rb +6 -6
  43. data/test/twin/struct/coercion_test.rb +36 -0
  44. data/test/twin/struct_test.rb +41 -38
  45. data/test/twin/sync_option_test.rb +2 -2
  46. data/test/twin/sync_test.rb +29 -29
  47. data/test/twin/twin_test.rb +25 -15
  48. data/test/twin/unnest_test.rb +7 -7
  49. data/test/twin/virtual_test.rb +3 -3
  50. data/test/twin/writeable_test.rb +8 -8
  51. metadata +25 -57
  52. data/.travis.yml +0 -13
  53. data/gemfiles/Gemfile.rails-2.3 +0 -7
  54. data/gemfiles/Gemfile.rails-3.0 +0 -7
  55. data/gemfiles/Gemfile.rails-3.2 +0 -7
  56. data/gemfiles/Gemfile.rails-4.0 +0 -8
  57. 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
@@ -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
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
@@ -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
 
@@ -114,23 +114,23 @@ class ChangedWithCoercionTest < MiniTest::Spec
114
114
  include Changed
115
115
  include Coercion
116
116
 
117
- property :released, type: Types::Form::Bool
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