lib/gillbus/helpers/parser.rb in gillbus-0.17.3 vs lib/gillbus/helpers/parser.rb in gillbus-0.17.4

- old
+ new

@@ -16,26 +16,34 @@ @options = options end def parse fields.each do |name:, key:, type:, root:| - raw_value = - if key.is_a?(Regexp) - doc.select { |k| k =~ key } - elsif root - doc[root] && doc[root][key] + value = + if type == :datetime_combined + datetime_combined(key) else - doc[key] + raw_value = fetch_value(key: key, root: root) + make_one_or_many(type, raw_value) end - value = make_one_or_many(type, raw_value) instance.send "#{name}=", value unless value.nil? end instance end private + def fetch_value(key:, root:) + if key.is_a?(Regexp) + doc.select { |k| k =~ key } + elsif root + doc[root] && doc[root][key] + else + doc[key] + end + end + def make_one_or_many(type, val) # [:type] if type.is_a? Array array(val).map { |v| make_one type.first, v } # :type @@ -88,11 +96,21 @@ $1 end end def datetime(val) - tz = @options[:timezone] || 'Europe/Kiev' - ActiveSupport::TimeZone[tz].parse(val) + ActiveSupport::TimeZone[default_timezone].parse(val) + end + + def datetime_combined(key) + date_string = doc["#{key}_DATE"] + time_string = doc["#{key}_TIME"] + timezone = doc["#{key}_TIMEZONE"].presence || default_timezone + ActiveSupport::TimeZone[timezone].parse("#{date_string} #{time_string}") + end + + def default_timezone + @options[:timezone] || 'Europe/Kiev' end def decimal(val) BigDecimal.new(val) end