class Dry::Validation::Evaluator
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
@api public
Attributes
@return [Hash]
Public Class Methods
Source
# File lib/dry/validation/evaluator.rb, line 67 def initialize(contract, **options, &block) super(contract, **options) @_options = options if block exec_opts = block_options.transform_values { _options[_1] } instance_exec(**exec_opts, &block) end macros.each do |args| macro = macro(*args.flatten(1)) instance_exec(**macro.extract_block_options(_options.merge(macro: macro)), ¯o.block) end end
Initialize a new evaluator
@api private
Public Instance Methods
Source
# File lib/dry/validation/evaluator.rb, line 103 def base @base ||= Failures.new end
Get ‘Failures` object for base errors
@return [Failures]
@see Failures#failure
@api public
Source
# File lib/dry/validation/evaluator.rb, line 205 def base_rule_error? !base.empty? || result.base_rule_error? end
Check if there are any base rule errors
@return [Boolean]
@api public
Source
# File lib/dry/validation/evaluator.rb, line 112 def failures @failures ||= [] @failures += @base.opts if defined?(@base) @failures.concat(@key.values.flat_map(&:opts)) if defined?(@key) @failures end
Return aggregated failures
@return [Array<Hash>]
@api private
Source
# File lib/dry/validation/evaluator.rb, line 92 def key(path = self.path) (@key ||= EMPTY_HASH.dup)[path] ||= Failures.new(path) end
Get ‘Failures` object for the default or provided path
@param [Symbol,String,Hash,Array<Symbol>] path
@return [Failures]
@see Failures#failure
@api public
Source
# File lib/dry/validation/evaluator.rb, line 170 def key?(name = key_name) values.key?(name) end
Return if the value under the default key is available
This is useful when dealing with rules for optional keys
@example use the default key name
rule(:age) do key.failure(:invalid) if key? && value < 18 end
@example specify the key name
rule(:start_date, :end_date) do if key?(:start_date) && !key?(:end_date) key(:end_date).failure("must provide an end_date with start_date") end end
@return [Boolean]
@api public
Source
# File lib/dry/validation/evaluator.rb, line 129 def key_name @key_name ||= keys.first end
Return default (first) key name
@return [Symbol]
@api public
Source
# File lib/dry/validation/evaluator.rb, line 210 def respond_to_missing?(meth, include_private = false) super || _contract.respond_to?(meth, true) end
@api private
Source
# File lib/dry/validation/evaluator.rb, line 192 def rule_error?(path = nil) if path.nil? !key(self.path).empty? else result.rule_error?(path) end end
Check if there are any errors on the current rule
@param path [Symbol, String, Array] A Path-compatible spec
@return [Boolean]
@api public
Source
# File lib/dry/validation/evaluator.rb, line 181 def schema_error?(path) result.schema_error?(path) end
Check if there are any errors on the schema under the provided path
@param path [Symbol, String, Array] A Path-compatible spec
@return [Boolean]
@api public
Source
# File lib/dry/validation/evaluator.rb, line 147 def value values[key_name] end
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
@example
rule(:age) do key.failure(:invalid) if value < 18 end
@return [Object]
@api public
Source
# File lib/dry/validation/evaluator.rb, line 120 def with(new_opts, &) self.class.new(_contract, **_options, **new_opts, &) end
@api private
Private Instance Methods
Source
# File lib/dry/validation/evaluator.rb, line 219 def method_missing(meth, ...) # yes, we do want to delegate to private methods too if _contract.respond_to?(meth, true) _contract.__send__(meth, ...) else super end end
Forward to the underlying contract
@api private