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

WITH_SAY_METHODS =
%w(say say_with_time)

Constants inherited from Core::Check

Core::Check::ALL_FILES, Core::Check::CONTROLLER_FILES, Core::Check::DEPLOY_FILES, Core::Check::HELPER_FILES, Core::Check::MAILER_FILES, Core::Check::MIGRATION_FILES, Core::Check::MODEL_FILES, Core::Check::PARTIAL_VIEW_FILES, Core::Check::ROUTE_FILES, Core::Check::SCHEMA_FILE, Core::Check::VIEW_FILES

Instance Method Summary collapse

Methods inherited from Review

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

Methods inherited from Core::Check

add_callback, #add_error, #after_prepare, #after_review, callbacks, #errors, #increment_total_files_checked!, #initialize, interesting_files, #interesting_files, #interesting_nodes, interesting_nodes, #method_missing, #node_end, #node_start, #parse_file?, #result, #total_files_checked

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

#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, then such method call should be wrapped by say or say_with_time



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb', line 32

def start_defs(node)
  node.body.statements.each do |child_node|
    next if child_node.grep_nodes_count(:sexp_type => [:fcall, :command], :message => WITH_SAY_METHODS) > 0

    subject_node = if :method_add_block == child_node.sexp_type
                     child_node[1]
                   elsif :method_add_arg == child_node.sexp_type
                     child_node[1]
                   else
                     child_node
                   end
    if :call == subject_node.sexp_type
      add_error("use say with time in migrations", node.file, child_node.line)
    end
  end
end

#urlObject



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

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