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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/LICENSE +1 -1
  4. data/README.md +9 -9
  5. data/dry-validation.gemspec +2 -1
  6. data/lib/dry/validation.rb +1 -0
  7. data/lib/dry/validation/input_type_compiler.rb +2 -2
  8. data/lib/dry/validation/schema.rb +7 -6
  9. data/lib/dry/validation/schema/key.rb +0 -2
  10. data/lib/dry/validation/version.rb +1 -1
  11. data/spec/integration/custom_predicates_spec.rb +1 -1
  12. data/spec/integration/schema_form_spec.rb +0 -2
  13. data/spec/unit/input_type_compiler_spec.rb +57 -0
  14. metadata +20 -89
  15. data/lib/dry/validation/predicate.rb +0 -35
  16. data/lib/dry/validation/predicate_set.rb +0 -22
  17. data/lib/dry/validation/predicates.rb +0 -125
  18. data/lib/dry/validation/rule.rb +0 -90
  19. data/lib/dry/validation/rule/check.rb +0 -15
  20. data/lib/dry/validation/rule/composite.rb +0 -63
  21. data/lib/dry/validation/rule/each.rb +0 -13
  22. data/lib/dry/validation/rule/group.rb +0 -21
  23. data/lib/dry/validation/rule/key.rb +0 -17
  24. data/lib/dry/validation/rule/result.rb +0 -119
  25. data/lib/dry/validation/rule/set.rb +0 -22
  26. data/lib/dry/validation/rule/value.rb +0 -13
  27. data/lib/dry/validation/rule_compiler.rb +0 -81
  28. data/spec/shared/predicates.rb +0 -35
  29. data/spec/unit/predicate_spec.rb +0 -27
  30. data/spec/unit/predicates/bool_spec.rb +0 -34
  31. data/spec/unit/predicates/date_spec.rb +0 -31
  32. data/spec/unit/predicates/date_time_spec.rb +0 -31
  33. data/spec/unit/predicates/decimal_spec.rb +0 -32
  34. data/spec/unit/predicates/empty_spec.rb +0 -38
  35. data/spec/unit/predicates/eql_spec.rb +0 -21
  36. data/spec/unit/predicates/exclusion_spec.rb +0 -35
  37. data/spec/unit/predicates/filled_spec.rb +0 -38
  38. data/spec/unit/predicates/float_spec.rb +0 -31
  39. data/spec/unit/predicates/format_spec.rb +0 -21
  40. data/spec/unit/predicates/gt_spec.rb +0 -40
  41. data/spec/unit/predicates/gteq_spec.rb +0 -40
  42. data/spec/unit/predicates/inclusion_spec.rb +0 -35
  43. data/spec/unit/predicates/int_spec.rb +0 -34
  44. data/spec/unit/predicates/key_spec.rb +0 -29
  45. data/spec/unit/predicates/lt_spec.rb +0 -40
  46. data/spec/unit/predicates/lteq_spec.rb +0 -40
  47. data/spec/unit/predicates/max_size_spec.rb +0 -49
  48. data/spec/unit/predicates/min_size_spec.rb +0 -49
  49. data/spec/unit/predicates/none_spec.rb +0 -28
  50. data/spec/unit/predicates/size_spec.rb +0 -55
  51. data/spec/unit/predicates/str_spec.rb +0 -32
  52. data/spec/unit/predicates/time_spec.rb +0 -31
  53. data/spec/unit/rule/check_spec.rb +0 -29
  54. data/spec/unit/rule/conjunction_spec.rb +0 -28
  55. data/spec/unit/rule/disjunction_spec.rb +0 -36
  56. data/spec/unit/rule/each_spec.rb +0 -20
  57. data/spec/unit/rule/group_spec.rb +0 -12
  58. data/spec/unit/rule/implication_spec.rb +0 -14
  59. data/spec/unit/rule/key_spec.rb +0 -27
  60. data/spec/unit/rule/set_spec.rb +0 -32
  61. data/spec/unit/rule/value_spec.rb +0 -42
  62. data/spec/unit/rule_compiler_spec.rb +0 -123
