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