dry-validation 0.12.0 → 1.6.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 (204) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +696 -239
  3. data/LICENSE +1 -1
  4. data/README.md +15 -12
  5. data/config/errors.yml +3 -88
  6. data/dry-validation.gemspec +31 -17
  7. data/lib/dry-validation.rb +3 -1
  8. data/lib/dry/validation.rb +45 -28
  9. data/lib/dry/validation/config.rb +24 -0
  10. data/lib/dry/validation/constants.rb +43 -0
  11. data/lib/dry/validation/contract.rb +171 -0
  12. data/lib/dry/validation/contract/class_interface.rb +230 -0
  13. data/lib/dry/validation/evaluator.rb +224 -0
  14. data/lib/dry/validation/extensions/hints.rb +67 -0
  15. data/lib/dry/validation/extensions/monads.rb +24 -8
  16. data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
  17. data/lib/dry/validation/failures.rb +70 -0
  18. data/lib/dry/validation/function.rb +44 -0
  19. data/lib/dry/validation/macro.rb +38 -0
  20. data/lib/dry/validation/macros.rb +104 -0
  21. data/lib/dry/validation/message.rb +80 -80
  22. data/lib/dry/validation/message_set.rb +80 -105
  23. data/lib/dry/validation/messages/resolver.rb +131 -0
  24. data/lib/dry/validation/result.rb +183 -41
  25. data/lib/dry/validation/rule.rb +135 -0
  26. data/lib/dry/validation/schema_ext.rb +19 -0
  27. data/lib/dry/validation/values.rb +104 -0
  28. data/lib/dry/validation/version.rb +3 -1
  29. metadata +47 -336
  30. data/.codeclimate.yml +0 -17
  31. data/.gitignore +0 -9
  32. data/.rspec +0 -3
  33. data/.travis.yml +0 -26
  34. data/CONTRIBUTING.md +0 -31
  35. data/Gemfile +0 -33
  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.rb +0 -7
  56. data/lib/dry/validation/extensions/struct.rb +0 -32
  57. data/lib/dry/validation/input_processor_compiler.rb +0 -135
  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 -192
  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 -112
  65. data/lib/dry/validation/messages/i18n.rb +0 -35
  66. data/lib/dry/validation/messages/namespaced.rb +0 -32
  67. data/lib/dry/validation/messages/yaml.rb +0 -54
  68. data/lib/dry/validation/predicate_registry.rb +0 -115
  69. data/lib/dry/validation/schema.rb +0 -126
  70. data/lib/dry/validation/schema/check.rb +0 -37
  71. data/lib/dry/validation/schema/class_interface.rb +0 -189
  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_compiler.rb +0 -81
  81. data/lib/dry/validation/type_specs.rb +0 -70
  82. data/spec/extensions/monads/result_spec.rb +0 -40
  83. data/spec/extensions/struct/schema_spec.rb +0 -32
  84. data/spec/fixtures/locales/en.yml +0 -6
  85. data/spec/fixtures/locales/pl.yml +0 -18
  86. data/spec/integration/custom_error_messages_spec.rb +0 -48
  87. data/spec/integration/custom_predicates_spec.rb +0 -228
  88. data/spec/integration/hints_spec.rb +0 -170
  89. data/spec/integration/injecting_rules_spec.rb +0 -30
  90. data/spec/integration/json/defining_base_schema_spec.rb +0 -41
  91. data/spec/integration/localized_error_messages_spec.rb +0 -72
  92. data/spec/integration/message_compiler_spec.rb +0 -405
  93. data/spec/integration/messages/i18n_spec.rb +0 -94
  94. data/spec/integration/optional_keys_spec.rb +0 -28
  95. data/spec/integration/params/predicates/array_spec.rb +0 -287
  96. data/spec/integration/params/predicates/empty_spec.rb +0 -263
  97. data/spec/integration/params/predicates/eql_spec.rb +0 -327
  98. data/spec/integration/params/predicates/even_spec.rb +0 -455
  99. data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
  100. data/spec/integration/params/predicates/excludes_spec.rb +0 -391
  101. data/spec/integration/params/predicates/false_spec.rb +0 -455
  102. data/spec/integration/params/predicates/filled_spec.rb +0 -467
  103. data/spec/integration/params/predicates/format_spec.rb +0 -454
  104. data/spec/integration/params/predicates/gt_spec.rb +0 -519
  105. data/spec/integration/params/predicates/gteq_spec.rb +0 -519
  106. data/spec/integration/params/predicates/included_in_spec.rb +0 -455
  107. data/spec/integration/params/predicates/includes_spec.rb +0 -391
  108. data/spec/integration/params/predicates/key_spec.rb +0 -67
  109. data/spec/integration/params/predicates/lt_spec.rb +0 -519
  110. data/spec/integration/params/predicates/lteq_spec.rb +0 -519
  111. data/spec/integration/params/predicates/max_size_spec.rb +0 -391
  112. data/spec/integration/params/predicates/min_size_spec.rb +0 -391
  113. data/spec/integration/params/predicates/none_spec.rb +0 -265
  114. data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
  115. data/spec/integration/params/predicates/odd_spec.rb +0 -455
  116. data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
  117. data/spec/integration/params/predicates/size/range_spec.rb +0 -396
  118. data/spec/integration/params/predicates/true_spec.rb +0 -455
  119. data/spec/integration/params/predicates/type_spec.rb +0 -391
  120. data/spec/integration/result_spec.rb +0 -81
  121. data/spec/integration/schema/array_schema_spec.rb +0 -59
  122. data/spec/integration/schema/check_rules_spec.rb +0 -119
  123. data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
  124. data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
  125. data/spec/integration/schema/default_settings_spec.rb +0 -11
  126. data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
  127. data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
  128. data/spec/integration/schema/each_with_set_spec.rb +0 -70
  129. data/spec/integration/schema/extending_dsl_spec.rb +0 -27
  130. data/spec/integration/schema/form_spec.rb +0 -236
  131. data/spec/integration/schema/hash_schema_spec.rb +0 -47
  132. data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
  133. data/spec/integration/schema/input_processor_spec.rb +0 -46
  134. data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
  135. data/spec/integration/schema/json_spec.rb +0 -163
  136. data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
  137. data/spec/integration/schema/macros/each_spec.rb +0 -268
  138. data/spec/integration/schema/macros/filled_spec.rb +0 -87
  139. data/spec/integration/schema/macros/input_spec.rb +0 -139
  140. data/spec/integration/schema/macros/maybe_spec.rb +0 -99
  141. data/spec/integration/schema/macros/rule_spec.rb +0 -75
  142. data/spec/integration/schema/macros/value_spec.rb +0 -119
  143. data/spec/integration/schema/macros/when_spec.rb +0 -62
  144. data/spec/integration/schema/nested_schemas_spec.rb +0 -236
  145. data/spec/integration/schema/nested_values_spec.rb +0 -46
  146. data/spec/integration/schema/not_spec.rb +0 -34
  147. data/spec/integration/schema/numbers_spec.rb +0 -19
  148. data/spec/integration/schema/option_with_default_spec.rb +0 -64
  149. data/spec/integration/schema/or_spec.rb +0 -87
  150. data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
  151. data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
  152. data/spec/integration/schema/params_spec.rb +0 -234
  153. data/spec/integration/schema/predicate_verification_spec.rb +0 -9
  154. data/spec/integration/schema/predicates/array_spec.rb +0 -295
  155. data/spec/integration/schema/predicates/custom_spec.rb +0 -103
  156. data/spec/integration/schema/predicates/empty_spec.rb +0 -263
  157. data/spec/integration/schema/predicates/eql_spec.rb +0 -327
  158. data/spec/integration/schema/predicates/even_spec.rb +0 -455
  159. data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
  160. data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
  161. data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
  162. data/spec/integration/schema/predicates/filled_spec.rb +0 -467
  163. data/spec/integration/schema/predicates/format_spec.rb +0 -455
  164. data/spec/integration/schema/predicates/gt_spec.rb +0 -519
  165. data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
  166. data/spec/integration/schema/predicates/hash_spec.rb +0 -69
  167. data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
  168. data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
  169. data/spec/integration/schema/predicates/includes_spec.rb +0 -391
  170. data/spec/integration/schema/predicates/key_spec.rb +0 -88
  171. data/spec/integration/schema/predicates/lt_spec.rb +0 -520
  172. data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
  173. data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
  174. data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
  175. data/spec/integration/schema/predicates/none_spec.rb +0 -265
  176. data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
  177. data/spec/integration/schema/predicates/odd_spec.rb +0 -455
  178. data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
  179. data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
  180. data/spec/integration/schema/predicates/type_spec.rb +0 -413
  181. data/spec/integration/schema/reusing_schema_spec.rb +0 -33
  182. data/spec/integration/schema/using_types_spec.rb +0 -135
  183. data/spec/integration/schema/validate_spec.rb +0 -120
  184. data/spec/integration/schema/xor_spec.rb +0 -35
  185. data/spec/integration/schema_builders_spec.rb +0 -17
  186. data/spec/integration/schema_spec.rb +0 -173
  187. data/spec/shared/message_compiler.rb +0 -11
  188. data/spec/shared/predicate_helper.rb +0 -15
  189. data/spec/shared/rule_compiler.rb +0 -8
  190. data/spec/spec_helper.rb +0 -58
  191. data/spec/support/define_struct.rb +0 -25
  192. data/spec/support/matchers.rb +0 -38
  193. data/spec/support/mutant.rb +0 -9
  194. data/spec/support/predicates_integration.rb +0 -7
  195. data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
  196. data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
  197. data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
  198. data/spec/unit/message_compiler/visit_spec.rb +0 -16
  199. data/spec/unit/message_compiler_spec.rb +0 -7
  200. data/spec/unit/predicate_registry_spec.rb +0 -34
  201. data/spec/unit/schema/key_spec.rb +0 -38
  202. data/spec/unit/schema/rule_spec.rb +0 -42
  203. data/spec/unit/schema/value_spec.rb +0 -131
  204. data/spec/unit/schema_spec.rb +0 -35
