module Rails::Generators
Constants
- DEFAULT_ALIASES
- DEFAULT_OPTIONS
- RAILS_DEV_PATH
- 
We need to store the RAILS_DEV_PATH in a constant, otherwise the path can change in Ruby 1.8.7 when we FileUtils.cd. 
- RESERVED_NAMES
Public Class Methods
# File railties/lib/rails/generators.rb, line 98
def self.fallbacks
  @fallbacks ||= {}
end Hold configured generators fallbacks. If a plugin developer wants a generator group to fallback to another group in case of missing generators, they can add a fallback.
For example, shoulda is considered a test_framework and is an extension of test_unit. However, most part of shoulda generators are similar to test_unit ones.
Shoulda then can tell generators to search for test_unit generators when some of them are not available by adding a fallback:
Rails::Generators.fallbacks[:shoulda] = :test_unit
# File railties/lib/rails/generators.rb, line 211
def self.help(command = 'generate')
  puts "Usage: rails #{command} GENERATOR [args] [options]"
  puts
  puts "General options:"
  puts "  -h, [--help]     # Print generator's options and usage"
  puts "  -p, [--pretend]  # Run but do not make any changes"
  puts "  -f, [--force]    # Overwrite files that already exist"
  puts "  -s, [--skip]     # Skip files that already exist"
  puts "  -q, [--quiet]    # Suppress status output"
  puts
  puts "Please choose a generator below."
  puts
  print_generators
end Show help message with available generators.
Returns an array of generator namespaces that are hidden. Generator namespaces may be hidden for a variety of reasons. Some are aliased such as “rails:migration” and can be invoked with the shorter “migration”, others are private to other generators such as “css:scaffold”.
# File railties/lib/rails/generators.rb, line 204 def hide_namespaces(*namespaces) hidden_namespaces.concat(namespaces) end
# File railties/lib/rails/generators.rb, line 153
def self.invoke(namespace, args=ARGV, config={})
  names = namespace.to_s.split(':')
  if klass = find_by_namespace(names.pop, names.any? && names.join(':'))
    args << "--help" if args.empty? && klass.arguments.any? { |a| a.required? }
    klass.start(args, config)
  else
    options     = sorted_groups.map(&:last).flatten
    suggestions = options.sort_by {|suggested| levenshtein_distance(namespace.to_s, suggested) }.first(3)
    msg =  "Could not find generator '#{namespace}'. "
    msg << "Maybe you meant #{ suggestions.map {|s| "'#{s}'"}.to_sentence(last_word_connector: " or ") }\n"
    msg << "Run `rails generate --help` for more options."
    puts msg
  end
end Receives a namespace, arguments and the behavior to invoke the generator. It's used as the default entry point for generate, destroy and update commands.
# File railties/lib/rails/generators.rb, line 103 def self.no_color! Thor::Base.shell = Thor::Shell::Basic end
Remove the color from output.
# File railties/lib/rails/generators.rb, line 232
def self.print_generators
  sorted_groups.each { |b, n| print_list(b, n) }
end # File railties/lib/rails/generators.rb, line 227
def self.public_namespaces
  lookup!
  subclasses.map { |k| k.namespace }
end # File railties/lib/rails/generators.rb, line 236
def self.sorted_groups
  namespaces = public_namespaces
  namespaces.sort!
  groups = Hash.new { |h,k| h[k] = [] }
  namespaces.each do |namespace|
    base = namespace.split(':').first
    groups[base] << namespace
  end
  rails = groups.delete("rails")
  rails.map! { |n| n.sub(/^rails:/, '') }
  rails.delete("app")
  rails.delete("plugin")
  hidden_namespaces.each { |n| groups.delete(n.to_s) }
  [["rails", rails]] + groups.sort.to_a
end # File railties/lib/rails/generators.rb, line 108 def self.subclasses @subclasses ||= [] end
Track all generators subclasses.
Protected Class Methods
# File railties/lib/rails/generators.rb, line 258
def self.levenshtein_distance str1, str2
  s = str1
  t = str2
  n = s.length
  m = t.length
  return m if (0 == n)
  return n if (0 == m)
  d = (0..m).to_a
  x = nil
  str1.each_char.each_with_index do |char1,i|
    e = i+1
    str2.each_char.each_with_index do |char2,j|
      cost = (char1 == char2) ? 0 : 1
      x = [
           d[j+1] + 1, # insertion
           e + 1,      # deletion
           d[j] + cost # substitution
          ].min
      d[j] = e
      e = x
    end
    d[m] = x
  end
  return x
end This code is based directly on the Text gem implementation Returns a value representing the “cost” of transforming str1 into str2
    © 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.