Class: Dry::Inflector

Inherits:
Object
  • Object
show all
Defined in:
lib/dry/inflector.rb,
lib/dry/inflector/rules.rb,
lib/dry/inflector/version.rb,
lib/dry/inflector/acronyms.rb,
lib/dry/inflector/inflections.rb,
lib/dry/inflector/inflections/defaults.rb

Overview

dry-inflector

Since:

  • 0.1.0

Defined Under Namespace

Classes: Acronyms, Inflections, Rules

Constant Summary collapse

VERSION =

Since:

  • 0.1.0

"1.1.0"

Instance Method Summary collapse

Constructor Details

#initialize(&blk) {|the| ... } ⇒ Dry::Inflector

Instantiate the inflector

Examples:

Basic usage

require "dry/inflector"

inflector = Dry::Inflector.new

Custom inflection rules

require "dry/inflector"

inflector = Dry::Inflector.new do |inflections|
  inflections.plural      "virus",   "viruses" # specify a rule for #pluralize
  inflections.singular    "thieves", "thief"   # specify a rule for #singularize
  inflections.uncountable "dry-inflector"      # add an exception for an uncountable word
end

Parameters:

  • blk (Proc)

    an optional block to specify custom inflection rules

Yield Parameters:

Since:

  • 0.1.0



33
34
35
# File 'lib/dry/inflector.rb', line 33

def initialize(&blk)
  @inflections = Inflections.build(&blk)
end

Instance Method Details

#camelize_lower(input) ⇒ String

Lower camelize a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.camelize_lower("data_mapper") # => "dataMapper"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    the lower camelized string

Since:

  • 0.1.3



49
50
51
# File 'lib/dry/inflector.rb', line 49

def camelize_lower(input)
  internal_camelize(input, false)
end

#camelize_upper(input) ⇒ String Also known as: camelize

Upper camelize a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.camelize_upper("data_mapper") # => "DataMapper"
inflector.camelize_upper("dry/inflector") # => "Dry::Inflector"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    the upper camelized string

Since:

  • 0.1.3



66
67
68
# File 'lib/dry/inflector.rb', line 66

def camelize_upper(input)
  internal_camelize(input, true)
end

#classify(input) ⇒ String

Classify a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.classify("books") # => "Book"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    the classified string

Since:

  • 0.1.0



104
105
106
# File 'lib/dry/inflector.rb', line 104

def classify(input)
  camelize(singularize(input.to_s.split(".").last))
end

#constantize(input) ⇒ Class, Module

Find a constant with the name specified in the argument string

The name is assumed to be the one of a top-level constant, constant scope of caller is ignored

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.constantize("Module")         # => Module
inflector.constantize("Dry::Inflector") # => Dry::Inflector

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (Class, Module)

    the class or module

Since:

  • 0.1.0



88
89
90
# File 'lib/dry/inflector.rb', line 88

def constantize(input)
  Object.const_get(input, false)
end

#dasherize(input) ⇒ String

Dasherize a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.dasherize("dry_inflector") # => "dry-inflector"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    the dasherized string

Since:

  • 0.1.0



120
121
122
# File 'lib/dry/inflector.rb', line 120

def dasherize(input)
  input.to_s.tr("_", "-")
end

#demodulize(input) ⇒ String

Demodulize a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.demodulize("Dry::Inflector") # => "Inflector"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    the demodulized string

Since:

  • 0.1.0



136
137
138
# File 'lib/dry/inflector.rb', line 136

def demodulize(input)
  input.to_s.split("::").last
end

#foreign_key(input) ⇒ String

Creates a foreign key name

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.foreign_key("Message") => "message_id"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    foreign key

Since:

  • 0.1.0



175
176
177
# File 'lib/dry/inflector.rb', line 175

def foreign_key(input)
  "#{underscore(demodulize(input))}_id"
end

#humanize(input) ⇒ String

Humanize a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.humanize("dry_inflector") # => "Dry inflector"
inflector.humanize("author_id")     # => "Author"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    the humanized string

