class RuboCop::Cop::Rails::PluralizationGrammar

1.month.ago
3.days.ago
# good
1.months.ago
3.day.ago
# bad
@example
core extensions to the numeric classes.
This cop checks for correct grammar when using ActiveSupport’s

def autocorrect(node)

def autocorrect(node)
  lambda do |corrector|
    method_name = node.loc.selector.source
    replacement = if plural_method?(method_name)
                    singularize(method_name)
                  else
                    pluralize(method_name)
                  end
    corrector.replace(node.loc.selector, replacement)
  end
end

def duration_method?(method_name)

def duration_method?(method_name)
  SINGULAR_DURATION_METHODS.key?(method_name) ||
    PLURAL_DURATION_METHODS.key?(method_name)
end

def expect_plural_method?(number, method_name)

def expect_plural_method?(number, method_name)
  plural_receiver?(number) && singular_method?(method_name)
end

def expect_singular_method?(number, method_name)

def expect_singular_method?(number, method_name)
  singular_receiver?(number) && plural_method?(method_name)
end

def literal_number?(node)

def literal_number?(node)
  node && (node.int_type? || node.float_type?)
end

def on_send(node)

def on_send(node)
  receiver, method_name, *_args = *node
  return unless duration_method?(method_name)
  return unless literal_number?(receiver)
  number, = *receiver
  if expect_singular_method?(number, method_name)
    add_offense(node,
                :expression,
                format(MSG, number, singularize(method_name)))
  elsif expect_plural_method?(number, method_name)
    add_offense(node,
                :expression,
                format(MSG, number, pluralize(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_DURATION_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 == 1
end

def singularize(method_name)

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