@@ -1,211 +0,0 @@
1
- require 'dry/validation/schema/dsl'
2
-
3
- module Dry
4
- module Validation
5
- class Schema
6
- class Value < DSL
7
- attr_reader :type, :schema_class, :schema, :type_map
8
-
9
- def initialize(options = {})
10
- super
11
- @type = options.fetch(:type, :key)
12
- @schema_class = options.fetch(:schema_class, ::Class.new(Schema))
13
- @options = options.merge(type: @type, schema_class: @schema_class)
14
- @type_map = parent && parent.root? ? parent.type_map : {}
15
- end
16
-
17
- def predicates(mod)
18
- @registry = options[:registry] = schema_class.predicates(mod)
19
- end
20
-
21
- def input(*predicates)
22
- schema_class.config.input = predicates
23
- self
24
- end
25
-
26
- def key(name, &block)
27
- warn 'key is deprecated - use required instead.'
28
-
29
- required(name, &block)
30
- end
31
-
32
- def required(name, type_spec = nil, &block)
33
- rule = define(name, Key, &block)
34
-
35
- if type_spec
36
- type_map[name] = type_spec
37
- end
38
-
39
- rule
40
- end
41
-
42
- def schema(other = nil, &block)
43
- @schema = Schema.create_class(self, other, &block)
44
- type_map.update(@schema.type_map)
45
- hash?.and(@schema)
46
- end
47
-
48
- def each(*predicates, &block)
49
- left = array?
50
-
51
- right =
52
- if predicates.size > 0
53
- create_rule([:each, infer_predicates(predicates, new).to_ast])
54
- else
55
- val = Value[
56
- name, registry: registry, schema_class: schema_class.clone
57
- ].instance_eval(&block)
58
-
59
- if val.type_map?
60
- if root?
61
- @type_map = [val.type_map]
62
- else
63
- type_map[name] = [val.type_map]
64
- end
65
- end
66
-
67
- create_rule([:each, val.to_ast])
68
- end
69
-
70
- rule = left.and(right)
71
-
72
- add_rule(rule) if root?
73
-
74
- rule
75
- end
76
-
77
- def when(*predicates, &block)
78
- left = infer_predicates(predicates, Check[path, type: type, registry: registry])
79
- right = Value.new(type: type, registry: registry).instance_eval(&block)
80
-
81
- add_check(left.then(right.to_rule))
82
-
83
- self
84
- end
85
-
86
- def rule(id = nil, **options, &block)
87
- if id
88
- val = Value[id, registry: registry, schema_class: schema_class]
89
- res = val.instance_exec(&block)
90
- else
91
- id, deps = options.to_a.first
92
- val = Value[id, registry: registry, schema_class: schema_class]
93
- res = val.instance_exec(*deps.map { |path| val.value(id, path: path) }, &block)
94
- end
95
-
96
- add_check(val.with(rules: [res.with(name: id, deps: deps || [])]))
97
- end
98
-
99
- def confirmation
100
- conf = :"#{name}_confirmation"
101
-
102
- parent.optional(conf).maybe
103
-
104
- rule(conf => [conf, name]) do |left, right|
105
- left.eql?(right)
106
- end
107
- end
108
-
109
- def value(path, opts = {})
110
- check(name || path, { registry: registry, rules: rules, path: path }.merge(opts))
111
- end
112
-
113
- def check(name, options = {})
114
- Check[name, options.merge(type: type)]
115
- end
116
-
117
- def validate(**opts, &block)
118
- id, *deps = opts.to_a.flatten
119
- name = deps.size > 1 ? id : deps.first
120
- rule = create_rule([:check, [deps, [:custom, [id, block]]]], name).with(deps: deps)
121
- add_check(rule)
122
- end
123
-
124
- def configure(&block)
125
- schema_class.class_eval(&block)
126
- @registry = schema_class.registry
127
- self
128
- end
129
-
130
- def root?
131
- name.nil?
132
- end
133
-
134
- def type_map?
135
- ! type_map.empty?
136
- end
137
-
138
- def schema?
139
- ! @schema.nil?
140
- end
141
-
142
- def class
143
- Value
144
- end
145
-
146
- def new
147
- self.class.new(registry: registry, schema_class: schema_class.clone)
148
- end
149
-
150
- def key?(name)
151
- create_rule(predicate(:key?, name))
152
- end
153
-
154
- def node(input, *args)
155
- if input.is_a?(::Symbol)
156
- registry.ensure_valid_predicate(input, args, schema_class)
157
- [type, [name, predicate(input, args)]]
158
- elsif input.respond_to?(:rule)
159
- [type, [name, [:type, input]]]
160
- elsif input.is_a?(Schema)
161
- [type, [name, schema(input).to_ast]]
162
- else
163
- [type, [name, input.to_ast]]
164
- end
165
- end
166
-
167
- def dyn_arg?(name)
168
- !name.to_s.end_with?('?') && schema_class.instance_methods.include?(name)
169
- end
170
-
171
- def respond_to?(name)
172
- self.class.public_methods.include?(name)
173
- end
174
-
175
- def infer_predicates(predicates, infer_on = self)
176
- predicates.flat_map(&::Kernel.method(:Array)).map { |predicate|
177
- name, *args = ::Kernel.Array(predicate)
178
-
179
- if name.is_a?(Schema)
180
- infer_on.schema(name)
181
- elsif name.respond_to?(:rule)
182
- create_rule(name.rule.to_ast)
183
- else
184
- infer_on.__send__(name, *args)
185
- end
186
- }.reduce(:and)
187
- end
188
-
189
- private
190
-
191
- def method_missing(meth, *args, &block)
192
- return schema_class.instance_method(meth) if dyn_arg?(meth)
193
-
194
- val_rule = create_rule(predicate(meth, args))
195
-
196
- if block
197
- val = new.instance_eval(&block)
198
-
199
- type_map.update(val.type_map) if val.type_map?
200
-
201
- new_rule = create_rule([:and, [val_rule.to_ast, val.to_ast]])
202
-
203
- add_rule(new_rule)
204
- else
205
- val_rule
206
- end
207
- end
208
- end
209
- end
210
- end
211
- end
@@ -1,81 +0,0 @@
1
- require 'dry/logic/rule_compiler'
2
-
3
- module Dry
4
- module Validation
5
- class Guard
6
- attr_reader :rule, :deps
7
-
8
- def initialize(rule, deps)
9
- @rule = rule
10
- @deps = deps
11
- end
12
-
13
- def call(input, results)
14
- rule.(input) if deps_valid?(results)
15
- end
16
-
17
- def with(options)
18
- self.class.new(rule.with(options), deps)
19
- end
20
-
21
- private
22
-
23
- def deps_valid?(results)
24
- deps.all? do |path|
25
- result = nil
26
- Array(path).each do |name|
27
- curr = results[name]
28
- if curr
29
- result = curr.is_a?(Array) ? curr.first.success? : curr.success?
30
- end
31
- end
32
- result
33
- end
34
- end
35
- end
36
-
37
- class SchemaCompiler < Logic::RuleCompiler
38
- attr_reader :schema, :options
39
-
40
- def initialize(*args, options)
41
- super(*args)
42
- @options = options
43
- @schema = predicates.schema
44
- end
45
-
46
- def visit_rule(node)
47
- id, other = node
48
- visit(other).with(id: id)
49
- end
50
-
51
- def visit_predicate(node)
52
- super.eval_args(schema)
53
- end
54
-
55
- def visit_custom(node)
56
- id, predicate = node
57
- Logic::Rule.new(predicate).with(id: id).bind(schema)
58
- end
59
-
60
- def visit_schema(klass)
61
- opt_keys = klass.config.options.keys
62
- opt_vals = options.values_at(*opt_keys).compact
63
-
64
- if opt_vals.empty?
65
- klass.new
66
- else
67
- klass.new(klass.config.rules, Hash[opt_keys.zip(opt_vals)])
68
- end
69
- end
70
-
71
- def visit_guard(node)
72
- deps, other = node
73
- Guard.new(visit(other), deps)
74
- end
75
-
76
- def visit_type(type)
77
- type.rule
78
- end
79
- end
80
- end
81
- end
@@ -1,70 +0,0 @@
1
- module Dry
2
- module Validation
3
- module TypeSpecs
4
- def self.extended(klass)
5
- super
6
- klass.class_eval do
7
- setting :input_processor, :noop
8
- setting :hash_type, :weak
9
- setting :type_map, {}
10
- end
11
- end
12
-
13
- def build_type_map(type_specs, category = config.input_processor)
14
- if type_specs.is_a?(Array)
15
- build_array_type(type_specs[0], category)
16
- else
17
- type_specs.reduce({}) { |res, (name, spec)|
18
- res.update(name => resolve_spec(spec, category))
19
- }
20
- end
21
- end
22
-
23
- def build_hash_type(spec = type_map)
24
- lookup_type("hash", config.input_processor)
25
- .public_send(config.hash_type, spec)
26
- end
27
-
28
- def build_array_type(spec, category)
29
- member_schema = build_type_map(spec, category)
30
- member_type = lookup_type("hash", category)
31
- .public_send(config.hash_type, member_schema)
32
-
33
- lookup_type("array", category).of(member_type)
34
- end
35
-
36
- def build_sum_type(spec, category)
37
- spec
38
- .map { |id| id.is_a?(Symbol) ? lookup_type(id, category) : id }
39
- .reduce(:|)
40
- end
41
-
42
- def resolve_spec(spec, category)
43
- case spec
44
- when Symbol
45
- lookup_type(spec, category)
46
- when Hash
47
- build_hash_type(spec)
48
- when Array
49
- if spec.size == 1
50
- if spec[0].is_a?(Hash)
51
- build_array_type(spec[0], category)
52
- else
53
- array_member = lookup_type(spec[0], category)
54
- lookup_type("array", category).of(array_member)
55
- end
56
- else
57
- build_sum_type(spec, category)
58
- end
59
- else
60
- spec
61
- end
62
- end
63
-
64
- def lookup_type(name, category)
65
- id = "#{category}.#{name}"
66
- Types.type_keys.include?(id) ? Types[id] : Types[name.to_s]
67
- end
68
- end
69
- end
70
- end
@@ -1,40 +0,0 @@
1
- RSpec.describe Dry::Validation::Result do
2
- before { Dry::Validation.load_extensions(:monads) }
3
-
4
- let(:schema) { Dry::Validation.Schema { required(:name).filled(:str?, size?: 2..4) } }
5
-
6
- context 'with valid input' do
7
- let(:input) { { name: 'Jane' } }
8
-
9
- describe '#to_monad' do
10
- it 'returns a Success value' do
11
- monad = result.to_monad
12
-
13
- expect(monad).to be_a Dry::Monads::Result
14
- expect(monad).to be_a_success
15
- expect(monad.value!).to eql(name: 'Jane')
16
- end
17
- end
18
- end
19
-
20
- context 'with invalid input' do
21
- let(:input) { { name: '' } }
22
-
23
- describe '#to_monad' do
24
- it 'returns a Failure value' do
25
- monad = result.to_monad
26
-
27
- expect(monad).to be_a_failure
28
- expect(monad.failure).to eql(name: ['must be filled', 'length must be within 2 - 4'])
29
- end
30
-
31
- it 'returns full messages' do
32
- monad = result.to_monad(full: true)
33
-
34
- expect(monad).to be_a Dry::Monads::Result
35
- expect(monad).to be_a_failure
36
- expect(monad.failure).to eql(name: ['name must be filled', 'name length must be within 2 - 4'])
37
- end
38
- end
39
- end
40
- end
@@ -1,32 +0,0 @@
1
- RSpec.describe Dry::Validation::Schema, 'defining schema using dry struct' do
2
- before do
3
- Dry::Validation.load_extensions(:struct)
4
- end
5
-
6
- subject(:schema) do
7
- Dry::Validation.Schema do
8
- required(:person).filled(Test::Person)
9
- end
10
- end
11
-
12
- before do
13
- class Test::Name < Dry::Struct::Value
14
- attribute :given_name, Dry::Types['strict.string']
15
- attribute :family_name, Dry::Types['strict.string']
16
- end
17
-
18
- class Test::Person < Dry::Struct::Value
19
- attribute :name, Test::Name
20
- end
21
- end
22
-
23
- it 'handles nested structs' do
24
- expect(schema.call(person: { name: { given_name: 'Tim', family_name: 'Cooper' } })).to be_success
25
- end
26
-
27
- it 'fails when input is not valid' do
28
- expect(schema.call(person: { name: { given_name: 'Tim' } }).messages).to eq(
29
- person: { name: { family_name: ['is missing', 'must be String'] } }
30
- )
31
- end
32
- end
@@ -1,6 +0,0 @@
1
- en:
2
- errors:
3
- rules:
4
- email:
5
- filled?: "Please provide your email"
6
- email?: "must be an email"