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