dry-validation 1.3.1 → 1.4.1
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 +88 -54
- data/LICENSE +1 -1
- data/README.md +7 -8
- data/lib/dry/validation/contract.rb +1 -1
- data/lib/dry/validation/contract/class_interface.rb +14 -15
- data/lib/dry/validation/evaluator.rb +6 -5
- data/lib/dry/validation/extensions/predicates_as_macros.rb +1 -1
- data/lib/dry/validation/failures.rb +7 -0
- data/lib/dry/validation/message.rb +1 -1
- data/lib/dry/validation/message_set.rb +3 -2
- data/lib/dry/validation/messages/resolver.rb +29 -2
- data/lib/dry/validation/result.rb +16 -0
- data/lib/dry/validation/schema_ext.rb +1 -1
- data/lib/dry/validation/values.rb +1 -0
- data/lib/dry/validation/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7da2738360b969decba415a2a6418b41ca8b55202d39dd6843871722b904164e
|
|
4
|
+
data.tar.gz: 20cfc387c6ebe8ce8ffd9b6d9227d59393cf304ba70bdd01ace0ff13d67e99fe
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5d86de3a87c58f51dabd171950a3d72398e3a93fde3ac521937c0e7b13518388519238127968eb330b991774a2d017b109e3ddc919e23d423771c2bee6361a63
|
|
7
|
+
data.tar.gz: 86c6cc8cf5ea0ba31dda616f68cedd2481f9e1f8455d787d4575583af7ad7428cee4de45477bf454084adacd6778216f2867dc95ac0cbe1e9fad2889a07f124a
|
data/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,42 @@
|
|
|
1
|
+
# v1.4.1 2020-01-08
|
|
2
|
+
|
|
3
|
+
### Added
|
|
4
|
+
|
|
5
|
+
- Pattern matching on result values (@flash-gordon)
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- List tokens are correctly interpolated as a comma separated list in rule messages (see #611) (@waiting-for-dev)
|
|
10
|
+
- Warnings about delegated keywords (@flash-gordon)
|
|
11
|
+
- A few delegation warnings about keyword arguments (@flash-gordon)
|
|
12
|
+
|
|
13
|
+
[Compare v1.4.0...v1.4.1](https://github.com/dry-rb/dry-validation/compare/v1.4.0...v1.4.1)
|
|
14
|
+
|
|
15
|
+
# v1.4.0 2019-12-12
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- Support for multi-schema inheritance (@ianwhite)
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- Keyword warnings reported by Ruby 2.7 (@flash-gordon)
|
|
24
|
+
- Fixed an issue where `MessageSet` would be marked as empty too early (@ianwhite)
|
|
25
|
+
- Messages are correctly generated when there are errors for both an array and one or more of its elements (see #599) (@Bugagazavr)
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- A meaningful exception is raised when failure options are not valid (@MatElGran)
|
|
30
|
+
- [internal] improved performance in `Contract.ensure_valid_keys` (@grzegorz-jakubiak)
|
|
31
|
+
- [internal] fixed keyword warnings on MRI 2.7.0 (@flash-gordon)
|
|
32
|
+
|
|
33
|
+
[Compare v1.3.1...v1.4.0](https://github.com/dry-rb/dry-validation/compare/v1.3.1...v1.4.0)
|
|
34
|
+
|
|
1
35
|
# v1.3.1 2019-08-16
|
|
2
36
|
|
|
3
37
|
### Changed
|
|
4
38
|
|
|
5
|
-
|
|
39
|
+
- You can now set an external schema without providing a block (@alassek)
|
|
6
40
|
|
|
7
41
|
[Compare v1.3.0...v1.3.1](https://github.com/dry-rb/dry-validation/compare/v1.3.0...v1.3.1)
|
|
8
42
|
|
|
@@ -10,15 +44,15 @@
|
|
|
10
44
|
|
|
11
45
|
### Added
|
|
12
46
|
|
|
13
|
-
|
|
47
|
+
- Support for setting an external schema (that can be extended too) (fixed #574) (@solnic)
|
|
14
48
|
|
|
15
49
|
### Fixed
|
|
16
50
|
|
|
17
|
-
|
|
51
|
+
- Using a hash spec to define rule keys with more than one value is properly handled by rule guard now (fixed #576) (@solnic)
|
|
18
52
|
|
|
19
53
|
### Changed
|
|
20
54
|
|
|
21
|
-
|
|
55
|
+
- `values` within rules uses `Hash#fetch_values` internally now, which improves performance (@esparta)
|
|
22
56
|
|
|
23
57
|
[Compare v1.2.1...v1.3.0](https://github.com/dry-rb/dry-validation/compare/v1.2.1...v1.3.0)
|
|
24
58
|
|
|
@@ -26,10 +60,10 @@
|
|
|
26
60
|
|
|
27
61
|
### Fixed
|
|
28
62
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
63
|
+
- Defining an abstract contract class that has no schema no longer crashes (issue #565) (@solnic)
|
|
64
|
+
- Fixed an issue where `Rule#each` would crash when the value is not an array (issue #567) (@solnic)
|
|
65
|
+
- Fixed an issue where guarding a rule would crash when keys are missing in the input (issue #569) (@solnic)
|
|
66
|
+
- Added missing "pathname" require (issue #570) (@solnic)
|
|
33
67
|
|
|
34
68
|
[Compare v1.2.0...v1.2.1](https://github.com/dry-rb/dry-validation/compare/v1.2.0...v1.2.1)
|
|
35
69
|
|
|
@@ -37,15 +71,15 @@
|
|
|
37
71
|
|
|
38
72
|
### Added
|
|
39
73
|
|
|
40
|
-
|
|
74
|
+
- New extension `:predicates_as_macros` (@waiting-for-dev)
|
|
41
75
|
|
|
42
76
|
### Fixed
|
|
43
77
|
|
|
44
|
-
|
|
78
|
+
- Guarding rules for nested keys works correctly (issue #560) (@solnic)
|
|
45
79
|
|
|
46
80
|
### Changed
|
|
47
81
|
|
|
48
|
-
|
|
82
|
+
- `dry-schema` dependency was bumped to `>= 1.3.1` (@solnic)
|
|
49
83
|
|
|
50
84
|
[Compare v1.1.1...v1.2.0](https://github.com/dry-rb/dry-validation/compare/v1.1.1...v1.2.0)
|
|
51
85
|
|
|
@@ -53,7 +87,7 @@
|
|
|
53
87
|
|
|
54
88
|
### Fixed
|
|
55
89
|
|
|
56
|
-
|
|
90
|
+
- `Rule#each` works with array values from nested hashes (@mustardnoise)
|
|
57
91
|
|
|
58
92
|
[Compare v1.1.0...v1.1.1](https://github.com/dry-rb/dry-validation/compare/v1.1.0...v1.1.1)
|
|
59
93
|
|
|
@@ -61,13 +95,13 @@
|
|
|
61
95
|
|
|
62
96
|
### Added
|
|
63
97
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
98
|
+
- `key?` method available within rules, that can be used to check if there's a value under the rule's default key (refs #540) (@solnic)
|
|
99
|
+
- `value` supports hash-based path specifications now (refs #547) (@solnic)
|
|
100
|
+
- `value` can read multiple values when the key points to them, ie in case of `rule(geo: [:lat, :lon])` it would return an array with `lat` and `lon` (@solnic)
|
|
67
101
|
|
|
68
102
|
### Fixed
|
|
69
103
|
|
|
70
|
-
|
|
104
|
+
- Passing multiple macro names to `validate` or `each` works correctly (fixed #538 #541) (@jandudulski)
|
|
71
105
|
|
|
72
106
|
[Compare v1.0.0...v1.1.0](https://github.com/dry-rb/dry-validation/compare/v1.0.0...v1.1.0)
|
|
73
107
|
|
|
@@ -114,14 +148,14 @@ See [the list of all addressed issues](https://github.com/dry-rb/dry-validation/
|
|
|
114
148
|
|
|
115
149
|
### Added
|
|
116
150
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
151
|
+
- [EXPERIMENTAL] `Validation.register_macro` for registering global macros (solnic)
|
|
152
|
+
- [EXPERIMENTAL] `Contract.register_macro` for registering macros available to specific contract classes (solnic)
|
|
153
|
+
- `Dry::Validation.Contract` shortcut for quickly defining a contract and getting its instance back (solnic)
|
|
154
|
+
- New configuration option `config.locale` for setting the default locale (solnic)
|
|
121
155
|
|
|
122
156
|
### Fixed
|
|
123
157
|
|
|
124
|
-
|
|
158
|
+
- `config/errors.yml` are now bundled with the gem, **`rc2` was broken because of this** (solnic)
|
|
125
159
|
|
|
126
160
|
[Compare v1.0.0.rc2...v1.0.0.rc3](https://github.com/dry-rb/dry-validation/compare/v1.0.0.rc2...v1.0.0.rc3)
|
|
127
161
|
|
|
@@ -131,17 +165,17 @@ This was **yanked** on rubygems.org because the bundled gem was missing `config`
|
|
|
131
165
|
|
|
132
166
|
### Added
|
|
133
167
|
|
|
134
|
-
|
|
135
|
-
|
|
168
|
+
- [EXPERIMENTAL] support for registering macros via `Dry::Validation::Macros.register(:your_macro, &block)` (solnic)
|
|
169
|
+
- [EXPERIMENTAL] `:acceptance` as the first built-in macro (issue #157) (solnic)
|
|
136
170
|
|
|
137
171
|
### Fixed
|
|
138
172
|
|
|
139
|
-
|
|
173
|
+
- Passing invalid argument to `failure` will raise a meaningful error instead of crashing (solnic)
|
|
140
174
|
|
|
141
175
|
### Changed
|
|
142
176
|
|
|
143
|
-
|
|
144
|
-
|
|
177
|
+
- In rule validation blocks, `values` is now an instance of a hash-like `Dry::Validation::Values` class, rather than `Dry::Schema::Result`. This gives more convenient access to data within rules (solnic)
|
|
178
|
+
- Dependency on `dry-schema` was updated to `~> 1.0` (solnic)
|
|
145
179
|
|
|
146
180
|
[Compare v1.0.0.rc1...v1.0.0.rc2](https://github.com/dry-rb/dry-validation/compare/v1.0.0.rc1...v1.0.0.rc2)
|
|
147
181
|
|
|
@@ -149,18 +183,18 @@ This was **yanked** on rubygems.org because the bundled gem was missing `config`
|
|
|
149
183
|
|
|
150
184
|
### Added
|
|
151
185
|
|
|
152
|
-
|
|
153
|
-
|
|
186
|
+
- `:hints` extension is back (solnic)
|
|
187
|
+
- `Result` objects have access to the context object which is shared between rules (flash-gordon)
|
|
154
188
|
|
|
155
189
|
### Fixed
|
|
156
190
|
|
|
157
|
-
|
|
158
|
-
|
|
191
|
+
- Multiple hint messages no longer crash message set (flash-gordon)
|
|
192
|
+
- `Contract#inspect` no longer crashes (solnic)
|
|
159
193
|
|
|
160
194
|
### Changed
|
|
161
195
|
|
|
162
|
-
|
|
163
|
-
|
|
196
|
+
- Dependency on `dry-schema` was bumped to `~> 0.6` - this pulls in `dry-types 1.0.0` and `dry-logic 1.0.0` (solnic)
|
|
197
|
+
- Dependency on `dry-initializer` was bumped to `~> 3.0` (solnic)
|
|
164
198
|
|
|
165
199
|
[Compare v1.0.0.beta2...v1.0.0.rc1](https://github.com/dry-rb/dry-validation/compare/v1.0.0.beta2...v1.0.0.rc1)
|
|
166
200
|
|
|
@@ -168,7 +202,7 @@ This was **yanked** on rubygems.org because the bundled gem was missing `config`
|
|
|
168
202
|
|
|
169
203
|
### Added
|
|
170
204
|
|
|
171
|
-
|
|
205
|
+
- Support for arbitrary meta-data in failures, ie:
|
|
172
206
|
|
|
173
207
|
```ruby
|
|
174
208
|
class NewUserContract < Dry::Validation::Contract
|
|
@@ -186,9 +220,9 @@ This was **yanked** on rubygems.org because the bundled gem was missing `config`
|
|
|
186
220
|
|
|
187
221
|
### Changed
|
|
188
222
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
223
|
+
- [BREAKING] `Error` was renamed to `Message` as it is a more generic concept (solnic)
|
|
224
|
+
- [BREAKING] `ErrorSet` was renamed to `MessageSet` for consistency (solnic)
|
|
225
|
+
- [BREAKING] `:monads` extension wraps entire result objects in `Success` or `Failure` (flash-gordon)
|
|
192
226
|
|
|
193
227
|
[Compare v1.0.0.beta1...v1.0.0.beta2](https://github.com/dry-rb/dry-validation/compare/v1.0.0.beta1...v1.0.0.beta2)
|
|
194
228
|
|
|
@@ -196,20 +230,20 @@ This was **yanked** on rubygems.org because the bundled gem was missing `config`
|
|
|
196
230
|
|
|
197
231
|
### Added
|
|
198
232
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
233
|
+
- New API for setting failures `base.failure` for base errors and `key.failure` for key errors (solnic)
|
|
234
|
+
- Support for `base` errors associated with a key even when child keys have errors too (solnic)
|
|
235
|
+
- Support for `base` errors not associated with any key (solnic)
|
|
236
|
+
- Result objects use `ErrorSet` object now for managing messages (solnic)
|
|
237
|
+
- Nested keys are properly handled when generating messages hash (issue #489) (flash-gordon + solnic)
|
|
238
|
+
- Result objects support `locale` and `full` options now (solnic)
|
|
239
|
+
- Ability to configure `top_namespace` for messages, which will be used for both schema and rule localization (solnic)
|
|
240
|
+
- Rule blocks receive a context object that you can use to share data between rules (solnic)
|
|
207
241
|
|
|
208
242
|
### Changed
|
|
209
243
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
244
|
+
- [BREAKING] `Result#errors` returns an instance of `ErrorSet` now, it's an enumerable, coerible to a hash (solnic)
|
|
245
|
+
- [BREAKING] `failure` was removed in favor of `key.failure` or `key(:foo).failure` (solnic)
|
|
246
|
+
- [BREAKING] `Result#to_hash` was removed (flash-gordon)
|
|
213
247
|
|
|
214
248
|
[Compare v1.0.0.alpha2...v1.0.0.beta1](https://github.com/dry-rb/dry-validation/compare/v1.0.0.alpha2...v1.0.0.beta1)
|
|
215
249
|
|
|
@@ -219,13 +253,13 @@ First round of bug fixes. Thanks for testing <3!
|
|
|
219
253
|
|
|
220
254
|
### Fixed
|
|
221
255
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
256
|
+
- Errors with nested messages are correctly built (flash-gordon)
|
|
257
|
+
- Messages for nested keys are correctly resolved (solnic)
|
|
258
|
+
- A message for a nested key is resolved when it's defined under `errors.rule.%{key}` too, but a message under nested key will override it (solnic)
|
|
225
259
|
|
|
226
260
|
### Changed
|
|
227
261
|
|
|
228
|
-
|
|
262
|
+
- When a message template is not found a more meaningful error is raised that includes both rule identifier and key path (solnic)
|
|
229
263
|
|
|
230
264
|
[Compare v1.0.0.alpha1...v1.0.0.alpha2](https://github.com/dry-rb/dry-validation/compare/v1.0.0.alpha1...v1.0.0.alpha2)
|
|
231
265
|
|
|
@@ -235,8 +269,8 @@ Complete rewrite on top of `dry-schema`.
|
|
|
235
269
|
|
|
236
270
|
### Added
|
|
237
271
|
|
|
238
|
-
|
|
239
|
-
|
|
272
|
+
- [BREAKING] `Dry::Validation::Contract` as a replacement for validation schemas (solnic)
|
|
273
|
+
- [BREAKING] New `rule` DSL with an improved API for setting error messages (solnic)
|
|
240
274
|
|
|
241
275
|
[Compare v0.13.0...v1.0.0.alpha1](https://github.com/dry-rb/dry-validation/compare/v0.13.0...v1.0.0.alpha1)
|
|
242
276
|
|
|
@@ -257,7 +291,7 @@ Complete rewrite on top of `dry-schema`.
|
|
|
257
291
|
|
|
258
292
|
### Changed
|
|
259
293
|
|
|
260
|
-
|
|
294
|
+
- [internal] dry-logic was pinned to `~> 0.4.2` (flash-gordon)
|
|
261
295
|
|
|
262
296
|
[Compare v0.12.2...v0.12.3](https://github.com/dry-rb/dry-validation/compare/v0.12.2...v0.12.3)
|
|
263
297
|
|
data/LICENSE
CHANGED
data/README.md
CHANGED
|
@@ -1,26 +1,25 @@
|
|
|
1
1
|
[gem]: https://rubygems.org/gems/dry-validation
|
|
2
|
-
[
|
|
3
|
-
[
|
|
2
|
+
[actions]: https://github.com/dry-rb/dry-validation/actions
|
|
3
|
+
[codacy]: https://www.codacy.com/gh/dry-rb/dry-validation
|
|
4
4
|
[chat]: https://dry-rb.zulipchat.com
|
|
5
5
|
[inchpages]: http://inch-ci.org/github/dry-rb/dry-validation
|
|
6
6
|
|
|
7
7
|
# dry-validation [][chat]
|
|
8
8
|
|
|
9
9
|
[][gem]
|
|
10
|
-
[][actions]
|
|
11
|
+
[][codacy]
|
|
12
|
+
[][codacy]
|
|
13
13
|
[][inchpages]
|
|
14
14
|
|
|
15
15
|
## Links
|
|
16
16
|
|
|
17
|
-
* [User documentation](
|
|
17
|
+
* [User documentation](http://dry-rb.org/gems/dry-validation)
|
|
18
18
|
* [API documentation](http://rubydoc.info/gems/dry-validation)
|
|
19
|
-
* [Guidelines for contributing](CONTRIBUTING.md)
|
|
20
19
|
|
|
21
20
|
## Supported Ruby versions
|
|
22
21
|
|
|
23
|
-
This library officially supports following Ruby versions:
|
|
22
|
+
This library officially supports the following Ruby versions:
|
|
24
23
|
|
|
25
24
|
* MRI >= `2.4`
|
|
26
25
|
* jruby >= `9.2`
|
|
@@ -57,8 +57,8 @@ module Dry
|
|
|
57
57
|
# @see https://dry-rb.org/gems/dry-schema/params/
|
|
58
58
|
#
|
|
59
59
|
# @api public
|
|
60
|
-
def params(
|
|
61
|
-
define(:Params,
|
|
60
|
+
def params(*external_schemas, &block)
|
|
61
|
+
define(:Params, external_schemas, &block)
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
# Define a JSON schema for your contract
|
|
@@ -69,8 +69,8 @@ module Dry
|
|
|
69
69
|
# @see https://dry-rb.org/gems/dry-schema/json/
|
|
70
70
|
#
|
|
71
71
|
# @api public
|
|
72
|
-
def json(
|
|
73
|
-
define(:JSON,
|
|
72
|
+
def json(*external_schemas, &block)
|
|
73
|
+
define(:JSON, external_schemas, &block)
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
# Define a plain schema for your contract
|
|
@@ -81,8 +81,8 @@ module Dry
|
|
|
81
81
|
# @see https://dry-rb.org/gems/dry-schema/
|
|
82
82
|
#
|
|
83
83
|
# @api public
|
|
84
|
-
def schema(
|
|
85
|
-
define(:schema,
|
|
84
|
+
def schema(*external_schemas, &block)
|
|
85
|
+
define(:schema, external_schemas, &block)
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
# Define a rule for your contract
|
|
@@ -123,7 +123,7 @@ module Dry
|
|
|
123
123
|
#
|
|
124
124
|
# @api public
|
|
125
125
|
def build(options = EMPTY_HASH, &block)
|
|
126
|
-
Class.new(self, &block).new(options)
|
|
126
|
+
Class.new(self, &block).new(**options)
|
|
127
127
|
end
|
|
128
128
|
|
|
129
129
|
# @api private
|
|
@@ -162,7 +162,7 @@ module Dry
|
|
|
162
162
|
.map { |key|
|
|
163
163
|
[key, Schema::Path[key]]
|
|
164
164
|
}
|
|
165
|
-
.
|
|
165
|
+
.flat_map { |(key, path)|
|
|
166
166
|
if (last = path.last).is_a?(Array)
|
|
167
167
|
last.map { |last_key|
|
|
168
168
|
path_key = [*path.to_a[0..-2], last_key]
|
|
@@ -172,7 +172,6 @@ module Dry
|
|
|
172
172
|
[[key, path]]
|
|
173
173
|
end
|
|
174
174
|
}
|
|
175
|
-
.flatten(1)
|
|
176
175
|
.reject { |(_, path)|
|
|
177
176
|
valid_paths.any? { |valid_path| valid_path.include?(path) }
|
|
178
177
|
}
|
|
@@ -197,8 +196,8 @@ module Dry
|
|
|
197
196
|
end
|
|
198
197
|
|
|
199
198
|
# @api private
|
|
200
|
-
def define(method_name,
|
|
201
|
-
return __schema__ if
|
|
199
|
+
def define(method_name, external_schemas, &block)
|
|
200
|
+
return __schema__ if external_schemas.empty? && block.nil?
|
|
202
201
|
|
|
203
202
|
unless __schema__.nil?
|
|
204
203
|
raise ::Dry::Validation::DuplicateSchemaError, 'Schema has already been defined'
|
|
@@ -206,15 +205,15 @@ module Dry
|
|
|
206
205
|
|
|
207
206
|
schema_opts = core_schema_opts
|
|
208
207
|
|
|
209
|
-
schema_opts.update(parent:
|
|
208
|
+
schema_opts.update(parent: external_schemas) if external_schemas.any?
|
|
210
209
|
|
|
211
210
|
case method_name
|
|
212
211
|
when :schema
|
|
213
|
-
@__schema__ = Schema.define(schema_opts, &block)
|
|
212
|
+
@__schema__ = Schema.define(**schema_opts, &block)
|
|
214
213
|
when :Params
|
|
215
|
-
@__schema__ = Schema.Params(schema_opts, &block)
|
|
214
|
+
@__schema__ = Schema.Params(**schema_opts, &block)
|
|
216
215
|
when :JSON
|
|
217
|
-
@__schema__ = Schema.JSON(schema_opts, &block)
|
|
216
|
+
@__schema__ = Schema.JSON(**schema_opts, &block)
|
|
218
217
|
end
|
|
219
218
|
end
|
|
220
219
|
end
|
|
@@ -63,19 +63,19 @@ module Dry
|
|
|
63
63
|
# Initialize a new evaluator
|
|
64
64
|
#
|
|
65
65
|
# @api private
|
|
66
|
-
def initialize(contract, options, &block)
|
|
67
|
-
super(contract, options)
|
|
66
|
+
def initialize(contract, **options, &block)
|
|
67
|
+
super(contract, **options)
|
|
68
68
|
|
|
69
69
|
@_options = options
|
|
70
70
|
|
|
71
71
|
if block
|
|
72
72
|
exec_opts = block_options.map { |key, value| [key, _options[value]] }.to_h
|
|
73
|
-
instance_exec(exec_opts, &block)
|
|
73
|
+
instance_exec(**exec_opts, &block)
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
macros.each do |args|
|
|
77
77
|
macro = macro(*args.flatten(1))
|
|
78
|
-
instance_exec(macro.extract_block_options(_options.merge(macro: macro)), ¯o.block)
|
|
78
|
+
instance_exec(**macro.extract_block_options(_options.merge(macro: macro)), ¯o.block)
|
|
79
79
|
end
|
|
80
80
|
end
|
|
81
81
|
|
|
@@ -117,7 +117,7 @@ module Dry
|
|
|
117
117
|
|
|
118
118
|
# @api private
|
|
119
119
|
def with(new_opts, &block)
|
|
120
|
-
self.class.new(_contract, _options
|
|
120
|
+
self.class.new(_contract, **_options, **new_opts, &block)
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
# Return default (first) key name
|
|
@@ -192,6 +192,7 @@ module Dry
|
|
|
192
192
|
super
|
|
193
193
|
end
|
|
194
194
|
end
|
|
195
|
+
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
|
195
196
|
end
|
|
196
197
|
end
|
|
197
198
|
end
|
|
@@ -12,7 +12,7 @@ module Dry
|
|
|
12
12
|
#
|
|
13
13
|
# @see Dry::Validation::Contract
|
|
14
14
|
WHITELIST = %i[
|
|
15
|
-
filled? gt? gteq? included_in? includes? inclusion? is? lt?
|
|
15
|
+
filled? format? gt? gteq? included_in? includes? inclusion? is? lt?
|
|
16
16
|
lteq? max_size? min_size? not_eql? odd? respond_to? size? true?
|
|
17
17
|
uuid_v4?
|
|
18
18
|
].freeze
|
|
@@ -45,6 +45,13 @@ module Dry
|
|
|
45
45
|
# @example
|
|
46
46
|
# failure(:taken)
|
|
47
47
|
#
|
|
48
|
+
# @overload failure(meta_hash)
|
|
49
|
+
# Use meta_hash[:text] as a message (either explicitely or as an identifier),
|
|
50
|
+
# setting the rest of the hash as error meta attribute
|
|
51
|
+
# @param meta [Hash] The hash containing the message as value for the :text key
|
|
52
|
+
# @example
|
|
53
|
+
# failure({text: :invalid, key: value})
|
|
54
|
+
#
|
|
48
55
|
# @see Evaluator#key
|
|
49
56
|
# @see Evaluator#base
|
|
50
57
|
#
|
|
@@ -41,7 +41,7 @@ module Dry
|
|
|
41
41
|
return self if new_options.empty? && other.eql?(messages)
|
|
42
42
|
|
|
43
43
|
self.class.new(
|
|
44
|
-
|
|
44
|
+
other | select { |err| err.is_a?(Message) },
|
|
45
45
|
options.merge(source: source_messages, **new_options)
|
|
46
46
|
).freeze
|
|
47
47
|
end
|
|
@@ -54,6 +54,7 @@ module Dry
|
|
|
54
54
|
#
|
|
55
55
|
# @api private
|
|
56
56
|
def add(message)
|
|
57
|
+
@empty = nil
|
|
57
58
|
source_messages << message
|
|
58
59
|
messages << message
|
|
59
60
|
initialize_placeholders!
|
|
@@ -114,7 +115,7 @@ module Dry
|
|
|
114
115
|
# rubocop:disable Metrics/AbcSize
|
|
115
116
|
# rubocop:disable Metrics/PerceivedComplexity
|
|
116
117
|
def initialize_placeholders!
|
|
117
|
-
@placeholders = unique_paths.each_with_object(EMPTY_HASH.dup) { |path, hash|
|
|
118
|
+
@placeholders = unique_paths.sort_by(&:size).each_with_object(EMPTY_HASH.dup) { |path, hash|
|
|
118
119
|
curr_idx = 0
|
|
119
120
|
last_idx = path.size - 1
|
|
120
121
|
node = hash
|
|
@@ -22,6 +22,8 @@ module Dry
|
|
|
22
22
|
# Resolve Message object from provided args and path
|
|
23
23
|
#
|
|
24
24
|
# This is used internally by contracts when rules are applied
|
|
25
|
+
# If message argument is a Hash, then it MUST have a :text key,
|
|
26
|
+
# which value will be used as the message value
|
|
25
27
|
#
|
|
26
28
|
# @return [Message, Message::Localized]
|
|
27
29
|
#
|
|
@@ -34,7 +36,12 @@ module Dry
|
|
|
34
36
|
Message[message, path, meta]
|
|
35
37
|
when Hash
|
|
36
38
|
meta = message.dup
|
|
37
|
-
text = meta.delete(:text)
|
|
39
|
+
text = meta.delete(:text) { |key|
|
|
40
|
+
raise ArgumentError, <<~STR
|
|
41
|
+
+message+ Hash must contain :#{key} key (#{message.inspect} given)
|
|
42
|
+
STR
|
|
43
|
+
}
|
|
44
|
+
|
|
38
45
|
call(message: text, tokens: tokens, path: path, meta: meta)
|
|
39
46
|
else
|
|
40
47
|
raise ArgumentError, <<~STR
|
|
@@ -68,11 +75,31 @@ module Dry
|
|
|
68
75
|
STR
|
|
69
76
|
end
|
|
70
77
|
|
|
71
|
-
|
|
78
|
+
parsed_tokens = parse_tokens(tokens)
|
|
79
|
+
text = template.(template.data(parsed_tokens))
|
|
72
80
|
|
|
73
81
|
[full ? "#{messages.rule(keys.last, msg_opts)} #{text}" : text, meta]
|
|
74
82
|
end
|
|
75
83
|
# rubocop:enable Metrics/AbcSize
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
|
|
87
|
+
def parse_tokens(tokens)
|
|
88
|
+
Hash[
|
|
89
|
+
tokens.map do |key, token|
|
|
90
|
+
[key, parse_token(token)]
|
|
91
|
+
end
|
|
92
|
+
]
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def parse_token(token)
|
|
96
|
+
case token
|
|
97
|
+
when Array
|
|
98
|
+
token.join(', ')
|
|
99
|
+
else
|
|
100
|
+
token
|
|
101
|
+
end
|
|
102
|
+
end
|
|
76
103
|
end
|
|
77
104
|
end
|
|
78
105
|
end
|
|
@@ -179,6 +179,22 @@ module Dry
|
|
|
179
179
|
super
|
|
180
180
|
end
|
|
181
181
|
|
|
182
|
+
if RUBY_VERSION >= '2.7'
|
|
183
|
+
# Pattern matching
|
|
184
|
+
#
|
|
185
|
+
# @api private
|
|
186
|
+
def deconstruct_keys(keys)
|
|
187
|
+
values.deconstruct_keys(keys)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# Pattern matching
|
|
191
|
+
#
|
|
192
|
+
# @api private
|
|
193
|
+
def deconstruct
|
|
194
|
+
[values, context.each.to_h]
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
182
198
|
private
|
|
183
199
|
|
|
184
200
|
# @api private
|
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.4.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:
|
|
11
|
+
date: 2020-01-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: concurrent-ruby
|
|
@@ -95,7 +95,7 @@ dependencies:
|
|
|
95
95
|
version: '1.0'
|
|
96
96
|
- - ">="
|
|
97
97
|
- !ruby/object:Gem::Version
|
|
98
|
-
version: 1.3
|
|
98
|
+
version: 1.4.3
|
|
99
99
|
type: :runtime
|
|
100
100
|
prerelease: false
|
|
101
101
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -105,7 +105,7 @@ dependencies:
|
|
|
105
105
|
version: '1.0'
|
|
106
106
|
- - ">="
|
|
107
107
|
- !ruby/object:Gem::Version
|
|
108
|
-
version: 1.3
|
|
108
|
+
version: 1.4.3
|
|
109
109
|
- !ruby/object:Gem::Dependency
|
|
110
110
|
name: bundler
|
|
111
111
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -200,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
200
200
|
- !ruby/object:Gem::Version
|
|
201
201
|
version: '0'
|
|
202
202
|
requirements: []
|
|
203
|
-
rubygems_version: 3.
|
|
203
|
+
rubygems_version: 3.1.2
|
|
204
204
|
signing_key:
|
|
205
205
|
specification_version: 4
|
|
206
206
|
summary: Validation library
|