Class: Dry::Validation::Evaluator
- Inherits:
-
Object
- Object
- Dry::Validation::Evaluator
- Extended by:
- Initializer
- Defined in:
- lib/dry/validation/evaluator.rb
Overview
Evaluator is the execution context for rules
Evaluators expose an API for setting failure messages and forward method calls to the contracts, so that you can use your contract methods within rule blocks
Instance Attribute Summary collapse
- #_context ⇒ Concurrent::Map readonly private
- #_contract ⇒ Contract readonly private
- #_options ⇒ Hash readonly
- #block_options ⇒ Hash<Symbol=>Symbol> readonly private
- #keys ⇒ Array<String, Symbol, Hash> readonly private
- #macros ⇒ Array<Symbol> readonly private
- #path ⇒ Dry::Schema::Path readonly private
- #result ⇒ Result readonly private
- #values ⇒ Object readonly private
Instance Method Summary collapse
-
#base ⇒ Failures
Get ‘Failures` object for base errors.
-
#error?(path) ⇒ Boolean
Check if there are any errors under the provided path.
-
#failures ⇒ Array<Hash>
private
Return aggregated failures.
-
#initialize(contract, options, &block) ⇒ Evaluator
constructor
private
Initialize a new evaluator.
-
#key(path = self.path) ⇒ Failures
Get ‘Failures` object for the default or provided path.
-
#key? ⇒ Boolean
Return if the value under the default key is available.
-
#key_name ⇒ Symbol
Return default (first) key name.
- #respond_to_missing?(meth, include_private = false) ⇒ Boolean private
-
#value ⇒ Object
Return the value found under the first specified key.
- #with(new_opts, &block) ⇒ Object private
Constructor Details
#initialize(contract, options, &block) ⇒ Evaluator
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Initialize a new evaluator
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/dry/validation/evaluator.rb', line 66 def initialize(contract, , &block) super(contract, ) @_options = if block exec_opts = .map { |key, value| [key, [value]] }.to_h instance_exec(exec_opts, &block) end macros.each do |args| macro = macro(*args.flatten(1)) instance_exec(macro.(.merge(macro: macro)), ¯o.block) end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(meth, *args, &block) ⇒ Object (private)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Forward to the underlying contract
187 188 189 190 191 192 193 194 |
# File 'lib/dry/validation/evaluator.rb', line 187 def method_missing(meth, *args, &block) # yes, we do want to delegate to private methods too if _contract.respond_to?(meth, true) _contract.__send__(meth, *args, &block) else super end end |
Instance Attribute Details
#_context ⇒ Concurrent::Map (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
43 |
# File 'lib/dry/validation/evaluator.rb', line 43 option :_context |
#_contract ⇒ Contract (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
23 |
# File 'lib/dry/validation/evaluator.rb', line 23 param :_contract |
#_options ⇒ Hash (readonly)
61 62 63 |
# File 'lib/dry/validation/evaluator.rb', line 61 def @_options end |
#block_options ⇒ Hash<Symbol=>Symbol> (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
58 |
# File 'lib/dry/validation/evaluator.rb', line 58 option :block_options, default: proc { EMPTY_HASH } |
#keys ⇒ Array<String, Symbol, Hash> (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
33 |
# File 'lib/dry/validation/evaluator.rb', line 33 option :keys |
#macros ⇒ Array<Symbol> (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
38 |
# File 'lib/dry/validation/evaluator.rb', line 38 option :macros, optional: true, default: proc { EMPTY_ARRAY.dup } |
#path ⇒ Dry::Schema::Path (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
48 |
# File 'lib/dry/validation/evaluator.rb', line 48 option :path, default: proc { Dry::Schema::Path[(key = keys.first) ? key : ROOT_PATH] } |
#result ⇒ Result (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
28 |
# File 'lib/dry/validation/evaluator.rb', line 28 option :result |
#values ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
53 |
# File 'lib/dry/validation/evaluator.rb', line 53 option :values |
Instance Method Details
#base ⇒ Failures
Get ‘Failures` object for base errors
102 103 104 |
# File 'lib/dry/validation/evaluator.rb', line 102 def base @base ||= Failures.new end |
#error?(path) ⇒ Boolean
Check if there are any errors under the provided path
173 174 175 |
# File 'lib/dry/validation/evaluator.rb', line 173 def error?(path) result.error?(path) end |
#failures ⇒ Array<Hash>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return aggregated failures
111 112 113 114 115 116 |
# File 'lib/dry/validation/evaluator.rb', line 111 def failures @failures ||= [] @failures += @base.opts if defined?(@base) @failures.concat(@key.values.flat_map(&:opts)) if defined?(@key) @failures end |
#key(path = self.path) ⇒ Failures
Get ‘Failures` object for the default or provided path
91 92 93 |
# File 'lib/dry/validation/evaluator.rb', line 91 def key(path = self.path) (@key ||= EMPTY_HASH.dup)[path] ||= Failures.new(path) end |
#key? ⇒ Boolean
Return if the value under the default key is available
This is useful when dealing with rules for optional keys
162 163 164 |
# File 'lib/dry/validation/evaluator.rb', line 162 def key? values.key?(key_name) end |
#key_name ⇒ Symbol
Return default (first) key name
128 129 130 |
# File 'lib/dry/validation/evaluator.rb', line 128 def key_name @key_name ||= keys.first end |
#respond_to_missing?(meth, include_private = false) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
178 179 180 |
# File 'lib/dry/validation/evaluator.rb', line 178 def respond_to_missing?(meth, include_private = false) super || _contract.respond_to?(meth, true) end |
#value ⇒ Object
Return the value found under the first specified key
This is a convenient method that can be used in all the common cases where a rule depends on just one key and you want a quick access to the value
146 147 148 |
# File 'lib/dry/validation/evaluator.rb', line 146 def value values[key_name] end |
#with(new_opts, &block) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
119 120 121 |
# File 'lib/dry/validation/evaluator.rb', line 119 def with(new_opts, &block) self.class.new(_contract, .merge(new_opts), &block) end |