Sha256: 3a1a5971266e0923add748efa8ab7f9e617ef09d1bbbf3dcea836f5aa850a1a7

Contents?: true

Size: 1.62 KB

Versions: 4

Compression:

Stored size: 1.62 KB

Contents

require_relative '../smells'
require_relative 'smell_detector'
require_relative '../configuration/app_configuration'

module Reek
  module Smells
    #
    # Contains all the existing smells and exposes operations on them.
    #
    class SmellRepository
      def self.smell_types
        Reek::Smells::SmellDetector.descendants.sort_by(&:name)
      end

      def self.eligible_smell_types(filter_by_smells = [])
        return smell_types if filter_by_smells.empty?
        smell_types.select do |klass|
          filter_by_smells.include? klass.smell_type
        end
      end

      def initialize(smell_types: self.class.smell_types,
                     configuration: {})
        @configuration = configuration
        @smell_types   = smell_types
      end

      def report_on(listener)
        detectors.each_value { |detector| detector.report_on(listener) }
      end

      def examine(context)
        smell_listeners[context.type].each do |detector|
          detector.examine(context)
        end
      end

      def detectors
        @initialized_detectors ||= smell_types.map do |klass|
          { klass => klass.new(source_configuration_for(klass)) }
        end.reduce({}, :merge)
      end

      private

      private_attr_reader :configuration, :smell_types

      def source_configuration_for(klass)
        configuration[klass] || {}
      end

      # TODO: Make a method smell_detectors_for(scope)
      def smell_listeners
        @smell_listeners ||= Hash.new { |hash, key| hash[key] = [] }.tap do |listeners|
          detectors.each_value { |detector| detector.register(listeners) }
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
reek-3.6.0 lib/reek/smells/smell_repository.rb
reek-3.5.0 lib/reek/smells/smell_repository.rb
reek-3.4.1 lib/reek/smells/smell_repository.rb
reek-3.4.0 lib/reek/smells/smell_repository.rb