reform 2.3.3 → 2.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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +0 -3
  4. data/CHANGES.md +9 -0
  5. data/Gemfile +1 -1
  6. data/LICENSE.txt +1 -1
  7. data/README.md +5 -5
  8. data/Rakefile +1 -12
  9. data/lib/reform/contract/validate.rb +1 -1
  10. data/lib/reform/form/dry.rb +47 -9
  11. data/lib/reform/validation/groups.rb +0 -1
  12. data/lib/reform/version.rb +1 -1
  13. data/test/call_test.rb +23 -0
  14. data/test/changed_test.rb +6 -6
  15. data/test/coercion_test.rb +17 -17
  16. data/test/{composition_new_api.rb → composition_test.rb} +27 -28
  17. data/test/{contract_new_api.rb → contract_test.rb} +8 -8
  18. data/test/default_test.rb +2 -2
  19. data/test/deserialize_test.rb +8 -8
  20. data/test/docs/validation_test.rb +134 -0
  21. data/test/{errors_new_api.rb → errors_test.rb} +41 -41
  22. data/test/feature_test.rb +2 -2
  23. data/test/fixtures/dry_error_messages.yml +64 -54
  24. data/test/{form_option_new_api.rb → form_option_test.rb} +1 -1
  25. data/test/{form_new_api.rb → form_test.rb} +3 -3
  26. data/test/from_test.rb +10 -10
  27. data/test/{inherit_new_api.rb → inherit_test.rb} +17 -17
  28. data/test/{module_new_api.rb → module_test.rb} +10 -10
  29. data/test/parse_option_test.rb +7 -7
  30. data/test/parse_pipeline_test.rb +1 -1
  31. data/test/{populate_new_api.rb → populate_test.rb} +112 -53
  32. data/test/populator_skip_test.rb +2 -2
  33. data/test/prepopulator_test.rb +15 -15
  34. data/test/read_only_test.rb +2 -2
  35. data/test/readable_test.rb +3 -3
  36. data/test/{reform_new_api.rb → reform_test.rb} +19 -19
  37. data/test/{save_new_api.rb → save_test.rb} +4 -4
  38. data/test/setup_test.rb +9 -9
  39. data/test/{skip_if_new_api.rb → skip_if_test.rb} +12 -12
  40. data/test/skip_setter_and_getter_test.rb +6 -6
  41. data/test/test_helper.rb +5 -6
  42. data/test/{validate_new_api.rb → validate_test.rb} +65 -78
  43. data/test/validation/{dry_validation_new_api.rb → dry_validation_test.rb} +124 -123
  44. data/test/validation/result_test.rb +14 -14
  45. data/test/virtual_test.rb +7 -7
  46. data/test/writeable_test.rb +8 -8
  47. metadata +35 -68
  48. data/Appraisals +0 -8
  49. data/gemfiles/0.13.0.gemfile +0 -8
  50. data/gemfiles/1.5.0.gemfile +0 -9
  51. data/lib/reform/form/dry/new_api.rb +0 -45
  52. data/lib/reform/form/dry/old_api.rb +0 -61
  53. data/test/call_new_api.rb +0 -23
  54. data/test/call_old_api.rb +0 -23
  55. data/test/composition_old_api.rb +0 -184
  56. data/test/contract_old_api.rb +0 -77
  57. data/test/errors_old_api.rb +0 -230
  58. data/test/fixtures/dry_new_api_error_messages.yml +0 -104
  59. data/test/form_old_api.rb +0 -57
  60. data/test/form_option_old_api.rb +0 -24
  61. data/test/inherit_old_api.rb +0 -105
  62. data/test/module_old_api.rb +0 -146
  63. data/test/populate_old_api.rb +0 -304
  64. data/test/reform_old_api.rb +0 -202
  65. data/test/save_old_api.rb +0 -101
  66. data/test/skip_if_old_api.rb +0 -92
  67. data/test/validate_old_api.rb +0 -410
  68. data/test/validation/dry_validation_old_api.rb +0 -772
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f5d5dea8c04f5d993a91776afffea2a0b48603d850c11204d04e79248be6cf8
4
- data.tar.gz: e4132e9db35384198bf31797b8620219c6418df4781a8f5300bbcf38c1a1c630
3
+ metadata.gz: e0b6b3c1dbb48304ae8b36f5fbc12d9f7149edc61b40757017472b3eb01cf04f
4
+ data.tar.gz: 689811ffa73a062d4e598d8a36b6258571350d1ce4c5c87c85db9707313dde04
5
5
  SHA512:
