Sha256: 2380600cf006747bbd870cabe9b400076054387e104f84ae1a6f3cc9f88abf3d

Contents?: true

Size: 1.57 KB

Versions: 14

Compression:

Stored size: 1.57 KB

Contents

# frozen_string_literal: true

module Reek
  module Spec
    #
    # Matches a +SmellWarning+ object agains a smell type and hash of attributes.
    #
    class SmellMatcher
      attr_reader :smell_warning

      COMPARABLE_ATTRIBUTES = [:message, :lines, :context, :source].freeze

      def initialize(smell_warning)
        @smell_warning = smell_warning
      end

      def matches?(klass, attributes = {})
        matches_smell_type?(klass) && matches_attributes?(attributes)
      end

      def matches_smell_type?(klass)
        smell_warning.smell_type == klass.to_s
      end

      def matches_attributes?(attributes)
        check_attributes_comparability(attributes)

        fields, params = attributes.
          partition { |key, _| COMPARABLE_ATTRIBUTES.include? key }.
          map(&:to_h)

        common_parameters_equal?(params) &&
          common_attributes_equal?(fields)
      end

      private

      def check_attributes_comparability(other_attributes)
        parameter_keys = other_attributes.keys - COMPARABLE_ATTRIBUTES
        extra_keys = parameter_keys - smell_warning.parameters.keys
        return if extra_keys.empty?

        raise ArgumentError, "The attribute '#{extra_keys.first}' is not available for comparison"
      end

      def common_parameters_equal?(other_parameters)
        smell_warning.parameters.slice(*other_parameters.keys) == other_parameters
      end

      def common_attributes_equal?(attributes)
        attributes.all? do |other_key, other_value|
          smell_warning.send(other_key) == other_value
        end
      end
    end
  end
end

Version data entries

14 entries across 12 versions & 2 rubygems

Version Path
reek-6.0.0 lib/reek/spec/smell_matcher.rb
reek-5.6.0 lib/reek/spec/smell_matcher.rb
reek-5.5.0 lib/reek/spec/smell_matcher.rb
reek-5.4.1 lib/reek/spec/smell_matcher.rb
reek-5.4.0 lib/reek/spec/smell_matcher.rb
reek-5.3.2 lib/reek/spec/smell_matcher.rb
reek-5.3.1 lib/reek/spec/smell_matcher.rb
reek-5.3.0 lib/reek/spec/smell_matcher.rb
config_gems_initialization_aim-0.1.4 vendor/bundle/ruby/2.5.0/gems/reek-5.2.0/lib/reek/spec/smell_matcher.rb
config_gems_initialization_aim-0.1.4 vendor/bundle/ruby/2.5.0/gems/config_gems_initialization_aim-0.1.1/vendor/bundle/ruby/2.5.0/gems/reek-5.2.0/lib/reek/spec/smell_matcher.rb
config_gems_initialization_aim-0.1.3 vendor/bundle/ruby/2.5.0/gems/config_gems_initialization_aim-0.1.1/vendor/bundle/ruby/2.5.0/gems/reek-5.2.0/lib/reek/spec/smell_matcher.rb
config_gems_initialization_aim-0.1.3 vendor/bundle/ruby/2.5.0/gems/reek-5.2.0/lib/reek/spec/smell_matcher.rb
reek-5.2.0 lib/reek/spec/smell_matcher.rb
reek-5.1.0 lib/reek/spec/smell_matcher.rb