dry-validation 1.2.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aadb0a6e283c3de0438b2ddf7335262e276c206021e95f4aaa7eb70be040f268
4
- data.tar.gz: e2c9949f4f69ded243970367602b997c8eba80c5d18b223f7f14d30d914b4886
3
+ metadata.gz: f61fe3205cc418d53bd0f2217bdd49a0e49119a69cae87ecf24e76a89567f845
4
+ data.tar.gz: 4ca306db1fd196c3253a78a6376fe0d4c197c5c8d625636bc37038b9caa3278b
5
5
  SHA512:
6
- metadata.gz: 7cd158435b3998c6864a594d61315760b974a4b8d8a8728bdff42cc3684209416a23a154e0efe9537ab54839f96819b4b11f434104b2ba5b2be6dd4fce4c39b5
7
- data.tar.gz: d796476595c68a33dca5cf26cb11f3aff0c3fc2be73165f5693bb9b62c94c02a917ff8f559cc62055909805d95928dc96189e8a1391657177a21674ab15b58f5
6
+ metadata.gz: d0c6a082c4a7077bd428e1bbe2f8ec4677950ea0f073d15cb955568307e2924b75e9d4bfb0f023b65739df7d061569e1aa8a3941968c263d68f4fd3fe12a61d5
7
+ data.tar.gz: 50fa2999ebe80ce40fe244b10bac6cf3644f4dd7e7825913726e8cc2587a901f0d2d164d1c29e17b55f613bd7258dc13d672a5787334f90afc4059d0480312b9
@@ -1,3 +1,38 @@
1
+ # v1.3.1 2019-08-16
2
+
3
+ ### Changed
4
+
5
+ * You can now set an external schema without providing a block (alassek)
6
+
7
+ [Compare v1.3.0...v1.3.1](https://github.com/dry-rb/dry-validation/compare/v1.3.0...v1.3.1)
8
+
9
+ # v1.3.0 2019-08-14
10
+
11
+ ### Added
12
+
13
+ * Support for setting an external schema (that can be extended too) (fixed #574) (@solnic)
14
+
15
+ ### Fixed
16
+
17
+ * Using a hash spec to define rule keys with more than one value is properly handled by rule guard now (fixed #576) (@solnic)
18
+
19
+ ### Changed
20
+
21
+ * `values` within rules uses `Hash#fetch_values` internally now, which improves performance (@esparta)
22
+
23
+ [Compare v1.2.1...v1.3.0](https://github.com/dry-rb/dry-validation/compare/v1.2.1...v1.3.0)
24
+
25
+ # v1.2.1 2019-07-16
26
+
27
+ ### Fixed
28
+
29
+ * Defining an abstract contract class that has no schema no longer crashes (issue #565) (@solnic)
30
+ * Fixed an issue where `Rule#each` would crash when the value is not an array (issue #567) (@solnic)
31
+ * Fixed an issue where guarding a rule would crash when keys are missing in the input (issue #569) (@solnic)
32
+ * Added missing "pathname" require (issue #570) (@solnic)
33
+
34
+ [Compare v1.2.0...v1.2.1](https://github.com/dry-rb/dry-validation/compare/v1.2.0...v1.2.1)
35
+
1
36
  # v1.2.0 2019-07-08
2
37
 
3
38
  ### Added
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'pathname'
3
4
  require 'dry/core/constants'
4
5
 
5
6
  module Dry
@@ -119,6 +119,10 @@ module Dry
119
119
  def error?(result, spec)
120
120
  path = Schema::Path[spec]
121
121
 
122
+ if path.multi_value?
123
+ return path.expand.any? { |nested_path| error?(result, nested_path) }
124
+ end
125
+
122
126
  return true if result.error?(path)
123
127
 
124
128
  path
@@ -128,7 +132,9 @@ module Dry
128
132
 
129
133
  return false unless result.error?(curr_path)
130
134
 
131
- result.errors.any? { |err| Schema::Path[err.path] == curr_path }
135
+ result.errors.any? { |err|
136
+ (other = Schema::Path[err.path]).same_root?(curr_path) && other == curr_path
137
+ }
132
138
  }
133
139
  end
134
140
 
@@ -53,36 +53,36 @@ module Dry
53
53
  #
54
54
  # This type of schema is suitable for HTTP parameters
55
55
  #
56
- # @return [Dry::Schema::Params]
56
+ # @return [Dry::Schema::Params,NilClass]
57
57
  # @see https://dry-rb.org/gems/dry-schema/params/
58
58
  #
59
59
  # @api public
60
- def params(&block)
61
- define(:Params, &block)
60
+ def params(external_schema = nil, &block)
61
+ define(:Params, external_schema, &block)
62
62
  end
63
63
 
64
64
  # Define a JSON schema for your contract
65
65
  #
66
66
  # This type of schema is suitable for JSON data
67
67
  #
68
- # @return [Dry::Schema::JSON]
68
+ # @return [Dry::Schema::JSON,NilClass]
69
69
  # @see https://dry-rb.org/gems/dry-schema/json/
70
70
  #
71
71
  # @api public
72
- def json(&block)
73
- define(:JSON, &block)
72
+ def json(external_schema = nil, &block)
73
+ define(:JSON, external_schema, &block)
74
74
  end
75
75
 
76
76
  # Define a plain schema for your contract
77
77
  #
78
78
  # This type of schema does not offer coercion out of the box
79
79
  #
80
- # @return [Dry::Schema::Processor]
80
+ # @return [Dry::Schema::Processor,NilClass]
81
81
  # @see https://dry-rb.org/gems/dry-schema/
82
82
  #
83
83
  # @api public
84
- def schema(&block)
85
- define(:schema, &block)
84
+ def schema(external_schema = nil, &block)
85
+ define(:schema, external_schema, &block)
86
86
  end
87
87
 
88
88
  # Define a rule for your contract
@@ -101,7 +101,7 @@ module Dry
101
101
  #
102
102
  # @api public
103
103
  def rule(*keys, &block)
104
- ensure_valid_keys(*keys)
104
+ ensure_valid_keys(*keys) if __schema__
105
105
 
106
106
  Rule.new(keys: keys, block: block).tap do |rule|
107
107
  rules << rule
@@ -192,16 +192,22 @@ module Dry
192
192
  end
193
193
 
194
194
  # @api private
195
- def schema_opts
195
+ def core_schema_opts
196
196
  { parent: superclass&.__schema__, config: config }
197
197
  end
198
198
 
199
199
  # @api private
200
- def define(method_name, &block)
201
- if defined?(@__schema__)
200
+ def define(method_name, external_schema, &block)
201
+ return __schema__ if external_schema.nil? && block.nil?
202
+
203
+ unless __schema__.nil?
202
204
  raise ::Dry::Validation::DuplicateSchemaError, 'Schema has already been defined'
203
205
  end
204
206
 
207
+ schema_opts = core_schema_opts
208
+
209
+ schema_opts.update(parent: external_schema) if external_schema
210
+
205
211
  case method_name
206
212
  when :schema
207
213
  @__schema__ = Schema.define(schema_opts, &block)
@@ -106,6 +106,22 @@ module Dry
106
106
  schema_result.error?(key)
107
107
  end
108
108
 
109
+ # Check if there's any error for the provided key
110
+ #
111
+ # This does not consider errors from the nested values
112
+ #
113
+ # @api private
114
+ def base_error?(key)
115
+ schema_result.errors.any? { |error|
116
+ key_path = Schema::Path[key]
117
+ err_path = Schema::Path[error.path]
118
+
119
+ return false unless key_path.same_root?(err_path)
120
+
121
+ key_path == err_path
122
+ }
123
+ end
124
+
109
125
  # Add a new error for the provided key
110
126
  #
111
127
  # @api private
@@ -82,14 +82,16 @@ module Dry
82
82
  @keys = []
83
83
 
84
84
  @block = proc do
85
- (values[root] || []).each_with_index do |_, idx|
86
- path = [*Schema::Path[root].to_a, 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]
87
88
 
88
- next if result.error?(path)
89
+ next if result.error?(path)
89
90
 
90
- evaluator = with(macros: macros, keys: [path], &block)
91
+ evaluator = with(macros: macros, keys: [path], &block)
91
92
 
92
- failures.concat(evaluator.failures)
93
+ failures.concat(evaluator.failures)
94
+ end
93
95
  end
94
96
  end
95
97
 
@@ -5,6 +5,18 @@ require 'dry/schema/key_map'
5
5
 
6
6
  module Dry
7
7
  module Schema
8
+ class Path
9
+ # @api private
10
+ def multi_value?
11
+ last.is_a?(Array)
12
+ end
13
+
14
+ # @api private
15
+ def expand
16
+ to_a[0..-2].product(last).map { |spec| self.class[spec] }
17
+ end
18
+ end
19
+
8
20
  # @api private
9
21
  #
10
22
  # TODO: this should be moved to dry-schema at some point
@@ -45,15 +45,13 @@ module Dry
45
45
 
46
46
  case (key = args[0])
47
47
  when Symbol, String, Array, Hash
48
- path = Schema::Path[key]
49
- keys = path.to_a
48
+ keys = Schema::Path[key].to_a
50
49
 
51
50
  return data.dig(*keys) unless keys.last.is_a?(Array)
52
51
 
53
52
  last = keys.pop
54
53
  vals = self.class.new(data.dig(*keys))
55
-
56
- last.map { |name| vals[name] }
54
+ vals.fetch_values(*last) { nil }
57
55
  else
58
56
  raise ArgumentError, '+key+ must be a valid path specification'
59
57
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dry
4
4
  module Validation
5
- VERSION = '1.2.0'
5
+ VERSION = '1.3.1'
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.2.0
4
+ version: 1.3.1
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-07-08 00:00:00.000000000 Z
11
+ date: 2019-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby