dry-validation 0.12.0 → 1.6.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 (204) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +696 -239
  3. data/LICENSE +1 -1
  4. data/README.md +15 -12
  5. data/config/errors.yml +3 -88
  6. data/dry-validation.gemspec +31 -17
  7. data/lib/dry-validation.rb +3 -1
  8. data/lib/dry/validation.rb +45 -28
  9. data/lib/dry/validation/config.rb +24 -0
  10. data/lib/dry/validation/constants.rb +43 -0
  11. data/lib/dry/validation/contract.rb +171 -0
  12. data/lib/dry/validation/contract/class_interface.rb +230 -0
  13. data/lib/dry/validation/evaluator.rb +224 -0
  14. data/lib/dry/validation/extensions/hints.rb +67 -0
  15. data/lib/dry/validation/extensions/monads.rb +24 -8
  16. data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
  17. data/lib/dry/validation/failures.rb +70 -0
  18. data/lib/dry/validation/function.rb +44 -0
  19. data/lib/dry/validation/macro.rb +38 -0
  20. data/lib/dry/validation/macros.rb +104 -0
  21. data/lib/dry/validation/message.rb +80 -80
  22. data/lib/dry/validation/message_set.rb +80 -105
  23. data/lib/dry/validation/messages/resolver.rb +131 -0
  24. data/lib/dry/validation/result.rb +183 -41
  25. data/lib/dry/validation/rule.rb +135 -0
  26. data/lib/dry/validation/schema_ext.rb +19 -0
  27. data/lib/dry/validation/values.rb +104 -0
  28. data/lib/dry/validation/version.rb +3 -1
  29. metadata +47 -336
  30. data/.codeclimate.yml +0 -17
  31. data/.gitignore +0 -9
  32. data/.rspec +0 -3
  33. data/.travis.yml +0 -26
  34. data/CONTRIBUTING.md +0 -31
  35. data/Gemfile +0 -33
  36. data/Rakefile +0 -22
  37. data/benchmarks/benchmark_form_invalid.rb +0 -64
  38. data/benchmarks/benchmark_form_valid.rb +0 -64
  39. data/benchmarks/benchmark_schema_invalid_huge.rb +0 -52
  40. data/benchmarks/profile_schema_call_invalid.rb +0 -20
  41. data/benchmarks/profile_schema_call_valid.rb +0 -20
  42. data/benchmarks/profile_schema_definition.rb +0 -14
  43. data/benchmarks/profile_schema_huge_invalid.rb +0 -30
  44. data/benchmarks/profile_schema_messages_invalid.rb +0 -20
  45. data/benchmarks/suite.rb +0 -5
  46. data/examples/basic.rb +0 -15
  47. data/examples/each.rb +0 -14
  48. data/examples/json.rb +0 -12
  49. data/examples/multiple.rb +0 -27
  50. data/examples/nested.rb +0 -22
  51. data/examples/params.rb +0 -11
  52. data/lib/dry/validation/compat/form.rb +0 -67
  53. data/lib/dry/validation/deprecations.rb +0 -24
  54. data/lib/dry/validation/executor.rb +0 -91
  55. data/lib/dry/validation/extensions.rb +0 -7
  56. data/lib/dry/validation/extensions/struct.rb +0 -32
  57. data/lib/dry/validation/input_processor_compiler.rb +0 -135
  58. data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
  59. data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
  60. data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
  61. data/lib/dry/validation/message_compiler.rb +0 -192
  62. data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
  63. data/lib/dry/validation/messages.rb +0 -14
  64. data/lib/dry/validation/messages/abstract.rb +0 -112
  65. data/lib/dry/validation/messages/i18n.rb +0 -35
  66. data/lib/dry/validation/messages/namespaced.rb +0 -32
  67. data/lib/dry/validation/messages/yaml.rb +0 -54
  68. data/lib/dry/validation/predicate_registry.rb +0 -115
  69. data/lib/dry/validation/schema.rb +0 -126
  70. data/lib/dry/validation/schema/check.rb +0 -37
  71. data/lib/dry/validation/schema/class_interface.rb +0 -189
  72. data/lib/dry/validation/schema/deprecated.rb +0 -30
  73. data/lib/dry/validation/schema/dsl.rb +0 -118
  74. data/lib/dry/validation/schema/form.rb +0 -9
  75. data/lib/dry/validation/schema/json.rb +0 -21
  76. data/lib/dry/validation/schema/key.rb +0 -71
  77. data/lib/dry/validation/schema/params.rb +0 -22
  78. data/lib/dry/validation/schema/rule.rb +0 -202
  79. data/lib/dry/validation/schema/value.rb +0 -211
  80. data/lib/dry/validation/schema_compiler.rb +0 -81
  81. data/lib/dry/validation/type_specs.rb +0 -70
  82. data/spec/extensions/monads/result_spec.rb +0 -40
  83. data/spec/extensions/struct/schema_spec.rb +0 -32
  84. data/spec/fixtures/locales/en.yml +0 -6
  85. data/spec/fixtures/locales/pl.yml +0 -18
  86. data/spec/integration/custom_error_messages_spec.rb +0 -48
  87. data/spec/integration/custom_predicates_spec.rb +0 -228
  88. data/spec/integration/hints_spec.rb +0 -170
  89. data/spec/integration/injecting_rules_spec.rb +0 -30
  90. data/spec/integration/json/defining_base_schema_spec.rb +0 -41
  91. data/spec/integration/localized_error_messages_spec.rb +0 -72
  92. data/spec/integration/message_compiler_spec.rb +0 -405
  93. data/spec/integration/messages/i18n_spec.rb +0 -94
  94. data/spec/integration/optional_keys_spec.rb +0 -28
  95. data/spec/integration/params/predicates/array_spec.rb +0 -287
  96. data/spec/integration/params/predicates/empty_spec.rb +0 -263
  97. data/spec/integration/params/predicates/eql_spec.rb +0 -327
  98. data/spec/integration/params/predicates/even_spec.rb +0 -455
  99. data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
  100. data/spec/integration/params/predicates/excludes_spec.rb +0 -391
  101. data/spec/integration/params/predicates/false_spec.rb +0 -455
  102. data/spec/integration/params/predicates/filled_spec.rb +0 -467
  103. data/spec/integration/params/predicates/format_spec.rb +0 -454
  104. data/spec/integration/params/predicates/gt_spec.rb +0 -519
  105. data/spec/integration/params/predicates/gteq_spec.rb +0 -519
  106. data/spec/integration/params/predicates/included_in_spec.rb +0 -455
  107. data/spec/integration/params/predicates/includes_spec.rb +0 -391
  108. data/spec/integration/params/predicates/key_spec.rb +0 -67
  109. data/spec/integration/params/predicates/lt_spec.rb +0 -519
  110. data/spec/integration/params/predicates/lteq_spec.rb +0 -519
  111. data/spec/integration/params/predicates/max_size_spec.rb +0 -391
  112. data/spec/integration/params/predicates/min_size_spec.rb +0 -391
  113. data/spec/integration/params/predicates/none_spec.rb +0 -265
  114. data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
  115. data/spec/integration/params/predicates/odd_spec.rb +0 -455
  116. data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
  117. data/spec/integration/params/predicates/size/range_spec.rb +0 -396
  118. data/spec/integration/params/predicates/true_spec.rb +0 -455
  119. data/spec/integration/params/predicates/type_spec.rb +0 -391
  120. data/spec/integration/result_spec.rb +0 -81
  121. data/spec/integration/schema/array_schema_spec.rb +0 -59
  122. data/spec/integration/schema/check_rules_spec.rb +0 -119
  123. data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
  124. data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
  125. data/spec/integration/schema/default_settings_spec.rb +0 -11
  126. data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
  127. data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
  128. data/spec/integration/schema/each_with_set_spec.rb +0 -70
  129. data/spec/integration/schema/extending_dsl_spec.rb +0 -27
  130. data/spec/integration/schema/form_spec.rb +0 -236
  131. data/spec/integration/schema/hash_schema_spec.rb +0 -47
  132. data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
  133. data/spec/integration/schema/input_processor_spec.rb +0 -46
  134. data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
  135. data/spec/integration/schema/json_spec.rb +0 -163
  136. data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
  137. data/spec/integration/schema/macros/each_spec.rb +0 -268
  138. data/spec/integration/schema/macros/filled_spec.rb +0 -87
  139. data/spec/integration/schema/macros/input_spec.rb +0 -139
  140. data/spec/integration/schema/macros/maybe_spec.rb +0 -99
  141. data/spec/integration/schema/macros/rule_spec.rb +0 -75
  142. data/spec/integration/schema/macros/value_spec.rb +0 -119
  143. data/spec/integration/schema/macros/when_spec.rb +0 -62
  144. data/spec/integration/schema/nested_schemas_spec.rb +0 -236
  145. data/spec/integration/schema/nested_values_spec.rb +0 -46
  146. data/spec/integration/schema/not_spec.rb +0 -34
  147. data/spec/integration/schema/numbers_spec.rb +0 -19
  148. data/spec/integration/schema/option_with_default_spec.rb +0 -64
  149. data/spec/integration/schema/or_spec.rb +0 -87
  150. data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
  151. data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
  152. data/spec/integration/schema/params_spec.rb +0 -234
  153. data/spec/integration/schema/predicate_verification_spec.rb +0 -9
  154. data/spec/integration/schema/predicates/array_spec.rb +0 -295
  155. data/spec/integration/schema/predicates/custom_spec.rb +0 -103
  156. data/spec/integration/schema/predicates/empty_spec.rb +0 -263
  157. data/spec/integration/schema/predicates/eql_spec.rb +0 -327
  158. data/spec/integration/schema/predicates/even_spec.rb +0 -455
  159. data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
  160. data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
  161. data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
  162. data/spec/integration/schema/predicates/filled_spec.rb +0 -467
  163. data/spec/integration/schema/predicates/format_spec.rb +0 -455
  164. data/spec/integration/schema/predicates/gt_spec.rb +0 -519
  165. data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
  166. data/spec/integration/schema/predicates/hash_spec.rb +0 -69
  167. data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
  168. data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
  169. data/spec/integration/schema/predicates/includes_spec.rb +0 -391
  170. data/spec/integration/schema/predicates/key_spec.rb +0 -88
  171. data/spec/integration/schema/predicates/lt_spec.rb +0 -520
  172. data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
  173. data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
  174. data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
  175. data/spec/integration/schema/predicates/none_spec.rb +0 -265
  176. data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
  177. data/spec/integration/schema/predicates/odd_spec.rb +0 -455
  178. data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
  179. data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
  180. data/spec/integration/schema/predicates/type_spec.rb +0 -413
  181. data/spec/integration/schema/reusing_schema_spec.rb +0 -33
  182. data/spec/integration/schema/using_types_spec.rb +0 -135
  183. data/spec/integration/schema/validate_spec.rb +0 -120
  184. data/spec/integration/schema/xor_spec.rb +0 -35
  185. data/spec/integration/schema_builders_spec.rb +0 -17
  186. data/spec/integration/schema_spec.rb +0 -173
  187. data/spec/shared/message_compiler.rb +0 -11
  188. data/spec/shared/predicate_helper.rb +0 -15
  189. data/spec/shared/rule_compiler.rb +0 -8
  190. data/spec/spec_helper.rb +0 -58
  191. data/spec/support/define_struct.rb +0 -25
  192. data/spec/support/matchers.rb +0 -38
  193. data/spec/support/mutant.rb +0 -9
  194. data/spec/support/predicates_integration.rb +0 -7
  195. data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
  196. data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
  197. data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
  198. data/spec/unit/message_compiler/visit_spec.rb +0 -16
  199. data/spec/unit/message_compiler_spec.rb +0 -7
  200. data/spec/unit/predicate_registry_spec.rb +0 -34
  201. data/spec/unit/schema/key_spec.rb +0 -38
  202. data/spec/unit/schema/rule_spec.rb +0 -42
  203. data/spec/unit/schema/value_spec.rb +0 -131
  204. data/spec/unit/schema_spec.rb +0 -35
