lib/ecoportal/api/common/hash_diff.rb in ecoportal-api-0.8.2 vs lib/ecoportal/api/common/hash_diff.rb in ecoportal-api-0.8.3
- old
+ new
@@ -3,30 +3,31 @@
module Common
module HashDiff
ID_KEYS = %w[id]
class << self
- def diff(a, b)
- return a if a.class != b.class
+
+ def diff(a, b, ignore: [])
case a
when Hash
{}.tap do |diffed|
a.each do |key, a_value|
- b_value = b[key]
- next if a_value == b_value && !ID_KEYS.include?(key)
- diffed[key] = diff(a_value, b_value)
+ b_value = b && b[key]
+ no_changes = (a_value == b_value) || ignore.include?(key)
+ next if !ID_KEYS.include?(key) && no_changes
+ diffed[key] = diff(a_value, b_value, ignore: ignore)
diffed.delete(key) if diffed[key] == {}
end
# All keys are IDs, so it's actually blank
if (diffed.keys - ID_KEYS).empty?
return {}
end
end
when Array
- return a unless a.length == b.length
+ return a unless b.is_a?(Array) && a.length == b.length
a.map.with_index do |a_value, idx|
b_value = b[idx]
- diff(a_value, b_value)
+ diff(a_value, b_value, ignore: ignore)
end.reject do |el|
el == {}
end
else
a