dry-validation 1.0.0 → 1.5.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/equalizer'
3
+ require "dry/equalizer"
4
4
 
5
- require 'dry/validation/constants'
6
- require 'dry/validation/function'
5
+ require "dry/validation/constants"
6
+ require "dry/validation/function"
7
7
 
8
8
  module Dry
9
9
  module Validation
@@ -54,7 +54,7 @@ module Dry
54
54
  #
55
55
  # @api public
56
56
  def validate(*macros, &block)
57
- @macros = macros.map { |spec| Array(spec) }.map(&:flatten)
57
+ @macros = parse_macros(*macros)
58
58
  @block = block if block
59
59
  self
60
60
  end
@@ -65,29 +65,38 @@ module Dry
65
65
  # for a given array item.
66
66
  #
67
67
  # @example
68
- # rule(:nums).each do
69
- # key.failure("must be greater than 0") if value < 0
68
+ # rule(:nums).each do |index:|
69
+ # key([:number, index]).failure("must be greater than 0") if value < 0
70
+ # end
71
+ # rule(:nums).each(min: 3)
72
+ # rule(address: :city) do
73
+ # key.failure("oops") if value != 'Munich'
70
74
  # end
71
75
  #
72
76
  # @return [Rule]
73
77
  #
74
78
  # @api public
75
79
  def each(*macros, &block)
76
- root = keys
80
+ root = keys[0]
81
+ macros = parse_macros(*macros)
77
82
  @keys = []
78
83
 
79
84
  @block = proc do
80
- values[root].each_with_index do |_, idx|
81
- path = [*root, idx]
85
+ unless result.base_error?(root) || !values.key?(root)
86
+ values[root].each_with_index do |_, idx|
87
+ path = [*Schema::Path[root].to_a, idx]
82
88
 
83
- next if result.error?(path)
89
+ next if result.schema_error?(path)
84
90
 
85
- evaluator = with(macros: macros, keys: [path], &block)
91
+ evaluator = with(macros: macros, keys: [path], index: idx, &block)
86
92
 
87
- failures.concat(evaluator.failures)
93
+ failures.concat(evaluator.failures)
94
+ end
88
95
  end
89
96
  end
90
97
 
98
+ @block_options = map_keywords(block) if block
99
+
91
100
  self
92
101
  end
93
102
 
@@ -99,6 +108,28 @@ module Dry
99
108
  def inspect
