module Ecoportal::API::Common::HashDiff

Constants

ID_KEYS

Public Class Methods

diff(a, b, ignore: []) click to toggle source
# File lib/ecoportal/api/common/hash_diff.rb, line 9
def diff(a, b, ignore: [])
  case a
  when Hash
    {}.tap do |diffed|
      a.each do |key, a_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 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, ignore: ignore)
    end.reject do |el|
      el == {}
    end
  else
    a
  end
end