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/inflections.rb,
lib/dry/inflector/inflections/defaults.rb

Overview

dry-inflector

Since:

  • 0.1.0

Defined Under Namespace

Classes: Inflections, Rules

Constant Summary collapse

VERSION =

Since:

  • 0.1.0

"0.1.1"

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(input) ⇒ String

Camelize a string

Examples:

require "dry/inflector"

inflector = Dry::Inflector.new
inflector.camelize("dry/inflector") # => "Dry::Inflector"

Parameters:

  • input (String, Symbol)

    the input

Returns:

  • (String)

    the camelized string

Since:

  • 0.1.0


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

def camelize(input)
  input.to_s.gsub(/\/(.?)/) { "::#{Regexp.last_match(1).upcase}" }.gsub(/(?:\A|_)(.)/) { Regexp.last_match(1).upcase }
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


85
86
87
# File 'lib/dry/inflector.rb', line 85

def classify(input)
  camelize(singularize(input.to_s.sub(/.*\./, "")))
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


69
70
71
# File 'lib/dry/inflector.rb', line 69

def constantize(input)
  Object.const_get(input)
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


101
102
103
# File 'lib/dry/inflector.rb', line 101

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


117
118
119
# File 'lib/dry/inflector.rb', line 117

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


153
154
155
# File 'lib/dry/inflector.rb', line 153

def foreign_key(input)
  "#{underscorize(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


134
135
136
137
138
139
140
141
# File 'lib/dry/inflector.rb', line 134

def humanize(input)
  input = input.to_s
  result = inflections.humans.apply_to(input)
  result.gsub!(/_id\z/, "")
  result.tr!("_", " ")
  result.capitalize!
  result
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


173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/dry/inflector.rb', line 173

def ordinalize(number) # rubocop:disable Metrics/MethodLength
  abs_value = number.abs

  if ORDINALIZE_TH.key?(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


201
202
203
204
205
# File 'lib/dry/inflector.rb', line 201

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


220
221
222
223
224
# File 'lib/dry/inflector.rb', line 220

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


238
239
240
241
# File 'lib/dry/inflector.rb', line 238

def tableize(input)
  input = input.to_s.gsub(/::/, "_")
  pluralize(underscorize(input))
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


267
268
269
# File 'lib/dry/inflector.rb', line 267

def uncountable?(input)
  !(input =~ /\A[[:space:]]*\z/).nil? || inflections.uncountables.include?(input.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


255
256
257
258
# File 'lib/dry/inflector.rb', line 255

def underscore(input)
  input = input.to_s.gsub(/::/, "/")
  underscorize(input)
end