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.
Files changed (207) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +506 -95
  3. data/LICENSE +1 -1
  4. data/README.md +16 -12
  5. data/config/errors.yml +3 -88
  6. data/dry-validation.gemspec +37 -24
  7. data/lib/dry/validation/config.rb +24 -0
  8. data/lib/dry/validation/constants.rb +43 -0
  9. data/lib/dry/validation/contract/class_interface.rb +230 -0
  10. data/lib/dry/validation/contract.rb +171 -0
  11. data/lib/dry/validation/evaluator.rb +224 -0
  12. data/lib/dry/validation/extensions/hints.rb +67 -0
  13. data/lib/dry/validation/extensions/monads.rb +24 -8
  14. data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
  15. data/lib/dry/validation/failures.rb +70 -0
  16. data/lib/dry/validation/function.rb +44 -0
  17. data/lib/dry/validation/macro.rb +38 -0
  18. data/lib/dry/validation/macros.rb +104 -0
  19. data/lib/dry/validation/message.rb +80 -80
  20. data/lib/dry/validation/message_set.rb +80 -105
  21. data/lib/dry/validation/messages/resolver.rb +131 -0
  22. data/lib/dry/validation/result.rb +183 -41
  23. data/lib/dry/validation/rule.rb +135 -0
  24. data/lib/dry/validation/schema_ext.rb +19 -0
  25. data/lib/dry/validation/values.rb +104 -0
  26. data/lib/dry/validation/version.rb +3 -1
  27. data/lib/dry/validation.rb +45 -28
  28. data/lib/dry-validation.rb +3 -1
  29. metadata +46 -344
  30. data/.codeclimate.yml +0 -17
  31. data/.gitignore +0 -9
  32. data/.rspec +0 -3
  33. data/.travis.yml +0 -29
  34. data/CONTRIBUTING.md +0 -31
  35. data/Gemfile +0 -25
  36. data/Rakefile +0 -22
  37. data/benchmarks/benchmark_form_invalid.rb +0 -64
  38. data/benchmarks/benchmark_form_valid.rb +0 -64
  39. data/benchmarks/benchmark_schema_invalid_huge.rb +0 -52
  40. data/benchmarks/profile_schema_call_invalid.rb +0 -20
  41. data/benchmarks/profile_schema_call_valid.rb +0 -20
  42. data/benchmarks/profile_schema_definition.rb +0 -14
  43. data/benchmarks/profile_schema_huge_invalid.rb +0 -30
  44. data/benchmarks/profile_schema_messages_invalid.rb +0 -20
  45. data/benchmarks/suite.rb +0 -5
  46. data/examples/basic.rb +0 -15
  47. data/examples/each.rb +0 -14
  48. data/examples/json.rb +0 -12
  49. data/examples/multiple.rb +0 -27
  50. data/examples/nested.rb +0 -22
  51. data/examples/params.rb +0 -11
  52. data/lib/dry/validation/compat/form.rb +0 -67
  53. data/lib/dry/validation/deprecations.rb +0 -24
  54. data/lib/dry/validation/executor.rb +0 -91
  55. data/lib/dry/validation/extensions/struct.rb +0 -32
  56. data/lib/dry/validation/extensions.rb +0 -7
  57. data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
  58. data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
  59. data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
  60. data/lib/dry/validation/input_processor_compiler.rb +0 -137
  61. data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
  62. data/lib/dry/validation/message_compiler.rb +0 -188
  63. data/lib/dry/validation/messages/abstract.rb +0 -119
  64. data/lib/dry/validation/messages/i18n.rb +0 -47
  65. data/lib/dry/validation/messages/namespaced.rb +0 -39
  66. data/lib/dry/validation/messages/yaml.rb +0 -61
  67. data/lib/dry/validation/messages.rb +0 -14
  68. data/lib/dry/validation/predicate_registry.rb +0 -115
  69. data/lib/dry/validation/predicates.rb +0 -19
  70. data/lib/dry/validation/schema/check.rb +0 -37
  71. data/lib/dry/validation/schema/class_interface.rb +0 -190
  72. data/lib/dry/validation/schema/deprecated.rb +0 -30
  73. data/lib/dry/validation/schema/dsl.rb +0 -118
  74. data/lib/dry/validation/schema/form.rb +0 -9
  75. data/lib/dry/validation/schema/json.rb +0 -21
  76. data/lib/dry/validation/schema/key.rb +0 -71
  77. data/lib/dry/validation/schema/params.rb +0 -22
  78. data/lib/dry/validation/schema/rule.rb +0 -202
  79. data/lib/dry/validation/schema/value.rb +0 -211
  80. data/lib/dry/validation/schema.rb +0 -126
  81. data/lib/dry/validation/schema_compiler.rb +0 -81
  82. data/lib/dry/validation/template.rb +0 -66
  83. data/lib/dry/validation/type_specs.rb +0 -70
  84. data/log/.gitkeep +0 -0
  85. data/spec/extensions/monads/result_spec.rb +0 -40
  86. data/spec/extensions/struct/schema_spec.rb +0 -32
  87. data/spec/fixtures/locales/en.yml +0 -8
  88. data/spec/fixtures/locales/pl.yml +0 -22
  89. data/spec/integration/custom_error_messages_spec.rb +0 -54
  90. data/spec/integration/custom_predicates_spec.rb +0 -228
  91. data/spec/integration/hints_spec.rb +0 -170
  92. data/spec/integration/injecting_rules_spec.rb +0 -30
  93. data/spec/integration/json/defining_base_schema_spec.rb +0 -41
  94. data/spec/integration/localized_error_messages_spec.rb +0 -72
  95. data/spec/integration/message_compiler_spec.rb +0 -405
  96. data/spec/integration/messages/i18n_spec.rb +0 -104
  97. data/spec/integration/optional_keys_spec.rb +0 -28
  98. data/spec/integration/params/predicates/array_spec.rb +0 -287
  99. data/spec/integration/params/predicates/empty_spec.rb +0 -263
  100. data/spec/integration/params/predicates/eql_spec.rb +0 -327
  101. data/spec/integration/params/predicates/even_spec.rb +0 -455
  102. data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
  103. data/spec/integration/params/predicates/excludes_spec.rb +0 -391
  104. data/spec/integration/params/predicates/false_spec.rb +0 -455
  105. data/spec/integration/params/predicates/filled_spec.rb +0 -467
  106. data/spec/integration/params/predicates/format_spec.rb +0 -454
  107. data/spec/integration/params/predicates/gt_spec.rb +0 -519
  108. data/spec/integration/params/predicates/gteq_spec.rb +0 -519
  109. data/spec/integration/params/predicates/included_in_spec.rb +0 -455
  110. data/spec/integration/params/predicates/includes_spec.rb +0 -391
  111. data/spec/integration/params/predicates/key_spec.rb +0 -67
  112. data/spec/integration/params/predicates/lt_spec.rb +0 -519
  113. data/spec/integration/params/predicates/lteq_spec.rb +0 -519
  114. data/spec/integration/params/predicates/max_size_spec.rb +0 -391
  115. data/spec/integration/params/predicates/min_size_spec.rb +0 -391
  116. data/spec/integration/params/predicates/none_spec.rb +0 -265
  117. data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
  118. data/spec/integration/params/predicates/odd_spec.rb +0 -455
  119. data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
  120. data/spec/integration/params/predicates/size/range_spec.rb +0 -396
  121. data/spec/integration/params/predicates/true_spec.rb +0 -455
  122. data/spec/integration/params/predicates/type_spec.rb +0 -391
  123. data/spec/integration/result_spec.rb +0 -81
  124. data/spec/integration/schema/array_schema_spec.rb +0 -59
  125. data/spec/integration/schema/check_rules_spec.rb +0 -119
  126. data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
  127. data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
  128. data/spec/integration/schema/default_settings_spec.rb +0 -11
  129. data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
  130. data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
  131. data/spec/integration/schema/each_with_set_spec.rb +0 -70
  132. data/spec/integration/schema/extending_dsl_spec.rb +0 -27
  133. data/spec/integration/schema/form_spec.rb +0 -236
  134. data/spec/integration/schema/hash_schema_spec.rb +0 -47
  135. data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
  136. data/spec/integration/schema/input_processor_spec.rb +0 -46
  137. data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
  138. data/spec/integration/schema/json_spec.rb +0 -163
  139. data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
  140. data/spec/integration/schema/macros/each_spec.rb +0 -268
  141. data/spec/integration/schema/macros/filled_spec.rb +0 -87
  142. data/spec/integration/schema/macros/input_spec.rb +0 -139
  143. data/spec/integration/schema/macros/maybe_spec.rb +0 -99
  144. data/spec/integration/schema/macros/rule_spec.rb +0 -75
  145. data/spec/integration/schema/macros/value_spec.rb +0 -119
  146. data/spec/integration/schema/macros/when_spec.rb +0 -62
  147. data/spec/integration/schema/nested_schemas_spec.rb +0 -236
  148. data/spec/integration/schema/nested_values_spec.rb +0 -46
  149. data/spec/integration/schema/not_spec.rb +0 -34
  150. data/spec/integration/schema/numbers_spec.rb +0 -19
  151. data/spec/integration/schema/option_with_default_spec.rb +0 -64
  152. data/spec/integration/schema/or_spec.rb +0 -87
  153. data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
  154. data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
  155. data/spec/integration/schema/params_spec.rb +0 -234
  156. data/spec/integration/schema/predicate_verification_spec.rb +0 -9
  157. data/spec/integration/schema/predicates/array_spec.rb +0 -295
  158. data/spec/integration/schema/predicates/custom_spec.rb +0 -103
  159. data/spec/integration/schema/predicates/empty_spec.rb +0 -263
  160. data/spec/integration/schema/predicates/eql_spec.rb +0 -327
  161. data/spec/integration/schema/predicates/even_spec.rb +0 -455
  162. data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
  163. data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
  164. data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
  165. data/spec/integration/schema/predicates/filled_spec.rb +0 -467
  166. data/spec/integration/schema/predicates/format_spec.rb +0 -455
  167. data/spec/integration/schema/predicates/gt_spec.rb +0 -519
  168. data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
  169. data/spec/integration/schema/predicates/hash_spec.rb +0 -69
  170. data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
  171. data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
  172. data/spec/integration/schema/predicates/includes_spec.rb +0 -391
  173. data/spec/integration/schema/predicates/key_spec.rb +0 -88
  174. data/spec/integration/schema/predicates/lt_spec.rb +0 -520
  175. data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
  176. data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
  177. data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
  178. data/spec/integration/schema/predicates/none_spec.rb +0 -265
  179. data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
  180. data/spec/integration/schema/predicates/odd_spec.rb +0 -455
  181. data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
  182. data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
  183. data/spec/integration/schema/predicates/type_spec.rb +0 -413
  184. data/spec/integration/schema/reusing_schema_spec.rb +0 -33
  185. data/spec/integration/schema/using_types_spec.rb +0 -135
  186. data/spec/integration/schema/validate_spec.rb +0 -120
  187. data/spec/integration/schema/xor_spec.rb +0 -35
  188. data/spec/integration/schema_builders_spec.rb +0 -17
  189. data/spec/integration/schema_spec.rb +0 -173
  190. data/spec/shared/message_compiler.rb +0 -11
  191. data/spec/shared/predicate_helper.rb +0 -15
  192. data/spec/shared/rule_compiler.rb +0 -8
  193. data/spec/spec_helper.rb +0 -62
  194. data/spec/support/define_struct.rb +0 -25
  195. data/spec/support/matchers.rb +0 -38
  196. data/spec/support/mutant.rb +0 -9
  197. data/spec/support/predicates_integration.rb +0 -7
  198. data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
  199. data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
  200. data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
  201. data/spec/unit/message_compiler/visit_spec.rb +0 -16
  202. data/spec/unit/message_compiler_spec.rb +0 -7
  203. data/spec/unit/predicate_registry_spec.rb +0 -34
  204. data/spec/unit/schema/key_spec.rb +0 -38
  205. data/spec/unit/schema/rule_spec.rb +0 -42
  206. data/spec/unit/schema/value_spec.rb +0 -131
  207. 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