dry-validation 0.4.1 → 0.5.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/CHANGELOG.md +13 -0
- data/LICENSE +1 -1
- data/README.md +9 -9
- data/dry-validation.gemspec +2 -1
- data/lib/dry/validation.rb +1 -0
- data/lib/dry/validation/input_type_compiler.rb +2 -2
- data/lib/dry/validation/schema.rb +7 -6
- data/lib/dry/validation/schema/key.rb +0 -2
- data/lib/dry/validation/version.rb +1 -1
- data/spec/integration/custom_predicates_spec.rb +1 -1
- data/spec/integration/schema_form_spec.rb +0 -2
- data/spec/unit/input_type_compiler_spec.rb +57 -0
- metadata +20 -89
- data/lib/dry/validation/predicate.rb +0 -35
- data/lib/dry/validation/predicate_set.rb +0 -22
- data/lib/dry/validation/predicates.rb +0 -125
- data/lib/dry/validation/rule.rb +0 -90
- data/lib/dry/validation/rule/check.rb +0 -15
- data/lib/dry/validation/rule/composite.rb +0 -63
- data/lib/dry/validation/rule/each.rb +0 -13
- data/lib/dry/validation/rule/group.rb +0 -21
- data/lib/dry/validation/rule/key.rb +0 -17
- data/lib/dry/validation/rule/result.rb +0 -119
- data/lib/dry/validation/rule/set.rb +0 -22
- data/lib/dry/validation/rule/value.rb +0 -13
- data/lib/dry/validation/rule_compiler.rb +0 -81
- data/spec/shared/predicates.rb +0 -35
- data/spec/unit/predicate_spec.rb +0 -27
- data/spec/unit/predicates/bool_spec.rb +0 -34
- data/spec/unit/predicates/date_spec.rb +0 -31
- data/spec/unit/predicates/date_time_spec.rb +0 -31
- data/spec/unit/predicates/decimal_spec.rb +0 -32
- data/spec/unit/predicates/empty_spec.rb +0 -38
- data/spec/unit/predicates/eql_spec.rb +0 -21
- data/spec/unit/predicates/exclusion_spec.rb +0 -35
- data/spec/unit/predicates/filled_spec.rb +0 -38
- data/spec/unit/predicates/float_spec.rb +0 -31
- data/spec/unit/predicates/format_spec.rb +0 -21
- data/spec/unit/predicates/gt_spec.rb +0 -40
- data/spec/unit/predicates/gteq_spec.rb +0 -40
- data/spec/unit/predicates/inclusion_spec.rb +0 -35
- data/spec/unit/predicates/int_spec.rb +0 -34
- data/spec/unit/predicates/key_spec.rb +0 -29
- data/spec/unit/predicates/lt_spec.rb +0 -40
- data/spec/unit/predicates/lteq_spec.rb +0 -40
- data/spec/unit/predicates/max_size_spec.rb +0 -49
- data/spec/unit/predicates/min_size_spec.rb +0 -49
- data/spec/unit/predicates/none_spec.rb +0 -28
- data/spec/unit/predicates/size_spec.rb +0 -55
- data/spec/unit/predicates/str_spec.rb +0 -32
- data/spec/unit/predicates/time_spec.rb +0 -31
- data/spec/unit/rule/check_spec.rb +0 -29
- data/spec/unit/rule/conjunction_spec.rb +0 -28
- data/spec/unit/rule/disjunction_spec.rb +0 -36
- data/spec/unit/rule/each_spec.rb +0 -20
- data/spec/unit/rule/group_spec.rb +0 -12
- data/spec/unit/rule/implication_spec.rb +0 -14
- data/spec/unit/rule/key_spec.rb +0 -27
- data/spec/unit/rule/set_spec.rb +0 -32
- data/spec/unit/rule/value_spec.rb +0 -42
- data/spec/unit/rule_compiler_spec.rb +0 -123
@@ -1,22 +0,0 @@
|
|
1
|
-
module Dry
|
2
|
-
module Validation
|
3
|
-
class Rule::Set < Rule
|
4
|
-
def call(input)
|
5
|
-
Validation.Result(input, predicate.map { |rule| rule.(input) }, self)
|
6
|
-
end
|
7
|
-
|
8
|
-
def type
|
9
|
-
:set
|
10
|
-
end
|
11
|
-
|
12
|
-
def at(*args)
|
13
|
-
self.class.new(name, predicate.values_at(*args))
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_ary
|
17
|
-
[type, [name, predicate.map(&:to_ary)]]
|
18
|
-
end
|
19
|
-
alias_method :to_a, :to_ary
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'dry/validation/rule'
|
2
|
-
|
3
|
-
module Dry
|
4
|
-
module Validation
|
5
|
-
class RuleCompiler
|
6
|
-
attr_reader :predicates
|
7
|
-
|
8
|
-
def initialize(predicates)
|
9
|
-
@predicates = predicates
|
10
|
-
end
|
11
|
-
|
12
|
-
def call(ast)
|
13
|
-
ast.map { |node| visit(node) }
|
14
|
-
end
|
15
|
-
|
16
|
-
def visit(node)
|
17
|
-
name, nodes = node
|
18
|
-
send(:"visit_#{name}", nodes)
|
19
|
-
end
|
20
|
-
|
21
|
-
def visit_check(node)
|
22
|
-
name, predicate = node
|
23
|
-
Rule::Check.new(name, visit(predicate))
|
24
|
-
end
|
25
|
-
|
26
|
-
def visit_not(node)
|
27
|
-
visit(node).negation
|
28
|
-
end
|
29
|
-
|
30
|
-
def visit_key(node)
|
31
|
-
name, predicate = node
|
32
|
-
Rule::Key.new(name, visit(predicate))
|
33
|
-
end
|
34
|
-
|
35
|
-
def visit_val(node)
|
36
|
-
name, predicate = node
|
37
|
-
Rule::Value.new(name, visit(predicate))
|
38
|
-
end
|
39
|
-
|
40
|
-
def visit_set(node)
|
41
|
-
name, rules = node
|
42
|
-
Rule::Set.new(name, call(rules))
|
43
|
-
end
|
44
|
-
|
45
|
-
def visit_each(node)
|
46
|
-
name, rule = node
|
47
|
-
Rule::Each.new(name, visit(rule))
|
48
|
-
end
|
49
|
-
|
50
|
-
def visit_predicate(node)
|
51
|
-
name, args = node
|
52
|
-
predicates[name].curry(*args)
|
53
|
-
end
|
54
|
-
|
55
|
-
def visit_and(node)
|
56
|
-
left, right = node
|
57
|
-
visit(left) & visit(right)
|
58
|
-
end
|
59
|
-
|
60
|
-
def visit_or(node)
|
61
|
-
left, right = node
|
62
|
-
visit(left) | visit(right)
|
63
|
-
end
|
64
|
-
|
65
|
-
def visit_xor(node)
|
66
|
-
left, right = node
|
67
|
-
visit(left) ^ visit(right)
|
68
|
-
end
|
69
|
-
|
70
|
-
def visit_implication(node)
|
71
|
-
left, right = node
|
72
|
-
visit(left) > visit(right)
|
73
|
-
end
|
74
|
-
|
75
|
-
def visit_group(node)
|
76
|
-
identifier, predicate = node
|
77
|
-
Rule::Group.new(identifier, visit(predicate))
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
data/spec/shared/predicates.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'dry/validation/predicates'
|
2
|
-
|
3
|
-
RSpec.shared_examples 'predicates' do
|
4
|
-
let(:none?) { Dry::Validation::Predicates[:none?] }
|
5
|
-
|
6
|
-
let(:str?) { Dry::Validation::Predicates[:str?] }
|
7
|
-
|
8
|
-
let(:filled?) { Dry::Validation::Predicates[:filled?] }
|
9
|
-
|
10
|
-
let(:min_size?) { Dry::Validation::Predicates[:min_size?] }
|
11
|
-
|
12
|
-
let(:key?) { Dry::Validation::Predicates[:key?] }
|
13
|
-
|
14
|
-
let(:eql?) { Dry::Validation::Predicates[:eql?] }
|
15
|
-
end
|
16
|
-
|
17
|
-
RSpec.shared_examples 'a passing predicate' do
|
18
|
-
let(:predicate) { Dry::Validation::Predicates[predicate_name] }
|
19
|
-
|
20
|
-
it do
|
21
|
-
arguments_list.each do |(left, right)|
|
22
|
-
expect(predicate.call(left, right)).to be(true)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
RSpec.shared_examples 'a failing predicate' do
|
28
|
-
let(:predicate) { Dry::Validation::Predicates[predicate_name] }
|
29
|
-
|
30
|
-
it do
|
31
|
-
arguments_list.each do |(left, right)|
|
32
|
-
expect(predicate.call(left, right)).to be(false)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/spec/unit/predicate_spec.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'dry/validation/predicate'
|
2
|
-
|
3
|
-
RSpec.describe Dry::Validation::Predicate do
|
4
|
-
describe '#call' do
|
5
|
-
it 'returns result of the predicate function' do
|
6
|
-
is_empty = Dry::Validation::Predicate.new(:is_empty) { |str| str.empty? }
|
7
|
-
|
8
|
-
expect(is_empty.('')).to be(true)
|
9
|
-
|
10
|
-
expect(is_empty.('filled')).to be(false)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe '#curry' do
|
15
|
-
it 'returns curried predicate' do
|
16
|
-
min_age = Dry::Validation::Predicate.new(:min_age) { |age, input| input >= age }
|
17
|
-
|
18
|
-
min_age_18 = min_age.curry(18)
|
19
|
-
|
20
|
-
expect(min_age_18.args).to eql([18])
|
21
|
-
|
22
|
-
expect(min_age_18.(18)).to be(true)
|
23
|
-
expect(min_age_18.(19)).to be(true)
|
24
|
-
expect(min_age_18.(17)).to be(false)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'dry/validation/predicates'
|
2
|
-
|
3
|
-
RSpec.describe Dry::Validation::Predicates do
|
4
|
-
describe '#bool?' do
|
5
|
-
let(:predicate_name) { :bool? }
|
6
|
-
|
7
|
-
context 'when value is a date' do
|
8
|
-
let(:arguments_list) do
|
9
|
-
[[true], [false]]
|
10
|
-
end
|
11
|
-
|
12
|
-
it_behaves_like 'a passing predicate'
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'with value is not an integer' do
|
16
|
-
let(:arguments_list) do
|
17
|
-
[
|
18
|
-
[''],
|
19
|
-
[[]],
|
20
|
-
[{}],
|
21
|
-
[nil],
|
22
|
-
[:symbol],
|
23
|
-
[String],
|
24
|
-
[1],
|
25
|
-
[0],
|
26
|
-
['true'],
|
27
|
-
['false']
|
28
|
-
]
|
29
|
-
end
|
30
|
-
|
31
|
-
it_behaves_like 'a failing predicate'
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'dry/validation/predicates'
|
2
|
-
|
3
|
-
RSpec.describe Dry::Validation::Predicates do
|
4
|
-
describe '#date?' do
|
5
|
-
let(:predicate_name) { :date? }
|
6
|
-
|
7
|
-
context 'when value is a date' do
|
8
|
-
let(:arguments_list) do
|
9
|
-
[[Date.today]]
|
10
|
-
end
|
11
|
-
|
12
|
-
it_behaves_like 'a passing predicate'
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'with value is not an integer' do
|
16
|
-
let(:arguments_list) do
|
17
|
-
[
|
18
|
-
[''],
|
19
|
-
[[]],
|
20
|
-
[{}],
|
21
|
-
[nil],
|
22
|
-
[:symbol],
|
23
|
-
[String],
|
24
|
-
[1]
|
25
|
-
]
|
26
|
-
end
|
27
|
-
|
28
|
-
it_behaves_like 'a failing predicate'
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'dry/validation/predicates'
|
2
|
-
|
3
|
-
RSpec.describe Dry::Validation::Predicates do
|
4
|
-
describe '#date_time?' do
|
5
|
-
let(:predicate_name) { :date_time? }
|
6
|
-
|
7
|
-
context 'when value is a date' do
|
8
|
-
let(:arguments_list) do
|
9
|
-
[[DateTime.now]]
|
10
|
-
end
|
11
|
-
|
12
|
-
it_behaves_like 'a passing predicate'
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'with value is not an integer' do
|
16
|
-
let(:arguments_list) do
|
17
|
-
[
|
18
|
-
[''],
|
19
|
-
[[]],
|
20
|
-
[{}],
|
21
|
-
[nil],
|
22
|
-
[:symbol],
|
23
|
-
[String],
|
24
|
-
[1]
|
25
|
-
]
|
26
|
-
end
|
27
|
-
|
28
|
-
it_behaves_like 'a failing predicate'
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'dry/validation/predicates'
|
2
|
-
|
3
|
-
RSpec.describe Dry::Validation::Predicates do
|
4
|
-
describe '#decimal?' do
|
5
|
-
let(:predicate_name) { :decimal? }
|
6
|
-
|
7
|
-
context 'when value is a date' do
|
8
|
-
let(:arguments_list) do
|
9
|
-
[[1.2.to_d]]
|
10
|
-
end
|
11
|
-
|
12
|
-
it_behaves_like 'a passing predicate'
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'with value is not an integer' do
|
16
|
-
let(:arguments_list) do
|
17
|
-
[
|
18
|
-
[''],
|
19
|
-
[[]],
|
20
|
-
[{}],
|
21
|
-
[nil],
|
22
|
-
[:symbol],
|
23
|
-
[String],
|
24
|
-
[1],
|
25
|
-
[1.0]
|
26
|
-
]
|
27
|
-
end
|
28
|
-
|
29
|
-
it_behaves_like 'a failing predicate'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'dry/validation/predicates'
|
2
|
-
|
3
|
-
RSpec.describe Dry::Validation::Predicates do
|
4
|
-
describe '#empty?' do
|
5
|
-
let(:predicate_name) { :empty? }
|
6
|
-
|
7
|
-
context 'when value is empty' do
|
8
|
-
let(:arguments_list) do
|
9
|
-
[
|
10
|
-
[''],
|
11
|
-
[[]],
|
12
|
-
[{}],
|
13
|
-
[nil]
|
14
|
-
]
|
15
|
-
end
|
16
|
-
|
17
|
-
it_behaves_like 'a passing predicate'
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'with value is not empty' do
|
21
|
-
let(:arguments_list) do
|
22
|
-
[
|
23
|
-
['Jill'],
|
24
|
-
[[1, 2, 3]],
|
25
|
-
[{ name: 'John' }],
|
26
|
-
[true],
|
27
|
-
[false],
|
28
|
-
['1'],
|
29
|
-
['0'],
|
30
|
-
[:symbol],
|
31
|
-
[String]
|
32
|
-
]
|
33
|
-
end
|
34
|
-
|
35
|
-
it_behaves_like 'a failing predicate'
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'dry/validation/predicates'
|
2
|
-
|
3
|
-
RSpec.describe Dry::Validation::Predicates, '#eql?' do
|
4
|
-
let(:predicate_name) { :eql? }
|
5
|
-
|
6
|
-
context 'when value is equal to the arg' do
|
7
|
-
let(:arguments_list) do
|
8
|
-
[['Foo', 'Foo']]
|
9
|
-
end
|
10
|
-
|
11
|
-
it_behaves_like 'a passing predicate'
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'with value is not empty' do
|
15
|
-
let(:arguments_list) do
|
16
|
-
[['Bar', 'Foo']]
|
17
|
-
end
|
18
|
-
|
19
|
-
it_behaves_like 'a failing predicate'
|
20
|
-
end
|
21
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'dry/validation/predicates'
|
2
|
-
|
3
|
-
RSpec.describe Dry::Validation::Predicates do
|
4
|
-
describe '#exclusion?' do
|
5
|
-
let(:predicate_name) { :exclusion? }
|
6
|
-
|
7
|
-
context 'when value is not present in list' do
|
8
|
-
let(:arguments_list) do
|
9
|
-
[
|
10
|
-
[['Jill', 'John'], 'Jack'],
|
11
|
-
[1..2, 0],
|
12
|
-
[1..2, 3],
|
13
|
-
[[nil, false], true]
|
14
|
-
]
|
15
|
-
end
|
16
|
-
|
17
|
-
it_behaves_like 'a passing predicate'
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'with value is present in list' do
|
21
|
-
let(:arguments_list) do
|
22
|
-
[
|
23
|
-
[['Jill', 'John'], 'Jill'],
|
24
|
-
[['Jill', 'John'], 'John'],
|
25
|
-
[1..2, 1],
|
26
|
-
[1..2, 2],
|
27
|
-
[[nil, false], nil],
|
28
|
-
[[nil, false], false]
|
29
|
-
]
|
30
|
-
end
|
31
|
-
|
32
|
-
it_behaves_like 'a failing predicate'
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'dry/validation/predicates'
|
2
|
-
|
3
|
-
RSpec.describe Dry::Validation::Predicates do
|
4
|
-
describe '#filled?' do
|
5
|
-
let(:predicate_name) { :filled? }
|
6
|
-
|
7
|
-
context 'when value is filled' do
|
8
|
-
let(:arguments_list) do
|
9
|
-
[
|
10
|
-
['Jill'],
|
11
|
-
[[1, 2, 3]],
|
12
|
-
[{ name: 'John' }],
|
13
|
-
[true],
|
14
|
-
[false],
|
15
|
-
['1'],
|
16
|
-
['0'],
|
17
|
-
[:symbol],
|
18
|
-
[String]
|
19
|
-
]
|
20
|
-
end
|
21
|
-
|
22
|
-
it_behaves_like 'a passing predicate'
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'with value is not filled' do
|
26
|
-
let(:arguments_list) do
|
27
|
-
[
|
28
|
-
[''],
|
29
|
-
[[]],
|
30
|
-
[{}],
|
31
|
-
[nil]
|
32
|
-
]
|
33
|
-
end
|
34
|
-
|
35
|
-
it_behaves_like 'a failing predicate'
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|