lib/fmrest/string_date.rb in fmrest-0.9.0 vs lib/fmrest/string_date.rb in fmrest-0.10.0

- old
+ new

@@ -77,21 +77,28 @@ DELEGATE_CLASS = ::Date class InvalidDate < ArgumentError; end class << self - alias_method :strptime, :new + def strptime(str, date_format, *_) + begin + date = self::DELEGATE_CLASS.strptime(str, date_format) + rescue ArgumentError + raise InvalidDate + end + + new(str, date) + end end - def initialize(str, date_format, **str_args) + def initialize(str, date, **str_args) + raise ArgumentError, "str must be of class String" unless str.is_a?(String) + raise ArgumentError, "date must be of class #{self.class::DELEGATE_CLASS.name}" unless date.is_a?(self.class::DELEGATE_CLASS) + super(str, **str_args) - begin - @delegate = self.class::DELEGATE_CLASS.strptime(str, date_format) - rescue ArgumentError - raise InvalidDate - end + @delegate = date freeze end def is_a?(klass) @@ -174,8 +181,40 @@ @delegate.to_date end def to_datetime @delegate + end + end + + module StringDateAwareness + def _parse(v, *_) + if v.is_a?(StringDateTime) + return { year: v.year, mon: v.month, mday: v.mday, hour: v.hour, min: v.min, sec: v.sec, sec_fraction: v.sec_fraction, offset: v.offset } + end + if v.is_a?(StringDate) + return { year: v.year, mon: v.month, mday: v.mday } + end + super + end + + def parse(v, *_) + if v.is_a?(StringDate) + return self == ::DateTime ? v.to_datetime : v.to_date + end + super + end + + # Overriding case equality method so that it returns true for + # `FmRest::StringDate` instances + # + # Calls superclass method + # + def ===(other) + super || other.is_a?(StringDate) + end + + def self.enable(classes: [Date, DateTime]) + classes.each { |klass| klass.singleton_class.prepend(self) } end end end