class ValidatesTimeliness::Converter

Attributes

format[R]
ignore_usec[R]
type[R]

Public Class Methods

new(type:, format: nil, ignore_usec: false, time_zone_aware: false) click to toggle source
# File lib/validates_timeliness/converter.rb, line 5
def initialize(type:, format: nil, ignore_usec: false, time_zone_aware: false)
  @type = type
  @format = format
  @ignore_usec = ignore_usec
  @time_zone_aware = time_zone_aware
end

Public Instance Methods

dummy_time(value) click to toggle source
# File lib/validates_timeliness/converter.rb, line 33
def dummy_time(value)
  time = if value.acts_like?(:time)
    value = value.in_time_zone if time_zone_aware?
    [value.hour, value.min, value.sec]
  else
    [0,0,0]
  end
  values = ValidatesTimeliness.dummy_date_for_time_type + time
  Timeliness::Parser.make_time(values, (:current if time_zone_aware?))
end
evaluate(value, scope=nil) click to toggle source
# File lib/validates_timeliness/converter.rb, line 44
def evaluate(value, scope=nil)
  case value
  when Time, Date
    value
  when String
    parse(value)
  when Symbol
    if !scope.respond_to?(value) && restriction_shorthand?(value)
      ValidatesTimeliness.restriction_shorthand_symbols[value].call
    else
      evaluate(scope.send(value))
    end
  when Proc
    result = value.arity > 0 ? value.call(scope) : value.call
    evaluate(result, scope)
  else
    value
  end
end
parse(value) click to toggle source
# File lib/validates_timeliness/converter.rb, line 68
def parse(value)
  return nil if value.nil?

  if ValidatesTimeliness.use_plugin_parser
    Timeliness::Parser.parse(value, type, zone: (:current if time_zone_aware?), format: format, strict: false)
  else
    time_zone_aware? ? Time.zone.parse(value) : value.to_time(ValidatesTimeliness.default_timezone)
  end
rescue ArgumentError, TypeError
  nil
end
restriction_shorthand?(symbol) click to toggle source
# File lib/validates_timeliness/converter.rb, line 64
def restriction_shorthand?(symbol)
  ValidatesTimeliness.restriction_shorthand_symbols.keys.include?(symbol)
end
time_zone_aware?() click to toggle source
# File lib/validates_timeliness/converter.rb, line 80
def time_zone_aware?
  @time_zone_aware
end
type_cast_value(value) click to toggle source
# File lib/validates_timeliness/converter.rb, line 12
def type_cast_value(value)
  return nil if value.nil? || !value.respond_to?(:to_time)

  value = value.in_time_zone if value.acts_like?(:time) && time_zone_aware?
  value = case type
  when :time
    dummy_time(value)
  when :date
    value.to_date
  when :datetime
    value.is_a?(Time) ? value : value.to_time
  else
    value
  end
  if ignore_usec && value.is_a?(Time)
    Timeliness::Parser.make_time(Array(value).reverse[4..9], (:current if time_zone_aware?))
  else
    value
  end
end