Module: Extlib::Inflection
- Defined in:
 - lib/extlib/inflection.rb
 
Overview
English Nouns Number Inflection.
This module provides english singular <-> plural noun inflections.
Class Attribute Summary collapse
- 
  
    
      .plural_of  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    
Returns the value of attribute plural_of.
 - 
  
    
      .singular_of  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    
Returns the value of attribute singular_of.
 
Class Method Summary collapse
- 
  
    
      .camelize(lower_case_and_underscored_word, *args)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
By default, camelize converts strings to UpperCamelCase.
 - 
  
    
      .classify(name)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Take an underscored name and make it into a camelized name.
 - .clear(type = :all) ⇒ Object
 - 
  
    
      .constantize(camel_cased_word)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Constantize tries to find a declared constant with the name specified in the string.
 - 
  
    
      .demodulize(class_name_in_module)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Removes the module part from the expression in the string.
 - 
  
    
      .foreign_key(class_name, key = "id")  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Creates a foreign key name from a class name.
 - 
  
    
      .humanize(lower_case_and_underscored_word)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Capitalizes the first word and turns underscores into spaces and strips _id.
 - 
  
    
      .plural(word)  ⇒ Object 
    
    
      (also: pluralize)
    
  
  
  
  
  
  
  
  
  
    
Convert an English word from singular to plural.
 - 
  
    
      .plural_rule(singular, plural)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Define a plurualization rule.
 - 
  
    
      .plural_word(singular, plural)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Define a pluralization exception.
 - 
  
    
      .pluralization_rules  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Read prepared pluralization rules.
 - 
  
    
      .rule(singular, plural, whole_word = false)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Define a general rule.
 - 
  
    
      .singular(word)  ⇒ Object 
    
    
      (also: singularize)
    
  
  
  
  
  
  
  
  
  
    
Convert an English word from plural to singular.
 - 
  
    
      .singular_rule(singular, plural)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Define a singularization rule.
 - 
  
    
      .singular_word(singular, plural)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Define a singularization exception.
 - 
  
    
      .singularization_rules  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Read prepared singularization rules.
 - 
  
    
      .tableize(class_name)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Create the name of a table like Rails does for models to table names.
 - 
  
    
      .underscore(camel_cased_word)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
The reverse of
camelize. - 
  
    
      .word(singular, plural = nil)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Defines a general inflection exception case.
 
Class Attribute Details
.plural_of ⇒ Object (readonly)
Returns the value of attribute plural_of.
      262 263 264  | 
    
      # File 'lib/extlib/inflection.rb', line 262 def plural_of @plural_of end  | 
  
.singular_of ⇒ Object (readonly)
Returns the value of attribute singular_of.
      262 263 264  | 
    
      # File 'lib/extlib/inflection.rb', line 262 def singular_of @singular_of end  | 
  
Class Method Details
.camelize(lower_case_and_underscored_word, *args) ⇒ Object
By default, camelize converts strings to UpperCamelCase.
camelize will also convert ‘/’ to ‘::’ which is useful for converting paths to namespaces
      32 33 34  | 
    
      # File 'lib/extlib/inflection.rb', line 32 def camelize(lower_case_and_underscored_word, *args) lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase } end  | 
  
.classify(name) ⇒ Object
Take an underscored name and make it into a camelized name
      18 19 20 21 22  | 
    
      # File 'lib/extlib/inflection.rb', line 18 def classify(name) words = name.to_s.sub(/.*\./, '').split('_') words[-1] = singularize(words[-1]) words.collect { |word| word.capitalize }.join end  | 
  
.clear(type = :all) ⇒ Object
      138 139 140 141 142 143 144 145 146 147 148 149  | 
    
      # File 'lib/extlib/inflection.rb', line 138 def clear(type = :all) if type == :singular || type == :all @singular_of = {} @singular_rules = [] @singularization_rules, @singularization_regex = nil, nil end if type == :plural || type == :all @singular_of = {} @singular_rules = [] @singularization_rules, @singularization_regex = nil, nil end end  | 
  