100
109
  %(#<#{self.class} keys=#{keys.inspect}>)
101
110
  end
111
+
112
+ # Parse function arguments into macros structure
113
+ #
114
+ # @return [Array]
115
+ #
116
+ # @api private
117
+ def parse_macros(*args)
118
+ args.each_with_object([]) do |spec, macros|
119
+ case spec
120
+ when Hash
121
+ add_macro_from_hash(macros, spec)
122
+ else
123
+ macros << Array(spec)
124
+ end
125
+ end
126
+ end
127
+
128
+ def add_macro_from_hash(macros, spec)
129
+ spec.each do |k, v|
130
+ macros << [k, v.is_a?(Array) ? v : [v]]
131
+ end
132
+ end
102
133
  end
103
134
  end
104
135
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/schema/path"
4
+
5
+ module Dry
6
+ module Schema
7
+ class Path
8
+ # @api private
9
+ def multi_value?
10
+ last.is_a?(Array)
11
+ end
12
+
13
+ # @api private
14
+ def expand
15
+ to_a[0..-2].product(last).map { |spec| self.class[spec] }
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/equalizer'
4
- require 'dry/validation/constants'
3
+ require "dry/equalizer"
4
+ require "dry/schema/path"
5
+ require "dry/validation/constants"
5
6
 
6
7
  module Dry
7
8
  module Validation
@@ -34,23 +35,48 @@ module Dry
34
35
  # key.failure('must be > 18') if values[:age] <= 18
35
36
  # end
36
37
  #
37
- # @param [Symbol] key
38
+ # @param args [Symbol, String, Hash, Array<Symbol>] If given as a single
39
+ # Symbol, String, Array or Hash, build a key array using
40
+ # {Dry::Schema::Path} digging for data. If given as positional
41
+ # arguments, use these with Hash#dig on the data directly.
38
42
  #
39
43
  # @return [Object]
40
44
  #
41
45
  # @api public
42
46
  def [](*args)
43
- if args.size.equal?(1)
44
- case (key = args[0])
45
- when Symbol then data[key]
46
- when String then self[*key.split(DOT).map(&:to_sym)]
47
- when Array then self[*key]
47
+ return data.dig(*args) if args.size > 1
48
+
49
+ case (key = args[0])
50
+ when Symbol, String, Array, Hash
51
+ keys = Schema::Path[key].to_a
52
+
53
+ return data.dig(*keys) unless keys.last.is_a?(Array)
54
+
55
+ last = keys.pop
56
+ vals = self.class.new(data.dig(*keys))
57
+ vals.fetch_values(*last) { nil }
58
+ else
59
+ raise ArgumentError, "+key+ must be a valid path specification"
60
+ end
61
+ end
62
+
63
+ # @api public
64
+ def key?(key, hash = data)
65
+ return hash.key?(key) if key.is_a?(Symbol)
66
+
67
+ Schema::Path[key].reduce(hash) do |a, e|
68
+ if e.is_a?(Array)
69
+ result = e.all? { |k| key?(k, a) }
70
+ return result
71
+ elsif e.is_a?(Symbol) && a.is_a?(Array)
72
+ return false
48
73
  else
49
- raise ArgumentError, '+key+ must be a symbol, string, array, or a list of keys for dig'
74
+ return false unless a.is_a?(Array) ? (e >= 0 && e < a.size) : a.key?(e)
50
75
  end
51
- else
52
- data.dig(*args)
76
+ a[e]
53
77
  end
78
+
79
+ true
54
80
  end
55
81
 
56
82
  # @api private
@@ -68,6 +94,7 @@ module Dry
68
94
  super
69
95
  end
70
96
  end
97
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
71
98
  end
72
99
  end
73
100
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dry
4
4
  module Validation
5
- VERSION = '1.0.0'
5
+ VERSION = "1.5.6"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-validation
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.5.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-10 00:00:00.000000000 Z
11
+ date: 2020-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -25,53 +25,53 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: dry-core
28
+ name: dry-container
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.4'
33
+ version: '0.7'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 0.7.1
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
41
  - - "~>"
39
42
  - !ruby/object:Gem::Version
40
- version: '0.4'
43
+ version: '0.7'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 0.7.1
41
47
  - !ruby/object:Gem::Dependency
42
- name: dry-equalizer
48
+ name: dry-core
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '0.2'
53
+ version: '0.4'
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '0.2'
60
+ version: '0.4'
55
61
  - !ruby/object:Gem::Dependency
56
- name: dry-container
62
+ name: dry-equalizer
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
65
  - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '0.7'
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- version: 0.7.1
67
+ version: '0.2'
65
68
  type: :runtime
66
69
  prerelease: false
67
70
  version_requirements: !ruby/object:Gem::Requirement
68
71
  requirements:
69
72
  - - "~>"
70
73
  - !ruby/object:Gem::Version
71
- version: '0.7'
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: 0.7.1
74
+ version: '0.2'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: dry-initializer
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -92,20 +92,20 @@ dependencies:
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '1.0'
95
+ version: '1.5'
96
96
  - - ">="
97
97
  - !ruby/object:Gem::Version
98
- version: 1.1.0
98
+ version: 1.5.2
99
99
  type: :runtime
100
100
  prerelease: false
101
101
  version_requirements: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - "~>"
104
104
  - !ruby/object:Gem::Version
105
- version: '1.0'
105
+ version: '1.5'
106
106
  - - ">="
107
107
  - !ruby/object:Gem::Version
108
- version: 1.1.0
108
+ version: 1.5.2
109
109
  - !ruby/object:Gem::Dependency
110
110
  name: bundler
111
111
  requirement: !ruby/object:Gem::Requirement
@@ -148,7 +148,7 @@ dependencies:
148
148
  - - ">="
149
149
  - !ruby/object:Gem::Version
150
150
  version: '0'
151
- description:
151
+ description: Validation library
152
152
  email:
153
153
  - piotr.solnica@gmail.com
154
154
  executables: []
@@ -159,6 +159,7 @@ files:
159
159
  - LICENSE
160
160
  - README.md
161
161
  - config/errors.yml
162
+ - dry-validation.gemspec
162
163
  - lib/dry-validation.rb
163
164
  - lib/dry/validation.rb
164
165
  - lib/dry/validation/config.rb
@@ -168,6 +169,7 @@ files:
168
169
  - lib/dry/validation/evaluator.rb
169
170
  - lib/dry/validation/extensions/hints.rb
170
171
  - lib/dry/validation/extensions/monads.rb
172
+ - lib/dry/validation/extensions/predicates_as_macros.rb
171
173
  - lib/dry/validation/failures.rb
172
174
  - lib/dry/validation/function.rb
173
175
  - lib/dry/validation/macro.rb
@@ -177,12 +179,17 @@ files:
177
179
  - lib/dry/validation/messages/resolver.rb
178
180
  - lib/dry/validation/result.rb
179
181
  - lib/dry/validation/rule.rb
182
+ - lib/dry/validation/schema_ext.rb
180
183
  - lib/dry/validation/values.rb
181
184
  - lib/dry/validation/version.rb
182
185
  homepage: https://dry-rb.org/gems/dry-validation
183
186
  licenses:
184
187
  - MIT
185
- metadata: {}
188
+ metadata:
189
+ allowed_push_host: https://rubygems.org
190
+ changelog_uri: https://github.com/dry-rb/dry-validation/blob/master/CHANGELOG.md
191
+ source_code_uri: https://github.com/dry-rb/dry-validation
192
+ bug_tracker_uri: https://github.com/dry-rb/dry-validation/issues
186
193
  post_install_message:
187
194
  rdoc_options: []
188
195
  require_paths:
@@ -191,7 +198,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
191
198
  requirements:
192
199
  - - ">="
193
200
  - !ruby/object:Gem::Version
194
- version: '2.3'
201
+ version: 2.4.0
195
202
  required_rubygems_version: !ruby/object:Gem::Requirement
196
203
  requirements:
197
204
  - - ">="