Sha256: 2f2a9d3acbe09cbda594f670eca821077124f22abfa614c87808d947e3bd8a58

Contents?: true

Size: 1.84 KB

Versions: 6

Compression:

Stored size: 1.84 KB

Contents

module Skeptic
  module Rules
    class MaxMethodArity
      DESCRIPTION = 'Limit the arguments count per method'
      MAX_METHOD_ARITY = 3

      include SexpVisitor

      def initialize(limit = nil)
        @violations = []
        @limit  = limit || MAX_METHOD_ARITY
      end

      def apply_to(code, tokens, sexp)
        visit sexp
        self
      end

      def violations
        @violations.map do |method, arity|
          "#{method} has #{arity} arguments (maximum method arity: #{@limit})"
        end
      end

      def name
        "Maximum method arity (#@limit)"
      end

      private

      on :class do |name, parents, body|
        env.push module: qualified_class_name(name)
        visit body

        env.pop
      end

      on :module do |name, body|
        env.push module: qualified_class_name(name)
        visit body

        env.pop
      end

      on :def do |name, params, _|
        qualified_method_name = (env[:module] || '') + '#' + extract_name(name)
        env.push method: qualified_method_name

        visit params

        env.pop
      end

      on :defs do |target, separator, name, params, body|
        method_name = extract_name(name)
        class_name  = extract_name(target)
        class_name  = (env[:module] || '') if class_name == 'self'

        qualified_method_name = class_name + '.' + method_name
        env.push method: qualified_method_name

        visit params

        env.pop
      end

      on :params do |*params|
        check_max_arity(params) if params
      end

      def check_max_arity(params)
        arguments_count = extract_param_idents(params).size
        if arguments_count > @limit
          @violations << [env[:method], arguments_count]
        end
      end

      def qualified_class_name(name)
        [env[:module], extract_name(name)].compact.join('::')
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
skeptic-0.0.16 lib/skeptic/rules/max_method_arity.rb
skeptic-0.0.15 lib/skeptic/rules/max_method_arity.rb
skeptic-0.0.14 lib/skeptic/rules/max_method_arity.rb
skeptic-0.0.12 lib/skeptic/rules/max_method_arity.rb
skeptic-0.0.11 lib/skeptic/rules/max_method_arity.rb
skeptic-0.0.10 lib/skeptic/rules/max_method_arity.rb