Skip to Content Skip to Search
Namespace
Methods
A
C
F
H
I
L
P
S

Constants

DEFAULT_ALIASES = { rails: { actions: "-a", orm: "-o", javascripts: "-j", resource_controller: "-c", scaffold_controller: "-c", stylesheets: "-y", 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, 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 railties/lib/rails/generators.rb, line 115
def api_only!
  hide_namespaces "assets", "helper", "css", "js"

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

  options[:mailer] ||= {}
  options[:mailer][:template_engine] ||= :erb
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 railties/lib/rails/generators.rb, line 107
def fallbacks
  @fallbacks ||= {}
end

help(command = "generate")

Show help message with available generators.

# File railties/lib/rails/generators.rb, line 168
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”.

# File railties/lib/rails/generators.rb, line 133
def hidden_namespaces
  @hidden_namespaces ||= begin
    orm      = options[:rails][:orm]
    test     = options[:rails][:test_framework]
    template = options[:rails][:template_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",
      "action_text:install",
      "action_mailbox:install"
    ]
  end
end

hide_namespace(*namespaces)

Alias for: hide_namespaces

hide_namespaces(*namespaces)

Also aliased as: hide_namespace
# File railties/lib/rails/generators.rb, line 162
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 railties/lib/rails/generators.rb, line 259
      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)
          run_after_generate_callback if config[:behavior] == :invoke
        else
          options = sorted_groups.flat_map(&:last)
          error   = Command::Base::CorrectableError.new("Could not find generator '#{namespace}'.", namespace, options)

          if error.respond_to?(:detailed_message)
            formatted_message = error.detailed_message
          else
            formatted_message = error.message
          end

          puts <<~MSG
            #{formatted_message}
            Run `bin/rails generate --help` for more options.
          MSG
        end
      end

print_generators()

# File railties/lib/rails/generators.rb, line 189
def print_generators
  sorted_groups.each { |b, n| print_list(b, n) }
end

public_namespaces()

# File railties/lib/rails/generators.rb, line 184
def public_namespaces
  lookup!
  subclasses.map(&:namespace)
end

sorted_groups()

# File railties/lib/rails/generators.rb, line 193
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.delete_prefix("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

Class Private methods

command_type()

# File railties/lib/rails/generators.rb, line 309
def command_type # :doc:
  @command_type ||= "generator"
end

file_lookup_paths()

# File railties/lib/rails/generators.rb, line 317
def file_lookup_paths # :doc:
  @file_lookup_paths ||= [ "{#{lookup_paths.join(',')}}", "**", "*_generator.rb" ]
end

lookup_paths()

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

print_list(base, namespaces)

# File railties/lib/rails/generators.rb, line 288
def print_list(base, namespaces) # :doc:
  namespaces = namespaces.reject { |n| hidden_namespaces.include?(n) }
  super
end