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 either.

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:

EnforcedStyle: strict

# bad
Date.current
Date.yesterday
Date.today
date.to_time
date.to_time_in_current_zone

# good
Time.zone.today
Time.zone.today - 1.day

EnforcedStyle: flexible (default)

# bad
Date.today
date.to_time

# good
Time.zone.today
Time.zone.today - 1.day
Date.current
Date.yesterday
date.to_time_in_current_zone

Constant Summary collapse

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

Constants included from Util

Util::ASGN_NODES, Util::CONDITIONAL_NODES, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::LOGICAL_OPERATOR_NODES, Util::MODIFIER_NODES, Util::OPERATOR_METHODS, 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, #alternative_styles, #ambiguous_style_detected, #correct_style_detected, #detected_style, #detected_style=, #no_acceptable_style!, #no_acceptable_style?, #opposite_style_detected, #style, #style_detected, #style_parameter_name, #supported_styles, #unexpected_style_detected

Methods inherited from Cop

#add_offense, all, autocorrect_incompatible_with, badge, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, #correct, department, #duplicate_location?, #excluded_file?, #find_location, #highlights, inherited, #initialize, #join_force?, lint?, match?, #message, #messages, non_rails, #parse, qualified_cop_name, #relevant_file?, #target_rails_version, #target_ruby_version

Methods included from AST::Sexp

#s

Methods included from NodePattern::Macros

#def_node_matcher, #def_node_search, #node_search, #node_search_all, #node_search_body, #node_search_first

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?, comment_line?, double_quotes_required?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, needs_escaping?, on_node, operator?, parentheses?, same_line?, to_string_literal, to_supported_styles, tokens

Methods included from PathUtil

absolute?, match_path?, pwd, relative_path, reset_pwd, smart_path

Constructor Details

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

Instance Method Details

#on_const(node) ⇒ Object



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

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



66
67
68
69
70
71
72
73
# File 'lib/rubocop/cop/rails/date.rb', line 66

def on_send(node)
  return unless node.receiver && bad_methods.include?(node.method_name)

  return if safe_chain?(node) || safe_to_time?(node)

  add_offense(node, location: :selector,
                    message: format(MSG_SEND, method: node.method_name))
end