dry-validation 0.1.0 → 1.8.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 +5 -5
- data/CHANGELOG.md +969 -1
- data/LICENSE +1 -1
- data/README.md +19 -286
- data/config/errors.yml +4 -35
- data/dry-validation.gemspec +38 -22
- data/lib/dry/validation/config.rb +24 -0
- data/lib/dry/validation/constants.rb +43 -0
- data/lib/dry/validation/contract/class_interface.rb +230 -0
- data/lib/dry/validation/contract.rb +173 -0
- data/lib/dry/validation/evaluator.rb +233 -0
- data/lib/dry/validation/extensions/hints.rb +67 -0
- data/lib/dry/validation/extensions/monads.rb +34 -0
- data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
- data/lib/dry/validation/failures.rb +70 -0
- data/lib/dry/validation/function.rb +43 -0
- data/lib/dry/validation/macro.rb +38 -0
- data/lib/dry/validation/macros.rb +104 -0
- data/lib/dry/validation/message.rb +100 -0
- data/lib/dry/validation/message_set.rb +97 -0
- data/lib/dry/validation/messages/resolver.rb +129 -0
- data/lib/dry/validation/result.rb +206 -38
- data/lib/dry/validation/rule.rb +116 -106
- data/lib/dry/validation/schema_ext.rb +19 -0
- data/lib/dry/validation/values.rb +108 -0
- data/lib/dry/validation/version.rb +3 -1
- data/lib/dry/validation.rb +55 -7
- data/lib/dry-validation.rb +3 -1
- metadata +80 -106
- data/.gitignore +0 -8
- data/.rspec +0 -3
- data/.rubocop.yml +0 -16
- data/.rubocop_todo.yml +0 -7
- data/.travis.yml +0 -29
- data/Gemfile +0 -11
- data/Rakefile +0 -12
- data/examples/basic.rb +0 -21
- data/examples/nested.rb +0 -30
- data/examples/rule_ast.rb +0 -33
- data/lib/dry/validation/error.rb +0 -43
- data/lib/dry/validation/error_compiler.rb +0 -116
- data/lib/dry/validation/messages.rb +0 -71
- data/lib/dry/validation/predicate.rb +0 -39
- data/lib/dry/validation/predicate_set.rb +0 -22
- data/lib/dry/validation/predicates.rb +0 -88
- data/lib/dry/validation/rule_compiler.rb +0 -57
- data/lib/dry/validation/schema/definition.rb +0 -15
- data/lib/dry/validation/schema/key.rb +0 -39
- data/lib/dry/validation/schema/rule.rb +0 -28
- data/lib/dry/validation/schema/value.rb +0 -31
- data/lib/dry/validation/schema.rb +0 -74
- data/rakelib/rubocop.rake +0 -18
- data/spec/fixtures/errors.yml +0 -4
- data/spec/integration/custom_error_messages_spec.rb +0 -35
- data/spec/integration/custom_predicates_spec.rb +0 -57
- data/spec/integration/validation_spec.rb +0 -118
- data/spec/shared/predicates.rb +0 -31
- data/spec/spec_helper.rb +0 -18
- data/spec/unit/error_compiler_spec.rb +0 -165
- data/spec/unit/predicate_spec.rb +0 -37
- data/spec/unit/predicates/empty_spec.rb +0 -38
- data/spec/unit/predicates/eql_spec.rb +0 -21
- data/spec/unit/predicates/exclusion_spec.rb +0 -35
- data/spec/unit/predicates/filled_spec.rb +0 -38
- data/spec/unit/predicates/format_spec.rb +0 -21
- data/spec/unit/predicates/gt_spec.rb +0 -40
- data/spec/unit/predicates/gteq_spec.rb +0 -40
- data/spec/unit/predicates/inclusion_spec.rb +0 -35
- data/spec/unit/predicates/int_spec.rb +0 -34
- data/spec/unit/predicates/key_spec.rb +0 -29
- data/spec/unit/predicates/lt_spec.rb +0 -40
- data/spec/unit/predicates/lteq_spec.rb +0 -40
- data/spec/unit/predicates/max_size_spec.rb +0 -49
- data/spec/unit/predicates/min_size_spec.rb +0 -49
- data/spec/unit/predicates/nil_spec.rb +0 -28
- data/spec/unit/predicates/size_spec.rb +0 -49
- data/spec/unit/predicates/str_spec.rb +0 -32
- data/spec/unit/rule/each_spec.rb +0 -20
- data/spec/unit/rule/key_spec.rb +0 -27
- data/spec/unit/rule/set_spec.rb +0 -32
- data/spec/unit/rule/value_spec.rb +0 -42
- data/spec/unit/rule_compiler_spec.rb +0 -86
data/lib/dry/validation.rb
CHANGED
@@ -1,12 +1,60 @@
|
|
1
|
-
|
2
|
-
require 'dry-configurable'
|
3
|
-
require 'dry-container'
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
|
6
|
-
|
3
|
+
require "dry/validation/constants"
|
4
|
+
require "dry/validation/contract"
|
5
|
+
require "dry/validation/macros"
|
6
|
+
|
7
|
+
# Main namespace
|
8
|
+
#
|
9
|
+
# @api public
|
7
10
|
module Dry
|
11
|
+
# Main library namespace
|
12
|
+
#
|
13
|
+
# @api public
|
8
14
|
module Validation
|
15
|
+
extend Dry::Core::Extensions
|
16
|
+
extend Macros::Registrar
|
17
|
+
|
18
|
+
register_extension(:monads) do
|
19
|
+
require "dry/validation/extensions/monads"
|
20
|
+
end
|
21
|
+
|
22
|
+
register_extension(:hints) do
|
23
|
+
require "dry/validation/extensions/hints"
|
24
|
+
end
|
25
|
+
|
26
|
+
register_extension(:predicates_as_macros) do
|
27
|
+
require "dry/validation/extensions/predicates_as_macros"
|
28
|
+
end
|
29
|
+
|
30
|
+
# Define a contract and build its instance
|
31
|
+
#
|
32
|
+
# @example
|
33
|
+
# my_contract = Dry::Validation.Contract do
|
34
|
+
# params do
|
35
|
+
# required(:name).filled(:string)
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# my_contract.call(name: "Jane")
|
40
|
+
#
|
41
|
+
# @param [Hash] options Contract options
|
42
|
+
#
|
43
|
+
# @see Contract
|
44
|
+
#
|
45
|
+
# @return [Contract]
|
46
|
+
#
|
47
|
+
# @api public
|
48
|
+
#
|
49
|
+
def self.Contract(options = EMPTY_HASH, &block)
|
50
|
+
Contract.build(options, &block)
|
51
|
+
end
|
52
|
+
|
53
|
+
# This is needed by Macros::Registrar
|
54
|
+
#
|
55
|
+
# @api private
|
56
|
+
def self.macros
|
57
|
+
Macros
|
58
|
+
end
|
9
59
|
end
|
10
60
|
end
|
11
|
-
|
12
|
-
require 'dry/validation/schema'
|
data/lib/dry-validation.rb
CHANGED
metadata
CHANGED
@@ -1,64 +1,103 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-validation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Andy Holland
|
8
7
|
- Piotr Solnica
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2022-02-17 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
14
|
+
name: concurrent-ruby
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
16
|
requirements:
|
18
17
|
- - "~>"
|
19
18
|
- !ruby/object:Gem::Version
|
20
|
-
version: '0
|
19
|
+
version: '1.0'
|
21
20
|
type: :runtime
|
22
21
|
prerelease: false
|
23
22
|
version_requirements: !ruby/object:Gem::Requirement
|
24
23
|
requirements:
|
25
24
|
- - "~>"
|
26
25
|
- !ruby/object:Gem::Version
|
27
|
-
version: '0
|
26
|
+
version: '1.0'
|
28
27
|
- !ruby/object:Gem::Dependency
|
29
28
|
name: dry-container
|
30
29
|
requirement: !ruby/object:Gem::Requirement
|
31
30
|
requirements:
|
32
31
|
- - "~>"
|
33
32
|
- !ruby/object:Gem::Version
|
34
|
-
version: '0.
|
33
|
+
version: '0.7'
|
35
34
|
- - ">="
|
36
35
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0.
|
36
|
+
version: 0.7.1
|
38
37
|
type: :runtime
|
39
38
|
prerelease: false
|
40
39
|
version_requirements: !ruby/object:Gem::Requirement
|
41
40
|
requirements:
|
42
41
|
- - "~>"
|
43
42
|
- !ruby/object:Gem::Version
|
44
|
-
version: '0.
|
43
|
+
version: '0.7'
|
45
44
|
- - ">="
|
46
45
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
46
|
+
version: 0.7.1
|
48
47
|
- !ruby/object:Gem::Dependency
|
49
|
-
name: dry-
|
48
|
+
name: dry-core
|
50
49
|
requirement: !ruby/object:Gem::Requirement
|
51
50
|
requirements:
|
52
51
|
- - "~>"
|
53
52
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
53
|
+
version: '0.5'
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0.5'
|
57
|
+
type: :runtime
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0.5'
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0.5'
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: dry-initializer
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - "~>"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '3.0'
|
55
74
|
type: :runtime
|
56
75
|
prerelease: false
|
57
76
|
version_requirements: !ruby/object:Gem::Requirement
|
58
77
|
requirements:
|
59
78
|
- - "~>"
|
60
79
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
80
|
+
version: '3.0'
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: dry-schema
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '1.9'
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 1.9.1
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '1.9'
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: 1.9.1
|
62
101
|
- !ruby/object:Gem::Dependency
|
63
102
|
name: bundler
|
64
103
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,81 +140,48 @@ dependencies:
|
|
101
140
|
- - ">="
|
102
141
|
- !ruby/object:Gem::Version
|
103
142
|
version: '0'
|
104
|
-
description:
|
143
|
+
description: Validation library
|
105
144
|
email:
|
106
|
-
- andyholland1991@aol.com
|
107
145
|
- piotr.solnica@gmail.com
|
108
146
|
executables: []
|
109
147
|
extensions: []
|
110
148
|
extra_rdoc_files: []
|
111
149
|
files:
|
112
|
-
- ".gitignore"
|
113
|
-
- ".rspec"
|
114
|
-
- ".rubocop.yml"
|
115
|
-
- ".rubocop_todo.yml"
|
116
|
-
- ".travis.yml"
|
117
150
|
- CHANGELOG.md
|
118
|
-
- Gemfile
|
119
151
|
- LICENSE
|
120
152
|
- README.md
|
121
|
-
- Rakefile
|
122
153
|
- config/errors.yml
|
123
154
|
- dry-validation.gemspec
|
124
|
-
- examples/basic.rb
|
125
|
-
- examples/nested.rb
|
126
|
-
- examples/rule_ast.rb
|
127
155
|
- lib/dry-validation.rb
|
128
156
|
- lib/dry/validation.rb
|
129
|
-
- lib/dry/validation/
|
130
|
-
- lib/dry/validation/
|
131
|
-
- lib/dry/validation/
|
132
|
-
- lib/dry/validation/
|
133
|
-
- lib/dry/validation/
|
134
|
-
- lib/dry/validation/
|
157
|
+
- lib/dry/validation/config.rb
|
158
|
+
- lib/dry/validation/constants.rb
|
159
|
+
- lib/dry/validation/contract.rb
|
160
|
+
- lib/dry/validation/contract/class_interface.rb
|
161
|
+
- lib/dry/validation/evaluator.rb
|
162
|
+
- lib/dry/validation/extensions/hints.rb
|
163
|
+
- lib/dry/validation/extensions/monads.rb
|
164
|
+
- lib/dry/validation/extensions/predicates_as_macros.rb
|
165
|
+
- lib/dry/validation/failures.rb
|
166
|
+
- lib/dry/validation/function.rb
|
167
|
+
- lib/dry/validation/macro.rb
|
168
|
+
- lib/dry/validation/macros.rb
|
169
|
+
- lib/dry/validation/message.rb
|
170
|
+
- lib/dry/validation/message_set.rb
|
171
|
+
- lib/dry/validation/messages/resolver.rb
|
135
172
|
- lib/dry/validation/result.rb
|
136
173
|
- lib/dry/validation/rule.rb
|
137
|
-
- lib/dry/validation/
|
138
|
-
- lib/dry/validation/
|
139
|
-
- lib/dry/validation/schema/definition.rb
|
140
|
-
- lib/dry/validation/schema/key.rb
|
141
|
-
- lib/dry/validation/schema/rule.rb
|
142
|
-
- lib/dry/validation/schema/value.rb
|
174
|
+
- lib/dry/validation/schema_ext.rb
|
175
|
+
- lib/dry/validation/values.rb
|
143
176
|
- lib/dry/validation/version.rb
|
144
|
-
-
|
145
|
-
- spec/fixtures/errors.yml
|
146
|
-
- spec/integration/custom_error_messages_spec.rb
|
147
|
-
- spec/integration/custom_predicates_spec.rb
|
148
|
-
- spec/integration/validation_spec.rb
|
149
|
-
- spec/shared/predicates.rb
|
150
|
-
- spec/spec_helper.rb
|
151
|
-
- spec/unit/error_compiler_spec.rb
|
152
|
-
- spec/unit/predicate_spec.rb
|
153
|
-
- spec/unit/predicates/empty_spec.rb
|
154
|
-
- spec/unit/predicates/eql_spec.rb
|
155
|
-
- spec/unit/predicates/exclusion_spec.rb
|
156
|
-
- spec/unit/predicates/filled_spec.rb
|
157
|
-
- spec/unit/predicates/format_spec.rb
|
158
|
-
- spec/unit/predicates/gt_spec.rb
|
159
|
-
- spec/unit/predicates/gteq_spec.rb
|
160
|
-
- spec/unit/predicates/inclusion_spec.rb
|
161
|
-
- spec/unit/predicates/int_spec.rb
|
162
|
-
- spec/unit/predicates/key_spec.rb
|
163
|
-
- spec/unit/predicates/lt_spec.rb
|
164
|
-
- spec/unit/predicates/lteq_spec.rb
|
165
|
-
- spec/unit/predicates/max_size_spec.rb
|
166
|
-
- spec/unit/predicates/min_size_spec.rb
|
167
|
-
- spec/unit/predicates/nil_spec.rb
|
168
|
-
- spec/unit/predicates/size_spec.rb
|
169
|
-
- spec/unit/predicates/str_spec.rb
|
170
|
-
- spec/unit/rule/each_spec.rb
|
171
|
-
- spec/unit/rule/key_spec.rb
|
172
|
-
- spec/unit/rule/set_spec.rb
|
173
|
-
- spec/unit/rule/value_spec.rb
|
174
|
-
- spec/unit/rule_compiler_spec.rb
|
175
|
-
homepage: https://github.com/dryrb/dry-validation
|
177
|
+
homepage: https://dry-rb.org/gems/dry-validation
|
176
178
|
licenses:
|
177
179
|
- MIT
|
178
|
-
metadata:
|
180
|
+
metadata:
|
181
|
+
allowed_push_host: https://rubygems.org
|
182
|
+
changelog_uri: https://github.com/dry-rb/dry-validation/blob/master/CHANGELOG.md
|
183
|
+
source_code_uri: https://github.com/dry-rb/dry-validation
|
184
|
+
bug_tracker_uri: https://github.com/dry-rb/dry-validation/issues
|
179
185
|
post_install_message:
|
180
186
|
rdoc_options: []
|
181
187
|
require_paths:
|
@@ -184,47 +190,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
184
190
|
requirements:
|
185
191
|
- - ">="
|
186
192
|
- !ruby/object:Gem::Version
|
187
|
-
version:
|
193
|
+
version: 2.7.0
|
188
194
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
189
195
|
requirements:
|
190
196
|
- - ">="
|
191
197
|
- !ruby/object:Gem::Version
|
192
198
|
version: '0'
|
193
199
|
requirements: []
|
194
|
-
|
195
|
-
rubygems_version: 2.4.5
|
200
|
+
rubygems_version: 3.1.6
|
196
201
|
signing_key:
|
197
202
|
specification_version: 4
|
198
|
-
summary:
|
199
|
-
test_files:
|
200
|
-
- spec/fixtures/errors.yml
|
201
|
-
- spec/integration/custom_error_messages_spec.rb
|
202
|
-
- spec/integration/custom_predicates_spec.rb
|
203
|
-
- spec/integration/validation_spec.rb
|
204
|
-
- spec/shared/predicates.rb
|
205
|
-
- spec/spec_helper.rb
|
206
|
-
- spec/unit/error_compiler_spec.rb
|
207
|
-
- spec/unit/predicate_spec.rb
|
208
|
-
- spec/unit/predicates/empty_spec.rb
|
209
|
-
- spec/unit/predicates/eql_spec.rb
|
210
|
-
- spec/unit/predicates/exclusion_spec.rb
|
211
|
-
- spec/unit/predicates/filled_spec.rb
|
212
|
-
- spec/unit/predicates/format_spec.rb
|
213
|
-
- spec/unit/predicates/gt_spec.rb
|
214
|
-
- spec/unit/predicates/gteq_spec.rb
|
215
|
-
- spec/unit/predicates/inclusion_spec.rb
|
216
|
-
- spec/unit/predicates/int_spec.rb
|
217
|
-
- spec/unit/predicates/key_spec.rb
|
218
|
-
- spec/unit/predicates/lt_spec.rb
|
219
|
-
- spec/unit/predicates/lteq_spec.rb
|
220
|
-
- spec/unit/predicates/max_size_spec.rb
|
221
|
-
- spec/unit/predicates/min_size_spec.rb
|
222
|
-
- spec/unit/predicates/nil_spec.rb
|
223
|
-
- spec/unit/predicates/size_spec.rb
|
224
|
-
- spec/unit/predicates/str_spec.rb
|
225
|
-
- spec/unit/rule/each_spec.rb
|
226
|
-
- spec/unit/rule/key_spec.rb
|
227
|
-
- spec/unit/rule/set_spec.rb
|
228
|
-
- spec/unit/rule/value_spec.rb
|
229
|
-
- spec/unit/rule_compiler_spec.rb
|
230
|
-
has_rdoc:
|
203
|
+
summary: Validation library
|
204
|
+
test_files: []
|
data/.gitignore
DELETED
data/.rspec
DELETED
data/.rubocop.yml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# Generated by `rubocop --auto-gen-config`
|
2
|
-
inherit_from: .rubocop_todo.yml
|
3
|
-
|
4
|
-
Metrics/LineLength:
|
5
|
-
Max: 100
|
6
|
-
|
7
|
-
Style/Documentation:
|
8
|
-
Enabled: false
|
9
|
-
|
10
|
-
Lint/HandleExceptions:
|
11
|
-
Exclude:
|
12
|
-
- rakelib/*.rake
|
13
|
-
|
14
|
-
Style/FileName:
|
15
|
-
Exclude:
|
16
|
-
- lib/dry-validation.rb
|
data/.rubocop_todo.yml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
# This configuration was generated by
|
2
|
-
# `rubocop --auto-gen-config`
|
3
|
-
# on 2015-10-30 01:32:46 +0000 using RuboCop version 0.34.2.
|
4
|
-
# The point is for the user to remove these configuration records
|
5
|
-
# one by one as the offenses are removed from the code base.
|
6
|
-
# Note that changes in the inspected code, or installation of new
|
7
|
-
# versions of RuboCop, may require this file to be generated again.
|
data/.travis.yml
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
sudo: false
|
3
|
-
cache: bundler
|
4
|
-
bundler_args: --without console
|
5
|
-
script:
|
6
|
-
- bundle exec rake spec
|
7
|
-
rvm:
|
8
|
-
- 2.0
|
9
|
-
- 2.1
|
10
|
-
- 2.2
|
11
|
-
- rbx-2
|
12
|
-
- jruby-9000
|
13
|
-
- ruby-head
|
14
|
-
- jruby-head
|
15
|
-
env:
|
16
|
-
global:
|
17
|
-
- JRUBY_OPTS='--dev -J-Xmx1024M'
|
18
|
-
matrix:
|
19
|
-
allow_failures:
|
20
|
-
- rvm: ruby-head
|
21
|
-
- rvm: jruby-head
|
22
|
-
notifications:
|
23
|
-
email: false
|
24
|
-
webhooks:
|
25
|
-
urls:
|
26
|
-
- https://webhooks.gitter.im/e/19098b4253a72c9796db
|
27
|
-
on_success: change # options: [always|never|change] default: always
|
28
|
-
on_failure: always # options: [always|never|change] default: always
|
29
|
-
on_start: false # default: false
|
data/Gemfile
DELETED
data/Rakefile
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
#!/usr/bin/env rake
|
2
|
-
require 'bundler/gem_tasks'
|
3
|
-
|
4
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
5
|
-
|
6
|
-
require 'rspec/core'
|
7
|
-
require 'rspec/core/rake_task'
|
8
|
-
|
9
|
-
task default: :spec
|
10
|
-
|
11
|
-
desc 'Run all specs in spec directory'
|
12
|
-
RSpec::Core::RakeTask.new(:spec)
|
data/examples/basic.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'dry-validation'
|
2
|
-
|
3
|
-
class Schema < Dry::Validation::Schema
|
4
|
-
key(:email) { |email| email.filled? }
|
5
|
-
|
6
|
-
key(:age) do |age|
|
7
|
-
age.int? & age.gt?(18)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
schema = Schema.new
|
12
|
-
|
13
|
-
errors = schema.messages(email: 'jane@doe.org', age: 19)
|
14
|
-
|
15
|
-
puts errors.inspect
|
16
|
-
# []
|
17
|
-
|
18
|
-
errors = schema.messages(email: nil, age: 19)
|
19
|
-
|
20
|
-
puts errors.inspect
|
21
|
-
# [[:email, ["email must be filled"]]]
|
data/examples/nested.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'dry-validation'
|
2
|
-
|
3
|
-
class Schema < Dry::Validation::Schema
|
4
|
-
key(:address) do |address|
|
5
|
-
address.key(:city) do |city|
|
6
|
-
city.min_size?(3)
|
7
|
-
end
|
8
|
-
|
9
|
-
address.key(:street) do |street|
|
10
|
-
street.filled?
|
11
|
-
end
|
12
|
-
|
13
|
-
address.key(:country) do |country|
|
14
|
-
country.key(:name, &:filled?)
|
15
|
-
country.key(:code, &:filled?)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
schema = Schema.new
|
21
|
-
|
22
|
-
errors = schema.messages({})
|
23
|
-
|
24
|
-
puts errors.inspect
|
25
|
-
#<Dry::Validation::Error::Set:0x007fc4f89c4360 @errors=[#<Dry::Validation::Error:0x007fc4f89c4108 @result=#<Dry::Validation::Result::Value success?=false input=nil rule=#<Dry::Validation::Rule::Key name=:address predicate=#<Dry::Validation::Predicate id=:key?>>>>]>
|
26
|
-
|
27
|
-
errors = schema.messages(address: { city: 'NYC' })
|
28
|
-
|
29
|
-
puts errors.inspect
|
30
|
-
#<Dry::Validation::Error::Set:0x007fd151189b18 @errors=[#<Dry::Validation::Error:0x007fd151188e20 @result=#<Dry::Validation::Result::Set success?=false input={:city=>"NYC"} rule=#<Dry::Validation::Rule::Set name=:address predicate=[#<Dry::Validation::Rule::Conjunction left=#<Dry::Validation::Rule::Key name=:city predicate=#<Dry::Validation::Predicate id=:key?>> right=#<Dry::Validation::Rule::Value name=:city predicate=#<Dry::Validation::Predicate id=:min_size?>>>, #<Dry::Validation::Rule::Conjunction left=#<Dry::Validation::Rule::Key name=:street predicate=#<Dry::Validation::Predicate id=:key?>> right=#<Dry::Validation::Rule::Value name=:street predicate=#<Dry::Validation::Predicate id=:filled?>>>, #<Dry::Validation::Rule::Conjunction left=#<Dry::Validation::Rule::Key name=:country predicate=#<Dry::Validation::Predicate id=:key?>> right=#<Dry::Validation::Rule::Set name=:country predicate=[#<Dry::Validation::Rule::Conjunction left=#<Dry::Validation::Rule::Key name=:name predicate=#<Dry::Validation::Predicate id=:key?>> right=#<Dry::Validation::Rule::Value name=:name predicate=#<Dry::Validation::Predicate id=:filled?>>>, #<Dry::Validation::Rule::Conjunction left=#<Dry::Validation::Rule::Key name=:code predicate=#<Dry::Validation::Predicate id=:key?>> right=#<Dry::Validation::Rule::Value name=:code predicate=#<Dry::Validation::Predicate id=:filled?>>>]>>]>>>]>
|
data/examples/rule_ast.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'dry-validation'
|
2
|
-
|
3
|
-
ast = [
|
4
|
-
[
|
5
|
-
:and,
|
6
|
-
[
|
7
|
-
[:key, [:age, [:predicate, [:key?, []]]]],
|
8
|
-
[
|
9
|
-
:and,
|
10
|
-
[
|
11
|
-
[:val, [:age, [:predicate, [:filled?, []]]]],
|
12
|
-
[:val, [:age, [:predicate, [:gt?, [18]]]]]
|
13
|
-
]
|
14
|
-
]
|
15
|
-
]
|
16
|
-
]
|
17
|
-
]
|
18
|
-
|
19
|
-
compiler = Dry::Validation::RuleCompiler.new(Dry::Validation::Predicates)
|
20
|
-
|
21
|
-
rules = compiler.call(ast)
|
22
|
-
|
23
|
-
puts rules.inspect
|
24
|
-
# [
|
25
|
-
# #<Dry::Validation::Rule::Conjunction
|
26
|
-
# left=#<Dry::Validation::Rule::Key name=:age predicate=#<Dry::Validation::Predicate id=:key?>>
|
27
|
-
# right=#<Dry::Validation::Rule::Conjunction
|
28
|
-
# left=#<Dry::Validation::Rule::Value name=:age predicate=#<Dry::Validation::Predicate id=:filled?>>
|
29
|
-
# right=#<Dry::Validation::Rule::Value name=:age predicate=#<Dry::Validation::Predicate id=:gt?>>>>
|
30
|
-
# ]
|
31
|
-
|
32
|
-
puts rules.map(&:to_ary).inspect
|
33
|
-
# [[:and, [:key, [:age, [:predicate, [:key?, [:age]]]]], [[:and, [:val, [:age, [:predicate, [:filled?, []]]]], [[:val, [:age, [:predicate, [:gt?, [18]]]]]]]]]]
|
data/lib/dry/validation/error.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
module Dry
|
2
|
-
module Validation
|
3
|
-
class Error
|
4
|
-
class Set
|
5
|
-
include Enumerable
|
6
|
-
|
7
|
-
attr_reader :errors
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@errors = []
|
11
|
-
end
|
12
|
-
|
13
|
-
def each(&block)
|
14
|
-
errors.each(&block)
|
15
|
-
end
|
16
|
-
|
17
|
-
def empty?
|
18
|
-
errors.empty?
|
19
|
-
end
|
20
|
-
|
21
|
-
def <<(error)
|
22
|
-
errors << error
|
23
|
-
end
|
24
|
-
|
25
|
-
def to_ary
|
26
|
-
errors.map { |error| error.to_ary }
|
27
|
-
end
|
28
|
-
alias_method :to_a, :to_ary
|
29
|
-
end
|
30
|
-
|
31
|
-
attr_reader :result
|
32
|
-
|
33
|
-
def initialize(result)
|
34
|
-
@result = result
|
35
|
-
end
|
36
|
-
|
37
|
-
def to_ary
|
38
|
-
[:error, result.to_ary]
|
39
|
-
end
|
40
|
-
alias_method :to_a, :to_ary
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,116 +0,0 @@
|
|
1
|
-
module Dry
|
2
|
-
module Validation
|
3
|
-
class ErrorCompiler
|
4
|
-
attr_reader :messages
|
5
|
-
|
6
|
-
def initialize(messages)
|
7
|
-
@messages = messages
|
8
|
-
end
|
9
|
-
|
10
|
-
def call(ast)
|
11
|
-
ast.map { |node| visit(node) }
|
12
|
-
end
|
13
|
-
|
14
|
-
def visit(node, *args)
|
15
|
-
__send__(:"visit_#{node[0]}", node[1], *args)
|
16
|
-
end
|
17
|
-
|
18
|
-
def visit_error(error)
|
19
|
-
visit(error)
|
20
|
-
end
|
21
|
-
|
22
|
-
def visit_input(input, *args)
|
23
|
-
name, value, rules = input
|
24
|
-
[name, rules.map { |rule| visit(rule, name, value) }]
|
25
|
-
end
|
26
|
-
|
27
|
-
def visit_key(rule, name, value)
|
28
|
-
_, predicate = rule
|
29
|
-
visit(predicate, value, name)
|
30
|
-
end
|
31
|
-
|
32
|
-
def visit_val(rule, name, value)
|
33
|
-
name, predicate = rule
|
34
|
-
visit(predicate, value, name)
|
35
|
-
end
|
36
|
-
|
37
|
-
def visit_predicate(predicate, value, name)
|
38
|
-
messages.lookup(predicate[0], name, predicate[1][0]) % visit(predicate, value).merge(name: name)
|
39
|
-
end
|
40
|
-
|
41
|
-
def visit_key?(*args, value)
|
42
|
-
{ name: args[0][0] }
|
43
|
-
end
|
44
|
-
|
45
|
-
def visit_empty?(*args, value)
|
46
|
-
{ value: value }
|
47
|
-
end
|
48
|
-
|
49
|
-
def visit_exclusion?(*args, value)
|
50
|
-
{ list: args[0][0].join(', ') }
|
51
|
-
end
|
52
|
-
|
53
|
-
def visit_inclusion?(*args, value)
|
54
|
-
{ list: args[0][0].join(', ') }
|
55
|
-
end
|
56
|
-
|
57
|
-
def visit_gt?(*args, value)
|
58
|
-
{ num: args[0][0], value: value }
|
59
|
-
end
|
60
|
-
|
61
|
-
def visit_gteq?(*args, value)
|
62
|
-
{ num: args[0][0], value: value }
|
63
|
-
end
|
64
|
-
|
65
|
-
def visit_lt?(*args, value)
|
66
|
-
{ num: args[0][0], value: value }
|
67
|
-
end
|
68
|
-
|
69
|
-
def visit_lteq?(*args, value)
|
70
|
-
{ num: args[0][0], value: value }
|
71
|
-
end
|
72
|
-
|
73
|
-
def visit_int?(*args, value)
|
74
|
-
{ num: args[0][0], value: value }
|
75
|
-
end
|
76
|
-
|
77
|
-
def visit_max_size?(*args, value)
|
78
|
-
{ num: args[0][0], value: value }
|
79
|
-
end
|
80
|
-
|
81
|
-
def visit_min_size?(*args, value)
|
82
|
-
{ num: args[0][0], value: value }
|
83
|
-
end
|
84
|
-
|
85
|
-
def visit_eql?(*args, value)
|
86
|
-
{ eql_value: args[0][0], value: value }
|
87
|
-
end
|
88
|
-
|
89
|
-
def visit_size?(*args, value)
|
90
|
-
num = args[0][0]
|
91
|
-
|
92
|
-
if num.is_a?(Range)
|
93
|
-
{ left: num.first, right: num.last, value: value }
|
94
|
-
else
|
95
|
-
{ num: args[0][0], value: value }
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def visit_str?(*args, value)
|
100
|
-
{ value: value }
|
101
|
-
end
|
102
|
-
|
103
|
-
def visit_format?(*args, value)
|
104
|
-
{}
|
105
|
-
end
|
106
|
-
|
107
|
-
def visit_nil?(*args, value)
|
108
|
-
{}
|
109
|
-
end
|
110
|
-
|
111
|
-
def visit_filled?(*args)
|
112
|
-
{}
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|