Sha256: 8935aa36e33e19a930488f40a0c932054ac6037763a6b20e194276f82f6bb2f4

Contents?: true

Size: 1.8 KB

Versions: 8

Compression:

Stored size: 1.8 KB

Contents

# frozen_string_literal: true

require 'rubycritic/analysers/helpers/flay'
require 'rubycritic/core/smell'
require 'rubycritic/colorize'

module RubyCritic
  module Analyser
    class FlaySmells
      include Colorize
      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
          print green '.'
        end
        puts ''
      end

      def to_s
        'flay smells'
      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',
          analyser: 'flay',
          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

8 entries across 8 versions & 1 rubygems

Version Path
rubycritic-3.5.2 lib/rubycritic/analysers/smells/flay.rb
rubycritic-3.5.1 lib/rubycritic/analysers/smells/flay.rb
rubycritic-3.5.0 lib/rubycritic/analysers/smells/flay.rb
rubycritic-3.4.0 lib/rubycritic/analysers/smells/flay.rb
rubycritic-3.3.0 lib/rubycritic/analysers/smells/flay.rb
rubycritic-3.2.3 lib/rubycritic/analysers/smells/flay.rb
rubycritic-3.2.2 lib/rubycritic/analysers/smells/flay.rb
rubycritic-3.2.1 lib/rubycritic/analysers/smells/flay.rb