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,195 +0,0 @@
1
- RSpec.describe Dry::Validation::Schema::Params, 'explicit types' do
2
- context 'single type spec without rules' do
3
- subject(:schema) do
4
- Dry::Validation.Params do
5
- configure { config.type_specs = true }
6
- required(:age, :integer)
7
- end
8
- end
9
-
10
- it 'uses params coercion' do
11
- expect(schema.('age' => '19').to_h).to eql(age: 19)
12
- end
13
- end
14
-
15
- context 'integer' do
16
- subject(:schema) do
17
- Dry::Validation.Params do
18
- configure { config.type_specs = true }
19
- required(:age, :integer)
20
- end
21
- end
22
-
23
- it 'uses params coercion' do
24
- expect(schema.('age' => '19').to_h).to eql(age: 19)
25
- end
26
- end
27
-
28
- context 'single type spec with rules' do
29
- subject(:schema) do
30
- Dry::Validation.Params do
31
- configure { config.type_specs = true }
32
- required(:age, :integer).value(:int?, gt?: 18)
33
- end
34
- end
35
-
36
- it 'applies rules to coerced value' do
37
- expect(schema.(age: 19).messages).to be_empty
38
- expect(schema.(age: 18).messages).to eql(age: ['must be greater than 18'])
39
- end
40
- end
41
-
42
- context 'single type spec with an array' do
43
- subject(:schema) do
44
- Dry::Validation.Params do
45
- configure { config.type_specs = true }
46
- required(:nums, [:integer])
47
- end
48
- end
49
-
50
- it 'uses params coercion' do
51
- expect(schema.(nums: %w(1 2 3)).to_h).to eql(nums: [1, 2, 3])
52
- end
53
- end
54
-
55
- context 'sum type spec without rules' do
56
- subject(:schema) do
57
- Dry::Validation.Params do
58
- configure { config.type_specs = true }
59
- required(:age, [:nil, :integer])
60
- end
61
- end
62
-
63
- it 'uses params coercion' do
64
- expect(schema.('age' => '19').to_h).to eql(age: 19)
65
- expect(schema.('age' => '').to_h).to eql(age: nil)
66
- end
67
- end
68
-
69
- context 'sum type spec with rules' do
70
- subject(:schema) do
71
- Dry::Validation.Params do
72
- configure { config.type_specs = true }
73
- required(:age, [:nil, :integer]).maybe(:int?, gt?: 18)
74
- end
75
- end
76
-
77
- it 'applies rules to coerced value' do
78
- expect(schema.(age: nil).messages).to be_empty
79
- expect(schema.(age: 19).messages).to be_empty
80
- expect(schema.(age: 18).messages).to eql(age: ['must be greater than 18'])
81
- end
82
- end
83
-
84
- context 'using a type object' do
85
- subject(:schema) do
86
- Dry::Validation.Params do
87
- configure { config.type_specs = true }
88
- required(:age, Types::Params::Nil | Types::Params::Integer)
89
- end
90
- end
91
-
92
- it 'uses params coercion' do
93
- expect(schema.('age' => '').to_h).to eql(age: nil)
94
- expect(schema.('age' => '19').to_h).to eql(age: 19)
95
- end
96
- end
97
-
98
- context 'nested schema' do
99
- subject(:schema) do
100
- Dry::Validation.Params do
101
- configure { config.type_specs = true }
102
-
103
- required(:user).schema do
104
- required(:email, :string)
105
- required(:age, :integer)
106
-
107
- required(:address).schema do
108
- required(:street, :string)
109
- required(:city, :string)
110
- required(:zipcode, :string)
111
-
112
- required(:location).schema do
113
- required(:lat, :float)
114
- required(:lng, :float)
115
- end
116
- end
117
- end
118
- end
119
- end
120
-
121
- it 'uses params coercion for nested input' do
122
- input = {
123
- 'user' => {
124
- 'email' => 'jane@doe.org',
125
- 'age' => '21',
126
- 'address' => {
127
- 'street' => 'Street 1',
128
- 'city' => 'NYC',
129
- 'zipcode' => '1234',
130
- 'location' => { 'lat' => '1.23', 'lng' => '4.56' }
131
- }
132
- }
133
- }
134
-
135
- expect(schema.(input).to_h).to eql(
136
- user: {
137
- email: 'jane@doe.org',
138
- age: 21,
139
- address: {
140
- street: 'Street 1',
141
- city: 'NYC',
142
- zipcode: '1234',
143
- location: { lat: 1.23, lng: 4.56 }
144
- }
145
- }
146
- )
147
- end
148
- end
149
-
150
- context 'nested schema with arrays' do
151
- subject(:schema) do
152
- Dry::Validation.Params do
153
- configure { config.type_specs = true }
154
-
155
- required(:song).schema do
156
- required(:title, :string)
157
-
158
- required(:tags).each do
159
- schema do
160
- required(:name, :string)
161
- end
162
- end
163
- end
164
- end
165
- end
166
-
167
- it 'fails to coerce gracefuly' do
168
- result = schema.(song: nil)
169
-
170
- expect(result.messages).to eql(song: ['must be a hash'])
171
- expect(result.to_h).to eql(song: nil)
172
-
173
- result = schema.(song: { tags: nil })
174
-
175
- expect(result.messages).to eql(song: { tags: ['must be an array'] })
176
- expect(result.to_h).to eql(song: { tags: nil })
177
- end
178
-
179
- it 'uses params coercion for nested input' do
180
- input = {
181
- 'song' => {
182
- 'title' => 'dry-rb is awesome lala',
183
- 'tags' => [{ 'name' => 'red' }, { 'name' => 'blue' }]
184
- }
185
- }
186
-
187
- expect(schema.(input).to_h).to eql(
188
- song: {
189
- title: 'dry-rb is awesome lala',
190
- tags: [{ name: 'red' }, { name: 'blue' }]
191
- }
192
- )
193
- end
194
- end
195
- end
@@ -1,234 +0,0 @@
1
- RSpec.describe Dry::Validation::Schema::Params, 'defining a schema' do
2
- subject(:schema) do
3
- Dry::Validation.Params do
4
- configure do
5
- def email?(value)
6
- true
7
- end
8
- end
9
-
10
- required(:email).filled
11
-
12
- required(:age).maybe(:int?, gt?: 18)
13
-
14
- required(:address).schema do
15
- required(:city).filled
16
- required(:street).filled
17
-
18
- required(:loc).schema do
19
- required(:lat).filled(:float?)
20
- required(:lng).filled(:float?)
21
- end
22
- end
23
-
24
- optional(:password).maybe.confirmation
25
-
26
- optional(:phone_number).maybe(:int?, gt?: 0)
27
-
28
- rule(:email_valid) { value(:email).email? }
29
- end
30
- end
31
-
32
- describe '#messages' do
33
- it 'returns compiled error messages' do
34
- result = schema.('email' => '', 'age' => '19')
35
-
36
- expect(result.messages).to eql(
37
- email: ['must be filled'],
38
- address: ['is missing']
39
- )
40
-
41
- expect(result.output).to eql(email: '', age: 19)
42
- end
43
-
44
- it 'returns hints for nested data' do
45
- result = schema.(
46
- 'email' => 'jane@doe.org',
47
- 'age' => '19',
48
- 'address' => {
49
- 'city' => '',
50
- 'street' => 'Street 1/2',
51
- 'loc' => { 'lat' => '123.456', 'lng' => '' }
52
- }
53
- )
54
-
55
- expect(result.messages).to eql(
56
- address: {
57
- loc: { lng: ['must be filled'] },
58
- city: ['must be filled']
59
- }
60
- )
61
- end
62
- end
63
-
64
- describe '#call' do
65
- it 'passes when attributes are valid' do
66
- result = schema.(
67
- 'email' => 'jane@doe.org',
68
- 'age' => '19',
69
- 'address' => {
70
- 'city' => 'NYC',
71
- 'street' => 'Street 1/2',
72
- 'loc' => { 'lat' => '123.456', 'lng' => '456.123' }
73
- }
74
- )
75
-
76
- expect(result).to be_success
77
-
78
- expect(result.output).to eql(
79
- email: 'jane@doe.org', age: 19,
80
- address: {
81
- city: 'NYC', street: 'Street 1/2',
82
- loc: { lat: 123.456, lng: 456.123 }
83
- }
84
- )
85
- end
86
-
87
- it 'validates presence of an email and min age value' do
88
- result = schema.('email' => '', 'age' => '18')
89
-
90
- expect(result.messages).to eql(
91
- address: ['is missing'],
92
- age: ['must be greater than 18'],
93
- email: ['must be filled']
94
- )
95
- end
96
-
97
- it 'handles optionals' do
98
- result = schema.(
99
- 'email' => 'jane@doe.org',
100
- 'age' => '19',
101
- 'phone_number' => '12',
102
- 'address' => {
103
- 'city' => 'NYC',
104
- 'street' => 'Street 1/2',
105
- 'loc' => { 'lat' => '123.456', 'lng' => '456.123' }
106
- }
107
- )
108
-
109
- expect(result).to be_success
110
-
111
- expect(result.output).to eql(
112
- email: 'jane@doe.org', age: 19, phone_number: 12,
113
- address: {
114
- city: 'NYC', street: 'Street 1/2',
115
- loc: { lat: 123.456, lng: 456.123 }
116
- }
117
- )
118
- end
119
- end
120
-
121
- describe 'with an each and nested schema' do
122
- subject(:schema) do
123
- Dry::Validation.Params do
124
- required(:items).each do
125
- schema do
126
- required(:title).filled(:str?)
127
- end
128
- end
129
- end
130
- end
131
-
132
- it 'passes when each element passes schema check' do
133
- expect(schema.(items: [{ title: 'Foo' }])).to be_success
134
- end
135
-
136
- it 'fails when one or more elements did not pass schema check' do
137
- expect(schema.(items: [{ title: 'Foo' }, { title: :Foo }]).messages).to eql(
138
- items: { 1 => { title: ['must be a string'] } }
139
- )
140
- end
141
- end
142
-
143
- describe 'symbolizing keys when coercion fails' do
144
- subject(:schema) do
145
- Dry::Validation.Params do
146
- required(:email).value(size?: 8..60)
147
- required(:birthdate).value(:date?)
148
- required(:age).value(:int?, gt?: 23)
149
- required(:tags).maybe(max_size?: 3)
150
- end
151
- end
152
-
153
- let(:tags) { %(al b c) }
154
-
155
- it 'symbolizes keys and coerces values' do
156
- result = schema.(
157
- 'email' => 'jane@doe.org',
158
- 'birthdate' => '2001-02-03',
159
- 'age' => '24',
160
- 'tags' => tags
161
- ).to_h
162
-
163
- expect(result.to_h).to eql(
164
- email: 'jane@doe.org',
165
- birthdate: Date.new(2001, 2, 3),
166
- age: 24,
167
- tags: tags
168
- )
169
- end
170
-
171
- it 'symbolizes keys even when coercion fails' do
172
- result = schema.(
173
- 'email' => 'jane@doe.org',
174
- 'birthdate' => '2001-sutin-03',
175
- 'age' => ['oops'],
176
- 'tags' => nil
177
- )
178
-
179
- expect(result.to_h).to eql(
180
- email: 'jane@doe.org',
181
- birthdate: '2001-sutin-03',
182
- age: ['oops'],
183
- tags: nil
184
- )
185
-
186
- expect(result.messages).to eql(
187
- birthdate: ['must be a date'],
188
- age: ['must be an integer', 'must be greater than 23']
189
- )
190
- end
191
- end
192
-
193
- describe 'with nested schema in a high-level rule' do
194
- subject(:schema) do
195
- Dry::Validation.Params do
196
- required(:address).maybe(:hash?)
197
-
198
- required(:delivery).filled(:bool?)
199
-
200
- rule(address: [:delivery, :address]) do |delivery, address|
201
- delivery.true?.then(address.schema(AddressSchema))
202
- end
203
- end
204
- end
205
-
206
- before do
207
- AddressSchema = Dry::Validation.Params do
208
- required(:city).filled
209
- required(:zipcode).filled(:int?)
210
- end
211
- end
212
-
213
- after do
214
- Object.send(:remove_const, :AddressSchema)
215
- end
216
-
217
- it 'succeeds when nested params schema succeeds' do
218
- result = schema.(delivery: '1', address: { city: 'NYC', zipcode: '123' })
219
- expect(result).to be_success
220
- end
221
-
222
- it 'does not apply schema when there is no match' do
223
- result = schema.(delivery: '0', address: nil)
224
- expect(result).to be_success
225
- end
226
-
227
- it 'fails when nested schema fails' do
228
- result = schema.(delivery: '1', address: { city: 'NYC', zipcode: 'foo' })
229
- expect(result.messages).to eql(
230
- address: { zipcode: ['must be an integer'] }
231
- )
232
- end
233
- end
234
- end
@@ -1,9 +0,0 @@
1
- RSpec.describe 'Verifying predicates in the DSL' do
2
- it 'raises error when invalid predicate name is used' do
3
- expect { Dry::Validation.Schema { required(:age).value(filled?: 312) } }
4
- .to raise_error(ArgumentError, "filled? predicate arity is invalid")
5
-
6
- expect { Dry::Validation.Schema { required(:age) { none? | filled?(312) } } }
7
- .to raise_error(ArgumentError, "filled? predicate arity is invalid")
8
- end
9
- end