Sha256: 2afe6e3f7d9dae9699538b80ab6df9bd522e111f264049bdd3d320e032a8c0aa

Contents?: true

Size: 1.34 KB

Versions: 1

Compression:

Stored size: 1.34 KB

Contents

module HashDiff
  class Comparison < Struct.new(:left, :right)
  
    def diff
      @diff ||= differences(left, right)
    end

    def left_diff
      @concern = :left
      @left_diff ||= differences(left, right)
    end

    def right_diff
      @concern = :right
      @right_diff ||= differences(left, right)
    end

    private

    def concern
      @concern ||= :both
    end

    def clone(left, right)
      self.dup.tap do |inst|
        inst.left  = left
        inst.right = right
      end
    end

    def differences(left, right)
      combined_attribute_keys.reduce({}, &reduction_strategy)
    end

    def reduction_strategy(opts={})
      lambda do |diff, key|
        diff[key] = report(key) if not equal?(key)
        diff
      end
    end

    def combined_attribute_keys
      (left.keys + right.keys).uniq
    end

    def equal?(key)
      left[key] == right[key]
    end

    def hash?(value)
      value.is_a? Hash
    end

    def comparable?(key)
      hash?(left[key]) and hash?(right[key])
    end

    def report(key)
      if comparable?(key)
        clone(left[key], right[key]).diff
      else
        report_concern(key)
      end
    end

    def report_concern(key)
      case concern
      when :left  then right[key]
      when :right then left[key]
      when :both  then [left[key], right[key]]
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hash_diff-0.6.1 lib/hash_diff/comparison.rb