Sha256: 59260c1e3bc00bbd95a79fbab5264af281b50da28bf44fd7808157cd8d0af581

Contents?: true

Size: 1.51 KB

Versions: 10

Compression:

Stored size: 1.51 KB

Contents

require "rubycritic/analysers/helpers/flog"
require "rubycritic/core/smell"

module Rubycritic
  module Analyser

    class FlogSmells
      HIGH_COMPLEXITY_SCORE_THRESHOLD = 25
      VERY_HIGH_COMPLEXITY_SCORE_THRESHOLD = 60

      def initialize(analysed_modules)
        @flog = Flog.new
        @analysed_modules = analysed_modules
      end

      def run
        @analysed_modules.each do |analysed_module|
          add_smells_to(analysed_module)
        end
      end

      private

      def add_smells_to(analysed_module)
        @flog.reset
        @flog.flog(analysed_module.path)
        @flog.each_by_score do |class_method, original_score|
          score = original_score.round
          if score >= HIGH_COMPLEXITY_SCORE_THRESHOLD
            analysed_module.smells << create_smell(class_method, score)
          end
        end
      end

      def create_smell(context, score)
        Smell.new(
          :locations => smell_locations(context),
          :context   => context,
          :message   => "has a flog score of #{score}",
          :score     => score,
          :type      => type(score),
          :cost      => 0
        )
      end

      def smell_locations(context)
        line = @flog.method_locations[context]
        file_path, file_line = line.split(":")
        [Location.new(file_path, file_line)]
      end

      def type(score)
        if score >= VERY_HIGH_COMPLEXITY_SCORE_THRESHOLD
          "VeryHighComplexity"
        else
          "HighComplexity"
        end
      end
    end

  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
rubycritic-2.3.0 lib/rubycritic/analysers/smells/flog.rb
rubycritic-2.2.0 lib/rubycritic/analysers/smells/flog.rb
rubycritic-2.1.0 lib/rubycritic/analysers/smells/flog.rb
rubycritic-2.0.0 lib/rubycritic/analysers/smells/flog.rb
rubycritic-1.4.0 lib/rubycritic/analysers/smells/flog.rb
rubycritic-1.3.0 lib/rubycritic/analysers/smells/flog.rb
rubycritic-1.2.1 lib/rubycritic/analysers/smells/flog.rb
rubycritic-1.2.0 lib/rubycritic/analysers/smells/flog.rb
rubycritic-1.1.1 lib/rubycritic/analysers/smells/flog.rb
rubycritic-1.1.0 lib/rubycritic/analysers/smells/flog.rb