dry-validation 0.13.3 → 1.3.1

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 (206) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +233 -12
  3. data/LICENSE +1 -1
  4. data/README.md +13 -9
  5. data/config/errors.yml +3 -88
  6. data/lib/dry-validation.rb +2 -0
  7. data/lib/dry/validation.rb +47 -28
  8. data/lib/dry/validation/config.rb +24 -0
  9. data/lib/dry/validation/constants.rb +43 -0
  10. data/lib/dry/validation/contract.rb +160 -0
  11. data/lib/dry/validation/contract/class_interface.rb +223 -0
  12. data/lib/dry/validation/evaluator.rb +197 -0
  13. data/lib/dry/validation/extensions/hints.rb +69 -0
  14. data/lib/dry/validation/extensions/monads.rb +23 -7
  15. data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
  16. data/lib/dry/validation/failures.rb +58 -0
  17. data/lib/dry/validation/function.rb +44 -0
  18. data/lib/dry/validation/macro.rb +38 -0
  19. data/lib/dry/validation/macros.rb +104 -0
  20. data/lib/dry/validation/message.rb +79 -79
  21. data/lib/dry/validation/message_set.rb +108 -88
  22. data/lib/dry/validation/messages/resolver.rb +79 -0
  23. data/lib/dry/validation/result.rb +154 -42
  24. data/lib/dry/validation/rule.rb +129 -0
  25. data/lib/dry/validation/schema_ext.rb +46 -0
  26. data/lib/dry/validation/values.rb +94 -0
  27. data/lib/dry/validation/version.rb +3 -1
  28. metadata +41 -336
  29. data/.codeclimate.yml +0 -17
  30. data/.gitignore +0 -9
  31. data/.rspec +0 -3
  32. data/.travis.yml +0 -29
  33. data/CONTRIBUTING.md +0 -31
  34. data/Gemfile +0 -25
  35. data/Rakefile +0 -22
  36. data/benchmarks/benchmark_form_invalid.rb +0 -64
  37. data/benchmarks/benchmark_form_valid.rb +0 -64
  38. data/benchmarks/benchmark_schema_invalid_huge.rb +0 -52
  39. data/benchmarks/profile_schema_call_invalid.rb +0 -20
  40. data/benchmarks/profile_schema_call_valid.rb +0 -20
  41. data/benchmarks/profile_schema_definition.rb +0 -14
  42. data/benchmarks/profile_schema_huge_invalid.rb +0 -30
  43. data/benchmarks/profile_schema_messages_invalid.rb +0 -20
  44. data/benchmarks/suite.rb +0 -5
  45. data/dry-validation.gemspec +0 -28
  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.rb +0 -7
  56. data/lib/dry/validation/extensions/struct.rb +0 -32
  57. data/lib/dry/validation/input_processor_compiler.rb +0 -137
  58. data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
  59. data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
  60. data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
  61. data/lib/dry/validation/message_compiler.rb +0 -188
  62. data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
  63. data/lib/dry/validation/messages.rb +0 -14
  64. data/lib/dry/validation/messages/abstract.rb +0 -119
  65. data/lib/dry/validation/messages/i18n.rb +0 -47
  66. data/lib/dry/validation/messages/namespaced.rb +0 -39
  67. data/lib/dry/validation/messages/yaml.rb +0 -61
  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.rb +0 -126
  71. data/lib/dry/validation/schema/check.rb +0 -37
  72. data/lib/dry/validation/schema/class_interface.rb +0 -190
  73. data/lib/dry/validation/schema/deprecated.rb +0 -30
  74. data/lib/dry/validation/schema/dsl.rb +0 -118
  75. data/lib/dry/validation/schema/form.rb +0 -9
  76. data/lib/dry/validation/schema/json.rb +0 -21
  77. data/lib/dry/validation/schema/key.rb +0 -71
  78. data/lib/dry/validation/schema/params.rb +0 -22
  79. data/lib/dry/validation/schema/rule.rb +0 -202
  80. data/lib/dry/validation/schema/value.rb +0 -211
  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/spec/extensions/monads/result_spec.rb +0 -40
  85. data/spec/extensions/struct/schema_spec.rb +0 -32
  86. data/spec/fixtures/locales/en.yml +0 -8
  87. data/spec/fixtures/locales/pl.yml +0 -22
  88. data/spec/integration/custom_error_messages_spec.rb +0 -54
  89. data/spec/integration/custom_predicates_spec.rb +0 -228
  90. data/spec/integration/hints_spec.rb +0 -170
  91. data/spec/integration/injecting_rules_spec.rb +0 -30
  92. data/spec/integration/json/defining_base_schema_spec.rb +0 -41
  93. data/spec/integration/localized_error_messages_spec.rb +0 -72
  94. data/spec/integration/message_compiler_spec.rb +0 -405
  95. data/spec/integration/messages/i18n_spec.rb +0 -104
  96. data/spec/integration/optional_keys_spec.rb +0 -28
  97. data/spec/integration/params/predicates/array_spec.rb +0 -287
  98. data/spec/integration/params/predicates/empty_spec.rb +0 -263
  99. data/spec/integration/params/predicates/eql_spec.rb +0 -327
  100. data/spec/integration/params/predicates/even_spec.rb +0 -455
  101. data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
  102. data/spec/integration/params/predicates/excludes_spec.rb +0 -391
  103. data/spec/integration/params/predicates/false_spec.rb +0 -455
  104. data/spec/integration/params/predicates/filled_spec.rb +0 -467
  105. data/spec/integration/params/predicates/format_spec.rb +0 -454
  106. data/spec/integration/params/predicates/gt_spec.rb +0 -519
  107. data/spec/integration/params/predicates/gteq_spec.rb +0 -519
  108. data/spec/integration/params/predicates/included_in_spec.rb +0 -455
  109. data/spec/integration/params/predicates/includes_spec.rb +0 -391
  110. data/spec/integration/params/predicates/key_spec.rb +0 -67
  111. data/spec/integration/params/predicates/lt_spec.rb +0 -519
  112. data/spec/integration/params/predicates/lteq_spec.rb +0 -519
  113. data/spec/integration/params/predicates/max_size_spec.rb +0 -391
  114. data/spec/integration/params/predicates/min_size_spec.rb +0 -391
  115. data/spec/integration/params/predicates/none_spec.rb +0 -265
  116. data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
  117. data/spec/integration/params/predicates/odd_spec.rb +0 -455
  118. data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
  119. data/spec/integration/params/predicates/size/range_spec.rb +0 -396
  120. data/spec/integration/params/predicates/true_spec.rb +0 -455
  121. data/spec/integration/params/predicates/type_spec.rb +0 -391
  122. data/spec/integration/result_spec.rb +0 -81
  123. data/spec/integration/schema/array_schema_spec.rb +0 -59
  124. data/spec/integration/schema/check_rules_spec.rb +0 -119
  125. data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
  126. data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
  127. data/spec/integration/schema/default_settings_spec.rb +0 -11
  128. data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
  129. data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
  130. data/spec/integration/schema/each_with_set_spec.rb +0 -70
  131. data/spec/integration/schema/extending_dsl_spec.rb +0 -27
  132. data/spec/integration/schema/form_spec.rb +0 -236
  133. data/spec/integration/schema/hash_schema_spec.rb +0 -47
  134. data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
  135. data/spec/integration/schema/input_processor_spec.rb +0 -46
  136. data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
  137. data/spec/integration/schema/json_spec.rb +0 -163
  138. data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
  139. data/spec/integration/schema/macros/each_spec.rb +0 -268
  140. data/spec/integration/schema/macros/filled_spec.rb +0 -87
  141. data/spec/integration/schema/macros/input_spec.rb +0 -139
  142. data/spec/integration/schema/macros/maybe_spec.rb +0 -99
  143. data/spec/integration/schema/macros/rule_spec.rb +0 -75
  144. data/spec/integration/schema/macros/value_spec.rb +0 -119
  145. data/spec/integration/schema/macros/when_spec.rb +0 -62
  146. data/spec/integration/schema/nested_schemas_spec.rb +0 -236
  147. data/spec/integration/schema/nested_values_spec.rb +0 -46
  148. data/spec/integration/schema/not_spec.rb +0 -34
  149. data/spec/integration/schema/numbers_spec.rb +0 -19
  150. data/spec/integration/schema/option_with_default_spec.rb +0 -64
  151. data/spec/integration/schema/or_spec.rb +0 -87
  152. data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
  153. data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
  154. data/spec/integration/schema/params_spec.rb +0 -234
  155. data/spec/integration/schema/predicate_verification_spec.rb +0 -9
  156. data/spec/integration/schema/predicates/array_spec.rb +0 -295
  157. data/spec/integration/schema/predicates/custom_spec.rb +0 -103
  158. data/spec/integration/schema/predicates/empty_spec.rb +0 -263
  159. data/spec/integration/schema/predicates/eql_spec.rb +0 -327
  160. data/spec/integration/schema/predicates/even_spec.rb +0 -455
  161. data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
  162. data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
  163. data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
  164. data/spec/integration/schema/predicates/filled_spec.rb +0 -467
  165. data/spec/integration/schema/predicates/format_spec.rb +0 -455
  166. data/spec/integration/schema/predicates/gt_spec.rb +0 -519
  167. data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
  168. data/spec/integration/schema/predicates/hash_spec.rb +0 -69
  169. data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
  170. data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
  171. data/spec/integration/schema/predicates/includes_spec.rb +0 -391
  172. data/spec/integration/schema/predicates/key_spec.rb +0 -88
  173. data/spec/integration/schema/predicates/lt_spec.rb +0 -520
  174. data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
  175. data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
  176. data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
  177. data/spec/integration/schema/predicates/none_spec.rb +0 -265
  178. data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
  179. data/spec/integration/schema/predicates/odd_spec.rb +0 -455
  180. data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
  181. data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
  182. data/spec/integration/schema/predicates/type_spec.rb +0 -413
  183. data/spec/integration/schema/reusing_schema_spec.rb +0 -33
  184. data/spec/integration/schema/using_types_spec.rb +0 -135
  185. data/spec/integration/schema/validate_spec.rb +0 -120
  186. data/spec/integration/schema/xor_spec.rb +0 -35
  187. data/spec/integration/schema_builders_spec.rb +0 -17
  188. data/spec/integration/schema_spec.rb +0 -173
  189. data/spec/shared/message_compiler.rb +0 -11
  190. data/spec/shared/predicate_helper.rb +0 -15
  191. data/spec/shared/rule_compiler.rb +0 -8
  192. data/spec/spec_helper.rb +0 -62
  193. data/spec/support/define_struct.rb +0 -25
  194. data/spec/support/matchers.rb +0 -38
  195. data/spec/support/mutant.rb +0 -9
  196. data/spec/support/predicates_integration.rb +0 -7
  197. data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
  198. data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
  199. data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
  200. data/spec/unit/message_compiler/visit_spec.rb +0 -16
  201. data/spec/unit/message_compiler_spec.rb +0 -7
  202. data/spec/unit/predicate_registry_spec.rb +0 -34
  203. data/spec/unit/schema/key_spec.rb +0 -38
  204. data/spec/unit/schema/rule_spec.rb +0 -42
  205. data/spec/unit/schema/value_spec.rb +0 -131
  206. data/spec/unit/schema_spec.rb +0 -35
