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.
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