dry-validation 0.7.4 → 0.8.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/.gitignore +1 -0
- data/.travis.yml +9 -6
- data/CHANGELOG.md +58 -0
- data/Gemfile +3 -3
- data/benchmarks/benchmark_form_invalid.rb +64 -0
- data/benchmarks/benchmark_form_valid.rb +64 -0
- data/benchmarks/profile_schema_call_invalid.rb +20 -0
- data/benchmarks/profile_schema_call_valid.rb +20 -0
- data/benchmarks/profile_schema_definition.rb +14 -0
- data/benchmarks/profile_schema_messages_invalid.rb +20 -0
- data/benchmarks/suite.rb +5 -0
- data/config/errors.yml +12 -5
- data/dry-validation.gemspec +2 -2
- data/examples/basic.rb +2 -2
- data/examples/form.rb +2 -2
- data/examples/json.rb +2 -2
- data/examples/nested.rb +6 -6
- data/lib/dry/validation.rb +22 -3
- data/lib/dry/validation/deprecations.rb +23 -0
- data/lib/dry/validation/error_compiler.rb +31 -11
- data/lib/dry/validation/error_compiler/input.rb +44 -57
- data/lib/dry/validation/hint_compiler.rb +15 -7
- data/lib/dry/validation/input_processor_compiler.rb +13 -6
- data/lib/dry/validation/input_processor_compiler/form.rb +2 -0
- data/lib/dry/validation/input_processor_compiler/sanitizer.rb +1 -1
- data/lib/dry/validation/messages/abstract.rb +9 -1
- data/lib/dry/validation/predicate_registry.rb +101 -0
- data/lib/dry/validation/result.rb +8 -1
- data/lib/dry/validation/schema.rb +110 -44
- data/lib/dry/validation/schema/check.rb +4 -2
- data/lib/dry/validation/schema/deprecated.rb +31 -0
- data/lib/dry/validation/schema/dsl.rb +18 -11
- data/lib/dry/validation/schema/form.rb +1 -0
- data/lib/dry/validation/schema/json.rb +1 -0
- data/lib/dry/validation/schema/key.rb +23 -10
- data/lib/dry/validation/schema/rule.rb +81 -20
- data/lib/dry/validation/schema/value.rb +110 -25
- data/lib/dry/validation/version.rb +1 -1
- data/spec/fixtures/locales/en.yml +1 -0
- data/spec/fixtures/locales/pl.yml +1 -1
- data/spec/integration/custom_error_messages_spec.rb +2 -2
- data/spec/integration/custom_predicates_spec.rb +98 -15
- data/spec/integration/error_compiler_spec.rb +111 -96
- data/spec/integration/form/predicates/array_spec.rb +243 -0
- data/spec/integration/form/predicates/empty_spec.rb +263 -0
- data/spec/integration/form/predicates/eql_spec.rb +327 -0
- data/spec/integration/form/predicates/even_spec.rb +455 -0
- data/spec/integration/form/predicates/excluded_from_spec.rb +455 -0
- data/spec/integration/form/predicates/excludes_spec.rb +391 -0
- data/spec/integration/form/predicates/false_spec.rb +455 -0
- data/spec/integration/form/predicates/filled_spec.rb +467 -0
- data/spec/integration/form/predicates/format_spec.rb +454 -0
- data/spec/integration/form/predicates/gt_spec.rb +519 -0
- data/spec/integration/form/predicates/gteq_spec.rb +519 -0
- data/spec/integration/form/predicates/included_in_spec.rb +455 -0
- data/spec/integration/form/predicates/includes_spec.rb +391 -0
- data/spec/integration/form/predicates/key_spec.rb +75 -0
- data/spec/integration/form/predicates/lt_spec.rb +519 -0
- data/spec/integration/form/predicates/lteq_spec.rb +519 -0
- data/spec/integration/form/predicates/max_size_spec.rb +391 -0
- data/spec/integration/form/predicates/min_size_spec.rb +391 -0
- data/spec/integration/form/predicates/none_spec.rb +265 -0
- data/spec/integration/form/predicates/not_eql_spec.rb +327 -0
- data/spec/integration/form/predicates/odd_spec.rb +455 -0
- data/spec/integration/form/predicates/size/fixed_spec.rb +399 -0
- data/spec/integration/form/predicates/size/range_spec.rb +398 -0
- data/spec/integration/form/predicates/true_spec.rb +455 -0
- data/spec/integration/form/predicates/type_spec.rb +391 -0
- data/spec/integration/hints_spec.rb +90 -4
- data/spec/integration/injecting_rules_spec.rb +2 -2
- data/spec/integration/localized_error_messages_spec.rb +2 -2
- data/spec/integration/messages/i18n_spec.rb +3 -3
- data/spec/integration/optional_keys_spec.rb +3 -3
- data/spec/integration/schema/array_schema_spec.rb +49 -13
- data/spec/integration/schema/check_rules_spec.rb +6 -6
- data/spec/integration/schema/check_with_nested_el_spec.rb +3 -3
- data/spec/integration/schema/check_with_nth_el_spec.rb +1 -1
- data/spec/integration/schema/each_with_set_spec.rb +3 -3
- data/spec/integration/schema/extending_dsl_spec.rb +27 -0
- data/spec/integration/schema/form/explicit_types_spec.rb +182 -0
- data/spec/integration/schema/form_spec.rb +90 -18
- data/spec/integration/schema/hash_schema_spec.rb +47 -0
- data/spec/integration/schema/inheriting_schema_spec.rb +4 -4
- data/spec/integration/schema/input_processor_spec.rb +8 -8
- data/spec/integration/schema/json/explicit_types_spec.rb +157 -0
- data/spec/integration/schema/json_spec.rb +18 -18
- data/spec/integration/schema/macros/confirmation_spec.rb +1 -1
- data/spec/integration/schema/macros/each_spec.rb +177 -43
- data/spec/integration/schema/macros/{required_spec.rb → filled_spec.rb} +34 -6
- data/spec/integration/schema/macros/input_spec.rb +21 -0
- data/spec/integration/schema/macros/maybe_spec.rb +39 -2
- data/spec/integration/schema/macros/value_spec.rb +105 -0
- data/spec/integration/schema/macros/when_spec.rb +28 -8
- data/spec/integration/schema/nested_values_spec.rb +11 -8
- data/spec/integration/schema/not_spec.rb +2 -2
- data/spec/integration/schema/numbers_spec.rb +1 -1
- data/spec/integration/schema/option_with_default_spec.rb +1 -1
- data/spec/integration/schema/predicate_verification_spec.rb +9 -0
- data/spec/integration/schema/predicates/array_spec.rb +295 -0
- data/spec/integration/schema/predicates/custom_spec.rb +103 -0
- data/spec/integration/schema/predicates/empty_spec.rb +263 -0
- data/spec/integration/schema/predicates/eql_spec.rb +327 -0
- data/spec/integration/schema/predicates/even_spec.rb +455 -0
- data/spec/integration/schema/predicates/excluded_from_spec.rb +455 -0
- data/spec/integration/schema/predicates/excludes_spec.rb +391 -0
- data/spec/integration/schema/predicates/filled_spec.rb +467 -0
- data/spec/integration/schema/predicates/format_spec.rb +455 -0
- data/spec/integration/schema/predicates/gt_spec.rb +519 -0
- data/spec/integration/schema/predicates/gteq_spec.rb +519 -0
- data/spec/integration/schema/predicates/hash_spec.rb +69 -0
- data/spec/integration/schema/predicates/included_in_spec.rb +455 -0
- data/spec/integration/schema/predicates/includes_spec.rb +391 -0
- data/spec/integration/schema/predicates/key_spec.rb +88 -0
- data/spec/integration/schema/predicates/lt_spec.rb +520 -0
- data/spec/integration/schema/predicates/lteq_spec.rb +519 -0
- data/spec/integration/schema/predicates/max_size_spec.rb +391 -0
- data/spec/integration/schema/predicates/min_size_spec.rb +391 -0
- data/spec/integration/schema/predicates/none_spec.rb +265 -0
- data/spec/integration/schema/predicates/not_eql_spec.rb +391 -0
- data/spec/integration/schema/predicates/odd_spec.rb +455 -0
- data/spec/integration/schema/predicates/size/fixed_spec.rb +401 -0
- data/spec/integration/schema/predicates/size/range_spec.rb +399 -0
- data/spec/integration/schema/predicates/type_spec.rb +391 -0
- data/spec/integration/schema/reusing_schema_spec.rb +4 -4
- data/spec/integration/schema/using_types_spec.rb +24 -6
- data/spec/integration/schema/xor_spec.rb +2 -2
- data/spec/integration/schema_builders_spec.rb +15 -0
- data/spec/integration/schema_spec.rb +37 -12
- data/spec/shared/predicate_helper.rb +13 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/matchers.rb +38 -0
- data/spec/support/predicates_integration.rb +7 -0
- data/spec/unit/hint_compiler_spec.rb +10 -8
- data/spec/unit/input_processor_compiler/form_spec.rb +45 -43
- data/spec/unit/input_processor_compiler/json_spec.rb +37 -35
- data/spec/unit/predicate_registry_spec.rb +34 -0
- data/spec/unit/schema/key_spec.rb +12 -14
- data/spec/unit/schema/rule_spec.rb +4 -2
- data/spec/unit/schema/value_spec.rb +38 -121
- metadata +150 -16
- data/lib/dry/validation/schema/attr.rb +0 -15
- data/spec/integration/attr_spec.rb +0 -122
@@ -0,0 +1,391 @@
|
|
1
|
+
RSpec.describe 'Predicates: Type' do
|
2
|
+
context 'with required' do
|
3
|
+
subject(:schema) do
|
4
|
+
Dry::Validation.Schema do
|
5
|
+
required(:foo) { type?(Integer) }
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'with valid input' do
|
10
|
+
let(:input) { { foo: 23 } }
|
11
|
+
|
12
|
+
it 'is successful' do
|
13
|
+
expect(result).to be_successful
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'with missing input' do
|
18
|
+
let(:input) { {} }
|
19
|
+
|
20
|
+
it 'is not successful' do
|
21
|
+
expect(result).to be_failing ['is missing', 'must be Integer']
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'with nil input' do
|
26
|
+
let(:input) { { foo: nil } }
|
27
|
+
|
28
|
+
it 'is not successful' do
|
29
|
+
expect(result).to be_failing ['must be Integer']
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'with blank input' do
|
34
|
+
let(:input) { { foo: '' } }
|
35
|
+
|
36
|
+
it 'is not successful' do
|
37
|
+
expect(result).to be_failing ['must be Integer']
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with invalid type' do
|
42
|
+
let(:input) { { foo: [:x] } }
|
43
|
+
|
44
|
+
it 'is not successful' do
|
45
|
+
expect(result).to be_failing ['must be Integer']
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'with optional' do
|
51
|
+
subject(:schema) do
|
52
|
+
Dry::Validation.Schema do
|
53
|
+
optional(:foo) { type?(Integer) }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'with valid input' do
|
58
|
+
let(:input) { { foo: 23 } }
|
59
|
+
|
60
|
+
it 'is successful' do
|
61
|
+
expect(result).to be_successful
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with missing input' do
|
66
|
+
let(:input) { {} }
|
67
|
+
|
68
|
+
it 'is successful' do
|
69
|
+
expect(result).to be_successful
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'with nil input' do
|
74
|
+
let(:input) { { foo: nil } }
|
75
|
+
|
76
|
+
it 'is not successful' do
|
77
|
+
expect(result).to be_failing ['must be Integer']
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'with blank input' do
|
82
|
+
let(:input) { { foo: '' } }
|
83
|
+
|
84
|
+
it 'is not successful' do
|
85
|
+
expect(result).to be_failing ['must be Integer']
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'with invalid type' do
|
90
|
+
let(:input) { { foo: [:x] } }
|
91
|
+
|
92
|
+
it 'is not successful' do
|
93
|
+
expect(result).to be_failing ['must be Integer']
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'as macro' do
|
99
|
+
context 'with required' do
|
100
|
+
context 'with value' do
|
101
|
+
subject(:schema) do
|
102
|
+
Dry::Validation.Schema do
|
103
|
+
required(:foo).value(type?: Integer)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'with valid input' do
|
108
|
+
let(:input) { { foo: 23 } }
|
109
|
+
|
110
|
+
it 'is successful' do
|
111
|
+
expect(result).to be_successful
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'with missing input' do
|
116
|
+
let(:input) { {} }
|
117
|
+
|
118
|
+
it 'is not successful' do
|
119
|
+
expect(result).to be_failing ['is missing', 'must be Integer']
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'with nil input' do
|
124
|
+
let(:input) { { foo: nil } }
|
125
|
+
|
126
|
+
it 'is not successful' do
|
127
|
+
expect(result).to be_failing ['must be Integer']
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'with blank input' do
|
132
|
+
let(:input) { { foo: '' } }
|
133
|
+
|
134
|
+
it 'is not successful' do
|
135
|
+
expect(result).to be_failing ['must be Integer']
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context 'with invalid type' do
|
140
|
+
let(:input) { { foo: [:x] } }
|
141
|
+
|
142
|
+
it 'is not successful' do
|
143
|
+
expect(result).to be_failing ['must be Integer']
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'with filled' do
|
149
|
+
subject(:schema) do
|
150
|
+
Dry::Validation.Schema do
|
151
|
+
required(:foo).filled(type?: Integer)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'with valid input' do
|
156
|
+
let(:input) { { foo: 23 } }
|
157
|
+
|
158
|
+
it 'is successful' do
|
159
|
+
expect(result).to be_successful
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'with missing input' do
|
164
|
+
let(:input) { {} }
|
165
|
+
|
166
|
+
it 'is not successful' do
|
167
|
+
expect(result).to be_failing ['is missing', 'must be Integer']
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context 'with nil input' do
|
172
|
+
let(:input) { { foo: nil } }
|
173
|
+
|
174
|
+
it 'is not successful' do
|
175
|
+
expect(result).to be_failing ['must be filled', 'must be Integer']
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context 'with blank input' do
|
180
|
+
let(:input) { { foo: '' } }
|
181
|
+
|
182
|
+
it 'is not successful' do
|
183
|
+
expect(result).to be_failing ['must be filled', 'must be Integer']
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context 'with invalid type' do
|
188
|
+
let(:input) { { foo: [:x] } }
|
189
|
+
|
190
|
+
it 'is not successful' do
|
191
|
+
expect(result).to be_failing ['must be Integer']
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
context 'with maybe' do
|
197
|
+
subject(:schema) do
|
198
|
+
Dry::Validation.Schema do
|
199
|
+
required(:foo).maybe(type?: Integer)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
context 'with valid input' do
|
204
|
+
let(:input) { { foo: 23 } }
|
205
|
+
|
206
|
+
it 'is successful' do
|
207
|
+
expect(result).to be_successful
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
context 'with missing input' do
|
212
|
+
let(:input) { {} }
|
213
|
+
|
214
|
+
it 'is not successful' do
|
215
|
+
expect(result).to be_failing ['is missing', 'must be Integer']
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context 'with nil input' do
|
220
|
+
let(:input) { { foo: nil } }
|
221
|
+
|
222
|
+
it 'is successful' do
|
223
|
+
expect(result).to be_successful
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
context 'with blank input' do
|
228
|
+
let(:input) { { foo: '' } }
|
229
|
+
|
230
|
+
it 'is not successful' do
|
231
|
+
expect(result).to be_failing ['must be Integer']
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
context 'with invalid type' do
|
236
|
+
let(:input) { { foo: [:x] } }
|
237
|
+
|
238
|
+
it 'is not successful' do
|
239
|
+
expect(result).to be_failing ['must be Integer']
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
context 'with optional' do
|
246
|
+
context 'with value' do
|
247
|
+
subject(:schema) do
|
248
|
+
Dry::Validation.Schema do
|
249
|
+
optional(:foo).value(type?: Integer)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
context 'with valid input' do
|
254
|
+
let(:input) { { foo: 23 } }
|
255
|
+
|
256
|
+
it 'is successful' do
|
257
|
+
expect(result).to be_successful
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
context 'with missing input' do
|
262
|
+
let(:input) { {} }
|
263
|
+
|
264
|
+
it 'is successful' do
|
265
|
+
expect(result).to be_successful
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
context 'with nil input' do
|
270
|
+
let(:input) { { foo: nil } }
|
271
|
+
|
272
|
+
it 'is not successful' do
|
273
|
+
expect(result).to be_failing ['must be Integer']
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
context 'with blank input' do
|
278
|
+
let(:input) { { foo: '' } }
|
279
|
+
|
280
|
+
it 'is not successful' do
|
281
|
+
expect(result).to be_failing ['must be Integer']
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
context 'with invalid type' do
|
286
|
+
let(:input) { { foo: [:x] } }
|
287
|
+
|
288
|
+
it 'is not successful' do
|
289
|
+
expect(result).to be_failing ['must be Integer']
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
context 'with filled' do
|
295
|
+
subject(:schema) do
|
296
|
+
Dry::Validation.Schema do
|
297
|
+
optional(:foo).filled(type?: Integer)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
context 'with valid input' do
|
302
|
+
let(:input) { { foo: 23 } }
|
303
|
+
|
304
|
+
it 'is successful' do
|
305
|
+
expect(result).to be_successful
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
context 'with missing input' do
|
310
|
+
let(:input) { {} }
|
311
|
+
|
312
|
+
it 'is successful' do
|
313
|
+
expect(result).to be_successful
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
context 'with nil input' do
|
318
|
+
let(:input) { { foo: nil } }
|
319
|
+
|
320
|
+
it 'is not successful' do
|
321
|
+
expect(result).to be_failing ['must be filled', 'must be Integer']
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
context 'with blank input' do
|
326
|
+
let(:input) { { foo: '' } }
|
327
|
+
|
328
|
+
it 'is not successful' do
|
329
|
+
expect(result).to be_failing ['must be filled', 'must be Integer']
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
context 'with invalid type' do
|
334
|
+
let(:input) { { foo: [:x] } }
|
335
|
+
|
336
|
+
it 'is not successful' do
|
337
|
+
expect(result).to be_failing ['must be Integer']
|
338
|
+
end
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
context 'with maybe' do
|
343
|
+
subject(:schema) do
|
344
|
+
Dry::Validation.Schema do
|
345
|
+
optional(:foo).maybe(type?: Integer)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
context 'with valid input' do
|
350
|
+
let(:input) { { foo: 23 } }
|
351
|
+
|
352
|
+
it 'is successful' do
|
353
|
+
expect(result).to be_successful
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
context 'with missing input' do
|
358
|
+
let(:input) { {} }
|
359
|
+
|
360
|
+
it 'is successful' do
|
361
|
+
expect(result).to be_successful
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
context 'with nil input' do
|
366
|
+
let(:input) { { foo: nil } }
|
367
|
+
|
368
|
+
it 'is successful' do
|
369
|
+
expect(result).to be_successful
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
context 'with blank input' do
|
374
|
+
let(:input) { { foo: '' } }
|
375
|
+
|
376
|
+
it 'is not successful' do
|
377
|
+
expect(result).to be_failing ['must be Integer']
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
context 'with invalid type' do
|
382
|
+
let(:input) { { foo: [:x] } }
|
383
|
+
|
384
|
+
it 'is not successful' do
|
385
|
+
expect(result).to be_failing ['must be Integer']
|
386
|
+
end
|
387
|
+
end
|
388
|
+
end
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
RSpec.describe 'Reusing schemas' do
|
2
2
|
subject(:schema) do
|
3
3
|
Dry::Validation.Schema do
|
4
|
-
|
4
|
+
required(:city).filled
|
5
5
|
|
6
|
-
|
6
|
+
required(:location).schema(LocationSchema)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
@@ -11,8 +11,8 @@ RSpec.describe 'Reusing schemas' do
|
|
11
11
|
LocationSchema = Dry::Validation.Schema do
|
12
12
|
configure { config.input_processor = :form }
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
required(:lat).filled(:float?)
|
15
|
+
required(:lng).filled(:float?)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
RSpec.describe Dry::Validation::Schema, 'defining schema using dry types' do
|
2
2
|
subject(:schema) do
|
3
3
|
Dry::Validation.Schema do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
required(:email).filled(Email)
|
5
|
+
required(:age).maybe(Age)
|
6
|
+
required(:country).filled(Country)
|
7
7
|
optional(:admin).maybe(AdminBit)
|
8
8
|
end
|
9
9
|
end
|
@@ -42,7 +42,8 @@ RSpec.describe Dry::Validation::Schema, 'defining schema using dry types' do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
it 'fails when sum-type rule did not pass' do
|
45
|
-
|
45
|
+
result = schema.(email: 'jane@doe', age: 19, country: 'Australia', admin: 'foo')
|
46
|
+
expect(result.messages).to eql(
|
46
47
|
admin: ['must be FalseClass', 'must be TrueClass']
|
47
48
|
)
|
48
49
|
end
|
@@ -50,7 +51,7 @@ RSpec.describe Dry::Validation::Schema, 'defining schema using dry types' do
|
|
50
51
|
context "structs" do
|
51
52
|
subject(:schema) do
|
52
53
|
Dry::Validation.Schema do
|
53
|
-
|
54
|
+
required(:person).filled(Person)
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
@@ -79,7 +80,7 @@ RSpec.describe Dry::Validation::Schema, 'defining schema using dry types' do
|
|
79
80
|
Dry::Validation.Schema do
|
80
81
|
configure { config.input_processor = :sanitizer }
|
81
82
|
|
82
|
-
|
83
|
+
required(:email).filled(Dry::Types['strict.string'].constructor(&:strip))
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
@@ -90,4 +91,21 @@ RSpec.describe Dry::Validation::Schema, 'defining schema using dry types' do
|
|
90
91
|
expect(result.to_h).to eql(email: 'jane@doe.org')
|
91
92
|
end
|
92
93
|
end
|
94
|
+
|
95
|
+
context 'custom types' do
|
96
|
+
subject(:schema) do
|
97
|
+
Dry::Validation.Form do
|
98
|
+
required(:quantity).filled(Dry::Types['strict.int'].constrained(gt: 1))
|
99
|
+
required(:percentage).filled(Dry::Types['strict.decimal'].constrained(gt: 0, lt: 1))
|
100
|
+
required(:switch).filled(Dry::Types['strict.bool'])
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'applies custom types to input prior validation' do
|
105
|
+
result = schema.(quantity: '2', percentage: '0.5', switch: '0')
|
106
|
+
|
107
|
+
expect(result).to be_success
|
108
|
+
expect(result.to_h).to eql(quantity: 2, percentage: BigDecimal('0.5'), switch: false)
|
109
|
+
end
|
110
|
+
end
|
93
111
|
end
|