1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
# frozen_string_literal: true
module RuboCop
module Cop
module Rails
# Checks for time comparison.
# For more information see: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/133520
#
# @example
# # bad
# datetime > Time.now
# Time.current < datetime
# datetime > Time.zone.now
#
# # good
# datetime.future?
# datetime.future?
# datetime.past?
class AvoidTimeComparison < RuboCop::Cop::Base
MSG = 'Avoid time comparison, use `.past?` or `.future?` instead.'
RESTRICT_ON_SEND = %i[< >].to_set.freeze
def_node_matcher :comparison?, <<~PATTERN
(send _ %RESTRICT_ON_SEND _)
PATTERN
def_node_matcher :time_now?, <<~PATTERN
{
(send
(const {nil? cbase} :Time) :now)
(send
(send
(const {nil? cbase} :Time) :zone) :now)
(send
(const {nil? cbase} :Time) :current)
}
PATTERN
def on_send(node)
return unless comparison?(node)
arg_check = node.arguments.find { |arg| time_now?(arg) }
receiver_check = time_now?(node.receiver)
add_offense(node) if arg_check || receiver_check
end
end
end
end
end
|