dry-validation 0.13.3 → 1.0.0.alpha1

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 (196) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -25
  3. data/LICENSE +1 -1
  4. data/README.md +9 -4
  5. data/lib/dry-validation.rb +2 -0
  6. data/lib/dry/validation.rb +8 -35
  7. data/lib/dry/validation/constants.rb +12 -0
  8. data/lib/dry/validation/contract.rb +132 -0
  9. data/lib/dry/validation/contract/class_interface.rb +114 -0
  10. data/lib/dry/validation/evaluator.rb +121 -0
  11. data/lib/dry/validation/extensions/monads.rb +23 -7
  12. data/lib/dry/validation/messages.rb +50 -6
  13. data/lib/dry/validation/result.rb +109 -45
  14. data/lib/dry/validation/rule.rb +37 -0
  15. data/lib/dry/validation/version.rb +3 -1
  16. metadata +36 -337
  17. data/.codeclimate.yml +0 -17
  18. data/.gitignore +0 -9
  19. data/.rspec +0 -3
  20. data/.travis.yml +0 -29
  21. data/CONTRIBUTING.md +0 -31
  22. data/Gemfile +0 -25
  23. data/Rakefile +0 -22
  24. data/benchmarks/benchmark_form_invalid.rb +0 -64
  25. data/benchmarks/benchmark_form_valid.rb +0 -64
  26. data/benchmarks/benchmark_schema_invalid_huge.rb +0 -52
  27. data/benchmarks/profile_schema_call_invalid.rb +0 -20
  28. data/benchmarks/profile_schema_call_valid.rb +0 -20
  29. data/benchmarks/profile_schema_definition.rb +0 -14
  30. data/benchmarks/profile_schema_huge_invalid.rb +0 -30
  31. data/benchmarks/profile_schema_messages_invalid.rb +0 -20
  32. data/benchmarks/suite.rb +0 -5
  33. data/config/errors.yml +0 -89
  34. data/dry-validation.gemspec +0 -28
  35. data/examples/basic.rb +0 -15
  36. data/examples/each.rb +0 -14
  37. data/examples/json.rb +0 -12
  38. data/examples/multiple.rb +0 -27
  39. data/examples/nested.rb +0 -22
  40. data/examples/params.rb +0 -11
  41. data/lib/dry/validation/compat/form.rb +0 -67
  42. data/lib/dry/validation/deprecations.rb +0 -24
  43. data/lib/dry/validation/executor.rb +0 -91
  44. data/lib/dry/validation/extensions.rb +0 -7
  45. data/lib/dry/validation/extensions/struct.rb +0 -32
  46. data/lib/dry/validation/input_processor_compiler.rb +0 -137
  47. data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
  48. data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
  49. data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
  50. data/lib/dry/validation/message.rb +0 -98
  51. data/lib/dry/validation/message_compiler.rb +0 -188
  52. data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
  53. data/lib/dry/validation/message_set.rb +0 -122
  54. data/lib/dry/validation/messages/abstract.rb +0 -119
  55. data/lib/dry/validation/messages/i18n.rb +0 -47
  56. data/lib/dry/validation/messages/namespaced.rb +0 -39
  57. data/lib/dry/validation/messages/yaml.rb +0 -61
  58. data/lib/dry/validation/predicate_registry.rb +0 -115
  59. data/lib/dry/validation/predicates.rb +0 -19
  60. data/lib/dry/validation/schema.rb +0 -126
  61. data/lib/dry/validation/schema/check.rb +0 -37
  62. data/lib/dry/validation/schema/class_interface.rb +0 -190
  63. data/lib/dry/validation/schema/deprecated.rb +0 -30
  64. data/lib/dry/validation/schema/dsl.rb +0 -118
  65. data/lib/dry/validation/schema/form.rb +0 -9
  66. data/lib/dry/validation/schema/json.rb +0 -21
  67. data/lib/dry/validation/schema/key.rb +0 -71
  68. data/lib/dry/validation/schema/params.rb +0 -22
  69. data/lib/dry/validation/schema/rule.rb +0 -202
  70. data/lib/dry/validation/schema/value.rb +0 -211
  71. data/lib/dry/validation/schema_compiler.rb +0 -81
  72. data/lib/dry/validation/template.rb +0 -66
  73. data/lib/dry/validation/type_specs.rb +0 -70
  74. data/spec/extensions/monads/result_spec.rb +0 -40
  75. data/spec/extensions/struct/schema_spec.rb +0 -32
  76. data/spec/fixtures/locales/en.yml +0 -8
  77. data/spec/fixtures/locales/pl.yml +0 -22
  78. data/spec/integration/custom_error_messages_spec.rb +0 -54
  79. data/spec/integration/custom_predicates_spec.rb +0 -228
  80. data/spec/integration/hints_spec.rb +0 -170
  81. data/spec/integration/injecting_rules_spec.rb +0 -30
  82. data/spec/integration/json/defining_base_schema_spec.rb +0 -41
  83. data/spec/integration/localized_error_messages_spec.rb +0 -72
  84. data/spec/integration/message_compiler_spec.rb +0 -405
  85. data/spec/integration/messages/i18n_spec.rb +0 -104
  86. data/spec/integration/optional_keys_spec.rb +0 -28
  87. data/spec/integration/params/predicates/array_spec.rb +0 -287
  88. data/spec/integration/params/predicates/empty_spec.rb +0 -263
  89. data/spec/integration/params/predicates/eql_spec.rb +0 -327
  90. data/spec/integration/params/predicates/even_spec.rb +0 -455
  91. data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
  92. data/spec/integration/params/predicates/excludes_spec.rb +0 -391
  93. data/spec/integration/params/predicates/false_spec.rb +0 -455
  94. data/spec/integration/params/predicates/filled_spec.rb +0 -467
  95. data/spec/integration/params/predicates/format_spec.rb +0 -454
  96. data/spec/integration/params/predicates/gt_spec.rb +0 -519
  97. data/spec/integration/params/predicates/gteq_spec.rb +0 -519
  98. data/spec/integration/params/predicates/included_in_spec.rb +0 -455
  99. data/spec/integration/params/predicates/includes_spec.rb +0 -391
  100. data/spec/integration/params/predicates/key_spec.rb +0 -67
  101. data/spec/integration/params/predicates/lt_spec.rb +0 -519
  102. data/spec/integration/params/predicates/lteq_spec.rb +0 -519
  103. data/spec/integration/params/predicates/max_size_spec.rb +0 -391
  104. data/spec/integration/params/predicates/min_size_spec.rb +0 -391
  105. data/spec/integration/params/predicates/none_spec.rb +0 -265
  106. data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
  107. data/spec/integration/params/predicates/odd_spec.rb +0 -455
  108. data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
  109. data/spec/integration/params/predicates/size/range_spec.rb +0 -396
  110. data/spec/integration/params/predicates/true_spec.rb +0 -455
  111. data/spec/integration/params/predicates/type_spec.rb +0 -391
  112. data/spec/integration/result_spec.rb +0 -81
  113. data/spec/integration/schema/array_schema_spec.rb +0 -59
  114. data/spec/integration/schema/check_rules_spec.rb +0 -119
  115. data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
  116. data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
  117. data/spec/integration/schema/default_settings_spec.rb +0 -11
  118. data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
  119. data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
  120. data/spec/integration/schema/each_with_set_spec.rb +0 -70
  121. data/spec/integration/schema/extending_dsl_spec.rb +0 -27
  122. data/spec/integration/schema/form_spec.rb +0 -236
  123. data/spec/integration/schema/hash_schema_spec.rb +0 -47
  124. data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
  125. data/spec/integration/schema/input_processor_spec.rb +0 -46
  126. data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
  127. data/spec/integration/schema/json_spec.rb +0 -163
  128. data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
  129. data/spec/integration/schema/macros/each_spec.rb +0 -268
  130. data/spec/integration/schema/macros/filled_spec.rb +0 -87
  131. data/spec/integration/schema/macros/input_spec.rb +0 -139
  132. data/spec/integration/schema/macros/maybe_spec.rb +0 -99
  133. data/spec/integration/schema/macros/rule_spec.rb +0 -75
  134. data/spec/integration/schema/macros/value_spec.rb +0 -119
  135. data/spec/integration/schema/macros/when_spec.rb +0 -62
  136. data/spec/integration/schema/nested_schemas_spec.rb +0 -236
  137. data/spec/integration/schema/nested_values_spec.rb +0 -46
  138. data/spec/integration/schema/not_spec.rb +0 -34
  139. data/spec/integration/schema/numbers_spec.rb +0 -19
  140. data/spec/integration/schema/option_with_default_spec.rb +0 -64
  141. data/spec/integration/schema/or_spec.rb +0 -87
  142. data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
  143. data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
  144. data/spec/integration/schema/params_spec.rb +0 -234
  145. data/spec/integration/schema/predicate_verification_spec.rb +0 -9
  146. data/spec/integration/schema/predicates/array_spec.rb +0 -295
  147. data/spec/integration/schema/predicates/custom_spec.rb +0 -103
  148. data/spec/integration/schema/predicates/empty_spec.rb +0 -263
  149. data/spec/integration/schema/predicates/eql_spec.rb +0 -327
  150. data/spec/integration/schema/predicates/even_spec.rb +0 -455
  151. data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
  152. data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
  153. data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
  154. data/spec/integration/schema/predicates/filled_spec.rb +0 -467
  155. data/spec/integration/schema/predicates/format_spec.rb +0 -455
  156. data/spec/integration/schema/predicates/gt_spec.rb +0 -519
  157. data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
  158. data/spec/integration/schema/predicates/hash_spec.rb +0 -69
  159. data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
  160. data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
  161. data/spec/integration/schema/predicates/includes_spec.rb +0 -391
  162. data/spec/integration/schema/predicates/key_spec.rb +0 -88
  163. data/spec/integration/schema/predicates/lt_spec.rb +0 -520
  164. data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
  165. data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
  166. data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
  167. data/spec/integration/schema/predicates/none_spec.rb +0 -265
  168. data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
  169. data/spec/integration/schema/predicates/odd_spec.rb +0 -455
  170. data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
  171. data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
  172. data/spec/integration/schema/predicates/type_spec.rb +0 -413
  173. data/spec/integration/schema/reusing_schema_spec.rb +0 -33
  174. data/spec/integration/schema/using_types_spec.rb +0 -135
  175. data/spec/integration/schema/validate_spec.rb +0 -120
  176. data/spec/integration/schema/xor_spec.rb +0 -35
  177. data/spec/integration/schema_builders_spec.rb +0 -17
  178. data/spec/integration/schema_spec.rb +0 -173
  179. data/spec/shared/message_compiler.rb +0 -11
  180. data/spec/shared/predicate_helper.rb +0 -15
  181. data/spec/shared/rule_compiler.rb +0 -8
  182. data/spec/spec_helper.rb +0 -62
  183. data/spec/support/define_struct.rb +0 -25
  184. data/spec/support/matchers.rb +0 -38
  185. data/spec/support/mutant.rb +0 -9
  186. data/spec/support/predicates_integration.rb +0 -7
  187. data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
  188. data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
  189. data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
  190. data/spec/unit/message_compiler/visit_spec.rb +0 -16
  191. data/spec/unit/message_compiler_spec.rb +0 -7
  192. data/spec/unit/predicate_registry_spec.rb +0 -34
  193. data/spec/unit/schema/key_spec.rb +0 -38
  194. data/spec/unit/schema/rule_spec.rb +0 -42
  195. data/spec/unit/schema/value_spec.rb +0 -131
  196. data/spec/unit/schema_spec.rb +0 -35
