Sha256: b28e6ad430705d00d301c17d3da87d4144b56b8532e40a2d60b1ecdf9b970866

Contents?: true

Size: 1.52 KB

Versions: 15

Compression:

Stored size: 1.52 KB

Contents

# frozen_string_literal: true

module Hashdiff
  # @private
  # Used to compare hashes
  class CompareHashes
    class << self
      def call(obj1, obj2, opts = {})
        return [] if obj1.empty? && obj2.empty?

        obj1_keys = obj1.keys
        obj2_keys = obj2.keys

        added_keys = (obj2_keys - obj1_keys).sort_by(&:to_s)
        common_keys = (obj1_keys & obj2_keys).sort_by(&:to_s)
        deleted_keys = (obj1_keys - obj2_keys).sort_by(&:to_s)

        result = []

        # add deleted properties
        deleted_keys.each do |k|
          change_key = Hashdiff.prefix_append_key(opts[:prefix], k, opts)
          custom_result = Hashdiff.custom_compare(opts[:comparison], change_key, obj1[k], nil)

          if custom_result
            result.concat(custom_result)
          else
            result << ['-', change_key, obj1[k]]
          end
        end

        # recursive comparison for common keys
        common_keys.each do |k|
          prefix = Hashdiff.prefix_append_key(opts[:prefix], k, opts)

          result.concat(Hashdiff.diff(obj1[k], obj2[k], opts.merge(prefix: prefix)))
        end

        # added properties
        added_keys.each do |k|
          change_key = Hashdiff.prefix_append_key(opts[:prefix], k, opts)

          custom_result = Hashdiff.custom_compare(opts[:comparison], change_key, nil, obj2[k])

          if custom_result
            result.concat(custom_result)
          else
            result << ['+', change_key, obj2[k]]
          end
        end

        result
      end
    end
  end
end

Version data entries

15 entries across 14 versions & 4 rubygems

Version Path
cloudsmith-api-0.49.94 vendor/bundle/ruby/2.6.0/gems/hashdiff-1.0.0/lib/hashdiff/compare_hashes.rb
cloudsmith-api-0.49.21 vendor/bundle/ruby/2.6.0/gems/hashdiff-1.0.0/lib/hashdiff/compare_hashes.rb
cloudsmith-api-0.49.15 vendor/bundle/ruby/2.6.0/gems/hashdiff-1.0.0/lib/hashdiff/compare_hashes.rb
cloudsmith-api-0.49.13 vendor/bundle/ruby/2.6.0/gems/hashdiff-1.0.0/lib/hashdiff/compare_hashes.rb
cloudsmith-api-0.49.9 vendor/bundle/ruby/2.3.0/gems/hashdiff-1.0.0/lib/hashdiff/compare_hashes.rb
vagrant-unbundled-2.2.7.0 vendor/bundle/ruby/2.6.0/gems/hashdiff-0.4.0/lib/hashdiff/compare_hashes.rb
vagrant-unbundled-2.2.7.0 vendor/bundle/ruby/2.7.0/gems/hashdiff-0.4.0/lib/hashdiff/compare_hashes.rb
honeybadger-4.5.3 vendor/bundle/ruby/2.6.0/gems/hashdiff-0.4.0/lib/hashdiff/compare_hashes.rb
vagrant-unbundled-2.2.6.2 vendor/bundle/ruby/2.6.0/gems/hashdiff-1.0.0/lib/hashdiff/compare_hashes.rb
vagrant-unbundled-2.2.6.1 vendor/bundle/ruby/2.6.0/gems/hashdiff-1.0.0/lib/hashdiff/compare_hashes.rb
vagrant-unbundled-2.2.6.0 vendor/bundle/ruby/2.6.0/gems/hashdiff-1.0.0/lib/hashdiff/compare_hashes.rb
cloudsmith-api-0.44.4 vendor/bundle/ruby/2.3.0/gems/hashdiff-1.0.0/lib/hashdiff/compare_hashes.rb
hashdiff-1.0.0 lib/hashdiff/compare_hashes.rb
hashdiff-1.0.0.beta1 lib/hashdiff/compare_hashes.rb
hashdiff-0.4.0 lib/hashdiff/compare_hashes.rb