@@ -1,47 +0,0 @@
1
- RSpec.describe Dry::Validation::Schema, 'for a hash' do
2
- context 'without type specs' do
3
- subject(:schema) do
4
- Dry::Validation.Schema do
5
- hash? do
6
- required(:prefix).filled
7
- required(:value).filled
8
- end
9
- end
10
- end
11
-
12
- it 'applies its rules to array input' do
13
- result = schema.(prefix: 1, value: 123)
14
-
15
- expect(result).to be_success
16
-
17
- result = schema.(prefix: 1, value: nil)
18
-
19
- expect(result.messages).to eql(value: ["must be filled"])
20
- end
21
- end
22
-
23
- context 'with type specs' do
24
- subject(:schema) do
25
- Dry::Validation.Params do
26
- configure { config.type_specs = true }
27
-
28
- hash? do
29
- required(:prefix, :integer).filled
30
- required(:value, :integer).filled
31
- end
32
- end
33
- end
34
-
35
- it 'applies its rules to coerced array input' do
36
- result = schema.(prefix: 1, value: '123')
37
-
38
- expect(result).to be_success
39
-
40
- expect(result.output).to eql(prefix: 1, value: 123)
41
-
42
- result = schema.(prefix: 1, value: nil)
43
-
44
- expect(result.messages).to eql(value: ["must be filled"])
45
- end
46
- end
47
- end
@@ -1,31 +0,0 @@
1
- RSpec.describe 'Inheriting schema' do
2
- subject(:schema) do
3
- Dry::Validation.Schema(base_schema) do
4
- required(:location).schema do
5
- required(:lat).filled(:float?)
6
- required(:lng).filled(:float?)
7
- end
8
- end
9
- end
10
-
11
- let(:base_schema) do
12
- Dry::Validation.Schema do
13
- required(:city).filled
14
- end
15
- end
16
-
17
- it 'inherits rules from parent schema' do
18
- expect(schema.(city: 'NYC', location: { lat: 1.23, lng: 45.6 })).to be_success
19
-
20
- expect(schema.(city: '', location: { lat: 1.23, lng: 45.6 }).messages).to eql(
21
- city: ['must be filled']
22
- )
23
-
24
- expect(schema.(city: 'NYC', location: { lat: nil, lng: '45.6' }).messages).to eql(
25
- location: {
26
- lat: ['must be filled'],
27
- lng: ['must be a float']
28
- }
29
- )
30
- end
31
- end
@@ -1,46 +0,0 @@
1
- RSpec.describe Dry::Validation::Schema, 'setting input processor in schema' do
2
- subject(:schema) do
3
- Dry::Validation.Schema do
4
- configure do
5
- config.input_processor = :sanitizer
6
- end
7
-
8
- required(:email).filled
9
-
10
- required(:age).maybe(:int?, gt?: 18)
11
-
12
- required(:address).schema do
13
- required(:city).filled
14
- required(:street).filled
15
- end
16
-
17
- required(:phone_numbers).each do
18
- required(:prefix).filled
19
- required(:value).filled
20
- end
21
- end
22
- end
23
-
24
- it 'rejects unspecified keys' do
25
- result = schema.(
26
- email: 'jane@doe',
27
- age: 19,
28
- such: 'key',
29
- address: { city: 'NYC', street: 'Street', wow: 'bad' },
30
- phone_numbers: [
31
- { prefix: '48', value: '123' },
32
- { lol: '!!', prefix: '1', value: '312' }
33
- ]
34
- )
35
-
36
- expect(result.output).to eql(
37
- email: 'jane@doe',
38
- age: 19,
39
- address: { city: 'NYC', street: 'Street' },
40
- phone_numbers: [
41
- { prefix: '48', value: '123' },
42
- { prefix: '1', value: '312' }
43
- ]
44
- )
45
- end
46
- end
@@ -1,157 +0,0 @@
1
- RSpec.describe Dry::Validation::Schema::JSON, 'explicit types' do
2
- context 'single type spec without rules' do
3
- subject(:schema) do
4
- Dry::Validation.JSON do
5
- configure { config.type_specs = true }
6
- required(:bdate, :date)
7
- end
8
- end
9
-
10
- it 'uses json coercion' do
11
- expect(schema.('bdate' => '2010-09-08').to_h).to eql(bdate: Date.new(2010, 9, 8))
12
- end
13
- end
14
-
15
- context 'single type spec with rules' do
16
- subject(:schema) do
17
- Dry::Validation.JSON do
18
- configure { config.type_specs = true }
19
- required(:bdate, :date).value(:date?, gt?: Date.new(2009))
20
- end
21
- end
22
-
23
- it 'applies rules to coerced value' do
24
- expect(schema.(bdate: "2010-09-07").messages).to be_empty
25
- expect(schema.(bdate: "2008-01-01").messages).to eql(bdate: ['must be greater than 2009-01-01'])
26
- end
27
- end
28
-
29
- context 'sum type spec without rules' do
30
- subject(:schema) do
31
- Dry::Validation.JSON do
32
- configure { config.type_specs = true }
33
- required(:bdate, [:nil, :date])
34
- end
35
- end
36
-
37
- it 'uses form coercion' do
38
- expect(schema.('bdate' => '2010-09-08').to_h).to eql(bdate: Date.new(2010, 9, 8))
39
- expect(schema.('bdate' => '').to_h).to eql(bdate: nil)
40
- end
41
- end
42
-
43
- context 'sum type spec with rules' do
44
- subject(:schema) do
45
- Dry::Validation.JSON do
46
- configure { config.type_specs = true }
47
- required(:bdate, [:nil, :date]).maybe(:date?, gt?: Date.new(2008))
48
- end
49
- end
50
-
51
- it 'applies rules to coerced value' do
52
- expect(schema.(bdate: nil).messages).to be_empty
53
- expect(schema.(bdate: "2010-09-07").messages).to be_empty
54
- expect(schema.(bdate: "2008-01-01").messages).to eql(bdate: ['must be greater than 2008-01-01'])
55
- end
56
- end
57
-
58
- context 'using a type object' do
59
- subject(:schema) do
60
- Dry::Validation.JSON do
61
- configure { config.type_specs = true }
62
- required(:bdate, Types::JSON::Nil | Types::JSON::Date)
63
- end
64
- end
65
-
66
- it 'uses form coercion' do
67
- expect(schema.('bdate' => '').to_h).to eql(bdate: nil)
68
- expect(schema.('bdate' => '2010-09-08').to_h).to eql(bdate: Date.new(2010, 9, 8))
69
- end
70
- end
71
-
72
- context 'nested schema' do
73
- subject(:schema) do
74
- Dry::Validation.JSON do
75
- configure { config.type_specs = true }
76
-
77
- required(:user).schema do
78
- required(:email, :string)
79
- required(:bdate, :date)
80
-
81
- required(:address).schema do
82
- required(:street, :string)
83
- required(:city, :string)
84
- required(:zipcode, :string)
85
-
86
- required(:location).schema do
87
- required(:lat, :float)
88
- required(:lng, :float)
89
- end
90
- end
91
- end
92
- end
93
- end
94
-
95
- it 'uses form coercion for nested input' do
96
- input = {
97
- 'user' => {
98
- 'email' => 'jane@doe.org',
99
- 'bdate' => '2010-09-08',
100
- 'address' => {
101
- 'street' => 'Street 1',
102
- 'city' => 'NYC',
103
- 'zipcode' => '1234',
104
- 'location' => { 'lat' => 1.23, 'lng' => 4.56 }
105
- }
106
- }
107
- }
108
-
109
- expect(schema.(input).to_h).to eql(
110
- user: {
111
- email: 'jane@doe.org',
112
- bdate: Date.new(2010, 9, 8),
113
- address: {
114
- street: 'Street 1',
115
- city: 'NYC',
116
- zipcode: '1234',
117
- location: { lat: 1.23, lng: 4.56 }
118
- }
119
- }
120
- )
121
- end
122
- end
123
-
124
- context 'nested schema with arrays' do
125
- subject(:schema) do
126
- Dry::Validation.JSON do
127
- configure { config.type_specs = true }
128
-
129
- required(:song).schema do
130
- required(:title, :string)
131
-
132
- required(:tags).each do
133
- schema do
134
- required(:name, :string)
135
- end
136
- end
137
- end
138
- end
139
- end
140
-
141
- it 'uses form coercion for nested input' do
142
- input = {
143
- 'song' => {
144
- 'title' => 'dry-rb is awesome lala',
145
- 'tags' => [{ 'name' => 'red' }, { 'name' => 'blue' }]
146
- }
147
- }
148
-
149
- expect(schema.(input).to_h).to eql(
150
- song: {
151
- title: 'dry-rb is awesome lala',
152
- tags: [{ name: 'red' }, { name: 'blue' }]
153
- }
154
- )
155
- end
156
- end
157
- end
@@ -1,163 +0,0 @@
1
- RSpec.describe Dry::Validation::Schema::JSON, 'defining a schema' do
2
- subject(:schema) do
3
- Dry::Validation.JSON 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: { lat: ['must be a float'], 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 nested schema in a high-level rule' do
122
- subject(:schema) do
123
- Dry::Validation.JSON do
124
- required(:address).maybe(:hash?)
125
-
126
- required(:delivery).filled(:bool?)
127
-
128
- rule(address: [:delivery, :address]) do |delivery, address|
129
- delivery.true?.then(address.schema(AddressSchema))
130
- end
131
- end
132
- end
133
-
134
- before do
135
- AddressSchema = Dry::Validation.JSON do
136
- required(:city).filled
137
- required(:zipcode).filled(:int?)
138
- end
139
- end
140
-
141
- after do
142
- Object.send(:remove_const, :AddressSchema)
143
- end
144
-
145
- it 'succeeds when nested form schema succeeds' do
146
- result = schema.(delivery: true, address: { city: 'NYC', zipcode: 123 })
147
- expect(result).to be_success
148
- end
149
-
150
- it 'does not apply schema when there is no match' do
151
- result = schema.(delivery: false, address: nil)
152
- expect(result).to be_success
153
- end
154
-
155
- it 'fails when nested schema fails' do
156
- result = schema.(delivery: true, address: { city: 'NYC', zipcode: 'foo' })
157
-
158
- expect(result.messages).to eql(
159
- address: { zipcode: ['must be an integer'] }
160
- )
161
- end
162
- end
163
- end
@@ -1,35 +0,0 @@
1
- RSpec.describe 'Macros #confirmation' do
2
- describe 'with a maybe password with min-size specified' do
3
- subject(:schema) do
4
- Dry::Validation.Schema do
5
- configure do
6
- config.input_processor = :sanitizer
7
-
8
- def self.messages
9
- Messages.default.merge(
10
- en: { errors: { password_confirmation: 'does not match' } }
11
- )
12
- end
13
- end
14
-
15
- required(:password).maybe(min_size?: 3).confirmation
16
- end
17
- end
18
-
19
- it 'passes when values are equal' do
20
- expect(schema.(password: 'foo', password_confirmation: 'foo')).to be_success
21
- end
22
-
23
- it 'fails when source value is invalid' do
24
- expect(schema.(password: 'fo', password_confirmation: nil).messages).to eql(
25
- password: ['size cannot be less than 3']
26
- )
27
- end
28
-
29
- it 'fails when values are not equal' do
30
- expect(schema.(password: 'foo', password_confirmation: 'fo').messages).to eql(
31
- password_confirmation: ['does not match']
32
- )
33
- end
34
- end
35
- end