6
- metadata.gz: '0845ada0bbafc7c3a45485d51f93c66c8616bee7b23c851712d297be20c73e82f23a8e575f803adb2972c382c4c9003951ae8d788fe12df87195950490505028'
7
- data.tar.gz: bd463ddb326f4db34ef9ad6948cdb9466a56c87514f2a18fcafba6dff29b54baf5640b97b490657b92e438c336869f35adc3e407b91be80351f427fd84f28c35
6
+ metadata.gz: a797c79e164c4c1791661a97163d4e89b1b2e49ae4992e1c0a59eb427d98ddfdbdae96292f455f843acacc869b5053916afa7131018843c66f4d886e6872c372
7
+ data.tar.gz: 82fe647e1ab34dcc24e85250d5876b88b84ea3a991cdfb163bf0dd616be701105ab1ca87065285bc0e32abe9f67ccdb3cda103c7f70143e49d0a8c3024baa75e
data/.gitignore CHANGED
@@ -15,7 +15,7 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
- .rubocop-https*
18
+ .rubocop*
19
19
  .byebug_history
20
20
  .idea
21
21
  *.iml
data/.travis.yml CHANGED
@@ -7,9 +7,6 @@ rvm:
7
7
  - 2.6
8
8
  - 2.5
9
9
  - 2.4
10
- gemfile:
11
- - gemfiles/1.5.0.gemfile
12
- - gemfiles/0.13.0.gemfile
13
10
  matrix:
14
11
  fast_finish: true
15
12
  allow_failures:
data/CHANGES.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 2.5.0
2
+ * fix memory leak with Dry validation (#525)
3
+
4
+ ## 2.4.0
5
+
6
+ * [BREAKING] Dropping compatibility of dry-validation < 1.x
7
+ [* Removed `Reform::Contract` ?]
8
+ [* Move Form#deserializer to Form::deserializer]
9
+
1
10
  ## 2.3.3
2
11
 
3
12
  * Rename validation option for dry-v 1+ to `contract` instead of `schema`
data/Gemfile CHANGED
@@ -2,4 +2,4 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- gem "appraisal", "~> 2.2"
5
+ gem 'dry-validation', '~> 1.5.0'
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 - 2020 Nick Sutterer
1
+ Copyright (c) 2013 - 2021 Nick Sutterer
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -10,11 +10,11 @@ _Form objects decoupled from your models._
10
10
 
11
11
  Reform gives you a form object with validations and nested setup of models. It is completely framework-agnostic and doesn't care about your database.
12
12
 
13
- Although reform can be used in any Ruby framework, it comes with [Rails support](#rails-integration), works with [simple_form and other form gems](#formbuilder-support), allows nesting forms to implement [has_one](#nesting-forms-1-1-relations) and [has_many](#nesting-forms-1-n-relations) relationships, can [compose a form](#compositions) from multiple objects and gives you [coercion](#coercion).
13
+ Although reform can be used in any Ruby framework, it comes with [Rails support](#rails-integration), works with simple_form and other form gems, allows nesting forms to implement has_one and has_many relationships, can [compose a form](#compositions) from multiple objects and gives you coercion.
14
14
 
15
15
  ## Full Documentation
16
16
 
17
- Reform is part of the [Trailblazer](http://trailblazer.to) framework. [Full documentation](http://trailblazer.to/gems/reform) is available on the project site.
17
+ Reform is part of the [Trailblazer](http://trailblazer.to) framework. [Full documentation](http://trailblazer.to/2.1/docs/reform.html) is available on the project site.
18
18
 
19
19
  ## Reform 2.2
20
20
 
@@ -250,7 +250,7 @@ The manual saving with block is not encouraged. You should rather check the Disp
250
250
 
251
251
  ## Populating Forms
252
252
 
253
- Very often, you need to give Reform some information how to create or find nested objects when `validate`ing. This directive is called _populator_ and [documented here](http://trailblazer.to/gems/reform/populator.html).
253
+ Very often, you need to give Reform some information how to create or find nested objects when `validate`ing. This directive is called _populator_ and [documented here](http://trailblazer.to/2.1/docs/reform.html#reform-populators).
254
254
 
255
255
  ## Installation
256
256
 
@@ -313,7 +313,7 @@ AlbumForm.new(album: album, cd: CD.find(1))
313
313
 
314
314
  ## More
315
315
 
316
- Reform comes many more optional features, like hash fields, coercion, virtual fields, and so on. Check the [full documentation here](http://trailblazer.to/gems/reform).
316
+ Reform comes many more optional features, like hash fields, coercion, virtual fields, and so on. Check the [full documentation here](http://trailblazer.to/2.1/docs/reform.html).
317
317
 
318
318
  [![](http://trailblazer.to/images/3dbuch-freigestellt.png)](https://leanpub.com/trailblazer)
319
319
 
@@ -330,7 +330,7 @@ Temporary note: This is the README and API for Reform 2. On the public API, only
330
330
 
331
331
  Anyway, please upgrade and _report problems_ and do not simply assume that we will magically find out what needs to get fixed. When in trouble, join us on [Gitter](https://gitter.im/trailblazer/chat).
332
332
 
333
- [Full documentation for Reform](http://trailblazer.to/gems/reform) is available online, or support us and grab the [Trailblazer book](https://leanpub.com/trailblazer). There is an [Upgrading Guide](http://trailblazer.to/gems/reform/upgrading-guide.html) to help you migrate from Reform 1.x.
333
+ [Full documentation for Reform](http://trailblazer.to/2.1/docs/reform.html) is available online, or support us and grab the [Trailblazer book](https://leanpub.com/trailblazer). There is an [Upgrading Guide](http://trailblazer.to/2.1/docs/reform.html#reform-upgrading-guide) to help you migrate through versions.
334
334
 
335
335
  ### Attributions!!!
336
336
 
data/Rakefile CHANGED
@@ -4,19 +4,8 @@ require "dry/types/version"
4
4
 
5
5
  task default: %i[test]
6
6
 
7
- TEST_WITH_OLD_AND_NEW_API = %w[
8
- validation/dry_validation call composition contract errors inherit module reform
9
- save skip_if populate validate form
10
- ].freeze
11
-
12
- def dry_v_test_files
13
- api = Gem::Version.new(Dry::Types::VERSION).to_s.split('.').first.to_i >= 1 ? "new" : "old"
14
- TEST_WITH_OLD_AND_NEW_API.map { |file| "test/#{file}_#{api}_api.rb" }
15
- end
16
-
17
7
  Rake::TestTask.new(:test) do |test|
18
8
  test.libs << "test"
19
- test.test_files = FileList["test/*_test.rb"] + FileList["test/validation/*_test.rb"] + dry_v_test_files
9
+ test.test_files = FileList["test/**/*_test.rb"]
20
10
  test.verbose = true
21
11
  end
22
-
@@ -11,7 +11,7 @@ class Reform::Contract < Disposable::Twin
11
11
  validate!(nil).success?
12
12
  end
13
13
 
14
- # The #errors method will be removed in Reform 2.4/3.0 core.
14
+ # The #errors method will be removed in Reform 3.0 core.
15
15
  def errors(*args)
16
16
  Result::Errors.new(@result, self)
17
17
  end
@@ -1,19 +1,57 @@
1
+ gem 'dry-validation', '~> 1.5'
1
2
  require "dry-validation"
2
- require "dry/validation/version"
3
3
  require "reform/validation"
4
4
  require "reform/form/dry/input_hash"
5
5
 
6
+ ::Dry::Validation.load_extensions(:hints)
7
+
6
8
  module Reform::Form::Dry
9
+ class Contract < Dry::Validation::Contract
10
+ end
11
+
7
12
  def self.included(includer)
8
- if Gem::Version.new(Dry::Validation::VERSION) > Gem::Version.new("0.13.3")
9
- require "reform/form/dry/new_api"
10
- validations = Reform::Form::Dry::NewApi::Validations
11
- else
12
- require "reform/form/dry/old_api"
13
- validations = Reform::Form::Dry::OldApi::Validations
13
+ includer.send :include, Validations
14
+ includer.extend Validations::ClassMethods
15
+ end
16
+
17
+ module Validations
18
+ module ClassMethods
19
+ def validation_group_class
20
+ Group
21
+ end
22
+ end
23
+
24
+ def self.included(includer)
25
+ includer.extend(ClassMethods)
14
26
  end
15
27
 
16
- includer.send :include, validations
17
- includer.extend validations::ClassMethods
28
+ class Group
29
+ include InputHash
30
+
31
+ def initialize(**options)
32
+ @validator = options.fetch(:contract, Contract)
33
+ @schema_inject_params = options.fetch(:with, {})
34
+ end
35
+
36
+ attr_reader :validator, :schema_inject_params, :block
37
+
38
+ def instance_exec(&block)
39
+ @block = block
40
+ end
41
+
42
+ def call(form)
43
+ # when passing options[:schema] the class instance is already created so we just need to call
44
+ # "call"
45
+ return validator.call(input_hash(form)) unless validator.is_a?(Class) && @validator <= ::Dry::Validation::Contract
46
+
47
+ dynamic_options = { form: form }
48
+ inject_options = schema_inject_params.merge(dynamic_options)
49
+ contract.new(inject_options).call(input_hash(form))
50
+ end
51
+
52
+ def contract
53
+ @contract ||= Class.new(validator, &block)
54
+ end
55
+ end
18
56
  end
19
57
  end
@@ -43,7 +43,6 @@ module Reform::Validation
43
43
 
44
44
  groups.collect do |(name, group, options)|
45
45
  next unless evaluate?(options[:if], results, form)
46
-
47
46
  results[name] = group.(form) # run validation for group. store and collect <Result>.
48
47
  end
49
48
  end
@@ -1,3 +1,3 @@
1
1
  module Reform
2
- VERSION = "2.3.3".freeze
2
+ VERSION = "2.5.0".freeze
3
3
  end
data/test/call_test.rb ADDED
@@ -0,0 +1,23 @@
1
+ require "test_helper"
2
+
3
+ class CallTest < Minitest::Spec
4
+ Song = Struct.new(:title)
5
+
6
+ class SongForm < TestForm
7
+ property :title
8
+
9
+ validation do
10
+ params { required(:title).filled }
11
+ end
12
+ end
13
+
14
+ let(:form) { SongForm.new(Song.new) }
15
+
16
+ it { assert form.(title: "True North").success? }
17
+ it { refute form.(title: "True North").failure? }
18
+ it { refute form.(title: "").success? }
19
+ it { assert form.(title: "").failure? }
20
+
21
+ it { assert_equal form.(title: "True North").errors.messages, {} }
22
+ it { assert_equal form.(title: "").errors.messages, title: ["must be filled"] }
23
+ end
data/test/changed_test.rb CHANGED
@@ -26,16 +26,16 @@ class ChangedTest < MiniTest::Spec
26
26
 
27
27
  # nothing changed after setup.
28
28
  it do
29
- _(form.changed?(:name)).must_equal false
30
- _(form.songs[0].changed?(:title)).must_equal false
31
- _(form.songs[0].composer.changed?(:name)).must_equal false
29
+ refute form.changed?(:name)
30
+ refute form.songs[0].changed?(:title)
31
+ refute form.songs[0].composer.changed?(:name)
32
32
  end
33
33
 
34
34
  # after validate, things might have changed.
35
35
  it do
36
36
  form.validate("name" => "Out Of Bounds", "songs" => [{"composer" => {"name" => "Ingemar Jansson & Mikael Danielsson"}}])
37
- _(form.changed?(:name)).must_equal true
38
- _(form.songs[0].changed?(:title)).must_equal false
39
- _(form.songs[0].composer.changed?(:name)).must_equal true
37
+ assert form.changed?(:name)
38
+ refute form.songs[0].changed?(:title)
39
+ assert form.songs[0].composer.changed?(:name)
40
40
  end
41
41
  end
@@ -13,11 +13,11 @@ class CoercionTest < BaseTest
13
13
  feature Coercion
14
14
  include Disposable::Twin::Property::Hash
15
15
 
16
- property :released_at, type: DRY_TYPES_CONSTANT::DateTime
16
+ property :released_at, type: Types::Params::DateTime
17
17
 
18
18
  property :hit do
19
- property :length, type: DRY_TYPES_INT_CONSTANT
20
- property :good, type: DRY_TYPES_CONSTANT::Bool
19
+ property :length, type: Types::Params::Integer
20
+ property :good, type: Types::Params::Bool
21
21
  end
22
22
 
23
23
  property :band do
@@ -28,7 +28,7 @@ class CoercionTest < BaseTest
28
28
 
29
29
  property :metadata, field: :hash do
30
30
  property :publication_settings do
31
- property :featured, type: DRY_TYPES_CONSTANT::Bool
31
+ property :featured, type: Types::Params::Bool
32
32
  end
33
33
  end
34
34
  end
@@ -47,9 +47,9 @@ class CoercionTest < BaseTest
47
47
  end
48
48
 
49
49
  # it { subject.released_at.must_be_kind_of DateTime }
50
- it { _(subject.released_at).must_equal "31/03/1981" } # NO coercion in setup.
51
- it { _(subject.hit.length).must_equal "312" }
52
- it { _(subject.band.label.value).must_equal "9999.99" }
50
+ it { assert_equal subject.released_at, "31/03/1981" } # NO coercion in setup.
51
+ it { assert_equal subject.hit.length, "312" }
52
+ it { assert_equal subject.band.label.value, "9999.99" }
53
53
 
54
54
  let(:params) do
55
55
  {
@@ -75,24 +75,24 @@ class CoercionTest < BaseTest
75
75
  describe "#validate" do
76
76
  before { subject.validate(params) }
77
77
 
78
- it { _(subject.released_at).must_equal DateTime.parse("30/03/1981") }
79
- it { _(subject.hit.length).must_equal 312 }
80
- it { _(subject.hit.good).must_equal false }
81
- it { _(subject.band.label.value).must_equal "9999.999999.99" } # coercion happened once.
82
- it { _(subject.metadata.publication_settings.featured).must_equal false }
78
+ it { assert_equal subject.released_at, DateTime.parse("30/03/1981") }
79
+ it { assert_equal subject.hit.length, 312 }
80
+ it { assert_equal subject.hit.good, false }
81
+ it { assert_equal subject.band.label.value, "9999.999999.99" } # coercion happened once.
82
+ it { assert_equal subject.metadata.publication_settings.featured, false }
83
83
  end
84
84
 
85
85
  # sync
86
86
  describe "#sync" do
87
87
  before do
88
- _(subject.validate(params)).must_equal true
88
+ assert subject.validate(params)
89
89
  subject.sync
90
90
  end
91
91
 
92
- it { _(album.released_at).must_equal DateTime.parse("30/03/1981") }
93
- it { _(album.hit.length).must_equal 312 }
94
- it { _(album.hit.good).must_equal false }
92
+ it { assert_equal album.released_at, DateTime.parse("30/03/1981") }
93
+ it { assert_equal album.hit.length, 312 }
94
+ it { assert_equal album.hit.good, false }
95
95
  it { assert_nil album.metadata[:publication_settings] }
96
- it { _(album.metadata["publication_settings"]["featured"]).must_equal false }
96
+ it { assert_equal album.metadata["publication_settings"]["featured"], false }
97
97
  end
98
98
  end
@@ -33,8 +33,8 @@ class FormCompositionInheritanceTest < MiniTest::Spec
33
33
  Tshirt = Struct.new(:price, :size)
34
34
  Measurement = Struct.new(:size)
35
35
 
36
- it { _(form.price).must_equal 6 }
37
- it { _(form.price(for_size: :s)).must_equal 2 }
36
+ it { assert_equal form.price, 6 }
37
+ it { assert_equal form.price(for_size: :s), 2 }
38
38
  end
39
39
 
40
40
  class FormCompositionTest < MiniTest::Spec
@@ -71,24 +71,24 @@ class FormCompositionTest < MiniTest::Spec
71
71
  let(:band) { Band.new("Duran^2") }
72
72
 
73
73
  # delegation form -> composition works
74
- it { _(form.id).must_equal 1 }
75
- it { _(form.title).must_equal "Rio" }
76
- it { _(form.name).must_equal "Duran Duran" }
77
- it { _(form.requester_id).must_equal 2 }
74
+ it { assert_equal form.id, 1 }
75
+ it { assert_equal form.title, "Rio" }
76
+ it { assert_equal form.name, "Duran Duran" }
77
+ it { assert_equal form.requester_id, 2 }
78
78
  it { assert_nil form.channel }
79
- it { _(form.requester).must_equal "MCP" } # same name as composed model.
79
+ it { assert_equal form.requester, "MCP" } # same name as composed model.
80
80
  it { assert_nil form.captcha }
81
81
 
82
82
  # #model just returns <Composition>.
83
- it { _(form.mapper).must_be_kind_of Disposable::Composition }
83
+ it { assert form.mapper.is_a? Disposable::Composition }
84
84
 
85
85
  # #model[] -> composed models
86
- it { _(form.model[:requester]).must_equal requester }
87
- it { _(form.model[:song]).must_equal song }
86
+ it { assert_equal form.model[:requester], requester }
87
+ it { assert_equal form.model[:song], song }
88
88
 
89
89
  it "creates Composition for you" do
90
- _(form.validate("title" => "Greyhound", "name" => "Frenzal Rhomb")).must_equal true
91
- _(form.validate("title" => "", "name" => "Frenzal Rhomb")).must_equal false
90
+ assert_equal form.validate("title" => "Greyhound", "name" => "Frenzal Rhomb"), true
91
+ assert_equal form.validate("title" => "", "name" => "Frenzal Rhomb"), false
92
92
  end
93
93
 
94
94
  describe "#save" do
@@ -101,7 +101,7 @@ class FormCompositionTest < MiniTest::Spec
101
101
  hash[:title] = form.title
102
102
  end
103
103
 
104
- _(hash).must_equal({name: "Duran Duran", title: "Rio"})
104
+ assert_equal hash, name: "Duran Duran", title: "Rio"
105
105
  end
106
106
 
107
107
  it "provides nested symbolized hash as second block argument" do
@@ -113,11 +113,10 @@ class FormCompositionTest < MiniTest::Spec
113
113
  hash = map
114
114
  end
115
115
 
116
- _(hash).must_equal({
117
- song: {"title" => "Greyhound", "id" => 1, "channel" => "JJJ", "captcha" => "wonderful", "band" => {"title" => "Duran^2"}},
118
- requester: {"name" => "Frenzal Rhomb", "id" => 2, "requester" => "MCP"}
119
- }
120
- )
116
+ assert_equal hash, {
117
+ song: {"title" => "Greyhound", "id" => 1, "channel" => "JJJ", "captcha" => "wonderful", "band" => {"title" => "Duran^2"}},
118
+ requester: {"name" => "Frenzal Rhomb", "id" => 2, "requester" => "MCP"}
119
+ }
121
120
  end
122
121
 
123
122
  it "xxx pushes data to models and calls #save when no block passed" do
@@ -126,16 +125,16 @@ class FormCompositionTest < MiniTest::Spec
126
125
  band.extend(Saveable)
127
126
 
128
127
  form.validate("title" => "Greyhound", "name" => "Frenzal Rhomb", "captcha" => "1337")
129
- _(form.captcha).must_equal "1337" # TODO: move to separate test.
128
+ assert_equal form.captcha, "1337" # TODO: move to separate test.
130
129
 
131
130
  form.save
132
131
 
133
- _(requester.name).must_equal "Frenzal Rhomb"
134
- _(requester.saved?).must_equal true
135
- _(song.title).must_equal "Greyhound"
136
- _(song.saved?).must_equal true
137
- _(song.band.title).must_equal "Duran^2"
138
- _(song.band.saved?).must_equal true
132
+ assert_equal requester.name, "Frenzal Rhomb"
133
+ assert_equal requester.saved?, true
134
+ assert_equal song.title, "Greyhound"
135
+ assert_equal song.saved?, true
136
+ assert_equal song.band.title, "Duran^2"
137
+ assert_equal song.band.saved?, true
139
138
  end
140
139
 
141
140
  it "returns true when models all save successfully" do
@@ -143,7 +142,7 @@ class FormCompositionTest < MiniTest::Spec
143
142
  requester.extend(Saveable)
144
143
  band.extend(Saveable)
145
144
 
146
- _(form.save).must_equal true
145
+ assert_equal form.save, true
147
146
  end
148
147
 
149
148
  it "returns false when one or more models don't save successfully" do
@@ -157,7 +156,7 @@ class FormCompositionTest < MiniTest::Spec
157
156
  requester.extend(Saveable)
158
157
  band.extend(Saveable)
159
158
 
160
- _(form.save).must_equal false
159
+ assert_equal form.save, false
161
160
  end
162
161
  end
163
162
  end
@@ -182,5 +181,5 @@ class FormCompositionCollectionTest < MiniTest::Spec
182
181
  let(:form) { LibraryForm.new(library: library) }
183
182
  let(:library) { Library.new(2) }
184
183
 
185
- it { form.save { |hash| _(hash).must_equal({library: {"books" => [{"id" => 1, "name" => "My book"}]}}) } }
184
+ it { form.save { |hash| assert_equal hash, { library: { "books" => [{ "id" => 1, "name" => "My book" }] } } } }
186
185
  end