Module: Hanami::Utils::Inflector

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

Overview

String inflector

Since:

  • 0.4.1

Defined Under Namespace

Classes: IrregularRules

Constant Summary collapse

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
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
RSE =

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

'rse'.freeze
RSES =

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

'rses'.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

.add_to_inflecto(singular, plural) ⇒ Object

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.

Since ROM uses Inflecto for it inferences, we need to add an exception to it

when one is registered against our Inflector.

Since:

  • 0.4.1



342
343
344
345
346
# File 'lib/hanami/utils/inflector.rb', line 342

def self.add_to_inflecto(singular, plural)
  return unless defined? Inflecto

  Inflecto.inflections.irregular(singular, plural)
end

.exception(singular, plural) ⇒ Object

Add a custom inflection exception

Examples:

require 'hanami/utils/inflector'

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

Parameters:

See Also:

Since:

  • 0.6.0



333
334
335
336
337
# File 'lib/hanami/utils/inflector.rb', line 333

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

.inflections(&blk) ⇒ Object

Block for custom inflection rules.

Examples:

require 'hanami/utils/inflector'

Hanami::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



313
314
315
# File 'lib/hanami/utils/inflector.rb', line 313

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

rubocop:disable Metrics/AbcSize rubocop:disable Metrics/CyclomaticComplexity rubocop:disable Metrics/MethodLength rubocop:disable Style/PerlBackrefs

Parameters:

  • string (String)

    a string to pluralize

Returns:

  • (String, NilClass)

    the pluralized string, if present

Since:

  • 0.4.1



382
383
384
385
386
387
388
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
# File 'lib/hanami/utils/inflector.rb', line 382

def self.pluralize(string)
  return string if string.nil? || string =~ Utils::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(buffal|domin|ech|embarg|her|mosquit|potat|tomat)#{O}\z/i
    $1 + OES
  when /\A(.*)(fee)\z/
    $1 + $2 + S
  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

rubocop:disable Metrics/AbcSize rubocop:disable Metrics/CyclomaticComplexity rubocop:disable Metrics/MethodLength rubocop:disable Metrics/PerceivedComplexity rubocop:disable Style/PerlBackrefs

Parameters:

  • string (String)

    a string to singularize

Returns:

  • (String, NilClass)

    the singularized string, if present

Since:

  • 0.4.1



441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
# File 'lib/hanami/utils/inflector.rb', line 441

def self.singularize(string)
  return string if string.nil? || string =~ Utils::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.*#{EAUX}\z/
    string.chop
  when /\A(.*)#{IDES}\z/
    $1 + IS
  when /\A(.*)#{US}\z/
    $1 + I
  when /\A(.*)#{RSES}\z/
    $1 + RSE
  when /\A(.*)#{SES}\z/
    $1 + S
  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 'hanami/utils/inflector'

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

Parameters:

See Also:

Since:

  • 0.6.0



363
364
365
366
367
# File 'lib/hanami/utils/inflector.rb', line 363

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