class RubbyCop::Cop::Rails::PluralizationGrammar

This cop checks for correct grammar when using ActiveSupport's core extensions to the numeric classes.

@example

# bad
3.day.ago
1.months.ago

# good
3.days.ago
1.month.ago

Constants

MSG
PLURAL_DURATION_METHODS
SINGULAR_DURATION_METHODS

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 31
def on_send(node)
  return unless duration_method?(node.method_name)
  return unless literal_number?(node.receiver)

  return unless offense?(node)

  add_offense(node, :expression)
end

Private Instance Methods

autocorrect(node) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 48
def autocorrect(node)
  lambda do |corrector|
    method_name = node.loc.selector.source

    corrector.replace(node.loc.selector, correct_method(method_name))
  end
end
correct_method(method_name) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 56
def correct_method(method_name)
  if plural_method?(method_name)
    singularize(method_name)
  else
    pluralize(method_name)
  end
end
duration_method?(method_name) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 99
def duration_method?(method_name)
  SINGULAR_DURATION_METHODS.key?(method_name) ||
    PLURAL_DURATION_METHODS.key?(method_name)
end
literal_number?(node) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 87
def literal_number?(node)
  node && (node.int_type? || node.float_type?)
end
message(node) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 42
def message(node)
  number, = *node.receiver

  format(MSG, number, correct_method(node.method_name.to_s))
end
offense?(node) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 64
def offense?(node)
  number, = *node.receiver

  singular_receiver?(number) && plural_method?(node.method_name) ||
    plural_receiver?(number) && singular_method?(node.method_name)
end
plural_method?(method_name) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 71
def plural_method?(method_name)
  method_name.to_s.end_with?('s')
end
plural_receiver?(number) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 83
def plural_receiver?(number)
  !singular_receiver?(number)
end
pluralize(method_name) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 91
def pluralize(method_name)
  SINGULAR_DURATION_METHODS.fetch(method_name.to_sym).to_s
end
singular_method?(method_name) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 75
def singular_method?(method_name)
  !plural_method?(method_name)
end
singular_receiver?(number) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 79
def singular_receiver?(number)
  number == 1
end
singularize(method_name) click to toggle source
# File lib/rubbycop/cop/rails/pluralization_grammar.rb, line 95
def singularize(method_name)
  PLURAL_DURATION_METHODS.fetch(method_name.to_sym).to_s
end