module SplitDmy::SplitAccessors

Constants

PARTS

Public Instance Methods

split_dmy_accessor(*attrs) click to toggle source
# File lib/split_dmy/split_accessors.rb, line 5
def split_dmy_accessor(*attrs)
  require 'split_dmy/date_validator'

  attrs.each do |attr|
    override_builtin(attr)
    add_attr_accessors(attr)
    add_virtus_attributes(attr)
    extend_validation(attr)
  end
  add_methods
  override_permitted_attributes(attrs)
end

Private Instance Methods

add_attr_accessors(attr) click to toggle source
# File lib/split_dmy/split_accessors.rb, line 64
def add_attr_accessors(attr)
  PARTS.each do |part|
    define_method("#{attr}_#{part}=") do |val|
      instance_variable_set("@#{attr}_#{part}", val)
      new = DateValidator.new(self, attr).partial_updated
      send("#{attr}=", new)
    end

    define_method("#{attr}_#{part}") do
      instance_variable_get("@#{attr}_#{part}")
    end
  end
end
add_methods() click to toggle source
# File lib/split_dmy/split_accessors.rb, line 50
def add_methods
  define_method('split_into_parts') do |attr, full_date|
    instance_variable_set("@#{attr}_day", full_date.day)
    instance_variable_set("@#{attr}_month", full_date.month)
    instance_variable_set("@#{attr}_year", full_date.year)
  end
end
add_virtus_attributes(attr) click to toggle source
# File lib/split_dmy/split_accessors.rb, line 58
def add_virtus_attributes(attr)
  PARTS.each do |part|
    attribute "#{attr}_#{part}", String
  end
end
extend_validation(attr) click to toggle source
# File lib/split_dmy/split_accessors.rb, line 28
def extend_validation(attr)
  define_method("validate_#{attr}_partials") do
    dv = DateValidator.new(self, attr)
    if attr.present? && dv.any_errors?
      errors.delete(attr.to_sym)
      errors.add(attr.to_sym, :invalid)
    end
  end
end
override_builtin(attr) click to toggle source
Calls superclass method
# File lib/split_dmy/split_accessors.rb, line 38
def override_builtin(attr)
  after_initialize do
    full_date = send(attr.to_s)
    split_into_parts(attr, full_date) unless full_date.nil?
  end

  define_method("#{attr}=") do |val|
    super(val)
    split_into_parts(attr, Date.parse(val.to_s)) unless val.nil?
  end
end
override_permitted_attributes(attrs) click to toggle source
Calls superclass method
# File lib/split_dmy/split_accessors.rb, line 20
def override_permitted_attributes(attrs)
  array = attrs.product(PARTS).map { |attr, part| "#{attr}_#{part}".to_sym }

  define_method(:permitted_attributes) do
    super().push(array)
  end
end