Module: Validation::Validatable::ClassMethods

Defined in:
lib/validation/validatable/classmethods.rb

Instance Method Summary collapse

Instance Method Details

#attr_accessor_with_validation(name, pattern, writer_validation: true, reader_validation: true, &adjuster) ⇒ Array<Symbol>

Parameters:

  • name (Symbol, String)
  • pattern (Proc, Method, #===)
  • reader_validation (Boolean) (defaults to: true)
  • writer_validation (Boolean) (defaults to: true)

Returns:

  • (Array<Symbol>)


61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/validation/validatable/classmethods.rb', line 61

def attr_accessor_with_validation(name, pattern, writer_validation: true, reader_validation: true, &adjuster)
  reader_name = (
    if reader_validation
      attr_reader_with_validation(name, pattern)
    else
      attr_reader(name)
    end
  )

  writer_name = (
    if writer_validation
      attr_writer_with_validation(name, pattern, &adjuster)
    else
      attr_writer(name)
    end
  )

  [reader_name, writer_name]
end

#attr_reader_with_validation(name, pattern) ⇒ Symbol

Parameters:

  • name (Symbol, String)
  • pattern (Proc, Method, #===)

Returns:

  • (Symbol)


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/validation/validatable/classmethods.rb', line 10

def attr_reader_with_validation(name, pattern)
  define_method(name) do
    ivar = :"@#{name}"
    unless instance_variable_defined?(ivar)
      instance_variable_set(ivar, nil)
    end

    value = instance_variable_get(ivar)

    unless _valid?(pattern, value)
      raise InvalidReadingError,
            "#{value.inspect} is deficient for #{name} in #{self.class}"
    end

    value
  end
end

#attr_writer_with_validation(name, pattern, &adjuster) ⇒ Symbol

Parameters:

  • name (Symbol, String)
  • pattern (Proc, Method, #===)

Returns:

  • (Symbol)


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/validation/validatable/classmethods.rb', line 31

def attr_writer_with_validation(name, pattern, &adjuster)
  if adjuster
    adjustment = true
  end

  define_method(:"#{name}=") do |value|
    raise "can't modify frozen #{self.class}" if frozen?

    if adjustment
      begin
        value = instance_exec(value, &adjuster)
      rescue Exception => err
        raise InvalidAdjustingError, err
      end
    end

    if _valid?(pattern, value)
      instance_variable_set(:"@#{name}", value)
    else
      raise InvalidWritingError,
            "#{value.inspect} is deficient for #{name} in #{self.class}"
    end
  end
end