@@ -1,19 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- module Dry
4
- module Validation
5
- module Predicates
6
- include Dry::Logic::Predicates
7
-
8
- class << self
9
- undef :nil?
10
- end
11
-
12
- define_singleton_method :nil?, &Object.method(:nil?)
13
-
14
- def self.none?(input)
15
- input.nil?
16
- end
17
- end
18
- end
19
- end
@@ -1,126 +0,0 @@
1
- require 'dry/logic/predicates'
2
- require 'dry/types/constraints'
3
-
4
- require 'dry/validation/predicate_registry'
5
- require 'dry/validation/schema_compiler'
6
- require 'dry/validation/schema/key'
7
- require 'dry/validation/schema/value'
8
- require 'dry/validation/schema/check'
9
-
10
- require 'dry/validation/result'
11
- require 'dry/validation/messages'
12
- require 'dry/validation/message_compiler'
13
-
14
- require 'dry/validation/schema/deprecated'
15
- require 'dry/validation/schema/class_interface'
16
- require 'dry/validation/executor'
17
-
18
- module Dry
19
- module Validation
20
- class Schema
21
- attr_reader :config
22
-
23
- attr_reader :input_rule
24
-
25
- attr_reader :rules
26
-
27
- attr_reader :checks
28
-
29
- attr_reader :predicates
30
-
31
- attr_reader :input_processor
32
-
33
- attr_reader :rule_compiler
34
-
35
- attr_reader :message_compiler
36
-
37
- attr_reader :options
38
-
39
- attr_reader :type_map
40
-
41
- attr_reader :executor
42
-
43
- def initialize(rules, options)
44
- @type_map = self.class.type_map
45
- @config = self.class.config
46
- @predicates = options.fetch(:predicate_registry).bind(self)
47
- @rule_compiler = SchemaCompiler.new(predicates, options)
48
- @message_compiler = options.fetch(:message_compiler)
49
- @input_processor = options[:input_processor]
50
-
51
- @input_rule = rule_compiler.visit(config.input_rule.(predicates)) if config.input_rule
52
-
53
- initialize_options(options)
54
- initialize_rules(rules)
55
- initialize_checks(options.fetch(:checks, []))
56
-
57
- @executor = Executor.new do |steps|
58
- steps << ProcessInput.new(input_processor) if input_processor
59
- steps << ApplyInputRule.new(input_rule) if input_rule
60
- steps << ApplyRules.new(@rules)
61
- steps << ApplyChecks.new(@checks) if @checks.any?
62
- end
63
-
64
- freeze
65
- end
66
-
67
- def with(new_options)
68
- self.class.new(self.class.rules, options.merge(new_options))
69
- end
70
-
71
- def call(input)
72
- output, result = executor.(input)
73
- Result.new(output, result, message_compiler, config.path)
74
- end
75
-
76
- def curry(*curry_args)
77
- -> *args { call(*(curry_args + args)) }
78
- end
79
-
80
- def to_proc
81
- -> input { call(input) }
82
- end
83
-
84
- def arity
85
- 1
86
- end
87
-
88
- def ast(*)
89
- self.class.to_ast
90
- end
91
- alias_method :to_ast, :ast
92
-
93
- private
94
-
95
- def initialize_options(options)
96
- @options = options
97
-
98
- self.class.options.each do |name, default|
99
- value = options.fetch(name) do
100
- case default
101
- when Proc then default.()
102
- else default end
103
- end
104
-
105
- instance_variable_set("@#{name}", value)
106
- end
107
- end
108
-
109
- def initialize_rules(rules)
110
- @rules = rules.each_with_object({}) do |rule, result|
111
- result[rule.name] = rule_compiler.visit(rule.to_ast)
112
- end
113
- end
114
-
115
- def initialize_checks(checks)
116
- @checks = checks.each_with_object({}) do |check, result|
117
- if result.key?(check.name)
118
- result[check.name] << rule_compiler.visit(check.to_ast)
119
- else
120
- result[check.name] = [rule_compiler.visit(check.to_ast)]
121
- end
122
- end
123
- end
124
- end
125
- end
126
- end
@@ -1,37 +0,0 @@
1
- module Dry
2
- module Validation
3
- class Schema
4
- class Check < Value
5
- def class
6
- Check
7
- end
8
-
9
- def schema(other = nil, &block)
10
- schema = Schema.create_class(self, other, &block)
11
-
12
- if other
13
- schema.config.input_processor = other.class.config.input_processor
14
- end
15
-
16
- hash?.and(create_rule([:check, [[path], schema.to_ast]]))
17
- end
18
-
19
- private
20
-
21
- def method_missing(meth, *meth_args)
22
- vals, args = meth_args.partition { |arg| arg.class < DSL }
23
-
24
- keys = [path, vals.map(&:path)].reject(&:empty?)
25
-
26
- registry.ensure_valid_predicate(meth, args.size + keys.size, schema_class)
27
- predicate = predicate(meth, args)
28
-
29
- rule = create_rule([:check, [keys.reverse, predicate]], name)
30
-
31
- add_rule(rule)
32
- rule
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,190 +0,0 @@
1
- require 'dry/configurable'
2
- require 'dry/validation/predicates'
3
- require 'dry/validation/messages'
4
- require 'dry/validation/type_specs'
5
-
6
- module Dry
7
- module Validation
8
- class Schema
9
- extend Dry::Configurable
10
- extend TypeSpecs
11
- extend PredicateRegistry::PredicateDetector
12
-
13
- NOOP_INPUT_PROCESSOR = -> input { input }
14
-
15
- setting :path
16
- setting :predicates, Dry::Validation::Predicates
17
- setting :registry
18
- setting :messages, :yaml
19
- setting :messages_file
20
- setting :namespace
21
- setting :rules, []
22
- setting :checks, []
23
- setting :options, {}
24
- setting :input, nil
25
- setting :input_rule, nil
26
- setting :dsl_extensions, nil
27
-
28
- DEFAULT_PROCESSOR_MAP = {
29
- sanitizer: InputProcessorCompiler::Sanitizer.new,
30
- json: InputProcessorCompiler::JSON.new,
31
- params: InputProcessorCompiler::Params.new,
32
- }
33
-
34
- setting :input_processor_map, DEFAULT_PROCESSOR_MAP
35
-
36
- setting :type_specs, false
37
-
38
- def self.new(rules = config.rules, **options)
39
- super(rules, default_options.merge(options))
40
- end
41
-
42
- def self.define(options = {}, &block)
43
- source = options.fetch(:schema_class)
44
- config = source.config
45
-
46
- dsl_ext = config.dsl_extensions
47
-
48
- options = options.merge(rules: options[:rules].dup) if options.key?(:rules)
49
- dsl = Schema::Value.new(options.merge(registry: source.registry))
50
- dsl_ext.__send__(:extend_object, dsl) if dsl_ext
51
- dsl.predicates(options[:predicates]) if options.key?(:predicates)
52
- dsl.instance_exec(&block) if block
53
-
54
- target = dsl.schema_class
55
-
56
- if config.input
57
- config.input_rule = -> predicates {
58
- Schema::Value.new(registry: predicates).infer_predicates(Array(target.config.input)).to_ast
59
- }
60
- end
61
-
62
- rules = target.config.rules + (options.fetch(:rules, []) + dsl.rules)
63
-
64
- target.configure do |cfg|
65
- cfg.rules = rules
66
- cfg.checks = cfg.checks + dsl.checks
67
- cfg.path = dsl.path
68
- cfg.type_map = target.build_type_map(dsl.type_map) if cfg.type_specs
69
- end
70
-
71
- target
72
- end
73
-
74
- def self.define!(options = {}, &block)
75
- define(schema_class: self, &block)
76
- end
77
-
78
- def self.predicates(predicate_set = nil)
79
- if predicate_set
80
- config.predicates = predicate_set
81
- set_registry!
82
- else
83
- config.predicates
84
- end
85
- end
86
-
87
- def self.option(name, default = nil)
88
- attr_reader(*name)
89
- options.update(name => default)
90
- end
91
-
92
- def self.create_class(target, other = nil, &block)
93
- klass =
94
- if other.is_a?(self)
95
- Class.new(other.class)
96
- elsif other.respond_to?(:schema) && other.schema.is_a?(self)
97
- Class.new(other.schema.class)
98
- else
99
- Validation.Schema(target.schema_class, parent: target, build: false, &block)
100
- end
101
-
102
- klass.config.path = target.path if other
103
- klass.config.input_processor = :noop
104
-
105
- klass
106
- end
107
-
108
- def self.clone
109
- klass = Class.new(self)
110
- klass.config.rules = []
111
- klass.config.registry = registry
112
- klass
113
- end
114
-
115
- def self.to_ast
116
- [:schema, self]
117
- end
118
-
119
- def self.registry
120
- config.registry
121
- end
122
-
123
- def self.type_map
124
- config.type_map
125
- end
126
-
127
- def self.rules
128
- config.rules
129
- end
130
-
131
- def self.options
132
- config.options
133
- end
134
-
135
- def self.messages
136
- default = default_messages
137
-
138
- if config.messages_file && config.namespace
139
- default.merge(config.messages_file).namespaced(config.namespace)
140
- elsif config.messages_file
141
- default.merge(config.messages_file)
142
- elsif config.namespace
143
- default.namespaced(config.namespace)
144
- else
145
- default
146
- end
147
- end
148
-
149
- def self.default_messages
150
- case config.messages
151
- when :yaml then Messages.default
152
- when :i18n then Messages::I18n.new
153
- else
154
- raise "+#{config.messages}+ is not a valid messages identifier"
155
- end
156
- end
157
-
158
- def self.message_compiler
159
- @message_compiler ||= MessageCompiler.new(messages)
160
- end
161
-
162
- def self.rule_ast
163
- @rule_ast ||= config.rules.map(&:to_ast)
164
- end
165
-
166
- def self.default_options
167
- @default_options ||= { predicate_registry: registry,
168
- message_compiler: message_compiler,
169
- input_processor: input_processor,
170
- checks: config.checks }
171
- end
172
-
173
- def self.inherited(klass)
174
- super
175
-
176
- klass.config.options = klass.config.options.dup
177
-
178
- if registry && self != Schema
179
- klass.config.registry = registry.new(self)
180
- else
181
- klass.set_registry!
182
- end
183
- end
184
-
185
- def self.set_registry!
186
- config.registry = PredicateRegistry[config.predicates]
187
- end
188
- end
189
- end
190
- end
@@ -1,30 +0,0 @@
1
- require 'dry/validation/input_processor_compiler'
2
-
3
- module Dry
4
- module Validation
5
- class Schema
6
- def self.input_processor
7
- @input_processor ||=
8
- begin
9
- if type_map.is_a?(Dry::Types::Safe) && config.input_processor != :noop
10
- type_map
11
- elsif type_map.size > 0 && config.input_processor != :noop
12
- build_hash_type(type_map)
13
- elsif input_processor_compiler
14
- input_processor_compiler.(rule_ast)
15
- else
16
- NOOP_INPUT_PROCESSOR
17
- end
18
- end
19
- end
20
-
21
- def self.input_processor_ast(type)
22
- config.input_processor_map.fetch(type).schema_ast(rule_ast)
23
- end
24
-
25
- def self.input_processor_compiler
26
- @input_processor_comp ||= config.input_processor_map[config.input_processor]
27
- end
28
- end
29
- end
30
- end
@@ -1,118 +0,0 @@
1
- require 'dry/validation/schema/rule'
2
- require 'dry/validation/deprecations'
3
-
4
- module Dry
5
- module Validation
6
- class Schema
7
- class DSL < BasicObject
8
- include ::Dry::Validation::Deprecations
9
-
10
- attr_reader :name, :registry, :rules, :checks, :parent, :options
11
-
12
- def self.[](name, options = {})
13
- new(options.merge(name: name))
14
- end
15
-
16
- def initialize(options = {})
17
- @name = options[:name]
18
- @path = options.fetch(:path, name)
19
- @parent = options[:parent]
20
- @registry = options.fetch(:registry)
21
- @rules = options.fetch(:rules, [])
22
- @checks = options.fetch(:checks, [])
23
- @options = options
24
- end
25
-
26
- def inspect
27
- to_ast.inspect
28
- end
29
- alias_method :to_s, :inspect
30
-
31
- def optional(name, type_spec = nil, &block)
32
- rule = define(name, Key, :then, &block)
33
-
34
- if type_spec
35
- type_map[name] = type_spec
36
- end
37
-
38
- rule
39
- end
40
-
41
- def not
42
- negated = create_rule([:not, to_ast])
43
- @rules = [negated]
44
- self
45
- end
46
-
47
- def add_rule(rule)
48
- rules << rule
49
- self
50
- end
51
-
52
- def add_check(check)
53
- checks << check.to_rule
54
- self
55
- end
56
-
57
- def to_ast
58
- ast = rules.map(&:to_ast)
59
- ast.size > 1 ? [:set, ast] : ast[0] || []
60
- end
61
-
62
- def to_rule
63
- create_rule(to_ast)
64
- end
65
-
66
- def rule_ast
67
- rules.map(&:to_ast)
68
- end
69
-
70
- def path
71
- items = [parent && parent.path, *@path].flatten.compact.uniq
72
- items.size == 1 ? items[0] : items
73
- end
74
-
75
- def with(new_options)
76
- self.class.new(options.merge(new_options))
77
- end
78
-
79
- def predicate(name, args = EMPTY_ARRAY)
80
- [:predicate, [name, registry.arg_list(name, *args)]]
81
- end
82
-
83
- def predicate?(meth)
84
- registry.key?(meth)
85
- end
86
-
87
- private
88
-
89
- def define(name, key_class, op = :and, &block)
90
- type = key_class.type
91
-
92
- val = Value[
93
- name, registry: registry, type: type, parent: self, rules: rules,
94
- checks: checks, schema_class: schema_class.clone
95
- ].__send__(:"#{type}?", name)
96
-
97
- if block
98
- key = key_class[name, registry: registry]
99
- res = key.instance_eval(&block)
100
-
101
- if res.class == Value
102
- checks.concat(key.checks)
103
- add_rule(val.__send__(op, create_rule([type, [name, res.to_ast]])))
104
- else
105
- add_rule(val.__send__(op, create_rule(res.to_ast)))
106
- end
107
- else
108
- val.with(type: op)
109
- end
110
- end
111
-
112
- def create_rule(node, name = self.name)
113
- Schema::Rule.new(node, name: name, target: self)
114
- end
115
- end
116
- end
117
- end
118
- end