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,391 +0,0 @@
|
|
1
|
-
RSpec.describe 'Predicates: Type' do
|
2
|
-
context 'with required' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Params 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.Params 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.Params 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.Params 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.Params 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 successful' do
|
231
|
-
expect(result).to be_successful
|
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.Params 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.Params 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.Params 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 successful' do
|
377
|
-
expect(result).to be_successful
|
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,81 +0,0 @@
|
|
1
|
-
RSpec.describe Dry::Validation::Result do
|
2
|
-
subject(:result) { schema.(input) }
|
3
|
-
|
4
|
-
let(:schema) { Dry::Validation.Schema { required(:name).filled(:str?, size?: 2..4) } }
|
5
|
-
|
6
|
-
context 'with valid input' do
|
7
|
-
let(:input) { { name: 'Jane' } }
|
8
|
-
|
9
|
-
it 'is successful' do
|
10
|
-
expect(result).to be_successful
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'is not a failure' do
|
14
|
-
expect(result).to_not be_failure
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'coerces to validated hash' do
|
18
|
-
expect(Hash(result)).to eql(name: 'Jane')
|
19
|
-
end
|
20
|
-
|
21
|
-
describe '#messages' do
|
22
|
-
it 'returns an empty hash' do
|
23
|
-
expect(result.messages).to be_empty
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'with invalid input' do
|
29
|
-
let(:input) { { name: '' } }
|
30
|
-
|
31
|
-
it 'is not successful' do
|
32
|
-
expect(result).to_not be_successful
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'is failure' do
|
36
|
-
expect(result).to be_failure
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'coerces to validated hash' do
|
40
|
-
expect(Hash(result)).to eql(name: '')
|
41
|
-
end
|
42
|
-
|
43
|
-
describe '#messages' do
|
44
|
-
it 'returns a hash with error messages' do
|
45
|
-
expect(result.messages).to eql(
|
46
|
-
name: ['must be filled', 'length must be within 2 - 4']
|
47
|
-
)
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'with full: true returns full messages' do
|
51
|
-
expect(result.messages(full: true)).to eql(
|
52
|
-
name: ['name must be filled', 'name length must be within 2 - 4']
|
53
|
-
)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe '#errors' do
|
58
|
-
let(:input) { { name: '' } }
|
59
|
-
|
60
|
-
it 'returns failure messages' do
|
61
|
-
expect(result.errors).to eql(name: ['must be filled'])
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe '#hints' do
|
66
|
-
let(:input) { { name: '' } }
|
67
|
-
|
68
|
-
it 'returns hint messages' do
|
69
|
-
expect(result.hints).to eql(name: ['length must be within 2 - 4'])
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe '#message_set' do
|
74
|
-
it 'returns message set' do
|
75
|
-
expect(result.message_set.to_h).to eql(
|
76
|
-
name: ['must be filled', 'length must be within 2 - 4']
|
77
|
-
)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
RSpec.describe Dry::Validation::Schema, 'for an array' do
|
2
|
-
context 'without type specs' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Schema do
|
5
|
-
each do
|
6
|
-
schema do
|
7
|
-
required(:prefix).filled
|
8
|
-
required(:value).filled
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'applies its rules to array input' do
|
15
|
-
result = schema.([{ prefix: 1, value: 123 }, { prefix: 2, value: 456 }])
|
16
|
-
|
17
|
-
expect(result).to be_success
|
18
|
-
|
19
|
-
result = schema.([{ prefix: 1, value: nil }, { prefix: nil, value: 456 }])
|
20
|
-
|
21
|
-
expect(result.messages).to eql(
|
22
|
-
0 => { value: ["must be filled"] },
|
23
|
-
1 => { prefix: ["must be filled"] }
|
24
|
-
)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'with type specs' do
|
29
|
-
subject(:schema) do
|
30
|
-
Dry::Validation.Params do
|
31
|
-
configure { config.type_specs = true }
|
32
|
-
|
33
|
-
each do
|
34
|
-
schema do
|
35
|
-
required(:prefix, :integer).filled
|
36
|
-
required(:value, :integer).filled
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'applies its rules to coerced array input' do
|
43
|
-
result = schema.([{ prefix: 1, value: '123' }, { prefix: 2, value: 456 }])
|
44
|
-
|
45
|
-
expect(result).to be_success
|
46
|
-
|
47
|
-
expect(result.output).to eql(
|
48
|
-
[{ prefix: 1, value: 123 }, { prefix: 2, value: 456 }]
|
49
|
-
)
|
50
|
-
|
51
|
-
result = schema.([{ prefix: 1, value: nil }, { prefix: nil, value: 456 }])
|
52
|
-
|
53
|
-
expect(result.messages).to eql(
|
54
|
-
0 => { value: ["must be filled"] },
|
55
|
-
1 => { prefix: ["must be filled"] }
|
56
|
-
)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,119 +0,0 @@
|
|
1
|
-
RSpec.describe Schema, 'using high-level rules' do
|
2
|
-
context 'composing rules' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Schema do
|
5
|
-
configure do
|
6
|
-
def self.messages
|
7
|
-
Messages.default.merge(
|
8
|
-
en: { errors: { destiny: 'you must select either red or blue' } }
|
9
|
-
)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
optional(:red).maybe
|
14
|
-
optional(:blue).maybe
|
15
|
-
|
16
|
-
rule(destiny: [:red, :blue]) do |red, blue|
|
17
|
-
red.filled? | blue.filled?
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'passes when only red is filled' do
|
23
|
-
expect(schema.(red: '1')).to be_success
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'fails when keys are missing' do
|
27
|
-
expect(schema.({})).to be_failure
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'fails when red and blue are not filled ' do
|
31
|
-
expect(schema.(red: nil, blue: nil).messages).to eql(
|
32
|
-
destiny: ['you must select either red or blue']
|
33
|
-
)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'composing specific predicates' do
|
38
|
-
let(:schema) do
|
39
|
-
Dry::Validation.Schema do
|
40
|
-
configure do
|
41
|
-
def self.messages
|
42
|
-
Messages.default.merge(
|
43
|
-
en: {
|
44
|
-
errors: {
|
45
|
-
email_presence: 'must be present when login is set to true',
|
46
|
-
email_absence: 'must not be present when login is set to false'
|
47
|
-
}
|
48
|
-
}
|
49
|
-
)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
required(:login).filled(:bool?)
|
54
|
-
required(:email).maybe
|
55
|
-
|
56
|
-
rule(:email_presence) { value(:login).true?.then(value(:email).filled?) }
|
57
|
-
|
58
|
-
rule(:email_absence) { value(:login).false?.then(value(:email).none?) }
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'passes when login is false and email is nil' do
|
63
|
-
expect(schema.(login: false, email: nil)).to be_success
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'fails when login is false and email is present' do
|
67
|
-
expect(schema.(login: false, email: 'jane@doe').messages).to eql(
|
68
|
-
email_absence: ['must not be present when login is set to false']
|
69
|
-
)
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'passes when login is true and email is present' do
|
73
|
-
expect(schema.(login: true, email: 'jane@doe')).to be_success
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'fails when login is true and email is not present' do
|
77
|
-
expect(schema.(login: true, email: nil).messages).to eql(
|
78
|
-
email_presence: ['must be present when login is set to true']
|
79
|
-
)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe 'with nested schemas' do
|
84
|
-
subject(:schema) do
|
85
|
-
Dry::Validation.Schema do
|
86
|
-
required(:command).filled(:str?, included_in?: %w(First Second))
|
87
|
-
|
88
|
-
required(:args).filled(:hash?)
|
89
|
-
|
90
|
-
rule(first_args: [:command, :args]) do |command, args|
|
91
|
-
command.eql?('First')
|
92
|
-
.then(args.schema { required(:first).filled(:bool?) })
|
93
|
-
end
|
94
|
-
|
95
|
-
rule(second_args: [:command, :args]) do |command, args|
|
96
|
-
command.eql?('Second')
|
97
|
-
.then(args.schema { required(:second).filled(:bool?) })
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
it 'generates check rule matching on value' do
|
103
|
-
expect(schema.(command: 'First', args: { first: true })).to be_success
|
104
|
-
expect(schema.(command: 'Second', args: { second: true })).to be_success
|
105
|
-
|
106
|
-
expect(schema.(command: 'oops', args: { such: 'validation' }).messages).to eql(
|
107
|
-
command: ['must be one of: First, Second']
|
108
|
-
)
|
109
|
-
|
110
|
-
expect(schema.(command: 'First', args: { second: true }).messages).to eql(
|
111
|
-
args: { first: ['is missing'] }
|
112
|
-
)
|
113
|
-
|
114
|
-
expect(schema.(command: 'Second', args: { first: true }).messages).to eql(
|
115
|
-
args: { second: ['is missing'] }
|
116
|
-
)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
RSpec.describe 'Check depending on a nested value from a hash' do
|
2
|
-
subject(:schema) do
|
3
|
-
Dry::Validation.Schema do
|
4
|
-
required(:tag).schema do
|
5
|
-
required(:color).schema do
|
6
|
-
required(:value).filled(:str?)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
rule(tag: [[:tag, :color, :value]]) do |value|
|
11
|
-
value.eql?('red')
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'passes when check passes' do
|
17
|
-
expect(schema.(tag: { color: { value: 'red' }})).to be_success
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'skips check when parent of the dependency failed' do
|
21
|
-
expect(schema.(tag: { color: :oops }).messages).to eql(
|
22
|
-
tag: { color: ['must be a hash'] }
|
23
|
-
)
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'skips check when dependency failed' do
|
27
|
-
expect(schema.(tag: { color: { value: :oops }}).messages).to eql(
|
28
|
-
tag: { color: { value: ['must be a string'] } }
|
29
|
-
)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'fails when check fails' do
|
33
|
-
expect(schema.(tag: { color: { value: 'blue' }}).messages).to eql(
|
34
|
-
tag: { color: { value: ['must be equal to red'] } }
|
35
|
-
)
|
36
|
-
end
|
37
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
RSpec.describe 'Check depending on nth element in an array' do
|
2
|
-
subject(:schema) do
|
3
|
-
Dry::Validation.Schema do
|
4
|
-
required(:tags).each(:str?)
|
5
|
-
|
6
|
-
rule(tags: [[:tags, 0]]) do |value|
|
7
|
-
value.eql?('red')
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'skips check when dependency failed' do
|
13
|
-
expect(schema.(tags: 'oops')).to be_failure
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'passes when check passes' do
|
17
|
-
expect(schema.(tags: %w(red green blue))).to be_success
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'fails when check fails' do
|
21
|
-
expect(schema.(tags: %w(blue green red)).messages).to eql(
|
22
|
-
tags: { 0 => ["must be equal to red"] }
|
23
|
-
)
|
24
|
-
end
|
25
|
-
end
|