dry-validation 1.5.3 → 1.6.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 +54 -0
- data/README.md +1 -1
- data/dry-validation.gemspec +2 -2
- data/lib/dry/validation/contract.rb +13 -2
- data/lib/dry/validation/evaluator.rb +18 -5
- data/lib/dry/validation/messages/resolver.rb +27 -14
- data/lib/dry/validation/result.rb +7 -0
- data/lib/dry/validation/values.rb +4 -0
- data/lib/dry/validation/version.rb +1 -1
- metadata +10 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9df6f1e542743b8e5af8438caec2b5fe705f3bba96ed9f4791eacb1efc2a627d
|
|
4
|
+
data.tar.gz: d027d77079c1771691f11d8f143ceb9e92834b03fb4123cdcdf48e3711dd2fba
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 76059d5e724680569c71ab794849379e2404b63053073fbe57394ed6031cfd0aff67b210f92b15f985feef77a986cafa7f442397e91ec3deac436f289379b126
|
|
7
|
+
data.tar.gz: e5e1a9a3ae536767cbba5584061e04dc01a065bccd9936b8d30482b499e4a865309400c3eff5f589a5661ba25ed1403e4a77cadc83f215b8fd6cf588dd217aa7
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,53 @@
|
|
|
1
|
+
## 1.6.0
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Added
|
|
5
|
+
|
|
6
|
+
- You can now pass a key name or path to `rule_error?` predicate (issue #658 closed via #673) (@moofkit)
|
|
7
|
+
- You can now pass initial context object to `Contract#call` (issue #674 via #675) (@pyromaniac)
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Checking `key?` within a rule no longer crashes when value is `nil` or an empty string (issue #670 fixed via #672) (@alexxty7)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
[Compare v1.5.6...master](https://github.com/dry-rb/dry-validation/compare/v1.5.6...master)
|
|
15
|
+
|
|
16
|
+
## 1.5.6 2020-09-04
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- Dependency on dry-schema was bumped to >= 1.5.1. This time for real (@solnic)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
[Compare v1.5.5...v1.5.6](https://github.com/dry-rb/dry-validation/compare/v1.5.5...v1.5.6)
|
|
25
|
+
|
|
26
|
+
## 1.5.5 2020-09-03
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- Dependency on dry-schema was bumped to >= 1.5.2 (see #666 for more info) (@artofhuman)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
[Compare v1.5.4...v1.5.5](https://github.com/dry-rb/dry-validation/compare/v1.5.4...v1.5.5)
|
|
35
|
+
|
|
36
|
+
## 1.5.4 2020-08-21
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- You can now pass any key or a path to the rule's `key?` helper (see #664 for more info) (@alassek)
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
|
|
45
|
+
- Full messages work correctly with rule failures now (issue #661 fixed via #662) (@stind)
|
|
46
|
+
- Providing a custom message template for array errors works correctly (issue #663 fixed via #665) (@tadeusz-niemiec)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
[Compare v1.5.3...v1.5.4](https://github.com/dry-rb/dry-validation/compare/v1.5.3...v1.5.4)
|
|
50
|
+
|
|
1
51
|
## 1.5.3 2020-07-27
|
|
2
52
|
|
|
3
53
|
|
|
@@ -5,6 +55,10 @@
|
|
|
5
55
|
|
|
6
56
|
- You can now access current value's index via `rule(:foo).each do |index:|` (issue #606 done via #657) (@mrbongiolo)
|
|
7
57
|
|
|
58
|
+
### Fixed
|
|
59
|
+
|
|
60
|
+
- Using `.each(:foo)` works as expected when there are errors related to other keys (issue #659 fixed via #660) (@solnic)
|
|
61
|
+
|
|
8
62
|
### Changed
|
|
9
63
|
|
|
10
64
|
- `Result#error?` is now a public API and it takes into consideration both schema and rule errors (issue #655 fixed via #656) (@PragTob)
|
data/README.md
CHANGED
data/dry-validation.gemspec
CHANGED
|
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
|
25
25
|
spec.metadata['source_code_uri'] = 'https://github.com/dry-rb/dry-validation'
|
|
26
26
|
spec.metadata['bug_tracker_uri'] = 'https://github.com/dry-rb/dry-validation/issues'
|
|
27
27
|
|
|
28
|
-
spec.required_ruby_version = ">= 2.
|
|
28
|
+
spec.required_ruby_version = ">= 2.5.0"
|
|
29
29
|
|
|
30
30
|
# to update dependencies edit project.yml
|
|
31
31
|
spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
|
|
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
|
|
|
33
33
|
spec.add_runtime_dependency "dry-core", "~> 0.4"
|
|
34
34
|
spec.add_runtime_dependency "dry-equalizer", "~> 0.2"
|
|
35
35
|
spec.add_runtime_dependency "dry-initializer", "~> 3.0"
|
|
36
|
-
spec.add_runtime_dependency "dry-schema", "~> 1.5"
|
|
36
|
+
spec.add_runtime_dependency "dry-schema", "~> 1.5", ">= 1.5.2"
|
|
37
37
|
|
|
38
38
|
spec.add_development_dependency "bundler"
|
|
39
39
|
spec.add_development_dependency "rake"
|
|
@@ -68,6 +68,11 @@ module Dry
|
|
|
68
68
|
# @api public
|
|
69
69
|
option :macros, default: -> { config.macros }
|
|
70
70
|
|
|
71
|
+
# @!attribute [r] default_context
|
|
72
|
+
# @return [Hash] Default context for rules
|
|
73
|
+
# @api public
|
|
74
|
+
option :default_context, default: -> { EMPTY_HASH }
|
|
75
|
+
|
|
71
76
|
# @!attribute [r] schema
|
|
72
77
|
# @return [Dry::Schema::Params, Dry::Schema::JSON, Dry::Schema::Processor]
|
|
73
78
|
# @api private
|
|
@@ -86,12 +91,18 @@ module Dry
|
|
|
86
91
|
# Apply the contract to an input
|
|
87
92
|
#
|
|
88
93
|
# @param [Hash] input The input to validate
|
|
94
|
+
# @param [Hash] context Initial context for rules
|
|
89
95
|
#
|
|
90
96
|
# @return [Result]
|
|
91
97
|
#
|
|
92
98
|
# @api public
|
|
93
|
-
def call(input)
|
|
94
|
-
|
|
99
|
+
def call(input, context = EMPTY_HASH)
|
|
100
|
+
context_map = Concurrent::Map.new.tap do |map|
|
|
101
|
+
default_context.each { |key, value| map[key] = value }
|
|
102
|
+
context.each { |key, value| map[key] = value }
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
Result.new(schema.(input), context_map) do |result|
|
|
95
106
|
rules.each do |rule|
|
|
96
107
|
next if rule.keys.any? { |key| error?(result, key) }
|
|
97
108
|
|
|
@@ -155,16 +155,23 @@ module Dry
|
|
|
155
155
|
#
|
|
156
156
|
# This is useful when dealing with rules for optional keys
|
|
157
157
|
#
|
|
158
|
-
# @example
|
|
158
|
+
# @example use the default key name
|
|
159
159
|
# rule(:age) do
|
|
160
160
|
# key.failure(:invalid) if key? && value < 18
|
|
161
161
|
# end
|
|
162
162
|
#
|
|
163
|
+
# @example specify the key name
|
|
164
|
+
# rule(:start_date, :end_date) do
|
|
165
|
+
# if key?(:start_date) && !key?(:end_date)
|
|
166
|
+
# key(:end_date).failure("must provide an end_date with start_date")
|
|
167
|
+
# end
|
|
168
|
+
# end
|
|
169
|
+
#
|
|
163
170
|
# @return [Boolean]
|
|
164
171
|
#
|
|
165
172
|
# @api public
|
|
166
|
-
def key?
|
|
167
|
-
values.key?(
|
|
173
|
+
def key?(name = key_name)
|
|
174
|
+
values.key?(name)
|
|
168
175
|
end
|
|
169
176
|
|
|
170
177
|
# Check if there are any errors on the schema under the provided path
|
|
@@ -180,11 +187,17 @@ module Dry
|
|
|
180
187
|
|
|
181
188
|
# Check if there are any errors on the current rule
|
|
182
189
|
#
|
|
190
|
+
# @param path [Symbol, String, Array] A Path-compatible spec
|
|
191
|
+
#
|
|
183
192
|
# @return [Boolean]
|
|
184
193
|
#
|
|
185
194
|
# @api public
|
|
186
|
-
def rule_error?
|
|
187
|
-
|
|
195
|
+
def rule_error?(path = nil)
|
|
196
|
+
if path.nil?
|
|
197
|
+
!key(self.path).empty?
|
|
198
|
+
else
|
|
199
|
+
result.rule_error?(path)
|
|
200
|
+
end
|
|
188
201
|
end
|
|
189
202
|
|
|
190
203
|
# @api private
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "dry/validation/message"
|
|
4
|
+
require "dry/schema/message_compiler"
|
|
4
5
|
|
|
5
6
|
module Dry
|
|
6
7
|
module Validation
|
|
7
8
|
module Messages
|
|
9
|
+
FULL_MESSAGE_WHITESPACE = Dry::Schema::MessageCompiler::FULL_MESSAGE_WHITESPACE
|
|
10
|
+
|
|
8
11
|
# Resolve translated messages from failure arguments
|
|
9
12
|
#
|
|
10
13
|
# @api public
|
|
@@ -33,7 +36,7 @@ module Dry
|
|
|
33
36
|
when Symbol
|
|
34
37
|
Message[->(**opts) { message(message, path: path, tokens: tokens, **opts) }, path, meta]
|
|
35
38
|
when String
|
|
36
|
-
Message[->(**opts) { [message_text(message, path, **opts), meta] }, path, meta]
|
|
39
|
+
Message[->(**opts) { [message_text(message, path: path, **opts), meta] }, path, meta]
|
|
37
40
|
when Hash
|
|
38
41
|
meta = message.dup
|
|
39
42
|
text = meta.delete(:text) { |key|
|
|
@@ -51,18 +54,6 @@ module Dry
|
|
|
51
54
|
end
|
|
52
55
|
alias_method :[], :call
|
|
53
56
|
|
|
54
|
-
# Resolve a message
|
|
55
|
-
#
|
|
56
|
-
# @return String
|
|
57
|
-
#
|
|
58
|
-
# @api public
|
|
59
|
-
def message_text(message, path, locale: nil, full: false, **opts)
|
|
60
|
-
keys = path.to_a.compact
|
|
61
|
-
msg_opts = EMPTY_HASH.merge(path: keys, locale: locale || messages.default_locale)
|
|
62
|
-
|
|
63
|
-
full ? "#{messages.rule(keys.last, msg_opts) || keys.last} #{message}" : message
|
|
64
|
-
end
|
|
65
|
-
|
|
66
57
|
# Resolve a message
|
|
67
58
|
#
|
|
68
59
|
# @return [String]
|
|
@@ -81,6 +72,11 @@ module Dry
|
|
|
81
72
|
template, meta = messages[rule, msg_opts.merge(path: keys.last)] unless template
|
|
82
73
|
end
|
|
83
74
|
|
|
75
|
+
if !template && keys.size > 1
|
|
76
|
+
non_index_keys = keys.reject { |k| k.is_a?(Integer) }
|
|
77
|
+
template, meta = messages[rule, msg_opts.merge(path: non_index_keys.join(DOT))]
|
|
78
|
+
end
|
|
79
|
+
|
|
84
80
|
unless template
|
|
85
81
|
raise MissingMessageError, <<~STR
|
|
86
82
|
Message template for #{rule.inspect} under #{keys.join(DOT).inspect} was not found
|
|
@@ -90,12 +86,29 @@ module Dry
|
|
|
90
86
|
parsed_tokens = parse_tokens(tokens)
|
|
91
87
|
text = template.(template.data(parsed_tokens))
|
|
92
88
|
|
|
93
|
-
[
|
|
89
|
+
[message_text(text, path: path, locale: locale, full: full), meta]
|
|
94
90
|
end
|
|
95
91
|
# rubocop:enable Metrics/AbcSize
|
|
96
92
|
|
|
97
93
|
private
|
|
98
94
|
|
|
95
|
+
def message_text(text, path:, locale: nil, full: false)
|
|
96
|
+
return text unless full
|
|
97
|
+
|
|
98
|
+
key = key_text(path: path, locale: locale)
|
|
99
|
+
|
|
100
|
+
[key, text].compact.join(FULL_MESSAGE_WHITESPACE[locale])
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def key_text(path:, locale: nil)
|
|
104
|
+
locale ||= messages.default_locale
|
|
105
|
+
|
|
106
|
+
keys = path.to_a.compact
|
|
107
|
+
msg_opts = {path: keys, locale: locale}
|
|
108
|
+
|
|
109
|
+
messages.rule(keys.last, msg_opts) || keys.last
|
|
110
|
+
end
|
|
111
|
+
|
|
99
112
|
def parse_tokens(tokens)
|
|
100
113
|
Hash[
|
|
101
114
|
tokens.map do |key, token|
|
|
@@ -113,6 +113,13 @@ module Dry
|
|
|
113
113
|
schema_result.error?(key)
|
|
114
114
|
end
|
|
115
115
|
|
|
116
|
+
# Check if the rules includes an error for the provided key
|
|
117
|
+
#
|
|
118
|
+
# @api private
|
|
119
|
+
def rule_error?(key)
|
|
120
|
+
!schema_error?(key) && error?(key)
|
|
121
|
+
end
|
|
122
|
+
|
|
116
123
|
# Check if there's any error for the provided key
|
|
117
124
|
#
|
|
118
125
|
# This does not consider errors from the nested values
|
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.
|
|
4
|
+
version: 1.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Piotr Solnica
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
11
|
+
date: 2020-12-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: concurrent-ruby
|
|
@@ -93,6 +93,9 @@ dependencies:
|
|
|
93
93
|
- - "~>"
|
|
94
94
|
- !ruby/object:Gem::Version
|
|
95
95
|
version: '1.5'
|
|
96
|
+
- - ">="
|
|
97
|
+
- !ruby/object:Gem::Version
|
|
98
|
+
version: 1.5.2
|
|
96
99
|
type: :runtime
|
|
97
100
|
prerelease: false
|
|
98
101
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -100,6 +103,9 @@ dependencies:
|
|
|
100
103
|
- - "~>"
|
|
101
104
|
- !ruby/object:Gem::Version
|
|
102
105
|
version: '1.5'
|
|
106
|
+
- - ">="
|
|
107
|
+
- !ruby/object:Gem::Version
|
|
108
|
+
version: 1.5.2
|
|
103
109
|
- !ruby/object:Gem::Dependency
|
|
104
110
|
name: bundler
|
|
105
111
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -192,14 +198,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
192
198
|
requirements:
|
|
193
199
|
- - ">="
|
|
194
200
|
- !ruby/object:Gem::Version
|
|
195
|
-
version: 2.
|
|
201
|
+
version: 2.5.0
|
|
196
202
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
197
203
|
requirements:
|
|
198
204
|
- - ">="
|
|
199
205
|
- !ruby/object:Gem::Version
|
|
200
206
|
version: '0'
|
|
201
207
|
requirements: []
|
|
202
|
-
rubygems_version: 3.
|
|
208
|
+
rubygems_version: 3.1.4
|
|
203
209
|
signing_key:
|
|
204
210
|
specification_version: 4
|
|
205
211
|
summary: Validation library
|