reform 2.1.0 → 2.2.0.rc1

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.travis.yml +4 -12
  4. data/CHANGES.md +8 -0
  5. data/README.md +36 -743
  6. data/Rakefile +1 -31
  7. data/gemfiles/{Gemfile.rails-3.1 → Gemfile.disposable-0.3} +1 -2
  8. data/lib/reform.rb +0 -9
  9. data/lib/reform/contract.rb +5 -1
  10. data/lib/reform/form.rb +1 -4
  11. data/lib/reform/form/composition.rb +1 -2
  12. data/lib/reform/form/dry.rb +29 -16
  13. data/lib/reform/form/module.rb +15 -3
  14. data/lib/reform/form/validate.rb +1 -1
  15. data/lib/reform/validation.rb +3 -3
  16. data/lib/reform/version.rb +1 -1
  17. data/reform.gemspec +3 -10
  18. data/test/coercion_test.rb +7 -7
  19. data/test/composition_test.rb +5 -1
  20. data/test/contract_test.rb +10 -4
  21. data/test/deserialize_test.rb +3 -3
  22. data/test/errors_test.rb +48 -28
  23. data/test/form_option_test.rb +3 -1
  24. data/test/form_test.rb +19 -14
  25. data/test/module_test.rb +51 -11
  26. data/test/populate_test.rb +21 -7
  27. data/test/reform_test.rb +24 -20
  28. data/test/save_test.rb +10 -4
  29. data/test/skip_if_test.rb +5 -3
  30. data/test/test_helper.rb +3 -43
  31. data/test/validate_test.rb +34 -14
  32. data/test/validation/dry_test.rb +60 -0
  33. data/test/validation/dry_validation_test.rb +65 -43
  34. data/test/validation/errors.yml +4 -0
  35. metadata +16 -192
  36. data/database.sqlite3 +0 -0
  37. data/gemfiles/Gemfile.rails-3.2 +0 -7
  38. data/gemfiles/Gemfile.rails-4.0 +0 -8
  39. data/gemfiles/Gemfile.rails-4.1 +0 -8
  40. data/gemfiles/Gemfile.rails-4.2 +0 -8
  41. data/lib/reform/active_record.rb +0 -4
  42. data/lib/reform/form/active_model.rb +0 -87
  43. data/lib/reform/form/active_model/form_builder_methods.rb +0 -48
  44. data/lib/reform/form/active_model/model_reflections.rb +0 -46
  45. data/lib/reform/form/active_model/model_validations.rb +0 -110
  46. data/lib/reform/form/active_model/validations.rb +0 -107
  47. data/lib/reform/form/active_record.rb +0 -30
  48. data/lib/reform/form/lotus.rb +0 -59
  49. data/lib/reform/form/multi_parameter_attributes.rb +0 -48
  50. data/lib/reform/form/validation/unique_validator.rb +0 -54
  51. data/lib/reform/rails.rb +0 -13
  52. data/test/active_model_custom_validation_translations_test.rb +0 -75
  53. data/test/active_model_test.rb +0 -207
  54. data/test/active_model_validation_for_property_named_format_test.rb +0 -18
  55. data/test/active_record_test.rb +0 -273
  56. data/test/builder_test.rb +0 -32
  57. data/test/custom_validation_test.rb +0 -47
  58. data/test/dummy/Rakefile +0 -7
  59. data/test/dummy/app/controllers/albums_controller.rb +0 -18
  60. data/test/dummy/app/controllers/application_controller.rb +0 -4
  61. data/test/dummy/app/controllers/musician_controller.rb +0 -5
  62. data/test/dummy/app/forms/album_form.rb +0 -18
  63. data/test/dummy/app/helpers/application_helper.rb +0 -2
  64. data/test/dummy/app/models/album.rb +0 -4
  65. data/test/dummy/app/models/song.rb +0 -3
  66. data/test/dummy/app/views/albums/new.html.erb +0 -28
  67. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  68. data/test/dummy/config.ru +0 -4
  69. data/test/dummy/config/application.rb +0 -20
  70. data/test/dummy/config/boot.rb +0 -10
  71. data/test/dummy/config/database.yml +0 -22
  72. data/test/dummy/config/environment.rb +0 -5
  73. data/test/dummy/config/environments/development.rb +0 -16
  74. data/test/dummy/config/environments/production.rb +0 -46
  75. data/test/dummy/config/environments/test.rb +0 -33
  76. data/test/dummy/config/locales/en.yml +0 -14
  77. data/test/dummy/config/routes.rb +0 -4
  78. data/test/dummy/db/test.sqlite3 +0 -0
  79. data/test/form_builder_test.rb +0 -138
  80. data/test/lotus/Gemfile +0 -5
  81. data/test/lotus/lotus_test.rb +0 -31
  82. data/test/lotus_test.rb +0 -150
  83. data/test/model_reflections_test.rb +0 -138
  84. data/test/model_validations_test.rb +0 -82
  85. data/test/mongoid_test.rb +0 -313
  86. data/test/multi_parameter_attributes_test.rb +0 -50
  87. data/test/rails/integration_test.rb +0 -54
  88. data/test/unique_test.rb +0 -135
  89. data/test/validation/activemodel_validation_test.rb +0 -252
