module Gorillib::Inflector

String inflections define new methods on the String class to transform names for different purposes.

"ScaleScore".underscore # => "scale_score"

This doesn’t define the full set of inflections – only

String inflections define new methods on the String class to transform names for different purposes.

"ScaleScore".underscore # => "scale_score"

This doesn’t define the full set of inflections – only

Public Class Methods

pluralizations() click to toggle source
# File lib/gorillib/string/simple_inflector.rb, line 17
def self.pluralizations
  @pluralizations ||= {}
end

Public Instance Methods

camelize(str, first_letter = :upper) click to toggle source

By default, camelize converts strings to UpperCamelCase. If the argument to camelize is set to :lower then camelize produces lowerCamelCase.

camelize will also convert ‘/’ to ‘::’ which is useful for converting paths to namespaces.

@example:

"active_record".camelize                # => "ActiveRecord"
"active_record".camelize(:lower)        # => "activeRecord"
"active_record/errors".camelize         # => "ActiveRecord::Errors"
"active_record/errors".camelize(:lower) # => "activeRecord::Errors"

As a rule of thumb you can think of camelize as the inverse of underscore, though there are cases where that does not hold:

"SSLError".underscore.camelize # => "SslError"
# File lib/gorillib/string/inflector.rb, line 33
def camelize(str, first_letter = :upper)
  camelized = str.gsub(/\/(.?)/){ "::#{ $1.upcase }" }.gsub(/(?:^|_)(.)/){ $1.upcase }
  (first_letter == :lower) ? (str[0..0].downcase + camelized[1..-1]) : camelized
end
classify(table_name) click to toggle source

Create a class name from a plural table name like Rails does for table names to models. Note that this returns a string and not a Class. (To convert to an actual class follow classify with constantize.)

Examples:

"egg_and_hams".classify # => "EggAndHam"
"posts".classify        # => "Post"

Singular names are not handled correctly:

"business".classify     # => "Busines"
# File lib/gorillib/string/simple_inflector.rb, line 86
def classify(table_name)
  # strip out any leading schema name
  camelize(singularize(table_name.to_s.sub(/.*\./, '')))
end
constantize(str) click to toggle source

Constantize tries to find a declared constant with the name specified in the string. It raises a NameError when the name is not in CamelCase or is not initialized.

@example

"Module".constantize #=> Module
"Class".constantize #=> Class

This is the extlib version of String#constantize, which has different behavior wrt using lexical context: see active_support/inflector/methods.rb

# File lib/gorillib/string/inflector.rb, line 115
def constantize(str)
  unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ str
    raise NameError, "#{str.inspect} is not a valid constant name!"
  end

  Object.module_eval("::#{$1}", __FILE__, __LINE__)
end
dasherize(underscored_word) click to toggle source

Replaces underscores with dashes in the string.

Example:

"puni_puni" # => "puni-puni"
# File lib/gorillib/string/inflector.rb, line 76
def dasherize(underscored_word)
  underscored_word.gsub(/_/, '-')
end
deconstantize(path) click to toggle source

Removes the rightmost segment from the constant expression in the string:

"Net::HTTP".deconstantize   # => "Net"
"::Net::HTTP".deconstantize # => "::Net"
"String".deconstantize      # => ""
"::String".deconstantize    # => ""
"".deconstantize            # => ""

See also demodulize.

# File lib/gorillib/string/inflector.rb, line 100
def deconstantize(path)
  path.to_s[0...(path.rindex('::') || 0)] # implementation based on the one in facets' Module#spacename
end
demodulize(str) click to toggle source

Removes the module part from the expression in the string:

@example

"Gorillib::Inflections".demodulize #=> "Inflections"
"Inflections".demodulize                   #=> "Inflections"

See also deconstantize.

# File lib/gorillib/string/inflector.rb, line 87
def demodulize(str)
  str.gsub(/^.*::/, '')
end
humanize(lower_case_and_underscored_word) click to toggle source

Capitalizes the first word and turns underscores into spaces and strips a trailing “_id”, if any. Like titleize, this is meant for creating pretty output.

Examples:

"employee_salary" # => "Employee salary"
"author_id"       # => "Author"
# File lib/gorillib/string/simple_inflector.rb, line 44
def humanize(lower_case_and_underscored_word)
  result = lower_case_and_underscored_word.to_s.dup
  result.gsub!(/_id$/, "")
  result.gsub(/(_)?([a-z\d]*)/i){ "#{ $1 && ' ' }#{ $2.downcase}" }.gsub(/^\w/){ $&.upcase }
end
ordinalize(number) click to toggle source

Turns a number into an ordinal string used to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th.

Examples:

