Namespace

Module

Class

Methods

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 RAILS_DEV_PATH in a constant, otherwise the path can change in Ruby 1.8.7 when we FileUtils.cd.

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_namespace(*namespaces)

Alias for: hide_namespaces

hide_namespaces(*namespaces)

Also aliased as: hide_namespace
πŸ“ 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