Class: Dry::Validation::PredicateRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/dry/validation/predicate_registry.rb

Direct Known Subclasses

Bound, Unbound

Defined Under Namespace

Classes: Bound, Unbound

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(external, predicates = {}) ⇒ PredicateRegistry



44
45
46
47
# File 'lib/dry/validation/predicate_registry.rb', line 44

def initialize(external, predicates = {})
  @external = external
  @predicates = predicates
end

Instance Attribute Details

#externalObject (readonly)

Returns the value of attribute external.



5
6
7
# File 'lib/dry/validation/predicate_registry.rb', line 5

def external
  @external
end

#predicatesObject (readonly)

Returns the value of attribute predicates.



4
5
6
# File 'lib/dry/validation/predicate_registry.rb', line 4

def predicates
  @predicates
end

Class Method Details

.[](klass, predicates) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/dry/validation/predicate_registry.rb', line 31

def self.[](klass, predicates)
  Unbound.new(predicates).tap do |registry|
    klass.class_eval do
      def self.method_added(name)
        super
        if name.to_s.end_with?('?')
          registry.update(name => instance_method(name))
        end
      end
    end
  end
end

Instance Method Details

#[](name) ⇒ Object



57
58
59
60
61
62
63
64
65
# File 'lib/dry/validation/predicate_registry.rb', line 57

def [](name)
  predicates.fetch(name) do
    if external.key?(name)
      external[name]
    else
      raise_unknown_predicate_error(name)
    end
  end
end

#ensure_valid_predicate(name, args_or_arity) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/dry/validation/predicate_registry.rb', line 71

def ensure_valid_predicate(name, args_or_arity)
  if name == :key?
    raise InvalidSchemaError, "#{name} is a reserved predicate name"
  end

  if key?(name)
    arity = self[name].arity

    case args_or_arity
    when Array
      raise_invalid_arity_error(name) if ![0, args_or_arity.size + 1].include?(arity)
    when Fixnum
      raise_invalid_arity_error(name) if args_or_arity != arity
    end
  else
    raise_unknown_predicate_error(name)
  end
end

#key?(name) ⇒ Boolean



67
68
69
# File 'lib/dry/validation/predicate_registry.rb', line 67

def key?(name)
  predicates.key?(name) || external.key?(name)
end

#new(klass) ⇒ Object



49
50
51
52
53
54
55
# File 'lib/dry/validation/predicate_registry.rb', line 49

def new(klass)
  new_predicates = predicates
    .keys
    .each_with_object({}) { |key, res| res[key] = klass.instance_method(key) }

  self.class.new(external).update(new_predicates)
end