Module: Lotus::Utils::Inflector

Includes:
ClassAttribute
Defined in:
lib/lotus/utils/inflector.rb

Overview

String inflector

Since:

  • 0.4.1

Defined Under Namespace

Classes: IrregularRules

Constant Summary collapse

BLANK_STRING_MATCHER =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Matcher for blank strings

Since:

  • 0.4.1

/\A[[:space:]]*\z/.freeze
A =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'a'.freeze
CH =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ch'.freeze
CHES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ches'.freeze
EAUX =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'eaux'.freeze
ES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.6.0

'es'.freeze
F =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'f'.freeze
I =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'i'.freeze
ICE =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ice'.freeze
ICES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ices'.freeze
IDES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ides'.freeze
IES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ies'.freeze
IFE =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ife'.freeze
INA =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ina'.freeze
IS =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'is'.freeze
IVES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ives'.freeze
MA =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ma'.freeze
MATA =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'mata'.freeze
MEN =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'men'.freeze
MINA =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'mina'.freeze
NA =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.6.0

'na'.freeze
NON =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.6.0

'non'.freeze
O =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'o'.freeze
OES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'oes'.freeze
OUSE =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ouse'.freeze
S =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

's'.freeze
SES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ses'.freeze
SSES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'sses'.freeze
TA =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.6.0

'ta'.freeze
UM =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'um'.freeze
US =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'us'.freeze
USES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'uses'.freeze
VES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'ves'.freeze
X =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'x'.freeze
XES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'xes'.freeze
Y =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Since:

  • 0.4.1

'y'.freeze

Class Method Summary collapse

Methods included from ClassAttribute

included

Class Method Details

.exception(singular, plural) ⇒ Object

Add a custom inflection exception

Examples:

require 'lotus/utils/inflector'

Lotus::Utils::Inflector.inflections do
  exception 'alga', 'algae'
end

Parameters:

See Also:

Since:

  • 0.6.0



304
305
306
307
# File 'lib/lotus/utils/inflector.rb', line 304

def self.exception(singular, plural)
  singulars.add(plural, singular)
  plurals.add(singular, plural)
end

.inflections(&blk) ⇒ Object

Block for custom inflection rules.

Examples:

require 'lotus/utils/inflector'

Lotus::Utils::Inflector.inflections do
  exception   'analysis', 'analyses'
  exception   'alga',     'algae'
  uncountable 'music', 'butter'
end

Parameters:

  • blk (Proc)

    custom inflections

See Also:

Since:

  • 0.6.0



284
285
286
# File 'lib/lotus/utils/inflector.rb', line 284

def self.inflections(&blk)
  class_eval(&blk)
end

.pluralize(string) ⇒ String, NilClass

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Pluralize the given string

Parameters:

  • string (String)

    a string to pluralize

Returns:

  • (String, NilClass)

    the pluralized string, if present

Since:

  • 0.4.1



338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
# File 'lib/lotus/utils/inflector.rb', line 338

def self.pluralize(string)
  return string if string.nil? || string.match(BLANK_STRING_MATCHER)

  case string
  when plurals
    plurals.apply(string)
  when /\A((.*)[^aeiou])ch\z/
    $1 + CHES
  when /\A((.*)[^aeiou])y\z/
    $1 + IES
  when /\A(.*)(ex|ix)\z/
    $1 + ICES
  when /\A(.*)(eau|#{ EAUX })\z/
    $1 + EAUX
  when /\A(.*)x\z/
    $1 + XES
  when /\A(.*)ma\z/
    string + TA
  when /\A(.*)(um|#{ A })\z/
    $1 + A
  when /\A(.*)(ouse|#{ ICE })\z/
    $1 + ICE
  when /\A(buffal|domin|ech|embarg|her|mosquit|potat|tomat)#{ O }\z/i
    $1 + OES
  when /\A(.*)(en|#{ INA })\z/
    $1 + INA
  when /\A(.*)(?:([^f]))f[e]*\z/
    $1 + $2 + VES
  when /\A(.*)us\z/
    $1 + USES
  when /\A(.*)non\z/
    $1 + NA
  when /\A((.*)[^aeiou])is\z/
    $1 + ES
  when /\A(.*)ss\z/
    $1 + SSES
  when /s\z/
    string
  else
    string + S
  end
end

.singularize(string) ⇒ String, NilClass

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Singularize the given string

Parameters:

  • string (String)

    a string to singularize

Returns:

  • (String, NilClass)

    the singularized string, if present

Since:

  • 0.4.1



389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
# File 'lib/lotus/utils/inflector.rb', line 389

def self.singularize(string)
  return string if string.nil? || string.match(BLANK_STRING_MATCHER)

  case string
  when singulars
    singulars.apply(string)
  when /\A.*[^aeiou]#{CHES}\z/
    string.sub(CHES, CH)
  when /\A.*[^aeiou]#{IES}\z/
    string.sub(IES, Y)
  when /\A(.*)#{ICE}\z/
    $1 + OUSE
  when /\A.*#{EAUX}\z/
    string.chop
  when /\A(.*)#{IDES}\z/
    $1 + IS
  when /\A(.*)#{US}\z/
    $1 + I
  when /\A(.*)#{SES}\z/
    $1 + S
  when /\A(.*)#{OUSE}\z/
    $1 + ICE
  when /\A(.*)#{MATA}\z/
    $1 + MA
  when /\A(.*)#{OES}\z/
    $1 + O
  when /\A(.*)#{MINA}\z/
    $1 + MEN
  when /\A(.*)#{XES}\z/
    $1 + X
  when /\A(.*)#{IVES}\z/
    $1 + IFE
  when /\A(.*)#{VES}\z/
    $1 + F
  when /\A(.*)#{I}\z/
    $1 + US
  when /\A(.*)ae\z/
    $1 + A
  when /\A(.*)na\z/
    $1 + NON
  when /\A(.*)#{A}\z/
    $1 + UM
  when /[^s]\z/
    string
  else
    string.chop
  end
end

.uncountable(*words) ⇒ Object

Add an uncountable word

Examples:

require 'lotus/utils/inflector'

Lotus::Utils::Inflector.inflections do
  uncountable 'music', 'art'
end

Parameters:

See Also:

Since:

  • 0.6.0



324
325
326
327
328
# File 'lib/lotus/utils/inflector.rb', line 324

def self.uncountable(*words)
  Array(words).each do |word|
    exception(word, word)
  end
end