@@ -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
@@ -1,9 +0,0 @@
1
- require 'dry/validation/schema'
2
- require 'dry/validation/schema/params'
3
- require 'dry/types/compat/form_types'
4
-
5
- module Dry
6
- module Validation
7
- Schema::Form = Schema::Params
8
- end
9
- end
@@ -1,21 +0,0 @@
1
- require 'dry/validation/schema'
2
-
3
- module Dry
4
- module Validation
5
- class Schema::JSON < Schema
6
- def self.configure(klass = nil, &block)
7
- if klass
8
- klass.configure do |config|
9
- config.input_processor = :json
10
- config.hash_type = :symbolized
11
- end
12
- klass
13
- else
14
- super(&block)
15
- end
16
- end
17
-
18
- configure(self)
19
- end
20
- end
21
- end
@@ -1,71 +0,0 @@
1
- require 'dry/validation/schema/dsl'
2
-
3
- module Dry
4
- module Validation
5
- class Schema
6
- class Key < DSL
7
- attr_reader :parent
8
-
9
- def self.type
10
- :key
11
- end
12
-
13
- def class
14
- Key
15
- end
16
-
17
- def type
18
- self.class.type
19
- end
20
-
21
- def to_ast
22
- [type, [name, super]]
23
- end
24
-
25
- def each(*predicates, &block)
26
- create_rule([type, [name, value.each(*predicates, &block).to_ast]])
27
- end
28
-
29
- def schema(other = nil, &block)
30
- create_rule([type, [name, value.schema(other, &block).to_ast]])
31
- end
32
-
33
- def hash?(&block)
34
- predicate = predicate(:hash?)
35
-
36
- if block
37
- val = value.instance_eval(&block)
38
-
39
- rule = create_rule(predicate)
40
- .and(create_rule([type, [name, val.to_ast]]))
41
-
42
- add_rule(rule)
43
- rule
44
- else
45
- add_rule(create_rule(predicate))
46
- end
47
- end
48
-
49
- def value
50
- Value[name, registry: registry]
51
- end
52
-
53
- private
54
-
55
- def method_missing(meth, *args, &block)
56
- registry.ensure_valid_predicate(meth, args)
57
- predicate = predicate(meth, args)
58
-
59
- if block
60
- val = value.instance_eval(&block)
61
- add_rule(create_rule([:and, [predicate, val.to_ast]]))
62
- else
63
- rule = create_rule([type, [name, predicate]])
64
- add_rule(rule)
65
- rule
66
- end
67
- end
68
- end
69
- end
70
- end
71
- end
@@ -1,22 +0,0 @@
1
- require 'dry/validation/schema'
2
- require 'dry/types/params'
3
-
4
- module Dry
5
- module Validation
6
- class Schema::Params < Schema
7
- def self.configure(klass = nil, &block)
8
- if klass
9
- klass.configure do |config|
10
- config.input_processor = :params
11
- config.hash_type = :symbolized
12
- end
13
- klass
14
- else
15
- super(&block)
16
- end
17
- end
18
-
19
- configure(self)
20
- end
21
- end
22
- end
@@ -1,202 +0,0 @@
1
- require 'dry/validation/deprecations'
2
-
3
- module Dry
4
- module Validation
5
- class Schema
6
- class Rule < BasicObject
7
- include ::Dry::Validation::Deprecations
8
-
9
- INVALID_PREDICATES = {
10
- value: [],
11
- maybe: [:empty?, :none?],
12
- filled: [:empty?, :filled?],
13
- }.freeze
14
-
15
- attr_reader :name, :node, :type, :target, :deps, :options
16
-
17
- def initialize(node, options = {})
18
- @node = node
19
- @type = options.fetch(:type, :and)
20
- @deps = options.fetch(:deps, [])
21
- @name = options.fetch(:name)
22
- @target = options.fetch(:target)
23
- @options = options
24
- end
25
-
26
- def inspect
27
- to_ast.inspect
28
- end
29
- alias_method :to_s, :inspect
30
-
31
- def schema(other = nil, &block)
32
- schema = Schema.create_class(target, other, &block)
33
-
34
- if schema.config.type_specs
35
- target.type_map[name] = schema.type_map
36
- end
37
-
38
- rule = __send__(type, key(:hash?).and(key(schema)))
39
- add_rule(rule)
40
- end
41
-
42
- def schema?
43
- target.schema?
44
- end
45
-
46
- def registry
47
- target.registry
48
- end
49
-
50
- def type_map
51
- target.type_map
52
- end
53
-
54
- def type_map?
55
- target.type_map?
56
- end
57
-
58
- def required(*predicates)
59
- warn 'required is deprecated - use filled instead.'
60
-
61
- filled(*predicates)
62
- end
63
-
64
- def filled(*predicates, &block)
65
- left = ([key(:filled?)] + infer_predicates(predicates, :filled)).reduce(:and)
66
-
67
- rule =
68
- if block
69
- left.and(Key[name, registry: registry].instance_eval(&block))
70
- else
71
- left
72
- end
73
-
74
- add_rule(__send__(type, rule))
75
- end
76
-
77
- def value(*predicates, &block)
78
- if predicates.empty? && !block
79
- ::Kernel.raise ::ArgumentError, "wrong number of arguments (given 0, expected at least 1)"
80
- end
81
-
82
- from_predicates = infer_predicates(predicates, :value).reduce(:and)
83
- from_block = block ? Key[name, registry: registry].instance_eval(&block) : nil
84
-
85
- rule = [from_predicates, from_block].compact.reduce(:and)
86
-
87
- add_rule(__send__(type, rule))
88
- end
89
-
90
- def maybe(*predicates, &block)
91
- left = key(:none?).not
92
-
93
- from_predicates = infer_predicates(predicates, :maybe).reduce(:and)
94
- from_block = block ? Key[name, registry: registry].instance_eval(&block) : nil
95
-
96
- right = [from_predicates, from_block].compact.reduce(:and) || key(:filled?)
97
-
98
- rule = left.then(right)
99
-
100
- add_rule(__send__(type, rule))
101
- end
102
-
103
- def each(*predicates, &block)
104
- rule = target.each(*predicates, &block)
105
- add_rule(__send__(type, new([target.type, [name, rule.to_ast]])))
106
- end
107
-
108
- def add_rule(rule)
109
- target.add_rule(rule)
110
- end
111
-
112
- def rules
113
- target.rules
114
- end
115
-
116
- def checks
117
- target.checks
118
- end
119
-
120
- def rule_ast
121
- rules.size > 0 ? target.rule_ast : [to_ast]
122
- end
123
-
124
- def to_ast
125
- rule_node = name ? [:rule, [name, node]] : node
126
-
127
- if deps.empty?
128
- rule_node
129
- else
130
- [:guard, [deps, rule_node]]
131
- end
132
- end
133
-
134
- def class
135
- Schema::Rule
136
- end
137
-
138
- def not
139
- new([:not, node])
140
- end
141
-
142
- def and(other)
143
- new([:and, [to_ast, other.to_ast]])
144
- end
145
- alias_method :&, :and
146
-
147
- def or(other)
148
- new([:or, [to_ast, other.to_ast]])
149
- end
150
- alias_method :|, :or
151
-
152
- def xor(other)
153
- new([:xor, [to_ast, other.to_ast]])
154
- end
155
- alias_method :^, :xor
156
-
157
- def then(other)
158
- new([:implication, [to_ast, other.to_ast]])
159
- end
160
- alias_method :>, :then
161
-
162
- def infer_predicates(predicates, macro = nil)
163
- predicates.flat_map(&::Kernel.method(:Array)).map do |predicate|
164
- name, *args = ::Kernel.Array(predicate)
165
-
166
- if macro && INVALID_PREDICATES[macro].include?(name)
167
- ::Kernel.raise InvalidSchemaError, "you can't use #{name} predicate with #{macro} macro"
168
- else
169
- key(name, args)
170
- end
171
- end
172
- end
173
-
174
- def with(new_options)
175
- self.class.new(node, options.merge(new_options))
176
- end
177
-
178
- def to_rule
179
- self
180
- end
181
-
182
- private
183
-
184
- def method_missing(meth, *args, &block)
185
- if target.predicate?(meth)
186
- target.__send__(meth, *args, &block)
187
- else
188
- super
189
- end
190
- end
191
-
192
- def key(predicate, args = [])
193
- new(target.node(predicate, *args))
194
- end
195
-
196
- def new(node)
197
- self.class.new(node, options)
198
- end
199
- end
200
- end
201
- end
202
- end