Namespace
Methods
A
C
F
H
I
L
N
P
S
Constants
DEFAULT_ALIASES = { rails: { actions: "-a", orm: "-o", javascripts: "-j", javascript_engine: "-je", resource_controller: "-c", scaffold_controller: "-c", stylesheets: "-y", stylesheet_engine: "-se", scaffold_stylesheet: "-ss", template_engine: "-e", test_framework: "-t" }, test_unit: { fixture_replacement: "-r", } }
 
DEFAULT_OPTIONS = { rails: { api: false, assets: true, force_plural: false, helper: true, integration_tool: nil, orm: false, resource_controller: :controller, resource_route: true, scaffold_controller: :scaffold_controller, stylesheets: true, stylesheet_engine: :css, scaffold_stylesheet: true, system_tests: nil, test_framework: nil, template_engine: :erb } }
 
RAILS_DEV_PATH = File.expand_path("../../../../../..", __dir__)
 

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.

Class Public methods
api_only!()

Configure generators for API only applications. It basically hides everything that is usually browser related, such as assets and session migration generators, and completely disable helpers and assets so generators such as scaffold won't create them.

# File rails/railties/lib/rails/generators.rb, line 118
def api_only!
  hide_namespaces "assets", "helper", "css", "js"

  options[:rails].merge!(
    api: true,
    assets: false,
    helper: false,
    template_engine: nil
  )

  if ARGV.first == "mailer"
    options[:rails][:template_engine] = :erb
  end
end
command_type()
# File rails/railties/lib/rails/generators.rb, line 311
def command_type # :doc:
  @command_type ||= "generator"
end
fallbacks()

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 rails/railties/lib/rails/generators.rb, line 110
def fallbacks
  @fallbacks ||= {}
end
file_lookup_paths()
# File rails/railties/lib/rails/generators.rb, line 319
def file_lookup_paths # :doc:
  @file_lookup_paths ||= [ "{#{lookup_paths.join(',')}}", "**", "*_generator.rb" ]
end
help(command = "generate")

Show help message with available generators.

# File rails/railties/lib/rails/generators.rb, line 181
def 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
hidden_namespaces()

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 rails/railties/lib/rails/generators.rb, line 143
def hidden_namespaces
  @hidden_namespaces ||= begin
    orm      = options[:rails][:orm]
    test     = options[:rails][:test_framework]
    template = options[:rails][:template_engine]
    css      = options[:rails][:stylesheet_engine]

    [
      "rails",
      "resource_route",
      "#{orm}:migration",
      "#{orm}:model",
      "#{test}:controller",
      "#{test}:helper",
      "#{test}:integration",
      "#{test}:system",
      "#{test}:mailer",
      "#{test}:model",
      "#{test}:scaffold",
      "#{test}:view",
      "#{test}:job",
      "#{template}:controller",
      "#{template}:scaffold",
      "#{template}:mailer",
      "#{css}:scaffold",
      "#{css}:assets",
      "css:assets",
      "css:scaffold"
    ]
  end
end
hide_namespace(*namespaces)
Alias for: hide_namespaces
hide_namespaces(*namespaces)
Also aliased as: hide_namespace
# File rails/railties/lib/rails/generators.rb, line 175
def hide_namespaces(*namespaces)
  hidden_namespaces.concat(namespaces)
end
invoke(namespace, args = ARGV, config = {})

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 rails/railties/lib/rails/generators.rb, line 272
  def 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?(&:required?)
      klass.start(args, config)
    else
      options     = sorted_groups.flat_map(&:last)
      suggestion  = Rails::Command::Spellchecker.suggest(namespace.to_s, from: options)
      suggestion_msg = "Maybe you meant #{suggestion.inspect}?" if suggestion

      puts <<~MSG
        Could not find generator '#{namespace}'. #{suggestion_msg}
        Run %x`rails generate --help` for more options.
      MSG
    end
  end

  private
    def print_list(base, namespaces) # :doc:
      namespaces = namespaces.reject { |n| hidden_namespaces.include?(n) }
      super
    end

    # Try fallbacks for the given base.
    def invoke_fallbacks_for(name, base)
      return nil unless base && fallbacks[base.to_sym]
      invoked_fallbacks = []

      Array(fallbacks[base.to_sym]).each do |fallback|
        next if invoked_fallbacks.include?(fallback)
        invoked_fallbacks << fallback

        klass = find_by_namespace(name, fallback)
        return klass if klass
      end

      nil
    end

    def command_type # :doc:
      @command_type ||= "generator"
    end

    def lookup_paths # :doc:
      @lookup_paths ||= %w( rails/generators generators )
    end

    def file_lookup_paths # :doc:
      @file_lookup_paths ||= [ "{#{lookup_paths.join(',')}}", "**", "*_generator.rb" ]
    end
end
invoke_fallbacks_for(name, base)

Try fallbacks for the given base.

# File rails/railties/lib/rails/generators.rb, line 296
def invoke_fallbacks_for(name, base)
  return nil unless base && fallbacks[base.to_sym]
  invoked_fallbacks = []

  Array(fallbacks[base.to_sym]).each do |fallback|
    next if invoked_fallbacks.include?(fallback)
    invoked_fallbacks << fallback

    klass = find_by_namespace(name, fallback)
    return klass if klass
  end

  nil
end
lookup_paths()
# File rails/railties/lib/rails/generators.rb, line 315
def lookup_paths # :doc:
  @lookup_paths ||= %w( rails/generators generators )
end
no_color!()

Remove the color from output.

# File rails/railties/lib/rails/generators.rb, line 134
def no_color!
  Thor::Base.shell = Thor::Shell::Basic
end
print_generators()
# File rails/railties/lib/rails/generators.rb, line 202
def print_generators
  sorted_groups.each { |b, n| print_list(b, n) }
end
print_list(base, namespaces)
# File rails/railties/lib/rails/generators.rb, line 290
def print_list(base, namespaces) # :doc:
  namespaces = namespaces.reject { |n| hidden_namespaces.include?(n) }
  super
end
public_namespaces()
# File rails/railties/lib/rails/generators.rb, line 197
def public_namespaces
  lookup!
  subclasses.map(&:namespace)
end
sorted_groups()
# File rails/railties/lib/rails/generators.rb, line 206
def 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")
  rails.delete("encrypted_secrets")
  rails.delete("encrypted_file")
  rails.delete("encryption_key_file")
  rails.delete("master_key")
  rails.delete("credentials")
  rails.delete("db:system:change")

  hidden_namespaces.each { |n| groups.delete(n.to_s) }

  [[ "rails", rails ]] + groups.sort.to_a
end