module Quails::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
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 118 def api_only! hide_namespaces "assets", "helper", "css", "js" options[:quails].merge!( api: true, assets: false, helper: false, template_engine: nil ) if ARGV.first == "mailer" options[:quails].merge!(template_engine: :erb) end 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:
Quails::Generators.fallbacks[:shoulda] = :test_unit
# File railties/lib/rails/generators.rb, line 110 def fallbacks @fallbacks ||= {} end
Show help message with available generators.
# File railties/lib/rails/generators.rb, line 181 def help(command = "generate") puts "Usage: quails #{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
# File railties/lib/rails/generators.rb, line 175 def hide_namespaces(*namespaces) hidden_namespaces.concat(namespaces) 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 268 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) msg = "Could not find generator '#{namespace}'. ".dup msg << "Maybe you meant #{ suggestions.map { |s| "'#{s}'" }.to_sentence(last_word_connector: " or ", locale: :en) }\n" msg << "Run `quails generate --help` for more options." puts msg end end
Remove the color from output.
# File railties/lib/rails/generators.rb, line 134 def no_color! Thor::Base.shell = Thor::Shell::Basic end
# File railties/lib/rails/generators.rb, line 202 def print_generators sorted_groups.each { |b, n| print_list(b, n) } end
# File railties/lib/rails/generators.rb, line 197 def public_namespaces lookup! subclasses.map(&:namespace) end
# 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 quails = groups.delete("quails") quails.map! { |n| n.sub(/^quails:/, "") } quails.delete("app") quails.delete("plugin") quails.delete("encrypted_secrets") hidden_namespaces.each { |n| groups.delete(n.to_s) } [[ "quails", quails ]] + groups.sort.to_a end
Private Class Methods
# File railties/lib/rails/generators.rb, line 306 def command_type # :doc: @command_type ||= "generator" end
# File railties/lib/rails/generators.rb, line 314 def file_lookup_paths # :doc: @file_lookup_paths ||= [ "{#{lookup_paths.join(',')}}", "**", "*_generator.rb" ] end
Try fallbacks for the given base.
# File railties/lib/rails/generators.rb, line 291 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
# File railties/lib/rails/generators.rb, line 310 def lookup_paths # :doc: @lookup_paths ||= %w( quails/generators generators ) end
# File railties/lib/rails/generators.rb, line 285 def print_list(base, namespaces) # :doc: namespaces = namespaces.reject { |n| hidden_namespaces.include?(n) } super end