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