lib/gillbus/helpers/parser.rb in gillbus-0.22.2 vs lib/gillbus/helpers/parser.rb in gillbus-0.22.3
- old
+ new
@@ -44,13 +44,32 @@
return unless target_doc
if key.is_a?(Regexp)
target_doc.select { |k| k =~ key }
elsif key.is_a?(Array)
- key.map { |k| Array(target_doc[k]) }.inject(&:+)
+ key.map { |k| ensure_array(target_doc[k]) }.inject(&:+)
else
target_doc[key]
end
+ end
+
+ # Нужно удостовериться, что элемент завёрнут в массив,
+ # чтобы дальше эти массивы сложить в методе fetch_value.
+ # Есть нюанс, что при сложении ['Item'] + [{'ID'=>'1'}, 'Subitem'] получается
+ # ['Item', {'ID'=>'1'}, 'Subitem'], а нам надо ['Item', [{'ID'=>'1'}, 'Subitem']]
+ # Поэтому item_with_id заворачиваем во внешний массив
+ def ensure_array(val)
+ if is_item_with_id?(val)
+ [val]
+ else
+ Array(val)
+ end
+ end
+
+ # Детектит элементы вида <CRITICAL_INF ID="1">Text</CRITICAL_INF>,
+ # которые парсятся как [{'ID'=>'1'}, 'Text']
+ def is_item_with_id?(val)
+ val.is_a?(Array) && val.size == 2 && val.first.is_a?(Hash) && val.first.keys == ['ID']
end
def make_one_or_many(type, val)
# [:type]
if type.is_a? Array