class SplitDmy::DateValidator

Public Class Methods

new(object, attribute) click to toggle source
# File lib/split_dmy/date_validator.rb, line 3
def initialize(object, attribute)
  @split_day = object.instance_variable_get("@#{attribute}_day")
  @split_month = object.instance_variable_get("@#{attribute}_month")
  @split_year = object.instance_variable_get("@#{attribute}_year").to_i
  @object = object
  @attr = attribute
end

Public Instance Methods

any_errors?() click to toggle source
# File lib/split_dmy/date_validator.rb, line 37
def any_errors?
  !partials_valid? || partials_valid_date_fails?
end
build_date() click to toggle source
# File lib/split_dmy/date_validator.rb, line 26
def build_date
  date = Date.new(
    @split_year.to_i,
    parse_month(@split_month),
    @split_day.to_i
  )
  date if partials_match_date(date)
rescue
  false
end
parse_month(val) click to toggle source
# File lib/split_dmy/date_validator.rb, line 16
def parse_month(val)
  if valid_fixnum?(val, 12) || valid_numeric_string?(val, 12)
    result = val.to_i
  else
    mon_name = valid_month_name?(val)
    result = mon_name.present? ? mon_name : val
  end
  result.to_i
end
partial_updated() click to toggle source
# File lib/split_dmy/date_validator.rb, line 11
def partial_updated
  new_date = build_date
  partials_valid? && new_date ? new_date : nil
end

Private Instance Methods

partials_match_date(date) click to toggle source
# File lib/split_dmy/date_validator.rb, line 51
def partials_match_date(date)
  date.day == @split_day.to_i &&
    date.month == parse_month(@split_month).to_i &&
    date.year == @split_year.to_i
end
partials_valid?() click to toggle source
# File lib/split_dmy/date_validator.rb, line 43
def partials_valid?
  { d: valid_day?, m: valid_month?, y: valid_year? }.values.all?
end
partials_valid_date_fails?() click to toggle source
# File lib/split_dmy/date_validator.rb, line 47
def partials_valid_date_fails?
  partials_valid? && !build_date
end
valid_day?() click to toggle source
# File lib/split_dmy/date_validator.rb, line 57
def valid_day?
  (valid_fixnum?(@split_day, 31) || valid_numeric_string?(@split_day, 31))
end
valid_fixnum?(x, max) click to toggle source
# File lib/split_dmy/date_validator.rb, line 76
def valid_fixnum?(x, max)
  x.is_a?(Fixnum) && x > 0 && x <= max
end
valid_month?() click to toggle source
# File lib/split_dmy/date_validator.rb, line 61
def valid_month?
  (
    valid_fixnum?(@split_month, 12) ||
    valid_numeric_string?(@split_month, 12) ||
    valid_month_name?(@split_month)
  )
end
valid_month_name?(month) click to toggle source
# File lib/split_dmy/date_validator.rb, line 88
def valid_month_name?(month)
  short_months = I18n.t('date.abbr_month_names')
  full_months  = I18n.t('date.month_names')
  if short_months.include?(month.to_s.capitalize)
    short_months.index(month.capitalize)
  elsif full_months.include?(month.to_s.capitalize)
    full_months.index(month.capitalize)
  end
end
valid_numeric_string?(x, max) click to toggle source
# File lib/split_dmy/date_validator.rb, line 80
def valid_numeric_string?(x, max)
  x =~ /^[0-9]{1,2}$/ && x.to_i <= max
end
valid_numeric_string_year?(x) click to toggle source
# File lib/split_dmy/date_validator.rb, line 84
def valid_numeric_string_year?(x)
  x =~ /^[0-9]{4}$/ && x.to_i <= 3333 && x.to_i > 0000
end
valid_year?() click to toggle source
# File lib/split_dmy/date_validator.rb, line 69
def valid_year?
  (
    valid_fixnum?(@split_year, 3333) ||
    valid_numeric_string_year?(@split_year)
  )
end