Sha256: e6e7603213e0e66e553bc46a636b6d397ca52f4e8aa27ace927ccc8235b28da5

Contents?: true

Size: 1.43 KB

Versions: 7

Compression:

Stored size: 1.43 KB

Contents

require 'rails_best_practices/checks/check'

module RailsBestPractices
  module Checks
    # Check to make sure not avoid the law of demeter.
    # 
    # Implementation: 
    # 1. check all models to record belongs_to and has_one associations
    # 2. check if calling belongs_to and has_one association's method or attribute
    class LawOfDemeterCheck < Check
      
      def interesting_nodes
        [:call, :class]
      end

      def initialize
        super
        @associations = {}
      end

      def evaluate_start(node)
        if node.node_type == :class
          remember_association(node)
        elsif [:lvar, :ivar].include?(node.subject.node_type) and node.subject != s(:lvar, :_erbout)
          add_error "law of demeter" if need_delegate?(node)
        end
      end

      private

      # remember belongs_to or has_one node
      def remember_association(node)
        (node.body.grep_nodes(:message => :belongs_to) + node.body.grep_nodes(:message => :has_one)).collect do |body_node|
          class_name = node.subject.to_s.underscore
          @associations[class_name] ||= []
          @associations[class_name] << body_node.arguments[1].to_ruby_string
        end
      end

      def need_delegate?(node)
        @associations.each do |class_name, associations|
          return true if node.subject.to_ruby =~ /#{class_name}$/ and associations.include? node.message.to_s
        end
        false
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
rails_best_practices-0.4.2 lib/rails_best_practices/checks/law_of_demeter_check.rb
rails_best_practices-0.4.1 lib/rails_best_practices/checks/law_of_demeter_check.rb
rails_best_practices-0.4.0 lib/rails_best_practices/checks/law_of_demeter_check.rb
rails_best_practices-0.3.27 lib/rails_best_practices/checks/law_of_demeter_check.rb
rails_best_practices-0.3.26 lib/rails_best_practices/checks/law_of_demeter_check.rb
rails_best_practices-0.3.25 lib/rails_best_practices/checks/law_of_demeter_check.rb
rails_best_practices-0.3.24 lib/rails_best_practices/checks/law_of_demeter_check.rb