data/Rakefile CHANGED
@@ -5,36 +5,6 @@ task :default => [:test]
5
5
  Rake::TestTask.new(:test) do |test|
6
6
  test.libs << 'test'
7
7
  test.test_files = FileList['test/*_test.rb'] + FileList["test/validation/*_test.rb"]
8
-
9
- # test.test_files = ["test/changed_test.rb",
10
- # "test/coercion_test.rb",
11
- # "test/feature_test.rb",
12
-
13
- # "test/contract_test.rb",
14
-
15
- # "test/populate_test.rb", "test/prepopulator_test.rb",
16
-
17
- # "test/readable_test.rb","test/setup_test.rb","test/skip_if_test.rb",
18
-
19
- # "test/validate_test.rb", "test/save_test.rb",
20
-
21
- # "test/writeable_test.rb","test/virtual_test.rb",
22
-
23
- # "test/form_builder_test.rb", "test/active_model_test.rb",
24
-
25
- # "test/readonly_test.rb",
26
- # "test/inherit_test.rb",
27
- # "test/uniqueness_test.rb",
28
- # "test/from_test.rb",
29
- # "test/composition_test.rb",
30
- # "test/form_option_test.rb",
31
- # "test/form_test.rb",
32
- # "test/deserialize_test.rb",
33
- # "test/module_test.rb"
34
- # ]
35
-
36
-
37
-
38
8
  test.verbose = true
39
9
  end
40
10
 
@@ -42,4 +12,4 @@ Rake::TestTask.new(:test_rails) do |test|
42
12
  test.libs << 'test'
43
13
  test.test_files = FileList['test/rails/*_test.rb']
44
14
  test.verbose = true
45
- end
15
+ end
@@ -3,5 +3,4 @@ source "http://rubygems.org"
3
3
  # Specify your gem's dependencies in reform.gemspec
4
4
  gemspec :path => '../'
5
5
 
6
- gem 'railties', '~> 3.1.0'
7
- gem 'activerecord', '~> 3.1.0'
6
+ gem 'minitest'
@@ -1,17 +1,8 @@
1
1
  module Reform
2
- def self.rails3_0?
3
- ::ActiveModel::VERSION::MAJOR == 3 and ::ActiveModel::VERSION::MINOR == 0
4
- end
5
2
  end
6
3
 
7
4
  require "disposable"
8
5
  require "reform/contract"
9
6
  require "reform/form"
10
7
  require "reform/form/composition"
11
- require "reform/form/active_model"
12
8
  require "reform/form/module"
13
-
14
-
15
- if defined?(Rails)
16
- require "reform/rails"
17
- end
@@ -29,7 +29,7 @@ module Reform
29
29
 
30
30
  # FIXME: test me.
31
31
  def self.properties(*args)
32
- options = args.extract_options!
32
+ options = args.pop if args.last.is_a?(Hash)
33
33
  args.each { |name| property(name, options.dup) }
34
34
  end
35
35
 
@@ -40,6 +40,10 @@ module Reform
40
40
  require "reform/validation"
41
41
  include Reform::Validation # ::validates and #valid?
42
42
 
43
+ # FIXME: this is only for #to_nested_hash, #sync shouldn't be part of Contract.
44
+ require "disposable/twin/sync"
45
+ include Disposable::Twin::Sync
46
+
43
47
 
44
48
 
45
49
  # module ValidatesWarning
@@ -71,9 +71,6 @@ module Reform
71
71
  end
72
72
  extend Property
73
73
 
74
-
75
- require "reform/form/multi_parameter_attributes"
76
-
77
74
  require "disposable/twin/changed"
78
75
  feature Disposable::Twin::Changed
79
76
 
@@ -91,4 +88,4 @@ module Reform
91
88
  Representable::Pipeline::Stop
