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:

# 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.'.freeze
MSG_SEND =
'Do not use `%s` on Date objects, because they ' \
'know nothing about the time zone in use.'.freeze
BAD_DAYS =
[:today, :current, :yesterday, :tomorrow].freeze

Constants included from Util

Util::ASGN_NODES, Util::BYTE_ORDER_MARK, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, 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, #ambiguous_style_detected, #correct_style_detected, #detected_style, #detected_style=, #no_acceptable_style!, #no_acceptable_style?, #opposite_style_detected, #parameter_name, #style, #style_detected, #supported_styles, #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?, #duplicate_location?, #excluded_file?, #extra_details?, #find_location, #highlights, inherited, #initialize, #join_force?, lint?, match?, #message, #messages, non_rails, #parse, qualified_cop_name, #reference_url, #relevant_file?, #style_guide_url, #target_ruby_version

Methods included from 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?, block_length, comment_line?, directions, double_quotes_acceptable?, double_quotes_required?, effective_column, ends_its_line?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_distance, line_range, move_pos, needs_escaping?, numeric_range_size, on_node, operator?, parentheses?, parenthesized_call?, preceed?, range_between, range_with_surrounding_comma, range_with_surrounding_space, same_line?, source_range, strip_quotes, stripped_source_upto, to_string_literal, to_symbol_literal, within_node?

Methods included from PathUtil

absolute?, match_path?, relative_path

Constructor Details

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

Instance Method Details

#on_const(node) ⇒ Object



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

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



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

def on_send(node)
  receiver, method_name, *args = *node
  return unless receiver && bad_methods.include?(method_name)

  chain = extract_method_chain(node)
  return if safe_chain?(chain)

  return if method_name == :to_time && args.length == 1

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