.constantize(camel_cased_word) ⇒ Object
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.
      98 99 100 101 102 103 104  | 
    
      # File 'lib/extlib/inflection.rb', line 98 def constantize(camel_cased_word) unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ camel_cased_word raise NameError, "#{camel_cased_word.inspect} is not a valid constant name!" end Object.module_eval("::#{$1}", __FILE__, __LINE__) end  | 
  
.demodulize(class_name_in_module) ⇒ Object
Removes the module part from the expression in the string
      64 65 66  | 
    
      # File 'lib/extlib/inflection.rb', line 64 def demodulize(class_name_in_module) class_name_in_module.to_s.gsub(/^.*::/, '') end  | 
  
.foreign_key(class_name, key = "id") ⇒ Object
Creates a foreign key name from a class name.
      87 88 89  | 
    
      # File 'lib/extlib/inflection.rb', line 87 def foreign_key(class_name, key = "id") underscore(demodulize(class_name.to_s)) << "_" << key.to_s end  | 
  
.humanize(lower_case_and_underscored_word) ⇒ Object
Capitalizes the first word and turns underscores into spaces and strips _id. Like titleize, this is meant for creating pretty output.
      55 56 57  | 
    
      # File 'lib/extlib/inflection.rb', line 55 def humanize(lower_case_and_underscored_word) lower_case_and_underscored_word.to_s.gsub(/_id$/, '').tr('_', ' ').capitalize end  | 
  
.plural(word) ⇒ Object Also known as: pluralize
Convert an English word from singular to plural.
"boy".plural     #=> boys
"tomato".plural  #=> tomatoes
Parameters
- word<String>
 - 
word to pluralize
 
Returns
- <String>
 - 
pluralized form of word
 
Notes
Aliased as pluralize (a Railism)
      305 306 307 308 309 310 311 312 313 314 315 316  | 
    
      # File 'lib/extlib/inflection.rb', line 305 def plural(word) # special exceptions return "" if word == "" if result = plural_of[word] return result.dup end result = word.dup regex, hash = pluralization_rules result.sub!(regex) {|m| hash[m]} plural_of[word] = result return result end  | 
  
.plural_rule(singular, plural) ⇒ Object
Define a plurualization rule.
Parameters
- singular<String>
 - 
ending of the word in singular form
 - plural<String>
 - 
ending of the word in plural form
 
Examples
Once the following rule is defined: English::Inflect.singular_rule ‘fe’, ‘ves’
You can see the following results: irb> “wife”.plural
> wives
      237 238 239  | 
    
      # File 'lib/extlib/inflection.rb', line 237 def plural_rule(singular, plural) @plural_rules << [singular, plural] end  | 
  
.plural_word(singular, plural) ⇒ Object
Define a pluralization exception.
Parameters
- singular<String>
 - 
singular form of the word
 - plural<String>
 - 
plural form of the word
 
      171 172 173 174  | 
    
      # File 'lib/extlib/inflection.rb', line 171 def plural_word(singular, plural) @plural_of[singular] = plural @plural_of[singular.capitalize] = plural.capitalize end  | 
  
.pluralization_rules ⇒ Object
Read prepared pluralization rules.
      253 254 255 256 257 258 259 260  | 
    
      # File 'lib/extlib/inflection.rb', line 253 def pluralization_rules if defined?(@pluralization_regex) && @pluralization_regex return [@pluralization_regex, @pluralization_hash] end @pluralization_regex = Regexp.new("(" + @plural_rules.map {|s,p| s}.join("|") + ")$", "i") @pluralization_hash = Hash[*@plural_rules.flatten] [@pluralization_regex, @pluralization_hash] end  | 
  
.rule(singular, plural, whole_word = false) ⇒ Object
Define a general rule.
Parameters
- singular<String>
 - 
ending of the word in singular form
 - plural<String>
 - 
ending of the word in plural form
 - whole_word<Boolean>
 - 