92
89
  end
93
90
  end
94
- end
91
+ end
@@ -1,11 +1,10 @@
1
- require "reform/form/active_model"
2
1
  require "disposable/twin/composition"
3
2
 
4
3
  module Reform::Form::Composition
5
4
  # Automatically creates a Composition object for you when initializing the form.
6
5
  def self.included(base)
7
6
  base.class_eval do
8
- extend Reform::Form::ActiveModel::ClassMethods # ::model.
7
+ # extend Reform::Form::ActiveModel::ClassMethods # ::model.
9
8
  extend ClassMethods
10
9
  include Disposable::Twin::Composition
11
10
  end
@@ -3,8 +3,12 @@ require "dry/validation/schema/form"
3
3
  require "reform/validation"
4
4
 
5
5
  module Reform::Form::Dry
6
- module Validations
6
+ def self.included(includer)
7
+ includer.send :include, Validations
8
+ includer.extend Validations::ClassMethods
9
+ end
7
10
 
11
+ module Validations
8
12
  def build_errors
9
13
  Reform::Contract::Errors.new(self)
10
14
  end
@@ -21,33 +25,42 @@ module Reform::Form::Dry
21
25
 
22
26
  class Group
23
27
  def initialize
24
- @validator = Class.new(ValidatorSchema)
28
+ @schemas = []
25
29
  end
26
30
 
27
31
  def instance_exec(&block)
28
- @validator.class_eval(&block)
32
+ @schemas << block
33
+ @validator = Builder.new(@schemas.dup).validation_graph
29
34
  end
30
35
 
31
36
  def call(fields, reform_errors, form)
32
- validator = @validator.new(form)
33
-
34
- # a message item looks like: {:confirm_password=>[["confirm_password size cannot be less than 2"], "9"]}
35
- validator.call(fields).messages.each do |field, dry_error|
36
- dry_error[0].each do |attr_error|
37
+ # a message item looks like: {:confirm_password=>["confirm_password size cannot be less than 2"]}
38
+ @validator.with(form: form).call(fields).messages.each do |field, dry_error|
39
+ dry_error.each do |attr_error|
37
40
  reform_errors.add(field, attr_error)
38
41
  end
39
42
  end
40
43
  end
41
- end
42
44
 
43
- class ValidatorSchema < Dry::Validation::Schema::Form
44
- def initialize(form)
45
- @form = form
46
- super()
47
- end
45
+ class Builder < Array
46
+ def initialize(array)
47
+ super(array)
48
+ @validator = Dry::Validation.Form({}, &shift)
49
+ end
48
50
 
49
- def form
50
- @form
51
+ def validation_graph
52
+ build_graph(@validator)
53
+ end
54
+
55
+
56
+ private
57
+
58
+ def build_graph(validator)
59
+ if empty?
60
+ return validator
61
+ end
62
+ build_graph(Dry::Validation.Schema(validator, {}, &shift))
63
+ end
51
64
  end
52
65
  end
53
66
  end
@@ -1,10 +1,22 @@
1
1
  # Include this in every module that gets further included.
2
2
  module Reform::Form::Module
3
+ # DISCUSS: could this be part of Declarative?
3
4
  def self.included(base)
4
5
  base.extend ClassMethods
6
+ base.extend Declarative::Heritage::DSL # ::heritage
7
+ # base.extend Declarative::Heritage::Included # ::included
8
+ base.extend Included
9
+ end
5
10
 
6
- base.extend Declarative::Heritage::DSL # ::heritage
7
- base.extend Declarative::Heritage::Included # ::included
11
+ module Included
12
+ # Gets imported into your module and will be run when including it.
13
+ def included(includer)
14
+ super
15
+ # first, replay all declaratives like ::property on includer.
16
+ heritage.(includer) # this normally happens via Heritage::Included.
17
+ # then, include optional accessors.
18
+ includer.send(:include, self::InstanceMethods) if const_defined?(:InstanceMethods)
19
+ end
8
20
  end
9
21
 
10
22
  module ClassMethods
@@ -12,4 +24,4 @@ module Reform::Form::Module
12
24
  heritage.record(method, *args, &block)
13
25
  end
14
26
  end
15
- end
27
+ end
@@ -9,7 +9,7 @@ module Reform::Form::Validate
9
9
  # TODO: Schema should provide property names as plain list.
10
10
  properties = options[:binding][:nested].definitions.collect { |dfn| dfn[:name] }
11
11
 