ordinalize(1)     # => "1st"
ordinalize(2)     # => "2nd"
ordinalize(1002)  # => "1002nd"
ordinalize(1003)  # => "1003rd"
ordinalize(-11)   # => "-11th"
ordinalize(-1021) # => "-1021st"
# File lib/gorillib/string/inflector.rb, line 170
def ordinalize(number)
  if (11..13).include?(number.to_i.abs % 100)
    "#{number}th"
  else
    case number.to_i.abs % 10
    when 1; "#{number}st"
    when 2; "#{number}nd"
    when 3; "#{number}rd"
    else    "#{number}th"
    end
  end
end
pluralize(str) click to toggle source
# File lib/gorillib/string/simple_inflector.rb, line 21
def pluralize(str)
  Gorillib::Inflector.pluralizations.fetch(str){ "#{str}s" }
end
safe_constantize(camel_cased_word) click to toggle source

Tries to find a declared constant with the name specified in the string, or return nil.

@example

"Module".safe_constantize  # => Module
"Class".safe_constantize   # => Class

The ‘name` is assumed to be the one of a top-level constant, no matter whether it starts with “::” or not. No lexical context is taken into account:

@example finds the top-level constant ‘::C`, not `::M::C`

C = 'outside'
module M
  C = 'inside'
  C                    # => 'inside'
  "C".safe_constantize # => 'outside', same as ::C
end

@example nil is returned when the name is not in CamelCase or the constant (or part of it) is unknown.

"blargle".safe_constantize  # => nil
"UnknownModule".safe_constantize  # => nil
"UnknownModule::Foo::Bar".safe_constantize  # => nil

@see String.safe_constantize @return [Module,Class] the specified constant,

or nil when the name is not in CamelCase or is not initialized.
# File lib/gorillib/string/inflector.rb, line 149
def safe_constantize(camel_cased_word)
  begin
    constantize(camel_cased_word)
  rescue NameError => e
    raise unless e.message =~ /uninitialized constant #{const_regexp(camel_cased_word)}$/ ||
      e.name.to_s == camel_cased_word.to_s
  rescue ArgumentError => e
    raise unless e.message =~ /not missing constant #{const_regexp(camel_cased_word)}\!$/
  end
end
singularize(str) click to toggle source

The reverse of pluralize, returns the singular form of a word in a string.

Examples:

"posts".singularize            # => "post"
# it's not very smart
"octopi".singularize           # => "octopi"
"bonus".singularize            # => "bonu"
"boxes".singularize            # => "boxe"
"CamelOctopi".singularize      # => "CamelOctopi"
# File lib/gorillib/string/simple_inflector.rb, line 34
def singularize(str)
  Gorillib::Inflector.pluralizations.invert.fetch(str){ str.gsub(/s$/, '') }
end
snakeize(str) click to toggle source

Converts strings to snakeCase, also known as lowerCamelCase.

snakeize will also convert ‘/’ to ‘::’ which is useful for converting paths to namespaces.

@example:

"active_record".snakeize                # => "activeRecord"
"active_record/errors".snakeize         # => "activeRecord::Errors"
# File lib/gorillib/string/inflector.rb, line 46
def snakeize(str)
  camelize(str, :lower)
end
tableize(class_name) click to toggle source

Create the name of a table like Rails does for models to table names. This method uses the pluralize method on the last word in the string.

Examples

"RawScaledScorer".tableize # => "raw_scaled_scorers"
"egg_and_ham".tableize     # => "egg_and_hams"
"fancyCategory".tableize   # => "fancy_categories"
# File lib/gorillib/string/simple_inflector.rb, line 72
def tableize(class_name)
  pluralize(underscore(class_name))
end
titleize(word) click to toggle source

Capitalizes all the words and replaces some characters in the string to create a nicer looking title. titleize is meant for creating pretty output. It is not used in the Rails internals.

titleize is also aliased as as titlecase.

Examples:

"man from the boondocks".titleize   # => "Man From The Boondocks"
"x-men: the last stand".titleize    # => "X Men: The Last Stand"
"TheManWithoutAPast".titleize       # => "The Man Without A Past"
"raiders_of_the_lost_ark".titleize  # => "Raiders Of The Lost Ark"
# File lib/gorillib/string/simple_inflector.rb, line 61
def titleize(word)
  humanize(underscore(word)).gsub(/\b('?[a-z])/){ $1.capitalize }
end
underscore(str) click to toggle source

Makes an underscored, lowercase form from the expression in the string.

underscore will also change ‘::’ to ‘/’ to convert namespaces to paths.

Examples:

"ActiveRecord".underscore         # => "active_record"
"ActiveRecord::Errors".underscore # => active_record/errors

As a rule of thumb you can think of underscore as the inverse of camelize, though there are cases where that does not hold:

"SSLError".underscore.camelize # => "SslError"
# File lib/gorillib/string/inflector.rb, line 62
def underscore(str)
  word = str.dup
  word.gsub!(/::/, '/')
  word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
  word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
  word.tr!("-", "_")
  word.downcase!
  word
end