Class: RuboCop::Cop::Style::DateTime

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/style/date_time.rb

Overview

Checks for consistent usage of the DateTime class over the Time class. This cop is disabled by default since these classes, although highly overlapping, have particularities that make them not replaceable in certain situations when dealing with multiple timezones and/or DST.

Examples:


# bad - uses `DateTime` for current time
DateTime.now

# good - uses `Time` for current time
Time.now

# bad - uses `DateTime` for modern date
DateTime.iso8601('2016-06-29')

# good - uses `Time` for modern date
Time.iso8601('2016-06-29')

# good - uses `DateTime` with start argument for historical date
DateTime.iso8601('1751-04-23', Date::ENGLAND)

AllowCoercion: false (default)


# bad - coerces to `DateTime`
something.to_datetime

# good - coerces to `Time`
something.to_time

AllowCoercion: true


# good
something.to_datetime

# good
something.to_time

Cop Safety Information:

  • Autocorrection is not safe, because DateTime and Time do not have exactly the same behavior, although in most cases the autocorrection will be fine.

Constant Summary collapse

CLASS_MSG =
'Prefer Time over DateTime.'
COERCION_MSG =
'Do not use #to_datetime.'

Constants inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, autocorrect_incompatible_with, badge, #begin_investigation, callbacks_needed, #callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, #inspect, joining_forces, lint?, match?, #message, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #ready, #relevant_file?, support_autocorrect?, support_multiple_source?, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

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

Instance Method Details

#date_time?(node) ⇒ Object



56
57
58
# File 'lib/rubocop/cop/style/date_time.rb', line 56

def_node_matcher :date_time?, <<~PATTERN
  (send (const {nil? (cbase)} :DateTime) ...)
PATTERN

#historic_date?(node) ⇒ Object



61
62
63
# File 'lib/rubocop/cop/style/date_time.rb', line 61

def_node_matcher :historic_date?, <<~PATTERN
  (send _ _ _ (const (const {nil? (cbase)} :Date) _))
PATTERN

#on_send(node) ⇒ Object



70
71
72
73
74
75
76
77
# File 'lib/rubocop/cop/style/date_time.rb', line 70

def on_send(node)
  return unless date_time?(node) || (to_datetime?(node) && disallow_coercion?)
  return if historic_date?(node)

  message = to_datetime?(node) ? COERCION_MSG : CLASS_MSG

  add_offense(node, message: message) { |corrector| autocorrect(corrector, node) }
end

#to_datetime?(node) ⇒ Object



66
67
68
# File 'lib/rubocop/cop/style/date_time.rb', line 66

def_node_matcher :to_datetime?, <<~PATTERN
  (send _ :to_datetime)
PATTERN