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 Time class over the DateTime 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

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, #project_index

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, #always_autocorrect?, autocorrect_incompatible_with, badge, #begin_investigation, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #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, #parser_engine, #ready, #relevant_file?, requires_gem, #string_literals_frozen_by_default?, support_autocorrect?, support_multiple_source?, #target_gem_version, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

cop_dir_for, #exclude_limit, read_limits

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
  (call (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
  (call _ _ _ (const (const {nil? (cbase)} :Date) _))
PATTERN

#on_send(node) ⇒ Object Also known as: on_csend



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
  (call !nil? :to_datetime)
PATTERN