dry-validation 0.8.0 → 0.9.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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +39 -1
- data/benchmarks/benchmark_schema_invalid_huge.rb +52 -0
- data/benchmarks/profile_schema_huge_invalid.rb +30 -0
- data/config/errors.yml +3 -2
- data/dry-validation.gemspec +2 -2
- data/lib/dry/validation.rb +20 -32
- data/lib/dry/validation/constants.rb +6 -0
- data/lib/dry/validation/error.rb +5 -2
- data/lib/dry/validation/error_compiler.rb +46 -116
- data/lib/dry/validation/executor.rb +105 -0
- data/lib/dry/validation/hint_compiler.rb +36 -68
- data/lib/dry/validation/message.rb +86 -0
- data/lib/dry/validation/message_compiler.rb +141 -0
- data/lib/dry/validation/message_set.rb +70 -0
- data/lib/dry/validation/messages/abstract.rb +1 -1
- data/lib/dry/validation/messages/i18n.rb +5 -0
- data/lib/dry/validation/predicate_registry.rb +8 -3
- data/lib/dry/validation/result.rb +6 -7
- data/lib/dry/validation/schema.rb +21 -227
- data/lib/dry/validation/schema/check.rb +1 -1
- data/lib/dry/validation/schema/class_interface.rb +193 -0
- data/lib/dry/validation/schema/deprecated.rb +1 -2
- data/lib/dry/validation/schema/key.rb +4 -0
- data/lib/dry/validation/schema/value.rb +12 -7
- data/lib/dry/validation/schema_compiler.rb +20 -1
- data/lib/dry/validation/type_specs.rb +70 -0
- data/lib/dry/validation/version.rb +1 -1
- data/spec/fixtures/locales/pl.yml +1 -1
- data/spec/integration/custom_predicates_spec.rb +37 -0
- data/spec/integration/error_compiler_spec.rb +39 -39
- data/spec/integration/form/predicates/key_spec.rb +10 -18
- data/spec/integration/form/predicates/size/fixed_spec.rb +8 -12
- data/spec/integration/form/predicates/size/range_spec.rb +7 -7
- data/spec/integration/hints_spec.rb +17 -0
- data/spec/integration/messages/i18n_spec.rb +2 -2
- data/spec/integration/schema/check_rules_spec.rb +2 -2
- data/spec/integration/schema/defining_base_schema_spec.rb +38 -0
- data/spec/integration/schema/dynamic_predicate_args_spec.rb +18 -0
- data/spec/integration/schema/macros/each_spec.rb +2 -2
- data/spec/integration/schema/macros/input_spec.rb +102 -10
- data/spec/integration/schema/macros/maybe_spec.rb +30 -0
- data/spec/integration/schema/nested_schemas_spec.rb +200 -0
- data/spec/integration/schema/nested_values_spec.rb +3 -1
- data/spec/integration/schema/option_with_default_spec.rb +54 -20
- data/spec/integration/schema/predicates/size/fixed_spec.rb +10 -10
- data/spec/integration/schema/predicates/size/range_spec.rb +8 -10
- data/spec/unit/error_compiler_spec.rb +1 -1
- data/spec/unit/hint_compiler_spec.rb +2 -2
- metadata +18 -7
- data/examples/rule_ast.rb +0 -25
- data/lib/dry/validation/error_compiler/input.rb +0 -135
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-validation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Holland
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-07-
|
12
|
+
date: 2016-07-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: concurrent-ruby
|
@@ -165,8 +165,7 @@ description:
|
|
165
165
|
email:
|
166
166
|
- andyholland1991@aol.com
|
167
167
|
- piotr.solnica@gmail.com
|
168
|
-
executables:
|
169
|
-
- console
|
168
|
+
executables: []
|
170
169
|
extensions: []
|
171
170
|
extra_rdoc_files: []
|
172
171
|
files:
|
@@ -181,12 +180,13 @@ files:
|
|
181
180
|
- Rakefile
|
182
181
|
- benchmarks/benchmark_form_invalid.rb
|
183
182
|
- benchmarks/benchmark_form_valid.rb
|
183
|
+
- benchmarks/benchmark_schema_invalid_huge.rb
|
184
184
|
- benchmarks/profile_schema_call_invalid.rb
|
185
185
|
- benchmarks/profile_schema_call_valid.rb
|
186
186
|
- benchmarks/profile_schema_definition.rb
|
187
|
+
- benchmarks/profile_schema_huge_invalid.rb
|
187
188
|
- benchmarks/profile_schema_messages_invalid.rb
|
188
189
|
- benchmarks/suite.rb
|
189
|
-
- bin/console
|
190
190
|
- config/errors.yml
|
191
191
|
- dry-validation.gemspec
|
192
192
|
- examples/basic.rb
|
@@ -194,18 +194,21 @@ files:
|
|
194
194
|
- examples/form.rb
|
195
195
|
- examples/json.rb
|
196
196
|
- examples/nested.rb
|
197
|
-
- examples/rule_ast.rb
|
198
197
|
- lib/dry-validation.rb
|
199
198
|
- lib/dry/validation.rb
|
199
|
+
- lib/dry/validation/constants.rb
|
200
200
|
- lib/dry/validation/deprecations.rb
|
201
201
|
- lib/dry/validation/error.rb
|
202
202
|
- lib/dry/validation/error_compiler.rb
|
203
|
-
- lib/dry/validation/
|
203
|
+
- lib/dry/validation/executor.rb
|
204
204
|
- lib/dry/validation/hint_compiler.rb
|
205
205
|
- lib/dry/validation/input_processor_compiler.rb
|
206
206
|
- lib/dry/validation/input_processor_compiler/form.rb
|
207
207
|
- lib/dry/validation/input_processor_compiler/json.rb
|
208
208
|
- lib/dry/validation/input_processor_compiler/sanitizer.rb
|
209
|
+
- lib/dry/validation/message.rb
|
210
|
+
- lib/dry/validation/message_compiler.rb
|
211
|
+
- lib/dry/validation/message_set.rb
|
209
212
|
- lib/dry/validation/messages.rb
|
210
213
|
- lib/dry/validation/messages/abstract.rb
|
211
214
|
- lib/dry/validation/messages/i18n.rb
|
@@ -215,6 +218,7 @@ files:
|
|
215
218
|
- lib/dry/validation/result.rb
|
216
219
|
- lib/dry/validation/schema.rb
|
217
220
|
- lib/dry/validation/schema/check.rb
|
221
|
+
- lib/dry/validation/schema/class_interface.rb
|
218
222
|
- lib/dry/validation/schema/deprecated.rb
|
219
223
|
- lib/dry/validation/schema/dsl.rb
|
220
224
|
- lib/dry/validation/schema/form.rb
|
@@ -223,6 +227,7 @@ files:
|
|
223
227
|
- lib/dry/validation/schema/rule.rb
|
224
228
|
- lib/dry/validation/schema/value.rb
|
225
229
|
- lib/dry/validation/schema_compiler.rb
|
230
|
+
- lib/dry/validation/type_specs.rb
|
226
231
|
- lib/dry/validation/version.rb
|
227
232
|
- log/.gitkeep
|
228
233
|
- spec/fixtures/locales/en.yml
|
@@ -264,6 +269,8 @@ files:
|
|
264
269
|
- spec/integration/schema/check_rules_spec.rb
|
265
270
|
- spec/integration/schema/check_with_nested_el_spec.rb
|
266
271
|
- spec/integration/schema/check_with_nth_el_spec.rb
|
272
|
+
- spec/integration/schema/defining_base_schema_spec.rb
|
273
|
+
- spec/integration/schema/dynamic_predicate_args_spec.rb
|
267
274
|
- spec/integration/schema/each_with_set_spec.rb
|
268
275
|
- spec/integration/schema/extending_dsl_spec.rb
|
269
276
|
- spec/integration/schema/form/explicit_types_spec.rb
|
@@ -280,6 +287,7 @@ files:
|
|
280
287
|
- spec/integration/schema/macros/maybe_spec.rb
|
281
288
|
- spec/integration/schema/macros/value_spec.rb
|
282
289
|
- spec/integration/schema/macros/when_spec.rb
|
290
|
+
- spec/integration/schema/nested_schemas_spec.rb
|
283
291
|
- spec/integration/schema/nested_values_spec.rb
|
284
292
|
- spec/integration/schema/not_spec.rb
|
285
293
|
- spec/integration/schema/numbers_spec.rb
|
@@ -394,6 +402,8 @@ test_files:
|
|
394
402
|
- spec/integration/schema/check_rules_spec.rb
|
395
403
|
- spec/integration/schema/check_with_nested_el_spec.rb
|
396
404
|
- spec/integration/schema/check_with_nth_el_spec.rb
|
405
|
+
- spec/integration/schema/defining_base_schema_spec.rb
|
406
|
+
- spec/integration/schema/dynamic_predicate_args_spec.rb
|
397
407
|
- spec/integration/schema/each_with_set_spec.rb
|
398
408
|
- spec/integration/schema/extending_dsl_spec.rb
|
399
409
|
- spec/integration/schema/form/explicit_types_spec.rb
|
@@ -410,6 +420,7 @@ test_files:
|
|
410
420
|
- spec/integration/schema/macros/maybe_spec.rb
|
411
421
|
- spec/integration/schema/macros/value_spec.rb
|
412
422
|
- spec/integration/schema/macros/when_spec.rb
|
423
|
+
- spec/integration/schema/nested_schemas_spec.rb
|
413
424
|
- spec/integration/schema/nested_values_spec.rb
|
414
425
|
- spec/integration/schema/not_spec.rb
|
415
426
|
- spec/integration/schema/numbers_spec.rb
|
data/examples/rule_ast.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'dry-validation'
|
2
|
-
|
3
|
-
ast = [
|
4
|
-
[
|
5
|
-
:and,
|
6
|
-
[
|
7
|
-
[:key, [:age, [:predicate, [:key?, []]]]],
|
8
|
-
[
|
9
|
-
:and,
|
10
|
-
[
|
11
|
-
[:val, [:age, [:predicate, [:filled?, []]]]],
|
12
|
-
[:val, [:age, [:predicate, [:gt?, [18]]]]]
|
13
|
-
]
|
14
|
-
]
|
15
|
-
]
|
16
|
-
]
|
17
|
-
]
|
18
|
-
|
19
|
-
compiler = Dry::Validation::RuleCompiler.new(Dry::Validation::Predicates)
|
20
|
-
|
21
|
-
rules = compiler.call(ast)
|
22
|
-
|
23
|
-
puts rules.inspect
|
24
|
-
|
25
|
-
puts rules.map(&:to_ary).inspect
|
@@ -1,135 +0,0 @@
|
|
1
|
-
require 'dry/validation/deprecations'
|
2
|
-
|
3
|
-
module Dry
|
4
|
-
module Validation
|
5
|
-
Message = Struct.new(:rule, :predicate, :text) do
|
6
|
-
def to_s
|
7
|
-
text
|
8
|
-
end
|
9
|
-
|
10
|
-
def signature
|
11
|
-
@signature ||= [rule, predicate].hash
|
12
|
-
end
|
13
|
-
|
14
|
-
def eql?(other)
|
15
|
-
other.is_a?(String) ? text == other : super
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class ErrorCompiler::Input < ErrorCompiler
|
20
|
-
include Deprecations
|
21
|
-
|
22
|
-
attr_reader :name, :input, :rule, :val_type
|
23
|
-
|
24
|
-
def initialize(messages, options)
|
25
|
-
super
|
26
|
-
@name = options.fetch(:name)
|
27
|
-
@input = options.fetch(:input)
|
28
|
-
@rule = Array(name).last
|
29
|
-
@val_type = input.class
|
30
|
-
end
|
31
|
-
|
32
|
-
def visit_each(node)
|
33
|
-
node.map { |el| visit(el) }
|
34
|
-
end
|
35
|
-
|
36
|
-
def visit_set(node, *)
|
37
|
-
result = node.map do |input|
|
38
|
-
visit(input)
|
39
|
-
end
|
40
|
-
merge(result)
|
41
|
-
end
|
42
|
-
|
43
|
-
def visit_el(node)
|
44
|
-
idx, el = node
|
45
|
-
path = [*Array(name), idx]
|
46
|
-
input_visitor(path, input[idx]).visit(el)
|
47
|
-
end
|
48
|
-
|
49
|
-
def visit_check(node)
|
50
|
-
_, other = node
|
51
|
-
visit(other)
|
52
|
-
end
|
53
|
-
|
54
|
-
def visit_predicate(node)
|
55
|
-
predicate, args = node
|
56
|
-
|
57
|
-
lookup_options = options.merge(
|
58
|
-
rule: rule, val_type: val_type, arg_type: args.size > 0 && args[0][1].class
|
59
|
-
)
|
60
|
-
|
61
|
-
tokens = options_for(predicate, args)
|
62
|
-
template = messages[predicate, lookup_options.merge(tokens)]
|
63
|
-
|
64
|
-
unless template
|
65
|
-
raise MissingMessageError.new("message for #{predicate} was not found")
|
66
|
-
end
|
67
|
-
|
68
|
-
rule_name =
|
69
|
-
if rule.is_a?(Symbol)
|
70
|
-
messages.rule(rule, lookup_options) || rule
|
71
|
-
else
|
72
|
-
rule
|
73
|
-
end
|
74
|
-
|
75
|
-
text =
|
76
|
-
if full?
|
77
|
-
"#{rule_name || tokens[:name]} #{template % tokens}"
|
78
|
-
else
|
79
|
-
template % tokens
|
80
|
-
end
|
81
|
-
|
82
|
-
*arg_vals, _ = args.map(&:last)
|
83
|
-
message = Message.new(rule, [predicate, arg_vals], text)
|
84
|
-
path = [[message], *[tokens[:name], *Array(name).reverse].uniq]
|
85
|
-
|
86
|
-
path.reduce { |a, e| { e => a } }
|
87
|
-
end
|
88
|
-
|
89
|
-
def options_for_inclusion?(args)
|
90
|
-
warn 'inclusion is deprecated - use included_in instead.'
|
91
|
-
options_for_included_in?(args)
|
92
|
-
end
|
93
|
-
|
94
|
-
def options_for_exclusion?(args)
|
95
|
-
warn 'exclusion is deprecated - use excluded_from instead.'
|
96
|
-
options_for_excluded_from?(args)
|
97
|
-
end
|
98
|
-
|
99
|
-
def options_for_excluded_from?(args)
|
100
|
-
{ list: args[:list].join(', ') }
|
101
|
-
end
|
102
|
-
|
103
|
-
def options_for_included_in?(args)
|
104
|
-
{ list: args[:list].join(', ') }
|
105
|
-
end
|
106
|
-
|
107
|
-
def options_for_size?(args)
|
108
|
-
size = args[:size]
|
109
|
-
|
110
|
-
if size.is_a?(Range)
|
111
|
-
{ left: size.first, right: size.last }
|
112
|
-
else
|
113
|
-
args
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def options_for(predicate, args)
|
118
|
-
meth = :"options_for_#{predicate}"
|
119
|
-
|
120
|
-
args_map = Hash[args]
|
121
|
-
defaults = { name: rule, rule: rule, value: input }.update(args_map)
|
122
|
-
|
123
|
-
if respond_to?(meth)
|
124
|
-
defaults.merge!(__send__(meth, args_map))
|
125
|
-
end
|
126
|
-
|
127
|
-
defaults
|
128
|
-
end
|
129
|
-
|
130
|
-
def input_visitor(new_name, value)
|
131
|
-
self.class.new(messages, options.merge(name: [*name, *new_name].uniq, input: value))
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|