Sha256: 4fcbc4f1faa2ef9cc6157ec4aee7ac60ee6aeb46087dbf9ed818a7774e47440a

Contents?: true

Size: 1.85 KB

Versions: 3

Compression:

Stored size: 1.85 KB

Contents

require 'roodi/checks/check'

module Roodi

  module Checks

    class AbcMetricMethodCheck < Check

      #TODO: '-=' does not work in the moment!
      ASSIGNMENTS = [:lasgn]
      BRANCHES = [:vcall, :call]
      CONDITIONS = [:==, :<=, :>=, :<, :>]
      OPERATORS = [:*, :/, :%, :+, :<<, :>>, :&, :|, :^]
      DEFAULT_SCORE = 10

      def initialize(options = {})
        super()
        @score = options['score'] || DEFAULT_SCORE
      end

      def interesting_nodes
        [:defn]
      end

      def evaluate(node)
        method_name = node[1]
        a = count_assignments(node)
        b = count_branches(node)
        c = count_conditionals(node)
        score = Math.sqrt(a*a + b*b + c*c)
        add_error({ :method => method_name, :score => score }) unless score <= @score
      end

      private

        def count_assignments(node)
          count = 0
          count = count + 1 if assignment?(node)
          node.children.each {|node| count += count_assignments(node)}
          count
        end

        def count_branches(node)
          count = 0
          count = count + 1 if branch?(node)
          node.children.each {|node| count += count_branches(node)}
          count
        end

        def count_conditionals(node)
          count = 0
          count = count + 1 if conditional?(node)
          node.children.each {|node| count += count_conditionals(node)}
          count
        end

        def assignment?(node)
          ASSIGNMENTS.include?(node.node_type)
        end

        def branch?(node)
          BRANCHES.include?(node.node_type) && !conditional?(node) && !operator?(node)
        end

        def conditional?(node)
          (:call == node.node_type) && CONDITIONS.include?(node[2]) 
        end

        def operator?(node)
          (:call == node.node_type) && OPERATORS.include?(node[2]) 
        end      

    end

  end

end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
marcoow-roodi-1.3.2 lib/roodi/checks/abc_metric_method_check.rb
marcoow-roodi-1.3.4 lib/roodi/checks/abc_metric_method_check.rb
marcoow-roodi-1.3.5 lib/roodi/checks/abc_metric_method_check.rb