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,236 +0,0 @@
|
|
1
|
-
RSpec.describe Schema, 'nested schemas' do
|
2
|
-
context 'with multiple nested schemas' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Schema do
|
5
|
-
required(:content).schema do
|
6
|
-
required(:meta).schema do
|
7
|
-
required(:version).filled
|
8
|
-
end
|
9
|
-
|
10
|
-
required(:data).schema do
|
11
|
-
required(:city).filled
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'passes when input is valid' do
|
18
|
-
input = {content: {meta: {version: "1.0"}, data: {city: "Canberra"}}}
|
19
|
-
expect(schema.(input)).to be_success
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'fails when one sub-key is missing' do
|
23
|
-
input = {content: {data: {city: "Canberra"}}}
|
24
|
-
expect(schema.(input).messages).to eql(content: {meta: ['is missing']})
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'fails when both sub-keys are missing' do
|
28
|
-
input = {content: {}}
|
29
|
-
expect(schema.(input).messages).to eql(content: {meta: ['is missing'], data: ['is missing']})
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'fails when the deeply nested keys are invalid' do
|
33
|
-
input = {content: {meta: {version: ""}, data: {city: ""}}}
|
34
|
-
expect(schema.(input).messages).to eql(content: {meta: {version: ["must be filled"]}, data: {city: ["must be filled"]}})
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context 'with a 2-level deep schema' do
|
39
|
-
subject(:schema) do
|
40
|
-
Dry::Validation.Schema do
|
41
|
-
required(:meta).schema do
|
42
|
-
required(:info).schema do
|
43
|
-
required(:details).filled
|
44
|
-
required(:meta).filled
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'passes when input is valid' do
|
51
|
-
expect(schema.(meta: { info: { details: 'Krakow', meta: 'foo' }})).to be_success
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'fails when root key is missing' do
|
55
|
-
expect(schema.({}).messages).to eql(meta: ['is missing'])
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'fails when 1-level key is missing' do
|
59
|
-
expect(schema.(meta: {}).messages).to eql(
|
60
|
-
meta: { info: ['is missing'] }
|
61
|
-
)
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'fails when 2-level key is missing' do
|
65
|
-
expect(schema.(meta: { info: {} }).messages).to eql(
|
66
|
-
meta: { info: { details: ['is missing'], meta: ['is missing'] } }
|
67
|
-
)
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'fails when 1-level key has invalid value' do
|
71
|
-
expect(schema.(meta: { info: nil, meta: 'foo' }).messages).to eql(
|
72
|
-
meta: { info: ['must be a hash'] }
|
73
|
-
)
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'fails when 2-level key has invalid value' do
|
77
|
-
expect(schema.(meta: { info: { details: nil, meta: 'foo' } }).messages).to eql(
|
78
|
-
meta: { info: { details: ['must be filled'] } }
|
79
|
-
)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
context 'when duplicated key names are used in 2 subsequent levels' do
|
84
|
-
subject(:schema) do
|
85
|
-
Dry::Validation.Schema do
|
86
|
-
required(:meta).schema do
|
87
|
-
required(:meta).filled
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'passes when input is valid' do
|
93
|
-
expect(schema.(meta: { meta: 'data' })).to be_success
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'fails when root key is missing' do
|
97
|
-
expect(schema.({}).messages).to eql(meta: ['is missing'])
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'fails when 1-level key is missing' do
|
101
|
-
expect(schema.(meta: {}).messages).to eql(meta: { meta: ['is missing'] })
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'fails when 1-level key value is invalid' do
|
105
|
-
expect(schema.(meta: { meta: '' }).messages).to eql(
|
106
|
-
meta: { meta: ['must be filled'] }
|
107
|
-
)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context 'when duplicated key names are used in 2 subsequent levels as schemas' do
|
112
|
-
subject(:schema) do
|
113
|
-
Dry::Validation.Schema do
|
114
|
-
required(:meta).schema do
|
115
|
-
required(:meta).schema do
|
116
|
-
required(:data).filled
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'passes when input is valid' do
|
123
|
-
expect(schema.(meta: { meta: { data: 'this is fine' } })).to be_success
|
124
|
-
end
|
125
|
-
|
126
|
-
it 'fails when root key is missing' do
|
127
|
-
expect(schema.({}).messages).to eql(meta: ['is missing'])
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'fails when 1-level key is missing' do
|
131
|
-
expect(schema.(meta: {}).messages).to eql(meta: { meta: ['is missing'] })
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'fails when 1-level key value is invalid' do
|
135
|
-
expect(schema.(meta: { meta: '' }).messages).to eql(
|
136
|
-
meta: { meta: ['must be a hash'] }
|
137
|
-
)
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'fails when 2-level key is missing' do
|
141
|
-
expect(schema.(meta: { meta: {} }).messages).to eql(
|
142
|
-
meta: { meta: { data: ['is missing'] } }
|
143
|
-
)
|
144
|
-
end
|
145
|
-
|
146
|
-
it 'fails when 2-level key value is invalid' do
|
147
|
-
expect(schema.(meta: { meta: { data: '' } }).messages).to eql(
|
148
|
-
meta: { meta: { data: ['must be filled'] } }
|
149
|
-
)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
context 'with `each` + schema inside another schema' do
|
154
|
-
subject(:schema) do
|
155
|
-
Dry::Validation.Schema do
|
156
|
-
required(:meta).schema do
|
157
|
-
required(:data).each do
|
158
|
-
schema do
|
159
|
-
required(:info).schema do
|
160
|
-
required(:name).filled
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
it 'passes when data is valid' do
|
169
|
-
expect(schema.(meta: { data: [{ info: { name: 'oh hai' } }] })).to be_success
|
170
|
-
end
|
171
|
-
|
172
|
-
it 'fails when root key is missing' do
|
173
|
-
expect(schema.({}).messages).to eql(meta: ['is missing'])
|
174
|
-
end
|
175
|
-
|
176
|
-
it 'fails when root key value is invalid' do
|
177
|
-
expect(schema.(meta: '').messages).to eql(meta: ['must be a hash'])
|
178
|
-
end
|
179
|
-
|
180
|
-
it 'fails when 1-level key is missing' do
|
181
|
-
expect(schema.(meta: {}).messages).to eql(meta: { data: ['is missing'] })
|
182
|
-
end
|
183
|
-
|
184
|
-
it 'fails when 1-level key has invalid value' do
|
185
|
-
expect(schema.(meta: { data: '' }).messages).to eql(meta: { data: ['must be an array'] })
|
186
|
-
end
|
187
|
-
|
188
|
-
it 'fails when 1-level key has value with a missing key' do
|
189
|
-
expect(schema.(meta: { data: [{}] }).messages).to eql(
|
190
|
-
meta: { data: { 0 => { info: ['is missing'] } } }
|
191
|
-
)
|
192
|
-
end
|
193
|
-
|
194
|
-
it 'fails when 1-level key has value with an incorrect type' do
|
195
|
-
expect(schema.(meta: { data: [{ info: ''}] }).messages).to eql(
|
196
|
-
meta: { data: { 0 => { info: ['must be a hash'] } } }
|
197
|
-
)
|
198
|
-
end
|
199
|
-
|
200
|
-
it 'fails when 1-level key has value with a key with an invalid value' do
|
201
|
-
expect(schema.(meta: { data: [{ info: { name: '' } }] }).messages).to eql(
|
202
|
-
meta: { data: { 0 => { info: { name: ['must be filled'] } } } }
|
203
|
-
)
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
context 'with 2-level `each` + schema' do
|
208
|
-
subject(:schema) do
|
209
|
-
Dry::Validation.Schema do
|
210
|
-
required(:data).each do
|
211
|
-
schema do
|
212
|
-
required(:tags).each do
|
213
|
-
required(:name).filled
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
it 'passes when input is valid' do
|
221
|
-
expect(schema.(data: [{ tags: [{ name: 'red' }, { name: 'blue' }] }])).to be_success
|
222
|
-
end
|
223
|
-
|
224
|
-
it 'fails when 1-level element is not valid' do
|
225
|
-
expect(schema.(data: [{}]).messages).to eql(
|
226
|
-
data: { 0 => { tags: ['is missing'] } }
|
227
|
-
)
|
228
|
-
end
|
229
|
-
|
230
|
-
it 'fails when 2-level element is not valid' do
|
231
|
-
expect(schema.(data: [{ tags: [{ name: 'red' }, { name: '' }] }]).messages).to eql(
|
232
|
-
data: { 0 => { tags: { 1 => { name: ['must be filled'] } } } }
|
233
|
-
)
|
234
|
-
end
|
235
|
-
end
|
236
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
RSpec.describe Schema, 'using nested values' do
|
2
|
-
let(:schema) do
|
3
|
-
Dry::Validation.Schema do
|
4
|
-
required(:email).maybe
|
5
|
-
|
6
|
-
required(:settings).schema do
|
7
|
-
optional(:offers).filled(:bool?)
|
8
|
-
required(:newsletter).filled(:bool?)
|
9
|
-
end
|
10
|
-
|
11
|
-
rule(newsletter: [[:settings, :newsletter], [:settings, :offers]]) do |newsletter, offers|
|
12
|
-
offers.true?.then(newsletter.false?)
|
13
|
-
end
|
14
|
-
|
15
|
-
rule(email: [[:settings, :newsletter], :email]) do |newsletter, email|
|
16
|
-
newsletter.true?.then(email.filled?)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'passes when newsletter setting is false' do
|
22
|
-
expect(schema.(settings: { newsletter: false }, email: nil)).to be_success
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'passes when newsletter setting is true and email is filled' do
|
26
|
-
expect(schema.(settings: { newsletter: false }, email: 'jane@doe')).to be_success
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'passes when offers is false and newsletter is true' do
|
30
|
-
expect(schema.(settings: { offers: false, newsletter: true }, email: 'jane@doe')).to be_success
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'fails when newsletter is true and email is not filled' do
|
34
|
-
expect(schema.(settings: { newsletter: true }, email: nil).messages).to eql(
|
35
|
-
email: ['must be filled']
|
36
|
-
)
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'fails when offers is true and newsletter is true' do
|
40
|
-
input = { settings: { offers: true, newsletter: true }, email: 'jane@doe' }
|
41
|
-
|
42
|
-
expect(schema.(input).messages).to eql(
|
43
|
-
settings: { newsletter: ['must be false'] }
|
44
|
-
)
|
45
|
-
end
|
46
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
RSpec.describe 'Schema with negated rules' do
|
2
|
-
subject(:schema) do
|
3
|
-
Dry::Validation.Schema do
|
4
|
-
configure do
|
5
|
-
def self.messages
|
6
|
-
Messages.default.merge(
|
7
|
-
en: { errors: { be_reasonable: 'you cannot eat cake and have cake!' } }
|
8
|
-
)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
optional(:eat_cake).filled
|
13
|
-
optional(:have_cake).filled
|
14
|
-
|
15
|
-
rule(:be_reasonable) do
|
16
|
-
value(:eat_cake).eql?('yes!') & value(:have_cake).eql?('yes!').not
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe '#messages' do
|
22
|
-
it 'passes when only one option is selected' do
|
23
|
-
messages = schema.(eat_cake: 'yes!', have_cake: 'no!').messages[:be_reasonable]
|
24
|
-
|
25
|
-
expect(messages).to be(nil)
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'fails when both options are selected' do
|
29
|
-
messages = schema.(eat_cake: 'yes!', have_cake: 'yes!').messages[:be_reasonable]
|
30
|
-
|
31
|
-
expect(messages).to eql(['you cannot eat cake and have cake!'])
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
RSpec.describe Dry::Validation::Schema do
|
2
|
-
subject(:schema) do
|
3
|
-
Dry::Validation.Schema do
|
4
|
-
required(:age).filled(:number?, :int?)
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'passes when value is a number and an int' do
|
9
|
-
expect(schema.(age: 132)).to be_success
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'fails when value is not a number' do
|
13
|
-
expect(schema.(age: 'ops').messages).to eql(age: ['must be a number'])
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'fails when value is not an integer' do
|
17
|
-
expect(schema.(age: 1.0).messages).to eql(age: ['must be an integer'])
|
18
|
-
end
|
19
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
RSpec.describe Dry::Validation::Schema, 'defining schema context with option API' do
|
2
|
-
shared_context 'valid schema with :db option' do
|
3
|
-
before do
|
4
|
-
DB = [{ email: 'jane@doe' }]
|
5
|
-
end
|
6
|
-
|
7
|
-
after do
|
8
|
-
Object.send(:remove_const, :DB)
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'uses external dependency set by option with a default value' do
|
12
|
-
expect(schema.db).to be(DB)
|
13
|
-
|
14
|
-
expect(schema.(email: 'jade@doe', contact: { email: 'jade2@doe' })).to be_success
|
15
|
-
expect(schema.(email: 'jane@doe', contact: { email: 'jane2@doe' })).to be_failure
|
16
|
-
expect(schema.(email: 'jade@doe', contact: { email: 'jane@doe' })).to be_failure
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
context 'with a default value' do
|
22
|
-
subject(:schema) do
|
23
|
-
Dry::Validation.Schema do
|
24
|
-
configure do
|
25
|
-
option :db, -> { DB }
|
26
|
-
|
27
|
-
def unique?(name, value)
|
28
|
-
db.none? { |item| item[name] == value }
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
required(:email).filled(unique?: :email)
|
33
|
-
|
34
|
-
required(:contact).schema do
|
35
|
-
required(:email).filled(unique?: :email)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
include_context 'valid schema with :db option'
|
41
|
-
end
|
42
|
-
|
43
|
-
context 'without a default value' do
|
44
|
-
subject(:schema) do
|
45
|
-
Dry::Validation.Schema do
|
46
|
-
configure do
|
47
|
-
option :db
|
48
|
-
|
49
|
-
def unique?(name, value)
|
50
|
-
db.none? { |item| item[name] == value }
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
required(:email).filled(unique?: :email)
|
55
|
-
|
56
|
-
required(:contact).schema do
|
57
|
-
required(:email).filled(unique?: :email)
|
58
|
-
end
|
59
|
-
end.with(db: DB)
|
60
|
-
end
|
61
|
-
|
62
|
-
include_context 'valid schema with :db option'
|
63
|
-
end
|
64
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
RSpec.describe Dry::Validation::Schema, 'OR messages' do
|
2
|
-
context 'with two predicates' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Schema do
|
5
|
-
required(:foo) { str? | int? }
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'returns success for valid input' do
|
10
|
-
expect(schema.(foo: 'bar')).to be_success
|
11
|
-
expect(schema.(foo: 321)).to be_success
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'provides OR error message for invalid input where all both sides failed' do
|
15
|
-
expect(schema.(foo: []).errors).to eql(foo: ['must be a string or must be an integer'])
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context 'with a predicate and a conjunction of predicates' do
|
20
|
-
subject(:schema) do
|
21
|
-
Dry::Validation.Schema do
|
22
|
-
required(:foo) { str? | (int? & gt?(18)) }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'returns success for valid input' do
|
27
|
-
expect(schema.(foo: 'bar')).to be_success
|
28
|
-
expect(schema.(foo: 321)).to be_success
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'provides OR message for invalid input where both sides failed' do
|
32
|
-
expect(schema.(foo: []).errors).to eql(foo: ['must be a string or must be an integer'])
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'provides error messages for invalid input where right side failed' do
|
36
|
-
expect(schema.(foo: 17).errors).to eql(foo: ['must be a string or must be greater than 18'])
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
context 'with a predicate and an each operation' do
|
41
|
-
subject(:schema) do
|
42
|
-
Dry::Validation.Schema do
|
43
|
-
required(:foo) { str? | each(:int?) }
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'returns success for valid input' do
|
48
|
-
expect(schema.(foo: 'bar')).to be_success
|
49
|
-
expect(schema.(foo: [1, 2, 3])).to be_success
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'provides OR message for invalid input where both sides failed' do
|
53
|
-
expect(schema.(foo: {}).errors).to eql(foo: ['must be a string or must be an array'])
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'provides error messages for invalid input where right side failed' do
|
57
|
-
expect(schema.(foo: %w(1 2 3)).errors).to eql(
|
58
|
-
foo: {
|
59
|
-
0 => ['must be an integer'],
|
60
|
-
1 => ['must be an integer'],
|
61
|
-
2 => ['must be an integer']
|
62
|
-
}
|
63
|
-
)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'with a predicate and a schema' do
|
68
|
-
subject(:schema) do
|
69
|
-
Dry::Validation.Schema do
|
70
|
-
required(:foo) { str? | schema { required(:bar).filled } }
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'returns success for valid input' do
|
75
|
-
expect(schema.(foo: 'bar')).to be_success
|
76
|
-
expect(schema.(foo: { bar: 'baz' })).to be_success
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'provides OR message for invalid input where both sides failed' do
|
80
|
-
expect(schema.(foo: []).errors).to eql(foo: ['must be a string or must be a hash'])
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'provides error messages for invalid input where right side rules failed' do
|
84
|
-
expect(schema.(foo: { bar: '' }).errors).to eql(foo: { bar: ['must be filled'] })
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'dry/validation/messages/i18n'
|
2
|
-
require 'i18n'
|
3
|
-
|
4
|
-
RSpec.describe 'Defining base schema class' do
|
5
|
-
subject(:schema) do
|
6
|
-
Dry::Validation.Params(BaseSchema) do
|
7
|
-
required(:email).filled(:email?)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
before do
|
12
|
-
class BaseSchema < Dry::Validation::Schema
|
13
|
-
configure do |config|
|
14
|
-
config.messages_file = SPEC_ROOT.join('fixtures/locales/en.yml')
|
15
|
-
config.messages = :i18n
|
16
|
-
end
|
17
|
-
|
18
|
-
def email?(value)
|
19
|
-
true
|
20
|
-
end
|
21
|
-
|
22
|
-
define! do
|
23
|
-
required(:name).filled
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
after do
|
29
|
-
Object.send(:remove_const, :BaseSchema)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'inherits predicates' do
|
33
|
-
expect(schema).to respond_to(:email?)
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'inherits rules' do
|
37
|
-
expect(schema.('name' => '').messages).to eql(
|
38
|
-
name: ['must be filled'], email: ['is missing', 'must be an email']
|
39
|
-
)
|
40
|
-
end
|
41
|
-
end
|