Sha256: 138df1382ca65cd44ba48ef197747798ceda803fbe1c24a9f741f7a4e02a9836

Contents?: true

Size: 1.42 KB

Versions: 1

Compression:

Stored size: 1.42 KB

Contents

module Skeptic
  module Rules
    class MethodsPerClass
      include SexpVisitor

      def initialize(limit)
        @methods = Hash.new { |hash, key| hash[key] = [] }
        @limit   = limit
      end

      def apply_to(tokens, tree)
        visit tree
        self
      end

      def methods_in(class_name)
        @methods[class_name].length
      end

      def violations
        violators = @methods.keys.select { |name| @methods[name].length > @limit }

        violators.map do |class_name|
          method_names = @methods[class_name].map { |name| "##{name}" }
          count        = method_names.length

          "#{class_name} has #{count} methods: #{method_names.join(', ')}"
        end
      end

      def name
        "Number of methods per class (#@limit)"
      end

      private

      on :def do |name, params, body|
        method_name = extract_name(name)
        class_name  = env[:class]

        @methods[class_name] << method_name

        visit params
        visit body
      end

      on :class do |name, parents, body|
        env.push :class => qualified_class_name(name)

        visit parents if parents
        visit body

        env.pop
      end

      on :module do |name, body|
        env.push :class => qualified_class_name(name)

        visit body

        env.pop
      end

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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
skeptic-0.0.0 lib/skeptic/rules/methods_per_class.rb