dry-validation 0.1.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +969 -1
  3. data/LICENSE +1 -1
  4. data/README.md +19 -286
  5. data/config/errors.yml +4 -35
  6. data/dry-validation.gemspec +38 -22
  7. data/lib/dry/validation/config.rb +24 -0
  8. data/lib/dry/validation/constants.rb +43 -0
  9. data/lib/dry/validation/contract/class_interface.rb +230 -0
  10. data/lib/dry/validation/contract.rb +173 -0
  11. data/lib/dry/validation/evaluator.rb +233 -0
  12. data/lib/dry/validation/extensions/hints.rb +67 -0
  13. data/lib/dry/validation/extensions/monads.rb +34 -0
  14. data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
  15. data/lib/dry/validation/failures.rb +70 -0
  16. data/lib/dry/validation/function.rb +43 -0
  17. data/lib/dry/validation/macro.rb +38 -0
  18. data/lib/dry/validation/macros.rb +104 -0
  19. data/lib/dry/validation/message.rb +100 -0
  20. data/lib/dry/validation/message_set.rb +97 -0
  21. data/lib/dry/validation/messages/resolver.rb +129 -0
  22. data/lib/dry/validation/result.rb +206 -38
  23. data/lib/dry/validation/rule.rb +116 -106
  24. data/lib/dry/validation/schema_ext.rb +19 -0
  25. data/lib/dry/validation/values.rb +108 -0
  26. data/lib/dry/validation/version.rb +3 -1
  27. data/lib/dry/validation.rb +55 -7
  28. data/lib/dry-validation.rb +3 -1
  29. metadata +80 -106
  30. data/.gitignore +0 -8
  31. data/.rspec +0 -3
  32. data/.rubocop.yml +0 -16
  33. data/.rubocop_todo.yml +0 -7
  34. data/.travis.yml +0 -29
  35. data/Gemfile +0 -11
  36. data/Rakefile +0 -12
  37. data/examples/basic.rb +0 -21
  38. data/examples/nested.rb +0 -30
  39. data/examples/rule_ast.rb +0 -33
  40. data/lib/dry/validation/error.rb +0 -43
  41. data/lib/dry/validation/error_compiler.rb +0 -116
  42. data/lib/dry/validation/messages.rb +0 -71
  43. data/lib/dry/validation/predicate.rb +0 -39
  44. data/lib/dry/validation/predicate_set.rb +0 -22
  45. data/lib/dry/validation/predicates.rb +0 -88
  46. data/lib/dry/validation/rule_compiler.rb +0 -57
  47. data/lib/dry/validation/schema/definition.rb +0 -15
  48. data/lib/dry/validation/schema/key.rb +0 -39
  49. data/lib/dry/validation/schema/rule.rb +0 -28
  50. data/lib/dry/validation/schema/value.rb +0 -31
  51. data/lib/dry/validation/schema.rb +0 -74
  52. data/rakelib/rubocop.rake +0 -18
  53. data/spec/fixtures/errors.yml +0 -4
  54. data/spec/integration/custom_error_messages_spec.rb +0 -35
  55. data/spec/integration/custom_predicates_spec.rb +0 -57
  56. data/spec/integration/validation_spec.rb +0 -118
  57. data/spec/shared/predicates.rb +0 -31
  58. data/spec/spec_helper.rb +0 -18
  59. data/spec/unit/error_compiler_spec.rb +0 -165
  60. data/spec/unit/predicate_spec.rb +0 -37
  61. data/spec/unit/predicates/empty_spec.rb +0 -38
  62. data/spec/unit/predicates/eql_spec.rb +0 -21
  63. data/spec/unit/predicates/exclusion_spec.rb +0 -35
  64. data/spec/unit/predicates/filled_spec.rb +0 -38
  65. data/spec/unit/predicates/format_spec.rb +0 -21
  66. data/spec/unit/predicates/gt_spec.rb +0 -40
  67. data/spec/unit/predicates/gteq_spec.rb +0 -40
  68. data/spec/unit/predicates/inclusion_spec.rb +0 -35
  69. data/spec/unit/predicates/int_spec.rb +0 -34
  70. data/spec/unit/predicates/key_spec.rb +0 -29
  71. data/spec/unit/predicates/lt_spec.rb +0 -40
  72. data/spec/unit/predicates/lteq_spec.rb +0 -40
  73. data/spec/unit/predicates/max_size_spec.rb +0 -49
  74. data/spec/unit/predicates/min_size_spec.rb +0 -49
  75. data/spec/unit/predicates/nil_spec.rb +0 -28
  76. data/spec/unit/predicates/size_spec.rb +0 -49
  77. data/spec/unit/predicates/str_spec.rb +0 -32
  78. data/spec/unit/rule/each_spec.rb +0 -20
  79. data/spec/unit/rule/key_spec.rb +0 -27
  80. data/spec/unit/rule/set_spec.rb +0 -32
  81. data/spec/unit/rule/value_spec.rb +0 -42
  82. data/spec/unit/rule_compiler_spec.rb +0 -86
@@ -1,12 +1,60 @@
1
- require 'dry-equalizer'
2
- require 'dry-configurable'
3
- require 'dry-container'
1
+ # frozen_string_literal: true
4
2
 
5
- # A collection of micro-libraries, each intended to encapsulate
6
- # a common task in Ruby
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'
@@ -1 +1,3 @@
1
- require 'dry/validation'
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/validation"
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: 0.1.0
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: 2015-11-25 00:00:00.000000000 Z
11
+ date: 2022-02-17 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: dry-configurable
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.1'
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.1'
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.2'
33
+ version: '0.7'
35
34
  - - ">="
36
35
  - !ruby/object:Gem::Version
37
- version: 0.2.6
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.2'
43
+ version: '0.7'
45
44
  - - ">="
46
45
  - !ruby/object:Gem::Version
47
- version: 0.2.6
46
+ version: 0.7.1
48
47
  - !ruby/object:Gem::Dependency
49
- name: dry-equalizer
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.2'
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.2'
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/error.rb
130
- - lib/dry/validation/error_compiler.rb
131
- - lib/dry/validation/messages.rb
132
- - lib/dry/validation/predicate.rb
133
- - lib/dry/validation/predicate_set.rb
134
- - lib/dry/validation/predicates.rb
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/rule_compiler.rb
138
- - lib/dry/validation/schema.rb
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
- - rakelib/rubocop.rake
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: '0'
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
- rubyforge_project:
195
- rubygems_version: 2.4.5
200
+ rubygems_version: 3.1.6
196
201
  signing_key:
197
202
  specification_version: 4
198
- summary: A simple validation library
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
@@ -1,8 +0,0 @@
1
- .DS_Store
2
- coverage
3
- /.bundle
4
- vendor/bundle
5
- bin/
6
- tmp/
7
- .idea/
8
- Gemfile.lock
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --color
2
- --require spec_helper
3
- --order random
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
@@ -1,11 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
4
-
5
- group :tools do
6
- gem 'rubocop'
7
- gem 'guard'
8
- gem 'guard-rspec'
9
- gem 'guard-rubocop'
10
- gem 'byebug', platform: :mri
11
- end
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]]]]]]]]]]
@@ -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