12
- properties.each { |name| params[name].present? and return false }
12
+ properties.each { |name| (!params[name].nil? && params[name] != "") and return false }
13
13
  true # skip
14
14
  end
15
15
  end
@@ -7,7 +7,7 @@ module Reform::Validation
7
7
  end
8
8
 
9
9
  # DSL.
10
- def validation(name, options={}, &block)
10
+ def validation(name=:default, options={}, &block)
11
11
  heritage.record(:validation, name, options, &block)
12
12
 
13
13
  group = validation_groups.add(name, options)
@@ -33,8 +33,8 @@ module Reform::Validation
33
33
  end
34
34
 
35
35
  def valid?
36
- Groups::Result.new(self.class.validation_groups).(@fields, errors, self)
36
+ Groups::Result.new(self.class.validation_groups).(to_nested_hash, errors, self)
37
37
  end
38
38
  end
39
39
 
40
- require "reform/validation/groups"
40
+ require "reform/validation/groups"
@@ -1,3 +1,3 @@
1
1
  module Reform
2
- VERSION = "2.1.0"
2
+ VERSION = "2.2.0.rc1"
3
3
  end
@@ -17,21 +17,14 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_dependency "disposable", ">= 0.2.2", "< 0.3.0"
20
+ spec.add_dependency "disposable", ">= 0.3.0", "< 0.4.0"
21
21
  spec.add_dependency "uber", "~> 0.0.11"
22
22
  spec.add_dependency "representable", ">= 2.4.0", "< 3.1.0"
23
23
 
24
24
  spec.add_development_dependency "bundler"
25
25
  spec.add_development_dependency "rake"
26
26
  spec.add_development_dependency "minitest"
27
- spec.add_development_dependency "activerecord"
28
- spec.add_development_dependency "sqlite3"
29
- spec.add_development_dependency "virtus"
30
- spec.add_development_dependency "rails"
31
- spec.add_development_dependency "mongoid"
27
+ spec.add_development_dependency "dry-types"
32
28
  spec.add_development_dependency "multi_json"
33
-
34
- spec.add_development_dependency "lotus-validations"
35
- spec.add_development_dependency "dry-validation", ">= 0.4.0"
36
- spec.add_development_dependency "actionpack"
29
+ spec.add_development_dependency "dry-validation", ">= 0.7.0"
37
30
  end
@@ -2,8 +2,8 @@ require "test_helper"
2
2
  require "reform/form/coercion"
3
3
 
4
4
  class CoercionTest < BaseTest
5
- class Irreversible < Virtus::Attribute
6
- def coerce(value)
5
+ class Irreversible
6
+ def self.call(value)
7
7
  value*2
8
8
  end
9
9
  end
@@ -11,16 +11,16 @@ class CoercionTest < BaseTest
11
11
  class Form < Reform::Form
12
12
  feature Coercion
13
13
 
14
- property :released_at, :type => DateTime
14
+ property :released_at, type: Types::Form::DateTime
15
15
 
16
16
  property :hit do
17
- property :length, :type => Integer
18
- property :good, :type => Virtus::Attribute::Boolean
17
+ property :length, type: Types::Form::Int
18
+ property :good, type: Types::Form::Bool
19
19
  end
20
20
 
21
21
  property :band do
22
22
  property :label do
23
- property :value, :type => Irreversible
23
+ property :value, type: Irreversible
24
24
  end
25
25
  end
26
26
  end
@@ -63,4 +63,4 @@ class CoercionTest < BaseTest
63
63
  end
64
64
 
65
65
  # save
66
- end
66
+ end
@@ -16,7 +16,11 @@ class FormCompositionTest < MiniTest::Spec
16
16
  property :requester, :on => :requester
17
17
  property :captcha, :on => :song, :virtual => true
18
18
 
19
- validates :name, :title, :channel, :presence => true
19
+ validation do
20
+ key(:name).required
21
+ key(:name).required
22
+ key(:title).required
23
+ end
20
24
 
21
25
  property :band, :on => :song do
22
26
  property :title
@@ -11,15 +11,21 @@ class ContractTest < MiniTest::Spec
11
11
 
12
12
  class AlbumForm < Reform::Contract
13
13
  property :name
14
- validates :name, presence: true
14
+ validation do
15
+ key(:name).required
16
+ end
15
17
 
16
18
  collection :songs do
17
19
  property :title
18
- validates :title, presence: true
20
+ validation do
21
+ key(:title).required
22
+ end
19
23
 
20
24
  property :composer do
