Module: MercadoPublicoCl::Resources::Base

Defined in:
lib/mercado_publico_cl/resources/base.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

ISO_DATE_REGEX =
/\A(\d{4})-(\d{2})-(\d{2})/
DMY_DATE_REGEX =
/\A(\d{2})-(\d{2})-(\d{4})\z/

Class Method Summary collapse

Class Method Details

.build_date(year, month, day) ⇒ Object



69
70
71
72
73
# File 'lib/mercado_publico_cl/resources/base.rb', line 69

def build_date(year, month, day)
  Date.new(year.to_i, month.to_i, day.to_i)
rescue ArgumentError
  nil
end

.parse_date(value) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/mercado_publico_cl/resources/base.rb', line 49

def parse_date(value)
  return nil if value.nil?
  return value if value.is_a?(Date) && !value.is_a?(DateTime)
  # Solo duck-typing para objetos tipo Time (TimeWithZone, etc.).
  # Nunca para String: ActiveSupport le agrega #to_date y lanza
  # Date::Error con strings malformados.
  return value.to_date if !value.is_a?(String) && value.respond_to?(:to_date)

  str = value.to_s.strip
  return nil if str.empty?

  if (m = ISO_DATE_REGEX.match(str))
    build_date(m[1], m[2], m[3])
  elsif (m = DMY_DATE_REGEX.match(str))
    build_date(m[3], m[2], m[1])
  else
    slow_parse_date(str)
  end
end

.slow_parse_date(str) ⇒ Object



75
76
77
78
79
# File 'lib/mercado_publico_cl/resources/base.rb', line 75

def slow_parse_date(str)
  Date.parse(str)
rescue ArgumentError, TypeError
  nil
end

.to_bool(value, true_codes: [1], false_codes: [0]) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/mercado_publico_cl/resources/base.rb', line 81

def to_bool(value, true_codes: [1], false_codes: [0])
  return nil if value.nil?

  str = value.to_s.strip
  return nil if str.empty?
  return true if str.casecmp("true").zero?
  return false if str.casecmp("false").zero?

  n = value.is_a?(Numeric) ? value.to_i : Integer(str, 10, exception: false)
  return true if true_codes.include?(n)
  return false if false_codes.include?(n)

  nil
end

.to_float(value) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/mercado_publico_cl/resources/base.rb', line 109

def to_float(value)
  return value if value.is_a?(Float)
  return value.to_f if value.is_a?(Integer)
  return nil if value.nil?

  str = value.to_s.strip
  return nil if str.empty?

  Float(str)
rescue ArgumentError
  nil
end

.to_int(value) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/mercado_publico_cl/resources/base.rb', line 96

def to_int(value)
  return value if value.is_a?(Integer)
  return value.to_i if value.is_a?(Float)
  return nil if value.nil?

  str = value.to_s.strip
  return nil if str.empty?

  Integer(str, 10)
rescue ArgumentError
  nil
end