123456789_123456789_123456789_123456789_123456789_

Module: Rails::Generators

Relationships & Source Files
Namespace Children
Modules:
Classes:
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Defined in: activejob/lib/rails/generators/job/job_generator.rb,
actioncable/lib/rails/generators/channel/channel_generator.rb,
actionmailbox/lib/rails/generators/mailbox/mailbox_generator.rb,
actionmailer/lib/rails/generators/mailer/mailer_generator.rb,
railties/lib/rails/generators.rb,
railties/lib/rails/commands/application/application_command.rb,
railties/lib/rails/generators/actions.rb,
railties/lib/rails/generators/active_model.rb,
railties/lib/rails/generators/app_base.rb,
railties/lib/rails/generators/app_name.rb,
railties/lib/rails/generators/base.rb,
railties/lib/rails/generators/database.rb,
railties/lib/rails/generators/devcontainer.rb,
railties/lib/rails/generators/generated_attribute.rb,
railties/lib/rails/generators/migration.rb,
railties/lib/rails/generators/model_helpers.rb,
railties/lib/rails/generators/named_base.rb,
railties/lib/rails/generators/resource_helpers.rb,
railties/lib/rails/generators/test_case.rb,
railties/lib/rails/generators/actions/create_migration.rb,
railties/lib/rails/generators/rails/app/app_generator.rb,
railties/lib/rails/generators/rails/application_record/application_record_generator.rb,
railties/lib/rails/generators/rails/benchmark/benchmark_generator.rb,
railties/lib/rails/generators/rails/controller/controller_generator.rb,
railties/lib/rails/generators/rails/credentials/credentials_generator.rb,
railties/lib/rails/generators/rails/db/system/change/change_generator.rb,
railties/lib/rails/generators/rails/encrypted_file/encrypted_file_generator.rb,
railties/lib/rails/generators/rails/encryption_key_file/encryption_key_file_generator.rb,
railties/lib/rails/generators/rails/generator/generator_generator.rb,
railties/lib/rails/generators/rails/helper/helper_generator.rb,
railties/lib/rails/generators/rails/integration_test/integration_test_generator.rb,
railties/lib/rails/generators/rails/master_key/master_key_generator.rb,
railties/lib/rails/generators/rails/migration/migration_generator.rb,
railties/lib/rails/generators/rails/model/model_generator.rb,
railties/lib/rails/generators/rails/plugin/plugin_generator.rb,
railties/lib/rails/generators/rails/resource/resource_generator.rb,
railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb,
railties/lib/rails/generators/rails/scaffold/scaffold_generator.rb,
railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb,
railties/lib/rails/generators/rails/system_test/system_test_generator.rb,
railties/lib/rails/generators/rails/task/task_generator.rb,
railties/lib/rails/generators/testing/assertions.rb,
railties/lib/rails/generators/testing/behavior.rb,
railties/lib/rails/generators/testing/setup_and_teardown.rb

Constant Summary

  • DEFAULT_ALIASES =
    # File 'railties/lib/rails/generators.rb', line 30
    {
      rails: {
        actions: "-a",
        orm: "-o",
        javascripts: ["-j", "--js"],
        resource_controller: "-c",
        scaffold_controller: "-c",
        stylesheets: "-y",
        template_engine: "-e",
        test_framework: "-t"
      },
    
      test_unit: {
        fixture_replacement: "-r",
      }
    }
  • DEFAULT_OPTIONS =
    # File 'railties/lib/rails/generators.rb', line 47
    {
      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 =

    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.

    # File 'railties/lib/rails/generators/rails/app/app_generator.rb', line 282
    File.expand_path("../../../../../..", __dir__)

Class Attribute Summary

Class Method Summary

Instance Attribute Summary

Class Attribute Details

.namespace (rw) Also known as: #namespace

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 28

mattr_accessor :namespace

Class Method Details

.add_generated_file(file)

This method is for internal use only.
[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 275

def add_generated_file(file) # :nodoc:
  (@@generated_files ||= []) << file
  file
end

.after_generate_callbacks

This method is for internal use only.
[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 89

def after_generate_callbacks # :nodoc:
  @after_generate_callbacks ||= []
end

.aliases

This method is for internal use only.
[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 81

def aliases # :nodoc:
  @aliases ||= DEFAULT_ALIASES.dup
end

.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.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 113

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

.command_type (private)

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 302

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

.configure!(config)

This method is for internal use only.
[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 65

def configure!(config) # :nodoc:
  api_only! if config.api_only
  no_color! unless config.colorize_logging
  aliases.deep_merge! config.aliases
  options.deep_merge! config.options
  fallbacks.merge! config.fallbacks
  templates_path.concat config.templates
  templates_path.uniq!
  hide_namespaces(*config.hidden_namespaces)
  after_generate_callbacks.replace config.after_generate_callbacks
end

.fallbacks

Hold configured generators fallbacks. If a plugin developer wants a generator group to fall back 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
[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 105

def fallbacks
  @fallbacks ||= {}
end

.file_lookup_paths (private)

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 310

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

.find_by_namespace(name, base = nil, context = nil)

This method is for internal use only.

::Rails finds namespaces similar to Thor, it only adds one rule:

Generators names must end with “_generator.rb”. This is required because ::Rails looks in load paths and loads the generator just before it’s going to be used.

find_by_namespace :webrat, :rails, :integration

Will search for the following generators:

"rails:webrat", "webrat:integration", "webrat"

Notice that “rails:generators:webrat” could be loaded as well, what ::Rails looks for is the first and last parts of the namespace.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 231

def find_by_namespace(name, base = nil, context = nil) # :nodoc:
  lookups = []
  lookups << "#{base}:#{name}"    if base
  lookups << "#{name}:#{context}" if context

  unless base || context
    unless name.to_s.include?(?:)
      lookups << "#{name}:#{name}"
      lookups << "rails:#{name}"
    end
    lookups << "#{name}"
  end

  lookup(lookups)

  namespaces = subclasses.index_by(&:namespace)
  lookups.each do |namespace|
    klass = namespaces[namespace]
    return klass if klass
  end

  invoke_fallbacks_for(name, base) || invoke_fallbacks_for(context, name)
end

.help(command = "generate")

Show help message with available generators.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 166

def help(command = "generate")
  puts "Usage:"
  puts "  bin/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”.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 131

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.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 163

alias hide_namespace hide_namespaces

.hide_namespaces(*namespaces) Also known as: .hide_namespace

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 160

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.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 258

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::CorrectableNameError.new("Could not find generator '#{namespace}'.", namespace, options)

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

.invoke_fallbacks_for(name, base) (private)

Try fallbacks for the given base.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 287

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 (private)

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 306

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

.options

This method is for internal use only.
[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 85

def options # :nodoc:
  @options ||= DEFAULT_OPTIONS.dup
end

.public_namespaces

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 183

def public_namespaces
  lookup!
  subclasses.map(&:namespace)
end

.run_after_generate_callback (private)

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 314

def run_after_generate_callback
  if defined?(@@generated_files) && !@@generated_files.empty?
    @after_generate_callbacks.each do |callback|
      callback.call(@@generated_files)
    end
    @@generated_files = []
  end
end

.sorted_groups

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 192

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

.templates_path

This method is for internal use only.
[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 77

def templates_path # :nodoc:
  @templates_path ||= []
end

Instance Attribute Details

#namespace (rw)

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 28

mattr_accessor :namespace