class RuboCop::Cop::Rails::PluralizationGrammar

1.gigabyte
5.megabytes
1.month.ago
3.days.ago
# good
1.gigabytes
5.megabyte
1.months.ago
3.day.ago
# bad
@example
core extensions to the numeric classes.
Checks for correct grammar when using ActiveSupport’s

def correct_method(method_name)

def correct_method(method_name)
  if plural_method?(method_name)
    singularize(method_name)
  else
    pluralize(method_name)
  end
end

def duration_method?(method_name)

def duration_method?(method_name)
  SINGULAR_METHODS.key?(method_name) || PLURAL_METHODS.key?(method_name)
end

def literal_number?(node)

def literal_number?(node)
  node&.type?(:int, :float)
end

def message(number, method_name)

def message(number, method_name)
  format(MSG, number: number, correct: correct_method(method_name))
end

def offense?(node)

def offense?(node)
  number, = *node.receiver
  (singular_receiver?(number) && plural_method?(node.method_name)) ||
    (plural_receiver?(number) && singular_method?(node.method_name))
end

def on_send(node)

def on_send(node)
  return unless duration_method?(node.method_name) && literal_number?(node.receiver) && offense?(node)
  number, = *node.receiver
  add_offense(node, message: message(number, node.method_name)) do |corrector|
    method_name = node.loc.selector.source
    corrector.replace(node.loc.selector, correct_method(method_name))
  end
end

def plural_method?(method_name)

def plural_method?(method_name)
  method_name.to_s.end_with?('s')
end

def plural_receiver?(number)

def plural_receiver?(number)
  !singular_receiver?(number)
end

def pluralize(method_name)

def pluralize(method_name)
  SINGULAR_METHODS.fetch(method_name.to_sym).to_s
end

def singular_method?(method_name)

def singular_method?(method_name)
  !plural_method?(method_name)
end

def singular_receiver?(number)

def singular_receiver?(number)
  number.abs == 1
end

def singularize(method_name)

def singularize(method_name)
  PLURAL_METHODS.fetch(method_name.to_sym).to_s
end