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,328 +0,0 @@
1
- RSpec.describe Dry::Validation::InputProcessorCompiler::Params, '#call' do
2
- subject(:compiler) { Dry::Validation::InputProcessorCompiler::Params.new }
3
-
4
- include_context 'predicate helper'
5
-
6
- let(:rule_ast) do
7
- [
8
- [
9
- :and, [
10
- p(:key?, :email),
11
- [
12
- :and, [
13
- [:key, [:email, p(:str?)]],
14
- [:key, [:email, p(:filled?)]]
15
- ]
16
- ]
17
- ]
18
- ],
19
- [
20
- :and, [
21
- p(:key?, :age),
22
- [
23
- :or, [
24
- [:key, [:age, p(:none?)]],
25
- [
26
- :and, [
27
- [:key, [:age, p(:int?)]],
28
- [:key, [:age, p(:filled?)]]
29
- ]
30
- ]
31
- ]
32
- ]
33
- ]
34
- ],
35
- [
36
- :and, [
37
- p(:key?, :address),
38
- [:key, [:address, p(:str?)]]
39
- ]
40
- ]
41
- ]
42
- end
43
-
44
- let(:output) do
45
- { 'email' => 'jane@doe.org', 'age' => '20', 'address' => 'City, Street 1/2' }
46
- end
47
-
48
- it 'builds an input dry-data type' do
49
- input_type = compiler.(rule_ast)
50
-
51
- result = input_type[output]
52
-
53
- expect(result).to eql(email: 'jane@doe.org', age: 20, address: 'City, Street 1/2')
54
- end
55
-
56
- it 'supports arbitrary types via type?(const) => "params.const"' do
57
- rule_ast = [
58
- [
59
- :and,
60
- [
61
- [:val, p(:key?, :age)],
62
- [:key, [:age, p(:type?, Integer)]]
63
- ]
64
- ]
65
- ]
66
-
67
- input_type = compiler.(rule_ast)
68
-
69
- expect(input_type['age' => '21']).to eql(age: 21)
70
- end
71
-
72
- it 'supports arbitrary types via type?(conts)' do
73
- rule_ast = [
74
- [
75
- :and,
76
- [
77
- [:val, p(:key?, :admin)],
78
- [:key, [:admin, p(:type?, 'Params::Bool')]]
79
- ]
80
- ]
81
- ]
82
-
83
- input_type = compiler.(rule_ast)
84
-
85
- expect(input_type['admin' => '0']).to eql(admin: false)
86
- end
87
-
88
- it 'supports int? => "params.integer"' do
89
- rule_ast = [
90
- [
91
- :and,
92
- [
93
- [:val, p(:key?, :age)],
94
- [:key, [:age, p(:int?)]],
95
- ]
96
- ]
97
- ]
98
-
99
- input_type = compiler.(rule_ast)
100
-
101
- expect(input_type['age' => '21']).to eql(age: 21)
102
- end
103
-
104
- it 'supports none? => "params.integer"' do
105
- rule_ast = [
106
- [
107
- :and,
108
- [
109
- [:val, p(:key?, :age)],
110
- [
111
- :or, [
112
- [:key, [:age, p(:none?)]],
113
- [:key, [:age, p(:int?)]],
114
- ]
115
- ]
116
- ]
117
- ]
118
- ]
119
-
120
- input_type = compiler.(rule_ast)
121
-
122
- expect(input_type['age' => '']).to eql(age: nil)
123
- expect(input_type['age' => '21']).to eql(age: 21)
124
- end
125
-
126
- it 'supports float? => "params.float"' do
127
- rule_ast = [
128
- [
129
- :and,
130
- [
131
- [:val, p(:key?, :lat)],
132
- [:key, [:lat, p(:float?)]],
133
- ]
134
- ]
135
- ]
136
-
137
- input_type = compiler.(rule_ast)
138
-
139
- expect(input_type['lat' => '21.12']).to eql(lat: 21.12)
140
- end
141
-
142
- it 'supports decimal? => "params.decimal"' do
143
- rule_ast = [
144
- [
145
- :and,
146
- [
147
- [:val, p(:key?, :lat)],
148
- [:key, [:lat, p(:decimal?, [])]],
149
- ]
150
- ]
151
- ]
152
-
153
- input_type = compiler.(rule_ast)
154
-
155
- expect(input_type['lat' => '21.12']).to eql(lat: 21.12.to_d)
156
- end
157
-
158
- it 'supports date? => "params.date"' do
159
- rule_ast = [
160
- [
161
- :and,
162
- [
163
- [:val, p(:key?, :bday)],
164
- [:key, [:bday, p(:date?, [])]],
165
- ]
166
- ]
167
- ]
168
-
169
- input_type = compiler.(rule_ast)
170
-
171
- expect(input_type['bday' => '2012-01-23']).to eql(bday: Date.new(2012, 1, 23))
172
- end
173
-
174
- it 'supports date_time? => "params.date_time"' do
175
- rule_ast = [
176
- [
177
- :and,
178
- [
179
- [:val, p(:key?, :bday)],
180
- [:key, [:bday, p(:date_time?, [])]],
181
- ]
182
- ]
183
- ]
184
-
185
- input_type = compiler.(rule_ast)
186
-
187
- expect(input_type['bday' => '2012-01-23 11:07']).to eql(bday: DateTime.new(2012, 1, 23, 11, 7))
188
- end
189
-
190
- it 'supports time? => "params.time"' do
191
- rule_ast = [
192
- [
193
- :and,
194
- [
195
- [:val, p(:key?, :bday)],
196
- [:key, [:bday, p(:time?, [])]],
197
- ]
198
- ]
199
- ]
200
-
201
- input_type = compiler.(rule_ast)
202
-
203
- expect(input_type['bday' => '2012-01-23 11:07']).to eql(bday: Time.new(2012, 1, 23, 11, 7))
204
- end
205
-
206
- it 'supports time? => "params.time"' do
207
- rule_ast = [
208
- [
209
- :and,
210
- [
211
- [:val, p(:key?, :bday)],
212
- [:key, [:bday, p(:time?, [])]],
213
- ]
214
- ]
215
- ]
216
-
217
- input_type = compiler.(rule_ast)
218
-
219
- expect(input_type['bday' => '2012-01-23 11:07']).to eql(bday: Time.new(2012, 1, 23, 11, 7))
220
- end
221
-
222
- it 'supports bool? => "params.bool"' do
223
- rule_ast = [
224
- [
225
- :and,
226
- [
227
- [:val, p(:key?, :admin)],
228
- [:key, [:admin, p(:bool?, [])]],
229
- ]
230
- ]
231
- ]
232
-
233
- input_type = compiler.(rule_ast)
234
-
235
- expect(input_type['admin' => 'true']).to eql(admin: true)
236
- expect(input_type['admin' => 'false']).to eql(admin: false)
237
- end
238
-
239
- it 'supports each rule' do
240
- rule_ast = [
241
- [
242
- :and, [
243
- [:val, p(:key?, :author)],
244
- [:set, [
245
- [:and, [
246
- [:val, p(:key?, :books)],
247
- [
248
- :each, [
249
- :set, [
250
- [
251
- :and, [
252
- [:val, p(:key?, :published)],
253
- [:key, [:published, p(:bool?, [])]]
254
- ]
255
- ]
256
- ]
257
- ]
258
- ]
259
- ]]
260
- ]]
261
- ]
262
- ]
263
- ]
264
-
265
- input_type = compiler.(rule_ast)
266
-
267
- expect(input_type['author' => { 'books' => [{ 'published' => 'true' }] }]).to eql(
268
- author: { books: [published: true] }
269
- )
270
-
271
- expect(input_type['author' => { 'books' => [{ 'published' => 'false' }] }]).to eql(
272
- author: { books: [published: false] }
273
- )
274
- end
275
-
276
- it 'supports array? with an each rule' do
277
- rule_ast = [
278
- [
279
- :and, [
280
- [:val, p(:key?, :ids)],
281
- [:and, [
282
- [:key, [:ids, p(:array?, [])]],
283
- [:each, [:val, p(:int?, [])]]
284
- ]]
285
- ]
286
- ]
287
- ]
288
-
289
- input_type = compiler.(rule_ast)
290
-
291
- expect(input_type.('ids' => 'oops')).to eql(ids: 'oops')
292
-
293
- expect(input_type.('ids' => %w(1 2 3))).to eql(ids: [1, 2, 3])
294
- end
295
-
296
- it 'supports hash? with a set rule' do
297
- rule_ast = [
298
- [
299
- :and, [
300
- [:val, p(:key?, :address)],
301
- [
302
- :and, [
303
- [:key, [:address, p(:hash?, [])]],
304
- [
305
- :set, [
306
- [
307
- :and, [
308
- [:val, p(:key?, :street)],
309
- [:key, [:street, p(:filled?, [])]]
310
- ]
311
- ]
312
- ]
313
- ]
314
- ]
315
- ]
316
- ]
317
- ]
318
- ]
319
-
320
- input_type = compiler.(rule_ast)
321
-
322
- expect(input_type.('address' => 'oops')).to eql(address: 'oops')
323
-
324
- expect(input_type.('address' => { 'street' => 'ok' })).to eql(
325
- address: { street: 'ok' }
326
- )
327
- end
328
- end
@@ -1,38 +0,0 @@
1
- RSpec.describe Dry::Validation::MessageCompiler, '#visit_failure' do
2
- include_context :message_compiler
3
-
4
- let(:visitor) { :visit_failure }
5
-
6
- context 'with :int? predicate' do
7
- let(:node) do
8
- [:age, [:key, [:age, [:predicate, [:int?, [[:input, '17']]]]]]]
9
- end
10
-
11
- it 'returns a message for :int? failure with :rule name inferred from key-rule' do
12
- expect(result.rule).to be(:age)
13
- expect(result.path).to eql([:age])
14
- expect(result).to eql('must be an integer')
15
- end
16
- end
17
-
18
- context 'with set failure and :int? predicate' do
19
- let(:node) do
20
- [:items, [:key, [:items, [:set, [
21
- [:key, [0, [:predicate, [:int?, [[:input, 'foo']]]]]],
22
- [:key, [2, [:predicate, [:int?, [[:input, 'bar']]]]]]
23
- ]]]]]
24
- end
25
-
26
- it 'returns a message for the first element that failed' do
27
- expect(result[0].rule).to be(:items)
28
- expect(result[0].path).to eql([:items, 0])
29
- expect(result[0]).to eql('must be an integer')
30
- end
31
-
32
- it 'returns a message for the third element that failed' do
33
- expect(result[1].rule).to be(:items)
34
- expect(result[1].path).to eql([:items, 2])
35
- expect(result[1]).to eql('must be an integer')
36
- end
37
- end
38
- end
@@ -1,16 +0,0 @@
1
- RSpec.describe Dry::Validation::MessageCompiler, '#visit' do
2
- include_context :message_compiler
3
-
4
- let(:visitor) { :visit }
5
-
6
- context 'with an anonymous :failure' do
7
- let(:node) do
8
- [:failure, [:age, [:key, [:age, [:predicate, [:int?, [[:input, '17']]]]]]]]
9
- end
10
-
11
- it 'returns a message for :int? failure with :rule name inferred from key-rule' do
12
- expect(result.rule).to be(:age)
13
- expect(result).to eql('must be an integer')
14
- end
15
- end
16
- end
@@ -1,7 +0,0 @@
1
- RSpec.describe MessageCompiler, '#call' do
2
- subject(:message_compiler) { MessageCompiler.new( Messages.default ) }
3
-
4
- it 'returns an empty hash when there are no errors' do
5
- expect(message_compiler.([])).to be_empty
6
- end
7
- end
@@ -1,34 +0,0 @@
1
- require 'dry/validation/predicate_registry'
2
-
3
- RSpec.describe PredicateRegistry do
4
- subject!(:predicate_registry) { schema_class.registry }
5
-
6
- let(:schema_class) { Class.new(Schema) }
7
- let(:schema) { schema_class.new }
8
-
9
- before do
10
- schema_class.class_eval { def dis_ok?; true; end }
11
- end
12
-
13
- describe '.[]' do
14
- it 'returns a registry which collects predicate methods' do
15
- expect(predicate_registry[:dis_ok?]).to be_instance_of(UnboundMethod)
16
- end
17
- end
18
-
19
- describe '#[]' do
20
- it 'gives access to built-in predicates' do
21
- expect(predicate_registry[:filled?].("sutin")).to be(true)
22
- end
23
- end
24
-
25
- describe '#bind' do
26
- it 'binds unbound predicates and return finalized registry' do
27
- registry = predicate_registry.bind(schema)
28
-
29
- expect(registry).to be_frozen
30
- expect(registry[:dis_ok?]).to be_a(Method)
31
- expect(registry[:dis_ok?].()).to be(true)
32
- end
33
- end
34
- end
@@ -1,38 +0,0 @@
1
- RSpec.describe Schema::Key do
2
- include_context 'predicate helper'
3
-
4
- let(:registry) { PredicateRegistry.new(predicates) }
5
-
6
- describe '#str?' do
7
- subject(:user) { Schema::Key[:user, registry: registry] }
8
-
9
- it 'returns a key rule' do
10
- expect(user.str?.to_ast).to eql(
11
- [:rule, [:user, [:key, [:user, [:predicate, [:str?, [[:input, Undefined]]]]]]]]
12
- )
13
- end
14
-
15
- it 'returns a key rule & disjunction rule created within the block' do
16
- user.hash? do
17
- required(:email) { none? | filled? }
18
- end
19
-
20
- expect(user.to_ast).to eql(
21
- [:key, [:user, [:rule, [:user,
22
- [:and, [
23
- [:rule, [:user, [:predicate, [:hash?, [[:input, Undefined]]]]]],
24
- [:rule, [:user, [:key, [:user, [:rule, [:email,
25
- [:and, [
26
- [:rule, [:email, [:predicate, [:key?, [[:name, :email], [:input, Undefined]]]]]],
27
- [:rule, [:user, [:rule, [:email,
28
- [:or, [
29
- [:rule, [:email, [:key, [:email, [:predicate, [:none?, [[:input, Undefined]]]]]]]],
30
- [:rule, [:email, [:key, [:email, [:predicate, [:filled?, [[:input, Undefined]]]]]]]]
31
- ]]]]]]
32
- ]]]]]]]
33
- ]]]
34
- ]]]]
35
- )
36
- end
37
- end
38
- end
@@ -1,42 +0,0 @@
1
- RSpec.describe Schema::Rule do
2
- include_context 'predicate helper'
3
-
4
- let(:filled) { p(:filled?) }
5
- let(:format) { p(:format?, /regex/) }
6
-
7
- let(:left) { Schema::Rule.new(filled, name: :email, target: target) }
8
- let(:right) { Schema::Rule.new(format, name: :email, target: target) }
9
- let(:target) { double(:target, id: :user) }
10
-
11
- describe '#and' do
12
- it 'returns a conjunction' do
13
- expect(left.and(right).to_ast).to match_array(
14
- [:rule, [:email, [:and, [[:rule, [:email, filled]], [:rule, [:email, format]]]]]]
15
- )
16
- end
17
- end
18
-
19
- describe '#or' do
20
- it 'returns a disjunction' do
21
- expect(left.or(right).to_ast).to match_array(
22
- [:rule, [:email, [:or, [[:rule, [:email, filled]], [:rule, [:email, format]]]]]]
23
- )
24
- end
25
- end
26
-
27
- describe '#xor' do
28
- it 'returns an exclusive disjunction' do
29
- expect(left.xor(right).to_ast).to match_array(
30
- [:rule, [:email, [:xor, [[:rule, [:email, filled]], [:rule, [:email, format]]]]]]
31
- )
32
- end
33
- end
34
-
35
- describe '#then' do
36
- it 'returns an implication' do
37
- expect(left.then(right).to_ast).to match_array(
38
- [:rule, [:email, [:implication, [[:rule, [:email, filled]], [:rule, [:email, format]]]]]]
39
- )
40
- end
41
- end
42
- end
@@ -1,131 +0,0 @@
1
- RSpec.describe Schema::Value do
2
- include_context 'rule compiler'
3
- include_context 'predicate helper'
4
-
5
- let(:registry) { PredicateRegistry.new(predicates) }
6
-
7
- describe '#required' do
8
- subject(:value) { Schema::Value.new(registry: registry) }
9
-
10
- let(:expected_ast) do
11
- [:rule, [:address, [:and, [
12
- [:rule, [:address, [:predicate, [:key?, [[:name, :address], [:input, Undefined]]]]]],
13
- [:rule, [:address, [:key, [:address, [:predicate, [:filled?, [[:input, Undefined]]]]]]]]
14
- ]]]]
15
- end
16
-
17
- it 'creates a rule for a specified key using a block' do
18
- rule = value.required(:address, &:filled?)
19
- expect(rule.to_ast).to eql(expected_ast)
20
- end
21
-
22
- it 'creates a rule for a specified key using a macro' do
23
- rule = value.required(:address).filled
24
- expect(rule.to_ast).to eql(expected_ast)
25
- end
26
- end
27
-
28
- describe '#each' do
29
- subject(:value) { Schema::Value.new(registry: registry) }
30
-
31
- it 'creates an each rule with another rule returned from the block' do
32
- rule = value.each { key?(:method) }
33
-
34
- expect(rule.to_ast).to eql(
35
- [:and, [
36
- [:predicate, [:array?, [[:input, Undefined]]]],
37
- [:each, [:predicate, [:key?, [[:name, :method], [:input, Undefined]]]]]
38
- ]]
39
- )
40
- end
41
-
42
- it 'creates an each rule with other rules returned from the block' do
43
- rule = value.each do
44
- required(:method) { str? }
45
- required(:amount) { float? }
46
- end
47
-
48
- expect(rule.to_ast).to eql(
49
- [:and, [
50
- [:predicate, [:array?, [[:input, Undefined]]]],
51
- [:each, [:set, [
52
- [:rule, [:method, [:and, [
53
- [:rule, [:method, [:predicate, [:key?, [[:name, :method], [:input, Undefined]]]]]],
54
- [:rule, [:method, [:key, [:method, [:predicate, [:str?, [[:input, Undefined]]]]]]]]]
55
- ]]],
56
- [:rule, [:amount, [:and, [
57
- [:rule, [:amount, [:predicate, [:key?, [[:name, :amount], [:input, Undefined]]]]]],
58
- [:rule, [:amount, [:key, [:amount, [:predicate, [:float?, [[:input, Undefined]]]]]]]]
59
- ]]]]
60
- ]]]
61
- ]]
62
- )
63
- end
64
- end
65
-
66
- describe '#hash? with block' do
67
- subject(:user) { Schema::Value.new(registry: registry) }
68
-
69
- it 'builds hash? & rule created within the block' do
70
- rule = user.hash? { required(:email).filled }
71
-
72
- expect(rule.to_ast).to eql(
73
- [:and, [
74
- [:predicate, [:hash?, [[:input, Undefined]]]],
75
- [:rule, [:email, [:and, [
76
- [:rule, [:email, [:predicate, [:key?, [[:name, :email], [:input, Undefined]]]]]],
77
- [:rule, [:email, [:key, [:email, [:predicate, [:filled?, [[:input, Undefined]]]]]]]]
78
- ]]]]
79
- ]]
80
- )
81
- end
82
-
83
- it 'builds hash? & rule created within the block with deep nesting' do
84
- rule = user.hash? do
85
- required(:address) do
86
- hash? do
87
- required(:city).filled
88
- required(:zipcode).filled
89
- end
90
- end
91
- end
92
-
93
- expect(rule.to_ast).to eql(
94
- [:and, [
95
- [:predicate, [:hash?, [[:input, Undefined]]]],
96
- [:rule, [:address, [:and, [
97
- [:rule, [:address, [:predicate, [:key?, [[:name, :address], [:input, Undefined]]]]]],
98
- [:rule, [:address, [:and, [
99
- [:rule, [:address, [:predicate, [:hash?, [[:input, Undefined]]]]]],
100
- [:rule, [:address, [:key, [:address, [:set, [
101
- [:rule, [:city, [:and, [
102
- [:rule, [:city, [:predicate, [:key?, [[:name, :city], [:input, Undefined]]]]]],
103
- [:rule, [:city, [:key, [:city, [:predicate, [:filled?, [[:input, Undefined]]]]]]]]
104
- ]]]],
105
- [:rule, [:zipcode, [:and, [
106
- [:rule, [:zipcode, [:predicate, [:key?, [[:name, :zipcode], [:input, Undefined]]]]]],
107
- [:rule, [:zipcode, [:key, [:zipcode, [:predicate, [:filled?, [[:input, Undefined]]]]]]]]
108
- ]]]]
109
- ]]]]]]
110
- ]]]]
111
- ]]]]
112
- ]]
113
- )
114
- end
115
- end
116
-
117
- describe '#not' do
118
- subject(:user) { Schema::Value.new(registry: registry) }
119
-
120
- it 'builds a negated rule' do
121
- not_email = user.required(:email) { str?.not }
122
-
123
- expect(not_email.to_ast).to eql(
124
- [:rule, [:email, [:and, [
125
- [:rule, [:email, [:predicate, [:key?, [[:name, :email], [:input, Undefined]]]]]],
126
- [:rule, [:email, [:not, [:key, [:email, [:predicate, [:str?, [[:input, Undefined]]]]]]]]]]
127
- ]]]
128
- )
129
- end
130
- end
131
- end
@@ -1,35 +0,0 @@
1
- require 'dry/validation/messages/i18n'
2
-
3
- RSpec.describe Schema do
4
- describe '.messages' do
5
- context 'with default setting' do
6
- let(:schema) do
7
- Class.new(Schema)
8
- end
9
-
10
- it 'returns default yaml messages' do
11
- expect(schema.messages).to be_instance_of(Messages::YAML)
12
- end
13
- end
14
-
15
- context 'with i18n setting' do
16
- let(:schema) do
17
- Class.new(Schema) { configure { config.messages = :i18n } }
18
- end
19
-
20
- it 'returns default i18n messages' do
21
- expect(schema.messages).to be_instance_of(Messages::I18n)
22
- end
23
- end
24
-
25
- context 'with an invalid setting' do
26
- let(:schema) do
27
- Class.new(Schema) { configure { config.messages = :oops } }
28
- end
29
-
30
- it 'returns default i18n messages' do
31
- expect { schema.messages }.to raise_error(RuntimeError, /oops/)
32
- end
33
- end
34
- end
35
- end