@@ -1,22 +0,0 @@
1
- require 'dry/validation/predicate'
2
-
3
- module Dry
4
- module Validation
5
- module PredicateSet
6
- module Methods
7
- def predicate(name, &block)
8
- register(name) { Predicate.new(name, &block) }
9
- end
10
-
11
- def import(predicate_set)
12
- merge(predicate_set)
13
- end
14
- end
15
-
16
- def self.extended(other)
17
- super
18
- other.extend(Methods, Dry::Container::Mixin)
19
- end
20
- end
21
- end
22
- end
@@ -1,125 +0,0 @@
1
- require 'dry/validation/predicate_set'
2
-
3
- module Dry
4
- module Validation
5
- module Predicates
6
- extend PredicateSet
7
-
8
- def self.included(other)
9
- super
10
- other.extend(PredicateSet)
11
- other.import(self)
12
- end
13
-
14
- predicate(:none?) do |input|
15
- input.nil?
16
- end
17
-
18
- predicate(:key?) do |name, input|
19
- input.key?(name)
20
- end
21
-
22
- predicate(:empty?) do |input|
23
- case input
24
- when String, Array, Hash then input.empty?
25
- when nil then true
26
- else
27
- false
28
- end
29
- end
30
-
31
- predicate(:filled?) do |input|
32
- !self[:empty?].(input)
33
- end
34
-
35
- predicate(:bool?) do |input|
36
- input.is_a?(TrueClass) || input.is_a?(FalseClass)
37
- end
38
-
39
- predicate(:date?) do |input|
40
- input.is_a?(Date)
41
- end
42
-
43
- predicate(:date_time?) do |input|
44
- input.is_a?(DateTime)
45
- end
46
-
47
- predicate(:time?) do |input|
48
- input.is_a?(Time)
49
- end
50
-
51
- predicate(:int?) do |input|
52
- input.is_a?(Fixnum)
53
- end
54
-
55
- predicate(:float?) do |input|
56
- input.is_a?(Float)
57
- end
58
-
59
- predicate(:decimal?) do |input|
60
- input.is_a?(BigDecimal)
61
- end
62
-
63
- predicate(:str?) do |input|
64
- input.is_a?(String)
65
- end
66
-
67
- predicate(:hash?) do |input|
68
- input.is_a?(Hash)
69
- end
70
-
71
- predicate(:array?) do |input|
72
- input.is_a?(Array)
73
- end
74
-
75
- predicate(:lt?) do |num, input|
76
- input < num
77
- end
78
-
79
- predicate(:gt?) do |num, input|
80
- input > num
81
- end
82
-
83
- predicate(:lteq?) do |num, input|
84
- !self[:gt?].(num, input)
85
- end
86
-
87
- predicate(:gteq?) do |num, input|
88
- !self[:lt?].(num, input)
89
- end
90
-
91
- predicate(:size?) do |size, input|
92
- case size
93
- when Fixnum then size == input.size
94
- when Range, Array then size.include?(input.size)
95
- else
96
- raise ArgumentError, "+#{size}+ is not supported type for size? predicate"
97
- end
98
- end
99
-
100
- predicate(:min_size?) do |num, input|
101
- input.size >= num
102
- end
103
-
104
- predicate(:max_size?) do |num, input|
105
- input.size <= num
106
- end
107
-
108
- predicate(:inclusion?) do |list, input|
109
- list.include?(input)
110
- end
111
-
112
- predicate(:exclusion?) do |list, input|
113
- !self[:inclusion?].(list, input)
114
- end
115
-
116
- predicate(:eql?) do |left, right|
117
- left.eql?(right)
118
- end
119
-
120
- predicate(:format?) do |regex, input|
121
- !regex.match(input).nil?
122
- end
123
- end
124
- end
125
- end
@@ -1,90 +0,0 @@
1
- module Dry
2
- module Validation
3
- class Rule
4
- include Dry::Equalizer(:name, :predicate)
5
-
6
- attr_reader :name, :predicate
7
-
8
- class Negation < Rule
9
- include Dry::Equalizer(:rule)
10
-
11
- attr_reader :rule
12
-
13
- def initialize(rule)
14
- @rule = rule
15
- end
16
-
17
- def call(*args)
18
- rule.(*args).negated
19
- end
20
-
21
- def to_ary
22
- [:not, rule.to_ary]
23
- end
24
- end
25
-
26
- def initialize(name, predicate)
27
- @name = name
28
- @predicate = predicate
29
- end
30
-
31
- def predicate_id
32
- predicate.id
33
- end
34
-
35
- def type
36
- :rule
37
- end
38
-
39
- def call(*args)
40
- Validation.Result(args, predicate.call, self)
41
- end
42
-
43
- def to_ary
44
- [type, [name, predicate.to_ary]]
45
- end
46
- alias_method :to_a, :to_ary
47
-
48
- def and(other)
49
- Conjunction.new(self, other)
50
- end
51
- alias_method :&, :and
52
-
53
- def or(other)
54
- Disjunction.new(self, other)
55
- end
56
- alias_method :|, :or
57
-
58
- def xor(other)
59
- ExclusiveDisjunction.new(self, other)
60
- end
61
- alias_method :^, :xor
62
-
63
- def then(other)
64
- Implication.new(self, other)
65
- end
66
- alias_method :>, :then
67
-
68
- def negation
69
- Negation.new(self)
70
- end
71
-
72
- def new(predicate)
73
- self.class.new(name, predicate)
74
- end
75
-
76
- def curry(*args)
77
- self.class.new(name, predicate.curry(*args))
78
- end
79
- end
80
- end
81
- end
82
-
83
- require 'dry/validation/rule/key'
84
- require 'dry/validation/rule/value'
85
- require 'dry/validation/rule/each'
86
- require 'dry/validation/rule/set'
87
- require 'dry/validation/rule/composite'
88
- require 'dry/validation/rule/check'
89
- require 'dry/validation/rule/group'
90
- require 'dry/validation/rule/result'
@@ -1,15 +0,0 @@
1
- module Dry
2
- module Validation
3
- class Rule::Check < Rule
4
- alias_method :result, :predicate
5
-
6
- def call(*)
7
- Validation.Result(nil, result.call, self)
8
- end
9
-
10
- def type
11
- :check
12
- end
13
- end
14
- end
15
- end
@@ -1,63 +0,0 @@
1
- module Dry
2
- module Validation
3
- class Rule::Composite < Rule
4
- include Dry::Equalizer(:left, :right)
5
-
6
- attr_reader :name, :left, :right
7
-
8
- def initialize(left, right)
9
- @left = left
10
- @right = right
11
- end
12
-
13
- def name
14
- :"#{left.name}_#{type}_#{right.name}"
15
- end
16
-
17
- def to_ary
18
- [type, [left.to_ary, right.to_ary]]
19
- end
20
- alias_method :to_a, :to_ary
21
- end
22
-
23
- class Rule::Implication < Rule::Composite
24
- def call(*args)
25
- left.(*args) > right
26
- end
27
-
28
- def type
29
- :implication
30
- end
31
- end
32
-
33
- class Rule::Conjunction < Rule::Composite
34
- def call(*args)
35
- left.(*args).and(right)
36
- end
37
-
38
- def type
39
- :and
40
- end
41
- end
42
-
43
- class Rule::Disjunction < Rule::Composite
44
- def call(*args)
45
- left.(*args).or(right)
46
- end
47
-
48
- def type
49
- :or
50
- end
51
- end
52
-
53
- class Rule::ExclusiveDisjunction < Rule::Composite
54
- def call(*args)
55
- left.(*args).xor(right)
56
- end
57
-
58
- def type
59
- :xor
60
- end
61
- end
62
- end
63
- end
@@ -1,13 +0,0 @@
1
- module Dry
2
- module Validation
3
- class Rule::Each < Rule
4
- def call(input)
5
- Validation.Result(input, input.map { |element| predicate.(element) }, self)
6
- end
7
-
8
- def type
9
- :each
10
- end
11
- end
12
- end
13
- end
@@ -1,21 +0,0 @@
1
- module Dry
2
- module Validation
3
- class Rule::Group < Rule
4
- attr_reader :rules
5
-
6
- def initialize(identifier, predicate)
7
- name, rules = identifier.to_a.first
8
- @rules = rules
9
- super(name, predicate)
10
- end
11
-
12
- def call(*input)
13
- Validation.Result(input, predicate.(*input), self)
14
- end
15
-
16
- def type
17
- :group
18
- end
19
- end
20
- end
21
- end
@@ -1,17 +0,0 @@
1
- module Dry
2
- module Validation
3
- class Rule::Key < Rule
4
- def self.new(name, predicate)
5
- super(name, predicate.curry(name))
6
- end
7
-
8
- def type
9
- :key
10
- end
11
-
12
- def call(input)
13
- Validation.Result(input[name], predicate.(input), self)
14
- end
15
- end
16
- end
17
- end
@@ -1,119 +0,0 @@
1
- module Dry
2
- module Validation
3
- def self.Result(input, value, rule)
4
- case value
5
- when Rule::Result then value.class.new(value.input, value.success?, rule)
6
- when Array then Rule::Result::Set.new(input, value, rule)
7
- else Rule::Result::Value.new(input, value, rule)
8
- end
9
- end
10
-
11
- class Rule::Result
12
- include Dry::Equalizer(:success?, :input, :rule)
13
-
14
- attr_reader :input, :value, :rule, :name
15
-
16
- class Rule::Result::Set < Rule::Result
17
- def success?
18
- value.all?(&:success?)
19
- end
20
-
21
- def to_ary
22
- indices = value.map { |v| v.failure? ? value.index(v) : nil }.compact
23
- [:input, [rule.name, input, value.values_at(*indices).map(&:to_ary)]]
24
- end
25
- end
26
-
27
- class Rule::Result::Value < Rule::Result
28
- def to_ary
29
- [:input, [rule.name, input, [rule.to_ary]]]
30
- end
31
- alias_method :to_a, :to_ary
32
- end
33
-
34
- class Rule::Result::Verified < Rule::Result
35
- attr_reader :predicate_id
36
-
37
- def initialize(result, predicate_id)
38
- @input = result.input
39
- @value = result.value
40
- @rule = result.rule
41
- @name = result.name
42
- @predicate_id = predicate_id
43
- end
44
-
45
- def call
46
- Validation.Result(input, success?, rule)
47
- end
48
-
49
- def to_ary
50
- [:input, [name, input, [rule.to_ary]]]
51
- end
52
- alias_method :to_a, :to_ary
53
-
54
- def success?
55
- rule.predicate_id == predicate_id
56
- end
57
- end
58
-
59
- def initialize(input, value, rule)
60
- @input = input
61
- @value = value
62
- @rule = rule
63
- @name = rule.name
64
- end
65
-
66
- def call
67
- self
68
- end
69
-
70
- def curry(predicate_id = nil)
71
- if predicate_id
72
- Rule::Result::Verified.new(self, predicate_id)
73
- else
74
- self
75
- end
76
- end
77
-
78
- def negated
79
- self.class.new(input, !value, rule)
80
- end
81
-
82
- def >(other)
83
- if success?
84
- other.(input)
85
- else
86
- Validation.Result(input, true, rule)
87
- end
88
- end
89
-
90
- def and(other)
91
- if success?
92
- other.(input)
93
- else
94
- self
95
- end
96
- end
97
-
98
- def or(other)
99
- if success?
100
- self
101
- else
102
- other.(input)
103
- end
104
- end
105
-
106
- def xor(other)
107
- Validation.Result(input, success? ^ other.(input).success?, rule)
108
- end
109
-
110
- def success?
111
- @value
112
- end
113
-
114
- def failure?
115
- ! success?
116
- end
117
- end
118
- end
119
- end