Class: RuboCop::Cop::Rails::RelativeDateConstant

Inherits:
RuboCop::Cop
  • Object
show all
Includes:
RangeHelp
Defined in:
lib/rubocop/cop/rails/relative_date_constant.rb

Overview

This cop checks whether constant value isn’t relative date. Because the relative date will be evaluated only once.

Examples:

# bad
class SomeClass
  EXPIRED_AT = 1.week.since
end

# good
class SomeClass
  EXPIRES = 1.week

  def self.expired_at
    EXPIRES.since
  end
end

# good
class SomeClass
  def self.expired_at
    1.week.since
  end
end

Constant Summary collapse

MSG =
'Do not assign %<method_name>s to constants as it ' \
'will be evaluated only once.'

Instance Method Summary collapse

Instance Method Details

#autocorrect(node) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/rubocop/cop/rails/relative_date_constant.rb', line 65

def autocorrect(node)
  return unless node.casgn_type?

  scope, const_name, value = *node
  return unless scope.nil?

  indent = ' ' * node.loc.column
  new_code = ["def self.#{const_name.downcase}",
              "#{indent}#{value.source}",
              'end'].join("\n#{indent}")
  ->(corrector) { corrector.replace(node.source_range, new_code) }
end

#on_casgn(node) ⇒ Object



36
37
38
39
40
# File 'lib/rubocop/cop/rails/relative_date_constant.rb', line 36

def on_casgn(node)
  relative_date_assignment?(node) do |method_name|
    add_offense(node, message: format(MSG, method_name: method_name))
  end
end

#on_masgn(node) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/rubocop/cop/rails/relative_date_constant.rb', line 42

def on_masgn(node)
  lhs, rhs = *node

  return unless rhs&.array_type?

  lhs.children.zip(rhs.children).each do |(name, value)|
    next unless name.casgn_type?

    relative_date?(value) do |method_name|
      add_offense(node,
                  location: range_between(name.loc.expression.begin_pos,
                                          value.loc.expression.end_pos),
                  message: format(MSG, method_name: method_name))
    end
  end
end

#on_or_asgn(node) ⇒ Object



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

def on_or_asgn(node)
  relative_date_or_assignment?(node) do |method_name|
    add_offense(node, message: format(MSG, method_name: method_name))
  end
end