Class: RuboCop::Cop::Rails::Date

Inherits:
Cop
  • Object
show all
Includes:
ConfigurableEnforcedStyle
Defined in:
lib/rubocop/cop/rails/date.rb

Overview

This cop checks for the correct use of Date methods, such as Date.today, Date.current etc.

Using Date.today is dangerous, because it doesn't know anything about Rails time zone. You must use Time.zone.today instead.

The cop also reports warnings when you are using 'to_time' method, because it doesn't know about Rails time zone too.

Two styles are supported for this cop. When EnforcedStyle is 'strict' then the Date methods (today, current, yesterday, tomorrow) are prohibited and the usage of both 'to_time' and 'to_time_in_current_zone' is reported as warning.

When EnforcedStyle is 'flexible' then only 'Date.today' is prohibited and only 'to_time' is reported as warning.

Examples:

# no offense
Time.zone.today
Time.zone.today - 1.day

# acceptable
Date.current
Date.yesterday

# always reports offense
Date.today
date.to_time

# reports offense only when style is 'strict'
date.to_time_in_current_zone

Constant Summary collapse

MSG =
'Do not use `%s` without zone. Use `%s` instead.'
MSG_SEND =
'Do not use `%s` on Date objects, ' \
'because they know nothing about the time zone in use.'
BAD_DAYS =
[:today, :current, :yesterday, :tomorrow]

Constants included from Util

Util::ASGN_NODES, Util::BASIC_LITERALS, Util::EQUALS_ASGN_NODES, Util::LITERALS, Util::OPERATOR_METHODS, Util::PROC_NEW_NODE, Util::SHORTHAND_ASGN_NODES

Instance Attribute Summary

Attributes inherited from Cop

#config, #corrections, #offenses, #processed_source

Instance Method Summary collapse

Methods included from ConfigurableEnforcedStyle

#alternative_style, #ambiguous_style_detected, #correct_style_detected, #detected_style, #detected_style=, #no_acceptable_style!, #no_acceptable_style?, #opposite_style_detected, #parameter_name, #style, #style_detected, #unexpected_style_detected

Methods inherited from Cop

#add_offense, all, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, cop_type, #correct, #debug?, #details, #display_cop_names?, #display_style_guide?, #excluded_file?, #extra_details?, inherited, #initialize, #join_force?, lint?, match?, #message, non_rails, qualified_cop_name, rails?, #reference_url, #relevant_file?, #style_guide_url

Methods included from NodePattern::Macros

#def_node_matcher, #def_node_search

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #support_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

begins_its_line?, block_length, command?, comment_line?, const_name, directions, first_part_of_call_chain, lambda?, lambda_or_proc?, line_range, move_pos, numeric_range_size, on_node, operator?, parentheses?, proc?, range_with_surrounding_comma, range_with_surrounding_space, source_range, strip_quotes, within_node?

Methods included from PathUtil

hidden?, issue_deprecation_warning, match_path?, relative_path

Constructor Details

This class inherits a constructor from RuboCop::Cop::Cop

Instance Method Details

#on_const(node) ⇒ Object


48
49
50
51
52
53
54
# File 'lib/rubocop/cop/rails/date.rb', line 48

def on_const(node)
  mod, klass = *node.children
  # we should only check core Date class (`Date` or `::Date`)
  return unless (mod.nil? || mod.cbase_type?) && method_send?(node)

  check_date_node(node.parent) if klass == :Date
end

#on_send(node) ⇒ Object


56
57
58
59
60
61
62
63
64
65
66
# File 'lib/rubocop/cop/rails/date.rb', line 56

def on_send(node)
  receiver, method_name, *args = *node
  return unless receiver && bad_methods.include?(method_name)
  return if method_name == :to_time && args.length == 1

  add_offense(node, :selector,
              format(MSG_SEND,
                     method_name
                    )
             )
end