21
- validates :name, presence: true
22
25
  property :name
26
+ validation do
27
+ key(:name).required
28
+ end
23
29
  end
24
30
  end
25
31
 
@@ -43,4 +49,4 @@ class ContractTest < MiniTest::Spec
43
49
  it { AlbumForm.options_for(:name).extend(Declarative::Inspect).inspect.must_equal "#<Disposable::Twin::Definition: @options={:private_name=>:name, :name=>\"name\"}>" }
44
50
  it { AlbumForm.new(album).options_for(:name).extend(Declarative::Inspect).inspect.must_equal "#<Disposable::Twin::Definition: @options={:private_name=>:name, :name=>\"name\"}>" }
45
51
  end
46
- end
52
+ end
@@ -39,7 +39,7 @@ class DeserializeTest < MiniTest::Spec
39
39
  artist_id = artist.object_id
40
40
 
41
41
  form = JsonAlbumForm.new(Album.new("Best Of", artist))
42
- json = {title: "Apocalypse Soon", artist: {name: "Mute"}}.to_json
42
+ json = MultiJson.dump({title: "Apocalypse Soon", artist: {name: "Mute"}})
43
43
 
44
44
  form.validate(json)
45
45
 
@@ -85,7 +85,7 @@ class ValidateWithBlockTest < MiniTest::Spec
85
85
  it do
86
86
  album = Album.new
87
87
  form = AlbumForm.new(album)
88
- json = {title: "Apocalypse Soon", artist: {name: "Mute"}}.to_json
88
+ json = MultiJson.dump({title: "Apocalypse Soon", artist: {name: "Mute"}})
89
89
 
