lib/eco/api/common/people/default_parsers/date_parser.rb in eco-helpers-2.6.4 vs lib/eco/api/common/people/default_parsers/date_parser.rb in eco-helpers-2.7.0
- old
+ new
@@ -1,32 +1,84 @@
class Eco::API::Common::People::DefaultParsers::DateParser < Eco::API::Common::Loaders::Parser
attribute :date
+ MIN_DATE = '1901-01-02'.freeze
+ MAX_DATE = '2099-12-31'.freeze
+
def parser(value, deps)
- value.is_a?(Array) ? value.map { |v| parse_date(v) } : parse_date(value)
+ parse_date(value, attr: deps['attr'])
end
- def serializer(value, deps)
- value.is_a?(Array) ? value.map { |d| serialize_date(d) } : serialize_date(value)
+ def serializer(value, _deps)
+ serialize_date(value)
end
private
- def parse_date(value)
- begin
- (value.to_s.empty?) ? nil : Date.parse(value)
- rescue
+ def parse_date(value, attr:)
+ return value.map {|val| parse_date(val, attr: attr)}.compact if value.is_a?(Enumerable)
+
+ return nil if value.nil?
+ value = value.to_s.strip
+ return nil if value.empty?
+
+ if date?(value)
+ Date.parse(value).then do |date|
+ next date if valid_range?(date)
+ wrong!(value, attr: attr, desc: 'Date out of range (1900-2099). Given: ')
+ nil
+ end
+ else
+ wrong!(value, attr: attr)
nil
end
+ rescue TypeError, Date::Error
+ nil
end
def serialize_date(value)
+ return value.map {|val| serialize_date(val)}.compact if value.is_a?(Enumerable)
+
+ return nil if value.nil?
+ return nil if value.to_s.strip.empty?
return value if value.is_a?(String)
- begin
- value && value.strftime('%Y-%m-%d')
- rescue
- nil
- end
+ return nil unless [Date, Time].any? {|type| value.is_a?(type)}
+ value&.strftime('%Y-%m-%d')
+ rescue TypeError, Date::Error
+ nil
end
+ def wrong!(value, attr:, desc: "Can't make a date out of")
+ return if wrong(attr).key?(value)
+ wrong(attr)[value] = value
+ log(:warn) { "#{desc} '#{value}' for '#{attr}'" }
+ end
+ def wrong(attr = nil)
+ @wrong ||= {}
+ return @wrong if attr.nil?
+ @wrong[attr] ||= {}
+ end
+
+ def date?(value)
+ return true if value.nil?
+ return true if value.to_s.strip.empty?
+ Date.parse(value)
+ true
+ rescue TypeError, Date::Error
+ false
+ end
+
+ def valid_range?(date)
+ return true if date.nil?
+ return false unless min_date <= date
+ max_date >= date
+ end
+
+ def min_date
+ @min_date ||= Date.parse(MIN_DATE)
+ end
+
+ def max_date
+ @max_date ||= Date.parse(MAX_DATE)
+ end
end