Since:

  • 0.1.0



153
154
155
156
157
158
159
160
161
162
163
# File 'lib/dry/inflector.rb', line 153

def humanize(input)
  input = input.to_s
  result = inflections.humans.apply_to(input)
  result.delete_suffix!("_id")
  result.tr!("_", " ")
  match = /(\W)/.match(result)
  separator = match ? match[0] : DEFAULT_SEPARATOR
  result.split(separator).map.with_index { |word, index|
    inflections.acronyms.apply_to(word, capitalize: index.zero?)
  }.join(separator)
end

#ordinalize(number) ⇒ String

Ordinalize a number

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.ordinalize(1)  # => "1st"
inflector.ordinalize(2)  # => "2nd"
inflector.ordinalize(3)  # => "3rd"
inflector.ordinalize(10) # => "10th"
inflector.ordinalize(23) # => "23rd"

Parameters:

  • number (Integer)

    the input

Returns:

  • (String)

    the ordinalized number

Since:

  • 0.1.0



195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/dry/inflector.rb', line 195

def ordinalize(number)
  abs_value = number.abs

  if ORDINALIZE_TH[abs_value % 100]
    "#{number}th"
  else
    case abs_value % 10
    when 1 then "#{number}st"
    when 2 then "#{number}nd"
    when 3 then "#{number}rd"
    else        "#{number}th"
    end
  end
end

#pluralize(input) ⇒ String

Pluralize a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.pluralize("book")  # => "books"
inflector.pluralize("money") # => "money"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    the pluralized string

Since:

  • 0.1.0



223
224
225
226
227
228
# File 'lib/dry/inflector.rb', line 223

def pluralize(input)
  input = input.to_s
  return input if uncountable?(input)

  inflections.plurals.apply_to(input)
end

#singularize(input) ⇒ String

Singularize a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.singularize("books") # => "book"
inflector.singularize("money") # => "money"

Parameters:

  • input (String)

    the input

Returns:

  • (String)

    the singularized string

Since:

  • 0.1.0



243
244
245
246
247
248
# File 'lib/dry/inflector.rb', line 243

def singularize(input)
  input = input.to_s
  return input if uncountable?(input)

  inflections.singulars.apply_to(input)
end

#tableize(input) ⇒ String

Tableize a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.tableize("Book") # => "books"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    the tableized string

Since:

  • 0.1.0



262
263
264
265
# File 'lib/dry/inflector.rb', line 262

def tableize(input)
  input = input.to_s.gsub("::", "_")
  pluralize(underscore(input))
end

#to_sString Also known as: inspect

Returns:

  • (String)

Since:

  • 0.2.0



310
311
312
# File 'lib/dry/inflector.rb', line 310

def to_s
  "#<Dry::Inflector>"
end

#uncountable?(input) ⇒ TrueClass, FalseClass

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.

Check if the input is an uncountable word

Parameters:

  • input (String)

    the input

Returns:

  • (TrueClass, FalseClass)

    the result of the check

Since:

  • 0.1.0



300
301
302
303
304
# File 'lib/dry/inflector.rb', line 300

def uncountable?(input)
  input.match?(/\A[[:space:]]*\z/) ||
    inflections.uncountables.include?(input.downcase) ||
    inflections.uncountables.include?(input.split(/_|\b/).last.downcase)
end

#underscore(input) ⇒ String

Underscore a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.underscore("dry-inflector") # => "dry_inflector"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    the underscored string

Since:

  • 0.1.0



279
280
281
282
283
284
285
286
287
288
289
290
291
# File 'lib/dry/inflector.rb', line 279

def underscore(input)
  input = input.to_s.gsub("::", "/")
  input.gsub!(inflections.acronyms.regex) do
    m1 = Regexp.last_match(1)
    m2 = Regexp.last_match(2)
    "#{m1 ? "_" : ""}#{m2.downcase}"
  end
  input.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
  input.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
  input.tr!("-", "_")
  input.downcase!
  input
end