dry-schema 1.2.0 → 1.3.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 +118 -80
- data/README.md +2 -2
- data/lib/dry/schema/dsl.rb +1 -1
- data/lib/dry/schema/macros/dsl.rb +1 -7
- data/lib/dry/schema/macros/schema.rb +21 -5
- data/lib/dry/schema/predicate_inferrer.rb +69 -16
- data/lib/dry/schema/trace.rb +15 -20
- data/lib/dry/schema/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c2703b501037f07e55a7018b8e0e048525e591d2f5cb5e369717a0635aacd443
|
|
4
|
+
data.tar.gz: e199bafff541bee970435b2dd26ce10b888c2167d5aec919dafbf91b089311ea
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b7512d9308582c306717a507ad4c218e50137e13699dacadcdb4d9f5d8bb01cfae635cdd78a27d4466e620c13e43d63b4cc7f27112d1bbaf74bdc5e7c7e1d384
|
|
7
|
+
data.tar.gz: 58bc3d577e79752c8495749af8dc9304d1bcae753f6a612fbf744f4dc9586a65aafceb038c9ec6198361edd0b7f930e8f59abd600c74b3ba562de32a5d967e70
|
data/CHANGELOG.md
CHANGED
|
@@ -1,22 +1,60 @@
|
|
|
1
|
+
# 1.3.0 2019-07-06
|
|
2
|
+
|
|
3
|
+
### Added
|
|
4
|
+
|
|
5
|
+
- Automatic predicate inferring for constrained types! (@flash-gordon)
|
|
6
|
+
|
|
7
|
+
```ruby
|
|
8
|
+
Types::Name = Types::String.constrained(min_size: 1)
|
|
9
|
+
|
|
10
|
+
schema = Dry::Schema.define do
|
|
11
|
+
required(:name).value(Types::Name)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
schema.(name: '').errors.to_h # => { name: ["size cannot be less than 1"] }
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- Support for redefining re-used schemas (issue #43) (@skryukov)
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- Type container is passed down to nested schemas (@flash-gordon)
|
|
22
|
+
|
|
23
|
+
[Compare v1.2.0...v1.3.0](https://github.com/dry-rb/dry-schema/compare/v1.2.0...v1.3.0)
|
|
24
|
+
|
|
1
25
|
# v1.2.0 2019-06-13
|
|
2
26
|
|
|
3
27
|
### Added
|
|
4
28
|
|
|
5
|
-
|
|
29
|
+
- Ability to configure your own type container (@Morozzzko)
|
|
30
|
+
|
|
31
|
+
```ruby
|
|
32
|
+
types = Dry::Schema::TypeContainer.new
|
|
33
|
+
types.register(
|
|
34
|
+
'params.trimmed_string',
|
|
35
|
+
Types::String.constructor(&:strip).constructor(&:downcase)
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
Dry::Schema.Params do
|
|
39
|
+
config.types = types
|
|
40
|
+
|
|
41
|
+
require(:name).value(:trimmed_string)
|
|
42
|
+
end
|
|
43
|
+
```
|
|
6
44
|
|
|
7
45
|
### Fixed
|
|
8
46
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
47
|
+
- `filled` macro no longer generates incorrect messages for arrays (issue #151) (@solnic)
|
|
48
|
+
- `filled` macro works correctly with constructor types (@solnic)
|
|
49
|
+
- `filled` works correctly with nested schemas (#149) (@solnic + @timriley)
|
|
50
|
+
- Custom array constructors are no longer discredited by `array` macro (@solnic)
|
|
51
|
+
- `BigDecimal` type is correctly handled by predicate inference (@solnic)
|
|
52
|
+
- Works with latest `dry-logic` which provides the new `respond_to?` predicate (#153) (@flash-gordon)
|
|
15
53
|
|
|
16
54
|
### Changed
|
|
17
55
|
|
|
18
|
-
|
|
19
|
-
|
|
56
|
+
- Fixes related to `filled` restored pre-1.1.0 behavior of `:hints` which are again included (@solnic)
|
|
57
|
+
- `filled` no longer uses filter rules to handle empty strings in `Params` (@solnic)
|
|
20
58
|
|
|
21
59
|
[Compare v1.1.0...v1.2.0](https://github.com/dry-rb/dry-schema/compare/v1.1.0...v1.2.0)
|
|
22
60
|
|
|
@@ -24,18 +62,18 @@
|
|
|
24
62
|
|
|
25
63
|
### Added
|
|
26
64
|
|
|
27
|
-
|
|
28
|
-
|
|
65
|
+
- `config.messages.default_locale` for setting...default locale (surprise, surprise) (solnic)
|
|
66
|
+
- `Config` exposes `predicates` setting too (solnic)
|
|
29
67
|
|
|
30
68
|
### Fixed
|
|
31
69
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
70
|
+
- `filled` macro behavior results in `must be filled` error messages when appropriate - see PR #141 for more information (issue #134) (solnic)
|
|
71
|
+
- Filter rules no longer cause keys to be added to input (issue #142) (solnic)
|
|
72
|
+
- Filter rules work now with inheritance (solnic)
|
|
73
|
+
- Inherited type schemas used by coercion are now properly configured as `lax` type (solnic)
|
|
74
|
+
- `Config` is now finalized before instantiating schemas and properly dupped when its inherited (flash-gordon + solnic)
|
|
75
|
+
- `Config#eql?` works as expected (solnic)
|
|
76
|
+
- Predicates are properly inferred from array with a member type spec, ie `array[:integer]` results in `array? + each(:integer?)` (issue #140) (solnic)
|
|
39
77
|
|
|
40
78
|
[Compare v1.0.3...v1.1.0](https://github.com/dry-rb/dry-schema/compare/v1.0.3...v1.1.0)
|
|
41
79
|
|
|
@@ -43,9 +81,9 @@
|
|
|
43
81
|
|
|
44
82
|
### Fixed
|
|
45
83
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
84
|
+
- `Object#hash` is no longer used to calculate cache keys due to a potential risk of having hash collisions (solnic)
|
|
85
|
+
- Predicate arguments are used again for template cache keys (solnic)
|
|
86
|
+
- `I18n` messages backend no longer evaluates templates twice (solnic)
|
|
49
87
|
|
|
50
88
|
[Compare v1.0.2...v1.0.3](https://github.com/dry-rb/dry-schema/compare/v1.0.2...v1.0.3)
|
|
51
89
|
|
|
@@ -53,7 +91,7 @@
|
|
|
53
91
|
|
|
54
92
|
### Fixed
|
|
55
93
|
|
|
56
|
-
|
|
94
|
+
- Caching message templates uses restricted set of known keys to calculate cache keys (issue #132) (solnic)
|
|
57
95
|
|
|
58
96
|
[Compare v1.0.1...v1.0.2](https://github.com/dry-rb/dry-schema/compare/v1.0.1...v1.0.2)
|
|
59
97
|
|
|
@@ -61,7 +99,7 @@
|
|
|
61
99
|
|
|
62
100
|
### Fixed
|
|
63
101
|
|
|
64
|
-
|
|
102
|
+
- Applying `key?` predicate no longer causes recursive calls to `Result#errors` (issue #130) (solnic)
|
|
65
103
|
|
|
66
104
|
[Compare v1.0.0...v1.0.1](https://github.com/dry-rb/dry-schema/compare/v1.0.0...v1.0.1)
|
|
67
105
|
|
|
@@ -69,12 +107,12 @@
|
|
|
69
107
|
|
|
70
108
|
### Changed
|
|
71
109
|
|
|
72
|
-
|
|
110
|
+
- [BREAKING] `Result#to_hash` was removed (solnic)
|
|
73
111
|
|
|
74
112
|
### Fixed
|
|
75
113
|
|
|
76
|
-
|
|
77
|
-
|
|
114
|
+
- Setting `:any` as the type spec no longer crashes (solnic)
|
|
115
|
+
- `Result#error?` handles paths to array elements correctly (solnic)
|
|
78
116
|
|
|
79
117
|
[Compare v0.6.0...v1.0.0](https://github.com/dry-rb/dry-schema/compare/v0.6.0...v1.0.0)
|
|
80
118
|
|
|
@@ -82,9 +120,9 @@
|
|
|
82
120
|
|
|
83
121
|
### Changed
|
|
84
122
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
123
|
+
- Dependency on `dry-types` was bumped to `~> 1.0` (solnic)
|
|
124
|
+
- Dependency on `dry-logic` was bumped to `~> 1.0` (solnic)
|
|
125
|
+
- Dependency on `dry-initializer` was bumped to `~> 3.0` (solnic)
|
|
88
126
|
|
|
89
127
|
[Compare v0.5.1...v0.6.0](https://github.com/dry-rb/dry-schema/compare/v0.5.1...v0.6.0)
|
|
90
128
|
|
|
@@ -92,7 +130,7 @@
|
|
|
92
130
|
|
|
93
131
|
### Fixed
|
|
94
132
|
|
|
95
|
-
|
|
133
|
+
- Key map no longer crashes on unexpected input (issue #118) (solnic)
|
|
96
134
|
|
|
97
135
|
[Compare v0.5.0...v0.5.1](https://github.com/dry-rb/dry-schema/compare/v0.5.0...v0.5.1)
|
|
98
136
|
|
|
@@ -100,7 +138,7 @@
|
|
|
100
138
|
|
|
101
139
|
### Added
|
|
102
140
|
|
|
103
|
-
|
|
141
|
+
- Support for arbitrary meta-data in messages, ie:
|
|
104
142
|
|
|
105
143
|
```yaml
|
|
106
144
|
en:
|
|
@@ -113,10 +151,10 @@
|
|
|
113
151
|
|
|
114
152
|
Now your error hash will include `{ foo: [{ text: 'cannot be blank', code: 123 }] }` (solnic + flash-gordon)
|
|
115
153
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
154
|
+
- Support for type specs in `array` macro, ie `required(:tags).array(:integer)` (solnic)
|
|
155
|
+
- Support for type specs in `each` macro, ie `required(:tags).each(:integer)` (solnic)
|
|
156
|
+
- Shortcut for defining an array with hash as its member, ie:
|
|
157
|
+
|
|
120
158
|
```ruby
|
|
121
159
|
Dry::Schema.Params do
|
|
122
160
|
required(:tags).array(:hash) do
|
|
@@ -127,13 +165,13 @@
|
|
|
127
165
|
|
|
128
166
|
### Fixed
|
|
129
167
|
|
|
130
|
-
|
|
131
|
-
|
|
168
|
+
- Inferring predicates doesn't crash when `Any` type is used (flash-gordon)
|
|
169
|
+
- Inferring type specs when type is already set works correctly (solnic)
|
|
132
170
|
|
|
133
171
|
### Changed
|
|
134
172
|
|
|
135
|
-
|
|
136
|
-
|
|
173
|
+
- [BREAKING] `:monads` extension wraps entire result objects in `Success` or `Failure` (flash-gordon)
|
|
174
|
+
- When `:hints` are disabled, result AST will not include hint nodes (solnic)
|
|
137
175
|
|
|
138
176
|
[Compare v0.4.0...v0.5.0](https://github.com/dry-rb/dry-schema/compare/v0.4.0...v0.5.0)
|
|
139
177
|
|
|
@@ -141,30 +179,30 @@
|
|
|
141
179
|
|
|
142
180
|
### Added
|
|
143
181
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
182
|
+
- Schemas are now compatible with procs via `#to_proc` (issue #53) (solnic)
|
|
183
|
+
- Support for configuring `top_namespace` for localized messages (solnic)
|
|
184
|
+
- Support for configuring more than one load path for localized messages (solnic)
|
|
185
|
+
- Support for inferring predicates from arbitrary types (issue #101) (solnic)
|
|
148
186
|
|
|
149
187
|
### Fixed
|
|
150
188
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
189
|
+
- Handling of messages for `optional` keys without value rules works correctly (issue #87) (solnic)
|
|
190
|
+
- Message structure for `optional` keys with an array of hashes no longer duplicates keys (issue #89) (solnic)
|
|
191
|
+
- Inferring `:date_time?` predicate works correctly with `DateTime` types (issue #97) (solnic)
|
|
154
192
|
|
|
155
193
|
### Changed
|
|
156
194
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
195
|
+
- [BREAKING] Updated to work with `dry-types 0.15.0` (flash-gordon)
|
|
196
|
+
- [BREAKING] `Result#{errors,messages,hints}` returns `MessageSet` object now which is an enumerable coercible to a hash (solnic)
|
|
197
|
+
- [BREAKING] `Messages` backend classes no longer use global configuration (solnic)
|
|
198
|
+
- [BREAKING] Passing a non-symbol key name in the DSL will raise `ArgumentError` (issue #29) (solnic)
|
|
199
|
+
- [BREAKING] Configuration for message backends is now nested under `messages` key with following settings:
|
|
200
|
+
- `messages.backend` - previously `messages`
|
|
201
|
+
- `messages.load_paths` - previously `messages_path`
|
|
202
|
+
- `messages.namespace` - previously `namespace`
|
|
203
|
+
- `messages.top_namespace` - **new setting** see above
|
|
204
|
+
- [BREAKING] `Messages::I18n` uses `I18.store_translations` instead of messing with `I18n.load_path` (solnic)
|
|
205
|
+
- Schemas (`Params` and `JSON`) have nicer inspect (solnic)
|
|
168
206
|
|
|
169
207
|
[Compare v0.3.0...v0.4.0](https://github.com/dry-rb/dry-schema/compare/v0.3.0...v0.4.0)
|
|
170
208
|
|
|
@@ -172,16 +210,16 @@
|
|
|
172
210
|
|
|
173
211
|
### Fixed
|
|
174
212
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
213
|
+
- Configuration is properly inherited from a parent schema (skryukov)
|
|
214
|
+
- `Result#error?` returns `true` when a preceding key has errors (solnic)
|
|
215
|
+
- Predicate inferrer no longer chokes on sum, constructor and enum types (solnic)
|
|
216
|
+
- Predicate inferrer infers `:bool?` from boolean types (solnic)
|
|
217
|
+
- Block-based definitions using `array` works correctly (solnic)
|
|
218
|
+
- Using a disjunction with `array` and `hash` produces correct errors when element validation for array failed (solnic)
|
|
181
219
|
|
|
182
220
|
### Changed
|
|
183
221
|
|
|
184
|
-
|
|
222
|
+
- Required ruby version was removed from gemspec for people who are stuck on MRI 2.3.x (solnic)
|
|
185
223
|
|
|
186
224
|
[Compare v0.2.0...v0.3.0](https://github.com/dry-rb/dry-schema/compare/v0.2.0...v0.3.0)
|
|
187
225
|
|
|
@@ -189,28 +227,28 @@
|
|
|
189
227
|
|
|
190
228
|
### Added
|
|
191
229
|
|
|
192
|
-
|
|
193
|
-
|
|
230
|
+
- New `hash` macro which prepends `hash?` type-check and allows nested schema definition (solnic)
|
|
231
|
+
- New `array` macro which works like `each` but prepends `array?` type-check (solnic)
|
|
194
232
|
|
|
195
233
|
### Fixed
|
|
196
234
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
235
|
+
- Rule name translation works correctly with I18n (issue #52) (solnic)
|
|
236
|
+
- Rule name translation works correctly with namespaced messages (both I18n and plain YAML) (issue #57) (solnic)
|
|
237
|
+
- Error messages under namespaces are correctly resolved for overridden names (issue #53) (solnic)
|
|
238
|
+
- Namespaced error messages work correctly when schemas are reused within other schemas (issue #49) (solnic)
|
|
239
|
+
- Child schema can override inherited rules now (issue #66) (skryukov)
|
|
240
|
+
- Hints are correctly generated for disjunction that use type-check predicates (issue #24) (solnic)
|
|
241
|
+
- Hints are correctly generated for nested schemas (issue #26) (solnic)
|
|
242
|
+
- `filled` macro respects inferred type-check predicates and puts them in front (solnic)
|
|
243
|
+
- Value coercion works correctly with re-usable nested schemas (issue #25) (solnic)
|
|
206
244
|
|
|
207
245
|
### Changed
|
|
208
246
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
247
|
+
- [BREAKING] **Messages are now configured under `dry_schema` namespace by default** (issue #38) (solnic)
|
|
248
|
+
- [BREAKING] Hints are now an optional feature provided by `:hints` extension, to load it do `Dry::Schema.load_extensions(:hints)` (solnic)
|
|
249
|
+
- [BREAKING] Hints generation was improved in general, output of `Result#messages` and `Result#hints` changed in some cases (solnic)
|
|
250
|
+
- [BREAKING] `schema` macro no longer prepends `hash?` check, for this behavior use the new `hash` macro (see #31) (solnic)
|
|
251
|
+
- [BREAKING] Support for MRI < 2.4 was dropped (solnic)
|
|
214
252
|
|
|
215
253
|
[Compare v0.1.1...v0.2.0](https://github.com/dry-rb/dry-schema/compare/v0.1.1...v0.2.0)
|
|
216
254
|
|
data/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
[gem]: https://rubygems.org/gems/dry-schema
|
|
2
|
-
[travis]: https://travis-ci.
|
|
2
|
+
[travis]: https://travis-ci.com/dry-rb/dry-schema
|
|
3
3
|
[codeclimate]: https://codeclimate.com/github/dry-rb/dry-schema
|
|
4
4
|
[chat]: https://dry-rb.zulipchat.com
|
|
5
5
|
[inchpages]: http://inch-ci.org/github/dry-rb/dry-schema
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# dry-schema [][chat]
|
|
8
8
|
|
|
9
9
|
[][gem]
|
|
10
|
-
[][travis]
|
|
11
11
|
[][codeclimate]
|
|
12
12
|
[][codeclimate]
|
|
13
13
|
[][inchpages]
|
data/lib/dry/schema/dsl.rb
CHANGED
|
@@ -231,7 +231,7 @@ module Dry
|
|
|
231
231
|
#
|
|
232
232
|
# @api private
|
|
233
233
|
def new(options = EMPTY_HASH, &block)
|
|
234
|
-
self.class.new(options.merge(processor_type: processor_type), &block)
|
|
234
|
+
self.class.new(options.merge(processor_type: processor_type, config: config), &block)
|
|
235
235
|
end
|
|
236
236
|
|
|
237
237
|
# Set a type for the given key name
|
|
@@ -200,13 +200,7 @@ module Dry
|
|
|
200
200
|
|
|
201
201
|
type_predicates = predicate_inferrer[resolved_type]
|
|
202
202
|
|
|
203
|
-
unless type_predicates.empty?
|
|
204
|
-
if type_predicates.is_a?(::Array) && type_predicates.size.equal?(1)
|
|
205
|
-
predicates.unshift(type_predicates[0])
|
|
206
|
-
else
|
|
207
|
-
predicates.unshift(type_predicates)
|
|
208
|
-
end
|
|
209
|
-
end
|
|
203
|
+
predicates.replace(type_predicates + predicates) unless type_predicates.empty?
|
|
210
204
|
|
|
211
205
|
return self if predicates.empty?
|
|
212
206
|
end
|
|
@@ -11,10 +11,10 @@ module Dry
|
|
|
11
11
|
class Schema < Value
|
|
12
12
|
# @api private
|
|
13
13
|
def call(*args, &block)
|
|
14
|
-
super(*args) unless args.empty?
|
|
14
|
+
super(*args, &nil) unless args.empty?
|
|
15
15
|
|
|
16
16
|
if block
|
|
17
|
-
schema = define(&block)
|
|
17
|
+
schema = define(*args, &block)
|
|
18
18
|
trace << schema.to_rule
|
|
19
19
|
end
|
|
20
20
|
|
|
@@ -24,11 +24,17 @@ module Dry
|
|
|
24
24
|
private
|
|
25
25
|
|
|
26
26
|
# @api private
|
|
27
|
-
def define(&block)
|
|
27
|
+
def define(*args, &block)
|
|
28
28
|
definition = schema_dsl.new(&block)
|
|
29
29
|
schema = definition.call
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
type_schema =
|
|
31
|
+
if array?
|
|
32
|
+
parent_type.of(definition.type_schema)
|
|
33
|
+
elsif redefined_schema?(args)
|
|
34
|
+
parent_type.schema(definition.types)
|
|
35
|
+
else
|
|
36
|
+
definition.type_schema
|
|
37
|
+
end
|
|
32
38
|
final_type = optional? ? type_schema.optional : type_schema
|
|
33
39
|
|
|
34
40
|
type(final_type)
|
|
@@ -54,6 +60,16 @@ module Dry
|
|
|
54
60
|
def array?
|
|
55
61
|
parent_type.respond_to?(:of)
|
|
56
62
|
end
|
|
63
|
+
|
|
64
|
+
# @api private
|
|
65
|
+
def schema?
|
|
66
|
+
parent_type.respond_to?(:schema)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @api private
|
|
70
|
+
def redefined_schema?(args)
|
|
71
|
+
schema? && args.first.is_a?(Processor)
|
|
72
|
+
end
|
|
57
73
|
end
|
|
58
74
|
end
|
|
59
75
|
end
|
|
@@ -22,9 +22,15 @@ module Dry
|
|
|
22
22
|
}.freeze
|
|
23
23
|
|
|
24
24
|
REDUCED_TYPES = {
|
|
25
|
-
|
|
25
|
+
[[[:true?], [:false?]]] => %i[bool?]
|
|
26
26
|
}.freeze
|
|
27
27
|
|
|
28
|
+
HASH = %i[hash?].freeze
|
|
29
|
+
|
|
30
|
+
ARRAY = %i[array?].freeze
|
|
31
|
+
|
|
32
|
+
NIL = %i[nil?].freeze
|
|
33
|
+
|
|
28
34
|
# Compiler reduces type AST into a list of predicates
|
|
29
35
|
#
|
|
30
36
|
# @api private
|
|
@@ -40,7 +46,7 @@ module Dry
|
|
|
40
46
|
|
|
41
47
|
# @api private
|
|
42
48
|
def infer_predicate(type)
|
|
43
|
-
TYPE_TO_PREDICATE.fetch(type) { :"#{type.name.split('::').last.downcase}?" }
|
|
49
|
+
[TYPE_TO_PREDICATE.fetch(type) { :"#{type.name.split('::').last.downcase}?" }]
|
|
44
50
|
end
|
|
45
51
|
|
|
46
52
|
# @api private
|
|
@@ -54,21 +60,21 @@ module Dry
|
|
|
54
60
|
type = node[0]
|
|
55
61
|
predicate = infer_predicate(type)
|
|
56
62
|
|
|
57
|
-
if registry.key?(predicate)
|
|
63
|
+
if registry.key?(predicate[0])
|
|
58
64
|
predicate
|
|
59
65
|
else
|
|
60
|
-
|
|
66
|
+
[type?: type]
|
|
61
67
|
end
|
|
62
68
|
end
|
|
63
69
|
|
|
64
70
|
# @api private
|
|
65
71
|
def visit_hash(_)
|
|
66
|
-
|
|
72
|
+
HASH
|
|
67
73
|
end
|
|
68
74
|
|
|
69
75
|
# @api private
|
|
70
76
|
def visit_array(_)
|
|
71
|
-
|
|
77
|
+
ARRAY
|
|
72
78
|
end
|
|
73
79
|
|
|
74
80
|
# @api private
|
|
@@ -90,26 +96,73 @@ module Dry
|
|
|
90
96
|
|
|
91
97
|
# @api private
|
|
92
98
|
def visit_sum(node)
|
|
93
|
-
|
|
99
|
+
left_node, right_node, = node
|
|
100
|
+
left = visit(left_node)
|
|
101
|
+
right = visit(right_node)
|
|
94
102
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if predicates.first == :nil?
|
|
98
|
-
predicates[1..predicates.size - 1]
|
|
103
|
+
if left.eql?(NIL)
|
|
104
|
+
right
|
|
99
105
|
else
|
|
100
|
-
|
|
106
|
+
[[left, right]]
|
|
101
107
|
end
|
|
102
108
|
end
|
|
103
109
|
|
|
104
110
|
# @api private
|
|
105
111
|
def visit_constrained(node)
|
|
106
|
-
other,
|
|
107
|
-
visit(
|
|
112
|
+
other, rules = node
|
|
113
|
+
predicates = visit(rules)
|
|
114
|
+
|
|
115
|
+
if predicates.empty?
|
|
116
|
+
visit(other)
|
|
117
|
+
else
|
|
118
|
+
[*visit(other), *merge_predicates(predicates)]
|
|
119
|
+
end
|
|
108
120
|
end
|
|
109
121
|
|
|
110
122
|
# @api private
|
|
111
123
|
def visit_any(_)
|
|
112
|
-
|
|
124
|
+
EMPTY_ARRAY
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# @api private
|
|
128
|
+
def visit_and(node)
|
|
129
|
+
left, right = node
|
|
130
|
+
visit(left) + visit(right)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# @api private
|
|
134
|
+
def visit_predicate(node)
|
|
135
|
+
pred, args = node
|
|
136
|
+
|
|
137
|
+
if pred.equal?(:type?)
|
|
138
|
+
EMPTY_ARRAY
|
|
139
|
+
elsif registry.key?(pred)
|
|
140
|
+
*curried, _ = args
|
|
141
|
+
values = curried.map { |_, v| v }
|
|
142
|
+
|
|
143
|
+
if values.empty?
|
|
144
|
+
[pred]
|
|
145
|
+
else
|
|
146
|
+
[pred => values[0]]
|
|
147
|
+
end
|
|
148
|
+
else
|
|
149
|
+
EMPTY_ARRAY
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
private
|
|
154
|
+
|
|
155
|
+
# @api private
|
|
156
|
+
def merge_predicates(nodes)
|
|
157
|
+
preds, merged = nodes.each_with_object([[], {}]) do |predicate, (ps, h)|
|
|
158
|
+
if predicate.is_a?(::Hash)
|
|
159
|
+
h.update(predicate)
|
|
160
|
+
else
|
|
161
|
+
ps << predicate
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
merged.empty? ? preds : [*preds, merged]
|
|
113
166
|
end
|
|
114
167
|
end
|
|
115
168
|
|
|
@@ -134,7 +187,7 @@ module Dry
|
|
|
134
187
|
if predicates.is_a?(Hash)
|
|
135
188
|
predicates
|
|
136
189
|
else
|
|
137
|
-
|
|
190
|
+
REDUCED_TYPES[predicates] || predicates
|
|
138
191
|
end
|
|
139
192
|
end
|
|
140
193
|
end
|
data/lib/dry/schema/trace.rb
CHANGED
|
@@ -29,33 +29,28 @@ module Dry
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
# @api private
|
|
32
|
-
def evaluate(*
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
predicates.each do |predicate|
|
|
37
|
-
if predicate.respond_to?(:call)
|
|
38
|
-
append(predicate)
|
|
39
|
-
elsif predicate.is_a?(::Hash)
|
|
40
|
-
evaluate_hash_predicates(predicate)
|
|
41
|
-
elsif predicate.is_a?(::Array)
|
|
42
|
-
append(predicate.map { |pred| __send__(pred) }.reduce(:|))
|
|
43
|
-
else
|
|
44
|
-
append(__send__(predicate))
|
|
45
|
-
end
|
|
32
|
+
def evaluate(*args, type_spec: ::Dry::Schema::Undefined, **opts)
|
|
33
|
+
predicates = opts.empty? ? args : args.push(opts)
|
|
34
|
+
evaluate_predicates(predicates).each do |rule|
|
|
35
|
+
append(rule)
|
|
46
36
|
end
|
|
47
37
|
|
|
48
|
-
evaluate_hash_predicates(pred_opts)
|
|
49
|
-
|
|
50
38
|
self
|
|
51
39
|
end
|
|
52
40
|
|
|
53
41
|
# @api private
|
|
54
|
-
def
|
|
55
|
-
predicates.
|
|
56
|
-
|
|
42
|
+
def evaluate_predicates(predicates)
|
|
43
|
+
predicates.flat_map do |predicate|
|
|
44
|
+
if predicate.respond_to?(:call)
|
|
45
|
+
predicate
|
|
46
|
+
elsif predicate.is_a?(::Array)
|
|
47
|
+
predicate.map { |pred| evaluate_predicates(pred).reduce(:&) }.reduce(:|)
|
|
48
|
+
elsif predicate.is_a?(::Hash)
|
|
49
|
+
predicate.map { |pred, *args| __send__(pred, *args) }
|
|
50
|
+
else
|
|
51
|
+
__send__(predicate)
|
|
52
|
+
end
|
|
57
53
|
end
|
|
58
|
-
self
|
|
59
54
|
end
|
|
60
55
|
|
|
61
56
|
# @api private
|
data/lib/dry/schema/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dry-schema
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.3.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: 2019-06
|
|
11
|
+
date: 2019-07-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: concurrent-ruby
|