Namespace
Module
Class
- Rails::Generators::ActiveModel
- Rails::Generators::AppBase
- Rails::Generators::Base
- Rails::Generators::NamedBase
- Rails::Generators::TestCase
Methods
- api_only!
- command_type
- fallbacks
- file_lookup_paths
- help
- hidden_namespaces
- hide_namespace
- hide_namespaces
- invoke
- lookup_paths
- no_color!
- print_generators
- print_list
- public_namespaces
- sorted_groups
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, javascripts: true, javascript_engine: :js, 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 |
||
RESERVED_NAMES | = | %w[application destroy plugin runner test] |
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.
π Source code
# File 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].merge!(template_engine: :erb)
end
end
π See on GitHub
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
π Source code
# File railties/lib/rails/generators.rb, line 110
def fallbacks
@fallbacks ||= {}
end
π See on GitHub
help(command = "generate")
Show help message with available generators.
π Source code
# File 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
π See on GitHub
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β.
π Source code
# File 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
π See on GitHub
hide_namespaces(*namespaces)
π Source code
# File railties/lib/rails/generators.rb, line 175
def hide_namespaces(*namespaces)
hidden_namespaces.concat(namespaces)
end
π See on GitHub
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.
π Source code
# File 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)
suggestions = options.sort_by { |suggested| levenshtein_distance(namespace.to_s, suggested) }.first(3)
suggestions.map! { |s| "'#{s}'" }
msg = "Could not find generator '#{namespace}'. ".dup
msg << "Maybe you meant #{ suggestions[0...-1].join(', ')} or #{suggestions[-1]}\n"
msg << "Run `rails generate --help` for more options."
puts msg
end
end
π See on GitHub
no_color!()
Remove the color from output.
π Source code
# File railties/lib/rails/generators.rb, line 134
def no_color!
Thor::Base.shell = Thor::Shell::Basic
end
π See on GitHub
print_generators()
π Source code
# File railties/lib/rails/generators.rb, line 202
def print_generators
sorted_groups.each { |b, n| print_list(b, n) }
end
π See on GitHub
public_namespaces()
π Source code
# File railties/lib/rails/generators.rb, line 197
def public_namespaces
lookup!
subclasses.map(&:namespace)
end
π See on GitHub
sorted_groups()
π Source code
# File 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")
hidden_namespaces.each { |n| groups.delete(n.to_s) }
[[ "rails", rails ]] + groups.sort.to_a
end
π See on GitHub
Class Private methods
command_type()
π Source code
# File railties/lib/rails/generators.rb, line 311
def command_type # :doc:
@command_type ||= "generator"
end
π See on GitHub
file_lookup_paths()
π Source code
# File railties/lib/rails/generators.rb, line 319
def file_lookup_paths # :doc:
@file_lookup_paths ||= [ "{#{lookup_paths.join(',')}}", "**", "*_generator.rb" ]
end
π See on GitHub
lookup_paths()
π Source code
# File railties/lib/rails/generators.rb, line 315
def lookup_paths # :doc:
@lookup_paths ||= %w( rails/generators generators )
end
π See on GitHub
print_list(base, namespaces)
π Source code
# File railties/lib/rails/generators.rb, line 290
def print_list(base, namespaces) # :doc:
namespaces = namespaces.reject { |n| hidden_namespaces.include?(n) }
super
end
π See on GitHub