90
90
  deserializer = Disposable::Rescheme.from(AlbumForm,
91
91
  include: [Representable::JSON],
@@ -101,4 +101,4 @@ class ValidateWithBlockTest < MiniTest::Spec
101
101
  form.title.must_equal "Apocalypse Soon"
102
102
  form.artist.name.must_equal "Mute"
103
103
  end
104
- end
104
+ end
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
3
  class ErrorsTest < MiniTest::Spec
4
4
  class AlbumForm < Reform::Form
@@ -6,31 +6,51 @@ class ErrorsTest < MiniTest::Spec
6
6
 
7
7
  property :hit do
8
8
  property :title
9
- validates :title, :presence => true
9
+ validation do
10
+ key(:title).required
11
+ end
10
12
  end
11
13
 
12
14
  collection :songs do
13
15
  property :title
14
- validates :title, :presence => true
16
+ validation do
17
+ key(:title).required
18
+ end
15
19
  end
16
20
 
17
21
  property :band do # yepp, people do crazy stuff like that.
18
22
  property :name
19
23
  property :label do
20
24
  property :name
21
- validates :name, :presence => true
25
+ validation do
26
+ key(:name).required
27
+ end
22
28
  end
23
29
  # TODO: make band a required object.
24
30
 
25
- validate :music_taste_ok?
31
+ validation do
32
+ key(:name).required(:music_taste_ok?)
33
+
34
+ configure do
35
+ config.messages_file = "test/validation/errors.yml"
26
36
 
27
- private
28
- def music_taste_ok?
29
- errors.add(:base, "You are a bad person") if name == 'Nickelback'
37
+ def music_taste_ok?(value)
38
+ value != "Nickelback"
39
+ # errors.add(:base, "You are a bad person") if name == "Nickelback"
40
+ end
41
+ end
30
42
  end
43
+ # validate :music_taste_ok?
44
+
45
+ # private
46
+ # def music_taste_ok?
47
+ # errors.add(:base, "You are a bad person") if name == "Nickelback"
48
+ # end
31
49
  end
32
50
 
33
- validates :title, :presence => true
51
+ validation do
52
+ key(:title).required
53
+ end
34
54
  end
35
55
 
36
56
  let (:album) do
@@ -55,28 +75,28 @@ class ErrorsTest < MiniTest::Spec
55
75
 
56
76
  it do
57
77
  form.errors.messages.must_equal({
58
- :title => ["can't be blank"],
59
- :"hit.title"=>["can't be blank"],
60
- :"songs.title"=>["can't be blank"],
61
- :"band.label.name"=>["can't be blank"]
78
+ :title => ["must be filled"],
79
+ :"hit.title"=>["must be filled"],
80
+ :"songs.title"=>["must be filled"],
81
+ :"band.label.name"=>["is missing"]
62
82
  })
63
83
  end
64
84
 
65
85
  it do
66
- #form.errors.must_equal({:title => ["can't be blank"]})
86
+ #form.errors.must_equal({:title => ["must be filled"]})
67
87
  # TODO: this should only contain local errors?
68
88
  end
69
89
 
70
90
  # nested forms keep their own Errors:
71
- it { form.hit.errors.messages.must_equal({:title=>["can't be blank"]}) }
72
- it { form.songs[0].errors.messages.must_equal({:title=>["can't be blank"]}) }
91
+ it { form.hit.errors.messages.must_equal({:title=>["must be filled"]}) }
92
+ it { form.songs[0].errors.messages.must_equal({:title=>["must be filled"]}) }
73
93
 
74
94
  it do
75
95
  form.errors.messages.must_equal({
76
- :title => ["can't be blank"],
77
- :"hit.title" => ["can't be blank"],
78
- :"songs.title"=> ["can't be blank"],
79
- :"band.label.name"=>["can't be blank"]
96
+ :title => ["must be filled"],
97
+ :"hit.title" => ["must be filled"],
98
+ :"songs.title"=> ["must be filled"],
99
+ :"band.label.name"=>["is missing"]
80
100
  })
81
101
  end
82
102
  end
@@ -85,7 +105,7 @@ class ErrorsTest < MiniTest::Spec
85
105
  describe "#validate with main form invalid" do
86
106
  it do
87
107
  form.validate("title"=>"", "band"=>{"label"=>{:name => "Fat Wreck"}}).must_equal false
88
- form.errors.messages.must_equal({:title=>["can't be blank"]})
108
+ form.errors.messages.must_equal({:title=>["must be filled"]})
89
109
  end
90
110
  end
91
111
 
@@ -94,7 +114,7 @@ class ErrorsTest < MiniTest::Spec
94
114
  before { @result = form.validate("hit"=>{"title" => ""}, "band"=>{"label"=>{:name => "Fat Wreck"}}) }
95
115
 
96
116
  it { @result.must_equal false }
97
- it { form.errors.messages.must_equal({:"hit.title"=>["can't be blank"]}) }
117
+ it { form.errors.messages.must_equal({:"hit.title"=>["must be filled"]}) }
98
118
  end
99
119
 
100
120
 
@@ -102,7 +122,7 @@ class ErrorsTest < MiniTest::Spec
102
122
  before { @result = form.validate("songs"=>[{"title" => ""}], "band"=>{"label"=>{:name => "Fat Wreck"}}) }
103
123
 
104
124
  it { @result.must_equal false }
105
- it { form.errors.messages.must_equal({:"songs.title"=>["can't be blank"]}) }
125
+ it { form.errors.messages.must_equal({:"songs.title"=>["must be filled"]}) }
106
126
  end
107
127
 
108
128
 
@@ -110,14 +130,14 @@ class ErrorsTest < MiniTest::Spec
110
130
  before { @result = form.validate("songs"=>[{"title" => ""}], "band" => {"label" => {}}) }
111
131
 
112
132
  it { @result.must_equal false }
113
- it { form.errors.messages.must_equal({:"songs.title"=>["can't be blank"], :"band.label.name"=>["can't be blank"]}) }
133
+ it { form.errors.messages.must_equal({:"songs.title"=>["must be filled"], :"band.label.name"=>["is missing"]}) }
114
134
  end
115
135
 
116
136
  describe "#validate with nested form using :base invalid" do
117
- it "xxx" do
137
+ it do
118
138
  result = form.validate("songs"=>[{"title" => "Someday"}], "band" => {"name" => "Nickelback", "label" => {"name" => "Roadrunner Records"}})
119
139
  result.must_equal false
120
- form.errors.messages.must_equal({:base=>["You are a bad person"]})
140
+ form.errors.messages.must_equal({:"band.name"=>["You are a bad person"]})
121
141
  end
122
142
  end
123
143
 
@@ -140,6 +160,6 @@ class ErrorsTest < MiniTest::Spec
140
160
  before { form.validate("songs"=>[{"title" => ""}], "band" => {"label" => {}}) }
141
161
 
142
162
  # to_s is aliased to messages
143
- it { form.errors.to_s.must_equal "{:\"songs.title\"=>[\"can't be blank\"], :\"band.label.name\"=>[\"can't be blank\"]}" }
163
+ it { form.errors.to_s.must_equal "{:\"songs.title\"=>[\"must be filled\"], :\"band.label.name\"=>[\"is missing\"]}" }
144
164
  end
145
- end
165
+ end