Sha256: 73af33919efd234ccec05aa5c649495fadca56cd7d8f6b7b825e09d0c62c2655

Contents?: true

Size: 1.64 KB

Versions: 10

Compression:

Stored size: 1.64 KB

Contents

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

module Rubycritic
  module Analyser

    class FlaySmells
      def initialize(analysed_modules)
        @analysed_modules = paths_to_analysed_modules(analysed_modules)
        @flay = Flay.new(@analysed_modules.keys)
      end

      def run
        @flay.hashes.each do |structural_hash, nodes|
          smell = create_smell(structural_hash, nodes)
          nodes.map(&:file).uniq.each do |file|
            @analysed_modules[file].smells << smell
          end

          nodes.each do |node|
            @analysed_modules[node.file].duplication += node.mass
          end
        end
      end

      private

      def paths_to_analysed_modules(analysed_modules)
        paths = {}
        analysed_modules.each do |analysed_module|
          paths[analysed_module.path] = analysed_module
        end
        paths
      end

      def create_smell(structural_hash, nodes)
        mass = @flay.masses[structural_hash]
        Smell.new(
          :locations => smell_locations(nodes),
          :context   => similarity(structural_hash),
          :message   => "found in #{nodes.size} nodes",
          :score     => mass,
          :type      => "DuplicateCode",
          :cost      => cost(mass)
        )
      end

      def smell_locations(nodes)
        nodes.map do |node|
          Location.new(node.file, node.line)
        end.sort
      end

      def similarity(structural_hash)
        if @flay.identical[structural_hash]
          "Identical code"
        else
          "Similar code"
        end
      end

      def cost(mass)
        mass / 25
      end
    end

  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

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