Class: RailsBestPractices::Reviews::UseSayWithTimeInMigrationsReview

Inherits:
Review
  • Object
show all
Defined in:
lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb

Overview

Review a migration file to make sure to use say or say_with_time for customized data changes to produce a more readable output.

See the best practice detials here rails-bestpractices.com/posts/46-use-say-and-say_with_time-in-migrations-to-make-a-useful-migration-log.

Implementation:

Review process:

check class method define nodes (self.up or self.down).
if there is a method call in the class method definition,
and the message of method call is not say, say_with_time and default migration methods (such as add_column and create_table),
then the method call should be wrapped by say or say_with_time.

Constant Summary collapse

DEFAULT_MIGRATION_METHODS =
[:add_column, :add_index, :add_timestamps, :change_column, :change_column_default, :change_table, :create_table, :drop_table, :remove_column, :remove_index, :remove_timestamps, :rename_column, :rename_index, :rename_table]
WITH_SAY_METHODS =
[:say, :say_with_time]

Constants inherited from Core::Check

Core::Check::CONTROLLER_FILES, Core::Check::HELPER_FILES, Core::Check::MAILER_FILES, Core::Check::MIGRATION_FILES, Core::Check::MODEL_FILES, Core::Check::NODE_TYPES, Core::Check::PARTIAL_VIEW_FILES, Core::Check::ROUTE_FILE, Core::Check::SCHEMA_FILE, Core::Check::VIEW_FILES

Instance Attribute Summary

Attributes inherited from Core::Check

#errors

Instance Method Summary collapse

Methods inherited from Review

#equal?, #model_associations, #model_attributes, #models, #remember_variable_use_count, #reset_variable_use_count, #variable, #variable_use_count

Methods inherited from Core::Check

#add_error, #initialize, #method_missing, #node_end, #node_start

Constructor Details

This class inherits a constructor from RailsBestPractices::Core::Check

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class RailsBestPractices::Core::Check

Instance Method Details

#interesting_filesObject



30
31
32
# File 'lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb', line 30

def interesting_files
  MIGRATION_FILES
end

#interesting_nodesObject



26
27
28
# File 'lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb', line 26

def interesting_nodes
  [:defs]
end

#start_defs(node) ⇒ Object

check a class method define node to see if there are method calls that need to be wrapped by :say or :say_with_time.

it will check the first block node, if any method call whose message is not default migration methods in the block node, like

s(:defs, s(:self), :up, s(:args),
  s(:scope,
    s(:block,
      s(:iter,
        s(:call, s(:const, :User), :find_each, s(:arglist)),
        s(:lasgn, :user),
        s(:block,
          s(:masgn,
            s(:array,
              s(:attrasgn, s(:lvar, :user), :first_name=, s(:arglist)),
              s(:attrasgn, s(:lvar, :user), :last_name=, s(:arglist))
            ),
            s(:to_ary,
              s(:call,
                s(:call, s(:lvar, :user), :full_name, s(:arglist)),
                :split,
                s(:arglist, s(:str, " "))
              )
            )
          ),
          s(:call, s(:lvar, :user), :save, s(:arglist))
        )
      )
    )
  )
)

then such method call should be wrapped by say or say_with_time



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb', line 67

def start_defs(node)
  block_node = node.grep_node(:node_type => :block)
  block_node.children.each do |child_node|
    next if :iter != child_node.node_type || child_node.grep_nodes_count(:node_type => :call, :message => WITH_SAY_METHODS) > 0

    subject_node = child_node.subject
    if :call == subject_node.node_type && !DEFAULT_MIGRATION_METHODS.include?(subject_node.message)
      add_error("use say with time in migrations", subject_node.file, subject_node.line)
    end
  end
end

#urlObject



22
23
24
# File 'lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb', line 22

def url
  "http://rails-bestpractices.com/posts/46-use-say-and-say_with_time-in-migrations-to-make-a-useful-migration-log"
end