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