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.
- 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
|