for capitalization, since words can be capitalized (Man => Men) #
 
Examples
Once the following rule is defined: English::Inflect.rule ‘y’, ‘ies’
You can see the following results: irb> “fly”.plural
> flies
irb> “cry”.plural
> cries
Define a general rule.
      197 198 199 200 201  | 
    
      # File 'lib/extlib/inflection.rb', line 197 def rule(singular, plural, whole_word = false) singular_rule(singular, plural) plural_rule(singular, plural) word(singular, plural) if whole_word end  | 
  
.singular(word) ⇒ Object Also known as: singularize
Convert an English word from plural to singular.
"boys".singular      #=> boy
"tomatoes".singular  #=> tomato
Parameters
- word<String>
 - 
word to singularize
 
Returns
- <String>
 - 
singularized form of word
 
Notes
Aliased as singularize (a Railism)
      277 278 279 280 281 282 283 284 285 286  | 
    
      # File 'lib/extlib/inflection.rb', line 277 def singular(word) if result = singular_of[word] return result.dup end result = word.dup regex, hash = singularization_rules result.sub!(regex) {|m| hash[m]} singular_of[word] = result return result end  | 
  
.singular_rule(singular, plural) ⇒ Object
Define a singularization rule.
Parameters
- singular<String>
 - 
ending of the word in singular form
 - plural<String>
 - 
ending of the word in plural form
 
Examples
Once the following rule is defined: English::Inflect.singular_rule ‘o’, ‘oes’
You can see the following results: irb> “heroes”.singular
> hero
      218 219 220  | 
    
      # File 'lib/extlib/inflection.rb', line 218 def singular_rule(singular, plural) @singular_rules << [singular, plural] end  | 
  
.singular_word(singular, plural) ⇒ Object
Define a singularization exception.
Parameters
- singular<String>
 - 
singular form of the word
 - plural<String>
 - 
plural form of the word
 
      159 160 161 162  | 
    
      # File 'lib/extlib/inflection.rb', line 159 def singular_word(singular, plural) @singular_of[plural] = singular @singular_of[plural.capitalize] = singular.capitalize end  | 
  
.singularization_rules ⇒ Object
Read prepared singularization rules.
      242 243 244 245 246 247 248 249 250  | 
    
      # File 'lib/extlib/inflection.rb', line 242 def singularization_rules if defined?(@singularization_regex) && @singularization_regex return [@singularization_regex, @singularization_hash] end # No sorting needed: Regexen match on longest string @singularization_regex = Regexp.new("(" + @singular_rules.map {|s,p| p}.join("|") + ")$", "i") @singularization_hash = Hash[*@singular_rules.flatten].invert [@singularization_regex, @singularization_hash] end  | 
  
.tableize(class_name) ⇒ Object
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.
      76 77 78 79 80  | 
    
      # File 'lib/extlib/inflection.rb', line 76 def tableize(class_name) words = class_name.to_const_path.tr('/', '_').split('_') words[-1] = pluralize(words[-1]) words.join('_') end  | 
  
.underscore(camel_cased_word) ⇒ Object
The reverse of camelize. Makes an underscored form from the expression in the string.
Changes ‘::’ to ‘/’ to convert namespaces to paths.
      45 46 47  | 
    
      # File 'lib/extlib/inflection.rb', line 45 def underscore(camel_cased_word) camel_cased_word.to_const_path end  | 
  
.word(singular, plural = nil) ⇒ Object
Defines a general inflection exception case.
Parameters
- singular<String>
 - 
singular form of the word
 - plural<String>
 - 
plural form of the word
 
Examples
Here we define erratum/errata exception case:
English::Inflect.word “erratum”, “errata”
In case singular and plural forms are the same omit second argument on call:
English::Inflect.word ‘information’
      132 133 134 135 136  | 
    
      # File 'lib/extlib/inflection.rb', line 132 def word(singular, plural=nil) plural = singular unless plural singular_word(singular, plural) plural_word(singular, plural) end  |