dry-validation 0.13.3 → 1.7.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +506 -95
- data/LICENSE +1 -1
- data/README.md +16 -12
- data/config/errors.yml +3 -88
- data/dry-validation.gemspec +37 -24
- data/lib/dry/validation/config.rb +24 -0
- data/lib/dry/validation/constants.rb +43 -0
- data/lib/dry/validation/contract/class_interface.rb +230 -0
- data/lib/dry/validation/contract.rb +171 -0
- data/lib/dry/validation/evaluator.rb +224 -0
- data/lib/dry/validation/extensions/hints.rb +67 -0
- data/lib/dry/validation/extensions/monads.rb +24 -8
- data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
- data/lib/dry/validation/failures.rb +70 -0
- data/lib/dry/validation/function.rb +44 -0
- data/lib/dry/validation/macro.rb +38 -0
- data/lib/dry/validation/macros.rb +104 -0
- data/lib/dry/validation/message.rb +80 -80
- data/lib/dry/validation/message_set.rb +80 -105
- data/lib/dry/validation/messages/resolver.rb +131 -0
- data/lib/dry/validation/result.rb +183 -41
- data/lib/dry/validation/rule.rb +135 -0
- data/lib/dry/validation/schema_ext.rb +19 -0
- data/lib/dry/validation/values.rb +104 -0
- data/lib/dry/validation/version.rb +3 -1
- data/lib/dry/validation.rb +45 -28
- data/lib/dry-validation.rb +3 -1
- metadata +46 -344
- data/.codeclimate.yml +0 -17
- data/.gitignore +0 -9
- data/.rspec +0 -3
- data/.travis.yml +0 -29
- data/CONTRIBUTING.md +0 -31
- data/Gemfile +0 -25
- data/Rakefile +0 -22
- data/benchmarks/benchmark_form_invalid.rb +0 -64
- data/benchmarks/benchmark_form_valid.rb +0 -64
- data/benchmarks/benchmark_schema_invalid_huge.rb +0 -52
- data/benchmarks/profile_schema_call_invalid.rb +0 -20
- data/benchmarks/profile_schema_call_valid.rb +0 -20
- data/benchmarks/profile_schema_definition.rb +0 -14
- data/benchmarks/profile_schema_huge_invalid.rb +0 -30
- data/benchmarks/profile_schema_messages_invalid.rb +0 -20
- data/benchmarks/suite.rb +0 -5
- data/examples/basic.rb +0 -15
- data/examples/each.rb +0 -14
- data/examples/json.rb +0 -12
- data/examples/multiple.rb +0 -27
- data/examples/nested.rb +0 -22
- data/examples/params.rb +0 -11
- data/lib/dry/validation/compat/form.rb +0 -67
- data/lib/dry/validation/deprecations.rb +0 -24
- data/lib/dry/validation/executor.rb +0 -91
- data/lib/dry/validation/extensions/struct.rb +0 -32
- data/lib/dry/validation/extensions.rb +0 -7
- data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
- data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
- data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
- data/lib/dry/validation/input_processor_compiler.rb +0 -137
- data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
- data/lib/dry/validation/message_compiler.rb +0 -188
- data/lib/dry/validation/messages/abstract.rb +0 -119
- data/lib/dry/validation/messages/i18n.rb +0 -47
- data/lib/dry/validation/messages/namespaced.rb +0 -39
- data/lib/dry/validation/messages/yaml.rb +0 -61
- data/lib/dry/validation/messages.rb +0 -14
- data/lib/dry/validation/predicate_registry.rb +0 -115
- data/lib/dry/validation/predicates.rb +0 -19
- data/lib/dry/validation/schema/check.rb +0 -37
- data/lib/dry/validation/schema/class_interface.rb +0 -190
- data/lib/dry/validation/schema/deprecated.rb +0 -30
- data/lib/dry/validation/schema/dsl.rb +0 -118
- data/lib/dry/validation/schema/form.rb +0 -9
- data/lib/dry/validation/schema/json.rb +0 -21
- data/lib/dry/validation/schema/key.rb +0 -71
- data/lib/dry/validation/schema/params.rb +0 -22
- data/lib/dry/validation/schema/rule.rb +0 -202
- data/lib/dry/validation/schema/value.rb +0 -211
- data/lib/dry/validation/schema.rb +0 -126
- data/lib/dry/validation/schema_compiler.rb +0 -81
- data/lib/dry/validation/template.rb +0 -66
- data/lib/dry/validation/type_specs.rb +0 -70
- data/log/.gitkeep +0 -0
- data/spec/extensions/monads/result_spec.rb +0 -40
- data/spec/extensions/struct/schema_spec.rb +0 -32
- data/spec/fixtures/locales/en.yml +0 -8
- data/spec/fixtures/locales/pl.yml +0 -22
- data/spec/integration/custom_error_messages_spec.rb +0 -54
- data/spec/integration/custom_predicates_spec.rb +0 -228
- data/spec/integration/hints_spec.rb +0 -170
- data/spec/integration/injecting_rules_spec.rb +0 -30
- data/spec/integration/json/defining_base_schema_spec.rb +0 -41
- data/spec/integration/localized_error_messages_spec.rb +0 -72
- data/spec/integration/message_compiler_spec.rb +0 -405
- data/spec/integration/messages/i18n_spec.rb +0 -104
- data/spec/integration/optional_keys_spec.rb +0 -28
- data/spec/integration/params/predicates/array_spec.rb +0 -287
- data/spec/integration/params/predicates/empty_spec.rb +0 -263
- data/spec/integration/params/predicates/eql_spec.rb +0 -327
- data/spec/integration/params/predicates/even_spec.rb +0 -455
- data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
- data/spec/integration/params/predicates/excludes_spec.rb +0 -391
- data/spec/integration/params/predicates/false_spec.rb +0 -455
- data/spec/integration/params/predicates/filled_spec.rb +0 -467
- data/spec/integration/params/predicates/format_spec.rb +0 -454
- data/spec/integration/params/predicates/gt_spec.rb +0 -519
- data/spec/integration/params/predicates/gteq_spec.rb +0 -519
- data/spec/integration/params/predicates/included_in_spec.rb +0 -455
- data/spec/integration/params/predicates/includes_spec.rb +0 -391
- data/spec/integration/params/predicates/key_spec.rb +0 -67
- data/spec/integration/params/predicates/lt_spec.rb +0 -519
- data/spec/integration/params/predicates/lteq_spec.rb +0 -519
- data/spec/integration/params/predicates/max_size_spec.rb +0 -391
- data/spec/integration/params/predicates/min_size_spec.rb +0 -391
- data/spec/integration/params/predicates/none_spec.rb +0 -265
- data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
- data/spec/integration/params/predicates/odd_spec.rb +0 -455
- data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
- data/spec/integration/params/predicates/size/range_spec.rb +0 -396
- data/spec/integration/params/predicates/true_spec.rb +0 -455
- data/spec/integration/params/predicates/type_spec.rb +0 -391
- data/spec/integration/result_spec.rb +0 -81
- data/spec/integration/schema/array_schema_spec.rb +0 -59
- data/spec/integration/schema/check_rules_spec.rb +0 -119
- data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
- data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
- data/spec/integration/schema/default_settings_spec.rb +0 -11
- data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
- data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
- data/spec/integration/schema/each_with_set_spec.rb +0 -70
- data/spec/integration/schema/extending_dsl_spec.rb +0 -27
- data/spec/integration/schema/form_spec.rb +0 -236
- data/spec/integration/schema/hash_schema_spec.rb +0 -47
- data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
- data/spec/integration/schema/input_processor_spec.rb +0 -46
- data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
- data/spec/integration/schema/json_spec.rb +0 -163
- data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
- data/spec/integration/schema/macros/each_spec.rb +0 -268
- data/spec/integration/schema/macros/filled_spec.rb +0 -87
- data/spec/integration/schema/macros/input_spec.rb +0 -139
- data/spec/integration/schema/macros/maybe_spec.rb +0 -99
- data/spec/integration/schema/macros/rule_spec.rb +0 -75
- data/spec/integration/schema/macros/value_spec.rb +0 -119
- data/spec/integration/schema/macros/when_spec.rb +0 -62
- data/spec/integration/schema/nested_schemas_spec.rb +0 -236
- data/spec/integration/schema/nested_values_spec.rb +0 -46
- data/spec/integration/schema/not_spec.rb +0 -34
- data/spec/integration/schema/numbers_spec.rb +0 -19
- data/spec/integration/schema/option_with_default_spec.rb +0 -64
- data/spec/integration/schema/or_spec.rb +0 -87
- data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
- data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
- data/spec/integration/schema/params_spec.rb +0 -234
- data/spec/integration/schema/predicate_verification_spec.rb +0 -9
- data/spec/integration/schema/predicates/array_spec.rb +0 -295
- data/spec/integration/schema/predicates/custom_spec.rb +0 -103
- data/spec/integration/schema/predicates/empty_spec.rb +0 -263
- data/spec/integration/schema/predicates/eql_spec.rb +0 -327
- data/spec/integration/schema/predicates/even_spec.rb +0 -455
- data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
- data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
- data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
- data/spec/integration/schema/predicates/filled_spec.rb +0 -467
- data/spec/integration/schema/predicates/format_spec.rb +0 -455
- data/spec/integration/schema/predicates/gt_spec.rb +0 -519
- data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
- data/spec/integration/schema/predicates/hash_spec.rb +0 -69
- data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
- data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
- data/spec/integration/schema/predicates/includes_spec.rb +0 -391
- data/spec/integration/schema/predicates/key_spec.rb +0 -88
- data/spec/integration/schema/predicates/lt_spec.rb +0 -520
- data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
- data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
- data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
- data/spec/integration/schema/predicates/none_spec.rb +0 -265
- data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
- data/spec/integration/schema/predicates/odd_spec.rb +0 -455
- data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
- data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
- data/spec/integration/schema/predicates/type_spec.rb +0 -413
- data/spec/integration/schema/reusing_schema_spec.rb +0 -33
- data/spec/integration/schema/using_types_spec.rb +0 -135
- data/spec/integration/schema/validate_spec.rb +0 -120
- data/spec/integration/schema/xor_spec.rb +0 -35
- data/spec/integration/schema_builders_spec.rb +0 -17
- data/spec/integration/schema_spec.rb +0 -173
- data/spec/shared/message_compiler.rb +0 -11
- data/spec/shared/predicate_helper.rb +0 -15
- data/spec/shared/rule_compiler.rb +0 -8
- data/spec/spec_helper.rb +0 -62
- data/spec/support/define_struct.rb +0 -25
- data/spec/support/matchers.rb +0 -38
- data/spec/support/mutant.rb +0 -9
- data/spec/support/predicates_integration.rb +0 -7
- data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
- data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
- data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
- data/spec/unit/message_compiler/visit_spec.rb +0 -16
- data/spec/unit/message_compiler_spec.rb +0 -7
- data/spec/unit/predicate_registry_spec.rb +0 -34
- data/spec/unit/schema/key_spec.rb +0 -38
- data/spec/unit/schema/rule_spec.rb +0 -42
- data/spec/unit/schema/value_spec.rb +0 -131
- data/spec/unit/schema_spec.rb +0 -35
@@ -1,139 +0,0 @@
|
|
1
|
-
RSpec.describe 'Macros #input' do
|
2
|
-
context 'with a flat schema' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Schema do
|
5
|
-
input :hash?
|
6
|
-
|
7
|
-
required(:foo).filled
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'passes when input is valid' do
|
12
|
-
expect(schema.(foo: "bar")).to be_successful
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'prepends a rule for the input' do
|
16
|
-
expect(schema.(nil).messages).to eql(["must be a hash"])
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'applies other rules when input has expected type' do
|
20
|
-
expect(schema.(foo: '').messages).to eql(foo: ["must be filled"])
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
context 'with a nested schema' do
|
25
|
-
subject(:schema) do
|
26
|
-
Dry::Validation.Schema do
|
27
|
-
input(:hash?)
|
28
|
-
|
29
|
-
required(:foo).schema do
|
30
|
-
required(:bar).schema do
|
31
|
-
required(:baz).filled
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'passes when input is valid' do
|
38
|
-
expect(schema.(foo: { bar: { baz: "present" }})).to be_successful
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'fails when input has invalid type' do
|
42
|
-
expect(schema.(nil).messages).to eql(["must be a hash"])
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'fails when 1-level key is missing' do
|
46
|
-
expect(schema.(foo: {}).messages).to eql(foo: { bar: ["is missing"] })
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'fails when 2-level key has invalid value' do
|
50
|
-
expect(schema.(foo: { bar: { baz: '' }}).messages).to eql(
|
51
|
-
foo: { bar: { baz: ['must be filled'] } }
|
52
|
-
)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context 'when 2 nested schemas are under the same key' do
|
57
|
-
subject(:schema) do
|
58
|
-
Dry::Validation.Schema do
|
59
|
-
input :hash?
|
60
|
-
|
61
|
-
required(:meta).schema do
|
62
|
-
required(:meta).schema do
|
63
|
-
required(:data).filled
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'passes when input is valid' do
|
70
|
-
expect(schema.(meta: { meta: { data: 'sutin' } })).to be_success
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'fails when root key is missing' do
|
74
|
-
expect(schema.({}).messages).to eql(meta: ['is missing'])
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'fails when 1-level key is missing' do
|
78
|
-
expect(schema.(meta: {}).messages).to eql(meta: { meta: ['is missing'] })
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'fails when 1-level key value is invalid' do
|
82
|
-
expect(schema.(meta: { meta: '' }).messages).to eql(
|
83
|
-
meta: { meta: ['must be a hash'] }
|
84
|
-
)
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'fails when 2-level key value is invalid' do
|
88
|
-
expect(schema.(meta: { meta: { data: '' } }).messages).to eql(
|
89
|
-
meta: { meta: { data: ['must be filled'] } }
|
90
|
-
)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
context 'using more than one predicate' do
|
95
|
-
subject(:schema) do
|
96
|
-
Dry::Validation.Schema do
|
97
|
-
input :hash?, size?: 2
|
98
|
-
|
99
|
-
required(:foo).filled
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'passes when input is valid' do
|
104
|
-
expect(schema.(foo: "bar", bar: "baz")).to be_successful
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'fails when one of the root-rules fails' do
|
108
|
-
expect(schema.(foo: "bar", bar: "baz", oops: "heh").messages).to eql(
|
109
|
-
['size must be 2']
|
110
|
-
)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
context 'using a custom predicate' do
|
115
|
-
subject(:schema) do
|
116
|
-
Dry::Validation.Schema do
|
117
|
-
configure do
|
118
|
-
def valid_keys?(input)
|
119
|
-
input.size == 2 || input.size == 1
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
input :hash?, :valid_keys?
|
124
|
-
|
125
|
-
required(:foo).filled
|
126
|
-
optional(:bar).filled
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'passes when input is valid' do
|
131
|
-
expect(schema.(foo: 'bar')).to be_successful
|
132
|
-
expect(schema.(foo: 'bar', bar: 'baz')).to be_successful
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'fails when one of the root-rules fails' do
|
136
|
-
expect(schema.(foo: 'bar', bar: 'baz', oops: 'heh')).to be_failure
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
@@ -1,99 +0,0 @@
|
|
1
|
-
RSpec.describe 'Macros #maybe' do
|
2
|
-
describe 'with no args' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Schema do
|
5
|
-
required(:email).maybe
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'generates none? | filled? rule' do
|
10
|
-
expect(schema.(email: nil).messages).to be_empty
|
11
|
-
expect(schema.(email: 'jane@doe').messages).to be_empty
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'with a predicate with args' do
|
16
|
-
subject(:schema) do
|
17
|
-
Dry::Validation.Schema do
|
18
|
-
required(:name).maybe(min_size?: 3)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'generates none? | (filled? & min_size?) rule' do
|
23
|
-
expect(schema.(name: nil).messages).to be_empty
|
24
|
-
|
25
|
-
expect(schema.(name: 'jane').messages).to be_empty
|
26
|
-
|
27
|
-
expect(schema.(name: 'xy').messages).to eql(
|
28
|
-
name: ['size cannot be less than 3']
|
29
|
-
)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe 'with a block' do
|
34
|
-
subject(:schema) do
|
35
|
-
Dry::Validation.Schema do
|
36
|
-
required(:name).maybe { str? & min_size?(3) }
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'generates none? | (str? & min_size?) rule' do
|
41
|
-
expect(schema.(name: nil).messages).to be_empty
|
42
|
-
|
43
|
-
expect(schema.(name: 'jane').messages).to be_empty
|
44
|
-
|
45
|
-
expect(schema.(name: 'xy').messages).to eql(
|
46
|
-
name: ['size cannot be less than 3']
|
47
|
-
)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe 'with an optional key and a block with schema' do
|
52
|
-
subject(:schema) do
|
53
|
-
Dry::Validation.Schema do
|
54
|
-
optional(:employee).maybe do
|
55
|
-
schema do
|
56
|
-
required(:id).filled(:str?)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'passes when input is valid' do
|
63
|
-
expect(schema.(employee: { id: '1' })).to be_success
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'passes when key is missing' do
|
67
|
-
expect(schema.({})).to be_success
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'passes when value is nil' do
|
71
|
-
expect(schema.(employee: nil)).to be_success
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'fails when value for nested schema is invalid' do
|
75
|
-
expect(schema.(employee: { id: 1 }).messages).to eql(
|
76
|
-
employee: { id: ['must be a string'] }
|
77
|
-
)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe 'with a predicate and a block' do
|
82
|
-
subject(:schema) do
|
83
|
-
Dry::Validation.Schema do
|
84
|
-
required(:name).maybe(:str?) { min_size?(3) }
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'generates none? | (str? & min_size?) rule' do
|
89
|
-
expect(schema.(name: nil).messages).to be_empty
|
90
|
-
|
91
|
-
expect(schema.(name: 'jane').messages).to be_empty
|
92
|
-
|
93
|
-
expect(schema.(name: 'xy').messages).to eql(
|
94
|
-
name: ['size cannot be less than 3']
|
95
|
-
)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
@@ -1,75 +0,0 @@
|
|
1
|
-
RSpec.describe 'Macros / rule' do
|
2
|
-
shared_context 'password confirmation high-level rule' do
|
3
|
-
subject(:schema) { schema_class.new }
|
4
|
-
|
5
|
-
let(:schema_class) do
|
6
|
-
Dry::Validation.Schema(build: false) do
|
7
|
-
required(:user).schema do
|
8
|
-
required(:password).filled
|
9
|
-
required(:password_confirmation).filled
|
10
|
-
|
11
|
-
rule(password_confirmation: %i[password_confirmation password]) do |pc, p|
|
12
|
-
pc.eql?(p)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'passes when input is valid' do
|
19
|
-
expect(schema.(user: { password: 'foo', password_confirmation: 'foo' })).to be_successful
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'fails when the rule failed' do
|
23
|
-
expect(schema.(user: { password: 'foo', password_confirmation: 'bar' }).messages).to eql(
|
24
|
-
user: { password_confirmation: [error_message] }
|
25
|
-
)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'with the default message' do
|
30
|
-
let(:error_message) { 'must be equal to foo' }
|
31
|
-
|
32
|
-
include_context 'password confirmation high-level rule'
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'with a custom message' do
|
36
|
-
let(:error_message) { 'does not match' }
|
37
|
-
|
38
|
-
before do
|
39
|
-
schema_class.class_eval do
|
40
|
-
def self.messages
|
41
|
-
default_messages.merge(en: { errors: { password_confirmation: 'does not match' } })
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
include_context 'password confirmation high-level rule'
|
47
|
-
end
|
48
|
-
|
49
|
-
context 'with two rules relying on the same value' do
|
50
|
-
subject(:schema) do
|
51
|
-
Dry::Validation.Schema do
|
52
|
-
required(:x).filled(:int?)
|
53
|
-
|
54
|
-
rule(a: [:x]) do |x|
|
55
|
-
x.gt?(3)
|
56
|
-
end
|
57
|
-
|
58
|
-
rule(b: [:x]) do |x|
|
59
|
-
x.gt?(5)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'passes when input is valid' do
|
65
|
-
expect(schema.(x: 6)).to be_successful
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'fails when rules failed' do
|
69
|
-
expect(schema.(x: 2).messages).to eql(
|
70
|
-
a: ['must be greater than 3'],
|
71
|
-
b: ['must be greater than 5']
|
72
|
-
)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
@@ -1,119 +0,0 @@
|
|
1
|
-
RSpec.describe 'Macros #value' do
|
2
|
-
describe 'with no args' do
|
3
|
-
it 'raises an exception' do
|
4
|
-
expect { Dry::Validation.Schema { required(:email).value } }.to raise_error(
|
5
|
-
ArgumentError, "wrong number of arguments (given 0, expected at least 1)"
|
6
|
-
)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
describe 'with a type specification' do
|
11
|
-
subject(:schema) do
|
12
|
-
Dry::Validation.Schema do
|
13
|
-
required(:age).value(:int?)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'generates int? rule' do
|
18
|
-
expect(schema.(age: nil).messages).to eql(
|
19
|
-
age: ['must be an integer']
|
20
|
-
)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe 'with a predicate with args' do
|
25
|
-
context 'with a flat arg' do
|
26
|
-
subject(:schema) do
|
27
|
-
Dry::Validation.Schema do
|
28
|
-
required(:age).value(:int?, gt?: 18)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'generates int? & gt? rule' do
|
33
|
-
expect(schema.(age: nil).messages).to eql(
|
34
|
-
age: ['must be an integer', 'must be greater than 18']
|
35
|
-
)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'with a second predicate with args' do
|
40
|
-
subject(:schema) do
|
41
|
-
Dry::Validation.Schema do
|
42
|
-
required(:name).value(:str?, min_size?: 3, max_size?: 6)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'generates str? & min_size? & max_size?' do
|
47
|
-
expect(schema.(name: 'fo').messages).to eql(
|
48
|
-
name: ['size cannot be less than 3', 'size cannot be greater than 6']
|
49
|
-
)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
context 'with a range arg' do
|
54
|
-
subject(:schema) do
|
55
|
-
Dry::Validation.Schema do
|
56
|
-
required(:age).value(:int?, size?: 18..24)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'generates int? & gt? rule' do
|
61
|
-
expect(schema.(age: nil).messages).to eql(
|
62
|
-
age: ['must be an integer', 'size must be within 18 - 24']
|
63
|
-
)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'with a block' do
|
68
|
-
subject(:schema) do
|
69
|
-
Dry::Validation.Schema do
|
70
|
-
required(:age).value { int? & size?(18..24) }
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'generates int? & gt? rule' do
|
75
|
-
expect(schema.(age: nil).messages).to eql(
|
76
|
-
age: ['must be an integer', 'size must be within 18 - 24']
|
77
|
-
)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
context 'with a predicate and a block' do
|
82
|
-
subject(:schema) do
|
83
|
-
Dry::Validation.Schema do
|
84
|
-
required(:age).value(:int?) { size?(18..24) }
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'generates int? & gt? rule' do
|
89
|
-
expect(schema.(age: nil).messages).to eql(
|
90
|
-
age: ['must be an integer', 'size must be within 18 - 24']
|
91
|
-
)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
context 'with a schema' do
|
96
|
-
subject(:schema) do
|
97
|
-
Dry::Validation.Schema do
|
98
|
-
required(:data).value(DataSchema)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
before do
|
103
|
-
DataSchema = Dry::Validation.Schema do
|
104
|
-
required(:foo).filled(size?: 2..10)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
after do
|
109
|
-
Object.send(:remove_const, :DataSchema)
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'uses the schema' do
|
113
|
-
expect(schema.(data: { foo: '' }).messages).to eql(
|
114
|
-
data: { foo: ['must be filled', 'length must be within 2 - 10'] }
|
115
|
-
)
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
RSpec.describe 'Macros #when' do
|
2
|
-
context 'with a result rule returned from the block' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Schema do
|
5
|
-
required(:email).maybe
|
6
|
-
|
7
|
-
required(:login).filled.when(:true?) do
|
8
|
-
value(:email).filled?
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'generates check rule' do
|
14
|
-
expect(schema.(login: true, email: nil).messages).to eql(
|
15
|
-
email: ['must be filled']
|
16
|
-
)
|
17
|
-
|
18
|
-
expect(schema.(login: false, email: nil).messages).to be_empty
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe 'with a result rule depending on another result' do
|
23
|
-
subject(:schema) do
|
24
|
-
Dry::Validation.Schema do
|
25
|
-
required(:left).maybe(:int?)
|
26
|
-
required(:right).maybe(:int?)
|
27
|
-
|
28
|
-
required(:compare).maybe(:bool?).when(:true?) do
|
29
|
-
value(:left).gt?(value(:right))
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'generates check rule' do
|
35
|
-
expect(schema.(compare: false, left: nil, right: nil)).to be_success
|
36
|
-
|
37
|
-
expect(schema.(compare: true, left: 1, right: 2).messages).to eql(
|
38
|
-
left: ['must be greater than 2']
|
39
|
-
)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context 'predicate with options' do
|
44
|
-
subject(:schema) do
|
45
|
-
Dry::Validation.Schema do
|
46
|
-
required(:bar).maybe
|
47
|
-
|
48
|
-
required(:foo).filled.when(size?: 3) do
|
49
|
-
value(:bar).filled?
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'generates check rule' do
|
55
|
-
expect(schema.(foo: [1,2,3], bar: nil).messages).to eql(
|
56
|
-
bar: ['must be filled']
|
57
|
-
)
|
58
|
-
|
59
|
-
expect(schema.(foo: [1,2], bar: nil).messages).to be_empty
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|