reform 2.1.0 → 2.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/.travis.yml +4 -12
- data/CHANGES.md +8 -0
- data/README.md +36 -743
- data/Rakefile +1 -31
- data/gemfiles/{Gemfile.rails-3.1 → Gemfile.disposable-0.3} +1 -2
- data/lib/reform.rb +0 -9
- data/lib/reform/contract.rb +5 -1
- data/lib/reform/form.rb +1 -4
- data/lib/reform/form/composition.rb +1 -2
- data/lib/reform/form/dry.rb +29 -16
- data/lib/reform/form/module.rb +15 -3
- data/lib/reform/form/validate.rb +1 -1
- data/lib/reform/validation.rb +3 -3
- data/lib/reform/version.rb +1 -1
- data/reform.gemspec +3 -10
- data/test/coercion_test.rb +7 -7
- data/test/composition_test.rb +5 -1
- data/test/contract_test.rb +10 -4
- data/test/deserialize_test.rb +3 -3
- data/test/errors_test.rb +48 -28
- data/test/form_option_test.rb +3 -1
- data/test/form_test.rb +19 -14
- data/test/module_test.rb +51 -11
- data/test/populate_test.rb +21 -7
- data/test/reform_test.rb +24 -20
- data/test/save_test.rb +10 -4
- data/test/skip_if_test.rb +5 -3
- data/test/test_helper.rb +3 -43
- data/test/validate_test.rb +34 -14
- data/test/validation/dry_test.rb +60 -0
- data/test/validation/dry_validation_test.rb +65 -43
- data/test/validation/errors.yml +4 -0
- metadata +16 -192
- data/database.sqlite3 +0 -0
- data/gemfiles/Gemfile.rails-3.2 +0 -7
- data/gemfiles/Gemfile.rails-4.0 +0 -8
- data/gemfiles/Gemfile.rails-4.1 +0 -8
- data/gemfiles/Gemfile.rails-4.2 +0 -8
- data/lib/reform/active_record.rb +0 -4
- data/lib/reform/form/active_model.rb +0 -87
- data/lib/reform/form/active_model/form_builder_methods.rb +0 -48
- data/lib/reform/form/active_model/model_reflections.rb +0 -46
- data/lib/reform/form/active_model/model_validations.rb +0 -110
- data/lib/reform/form/active_model/validations.rb +0 -107
- data/lib/reform/form/active_record.rb +0 -30
- data/lib/reform/form/lotus.rb +0 -59
- data/lib/reform/form/multi_parameter_attributes.rb +0 -48
- data/lib/reform/form/validation/unique_validator.rb +0 -54
- data/lib/reform/rails.rb +0 -13
- data/test/active_model_custom_validation_translations_test.rb +0 -75
- data/test/active_model_test.rb +0 -207
- data/test/active_model_validation_for_property_named_format_test.rb +0 -18
- data/test/active_record_test.rb +0 -273
- data/test/builder_test.rb +0 -32
- data/test/custom_validation_test.rb +0 -47
- data/test/dummy/Rakefile +0 -7
- data/test/dummy/app/controllers/albums_controller.rb +0 -18
- data/test/dummy/app/controllers/application_controller.rb +0 -4
- data/test/dummy/app/controllers/musician_controller.rb +0 -5
- data/test/dummy/app/forms/album_form.rb +0 -18
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/models/album.rb +0 -4
- data/test/dummy/app/models/song.rb +0 -3
- data/test/dummy/app/views/albums/new.html.erb +0 -28
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -20
- data/test/dummy/config/boot.rb +0 -10
- data/test/dummy/config/database.yml +0 -22
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -16
- data/test/dummy/config/environments/production.rb +0 -46
- data/test/dummy/config/environments/test.rb +0 -33
- data/test/dummy/config/locales/en.yml +0 -14
- data/test/dummy/config/routes.rb +0 -4
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/form_builder_test.rb +0 -138
- data/test/lotus/Gemfile +0 -5
- data/test/lotus/lotus_test.rb +0 -31
- data/test/lotus_test.rb +0 -150
- data/test/model_reflections_test.rb +0 -138
- data/test/model_validations_test.rb +0 -82
- data/test/mongoid_test.rb +0 -313
- data/test/multi_parameter_attributes_test.rb +0 -50
- data/test/rails/integration_test.rb +0 -54
- data/test/unique_test.rb +0 -135
- 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
|
data/lib/reform.rb
CHANGED
@@ -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
|
data/lib/reform/contract.rb
CHANGED
@@ -29,7 +29,7 @@ module Reform
|
|
29
29
|
|
30
30
|
# FIXME: test me.
|
31
31
|
def self.properties(*args)
|
32
|
-
options = args.
|
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
|
data/lib/reform/form.rb
CHANGED
@@ -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
|
data/lib/reform/form/dry.rb
CHANGED
@@ -3,8 +3,12 @@ require "dry/validation/schema/form"
|
|
3
3
|
require "reform/validation"
|
4
4
|
|
5
5
|
module Reform::Form::Dry
|
6
|
-
|
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
|
-
@
|
28
|
+
@schemas = []
|
25
29
|
end
|
26
30
|
|
27
31
|
def instance_exec(&block)
|
28
|
-
@
|
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
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
class Builder < Array
|
46
|
+
def initialize(array)
|
47
|
+
super(array)
|
48
|
+
@validator = Dry::Validation.Form({}, &shift)
|
49
|
+
end
|
48
50
|
|
49
|
-
|
50
|
-
|
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
|
data/lib/reform/form/module.rb
CHANGED
@@ -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
|
-
|
7
|
-
|
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
|
data/lib/reform/form/validate.rb
CHANGED
@@ -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].
|
12
|
+
properties.each { |name| (!params[name].nil? && params[name] != "") and return false }
|
13
13
|
true # skip
|
14
14
|
end
|
15
15
|
end
|
data/lib/reform/validation.rb
CHANGED
@@ -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).(
|
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"
|
data/lib/reform/version.rb
CHANGED
data/reform.gemspec
CHANGED
@@ -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.
|
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 "
|
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
|
data/test/coercion_test.rb
CHANGED
@@ -2,8 +2,8 @@ require "test_helper"
|
|
2
2
|
require "reform/form/coercion"
|
3
3
|
|
4
4
|
class CoercionTest < BaseTest
|
5
|
-
class Irreversible
|
6
|
-
def
|
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, :
|
14
|
+
property :released_at, type: Types::Form::DateTime
|
15
15
|
|
16
16
|
property :hit do
|
17
|
-
property :length, :
|
18
|
-
property :good, :
|
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, :
|
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
|
data/test/composition_test.rb
CHANGED
@@ -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
|
-
|
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
|
data/test/contract_test.rb
CHANGED
@@ -11,15 +11,21 @@ class ContractTest < MiniTest::Spec
|
|
11
11
|
|
12
12
|
class AlbumForm < Reform::Contract
|
13
13
|
property :name
|
14
|
-
|
14
|
+
validation do
|
15
|
+
key(:name).required
|
16
|
+
end
|
15
17
|
|
16
18
|
collection :songs do
|
17
19
|
property :title
|
18
|
-
|
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
|
data/test/deserialize_test.rb
CHANGED
@@ -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"}}
|
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"}}
|
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
|
data/test/errors_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
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
|
-
|
9
|
+
validation do
|
10
|
+
key(:title).required
|
11
|
+
end
|
10
12
|
end
|
11
13
|
|
12
14
|
collection :songs do
|
13
15
|
property :title
|
14
|
-
|
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
|
-
|
25
|
+
validation do
|
26
|
+
key(:name).required
|
27
|
+
end
|
22
28
|
end
|
23
29
|
# TODO: make band a required object.
|
24
30
|
|
25
|
-
|
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
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
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 => ["
|
59
|
-
:"hit.title"=>["
|
60
|
-
:"songs.title"=>["
|
61
|
-
:"band.label.name"=>["
|
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 => ["
|
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=>["
|
72
|
-
it { form.songs[0].errors.messages.must_equal({:title=>["
|
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 => ["
|
77
|
-
:"hit.title" => ["
|
78
|
-
:"songs.title"=> ["
|
79
|
-
:"band.label.name"=>["
|
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=>["
|
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"=>["
|
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"=>["
|
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"=>["
|
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
|
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({:
|
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\"=>[\"
|
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
|