123456789_123456789_123456789_123456789_123456789_

Class: Rails::Command::Base

Relationships & Source Files
Namespace Children
Classes:
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Thor
Instance Chain:
self, Actions, Thor
Inherits: Thor
Defined in: railties/lib/rails/command/base.rb

Class Attribute Summary

Class Method Summary

Instance Method Summary

Actions - Included

#boot_application!, #load_environment_config!,
#load_generators

See additional method definition at line 36.

#load_tasks

See additional method definition at line 31.

#require_application!,
#set_application_directory!

Change to the application’s path if there is no config.ru file in current directory.

Class Attribute Details

.bin (rw)

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 20

class_attribute :bin, instance_accessor: false, default: "bin/rails"

.bin?Boolean (rw)

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 20

class_attribute :bin, instance_accessor: false, default: "bin/rails"

.engine?Boolean (readonly)

Returns true when the app is a Rails engine.

[ GitHub ]

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

def engine?
  defined?(ENGINE_ROOT)
end

.exit_on_failure?Boolean (readonly)

This method is for internal use only.
[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 23

def exit_on_failure? # :nodoc:
  false
end

Class Method Details

.base_name

Sets the base_name taking into account the current class namespace.

Rails::Command::TestCommand.base_name # => 'rails'
[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 106

def base_name
  @base_name ||= if base = name.to_s.split("::").first
    base.underscore
  end
end

.class_usage

This method is for internal use only.
[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 122

def class_usage # :nodoc:
  if usage_path
    @class_usage ||= ERB.new(File.read(usage_path), trim_mode: "-").result(binding)
  end
end

.command_name

Return command name without namespaces.

Rails::Command::TestCommand.command_name # => 'test'
[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 115

def command_name
  @command_name ||= if command = name.to_s.split("::").last
    command.chomp!("Command")
    command.underscore
  end
end

.create_command(meth) (private)

Allow the command method to be called perform.

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 146

def create_command(meth)
  if meth == "perform"
    alias_method command_name, meth
  else
    # Prevent exception about command without usage.
    # Some commands define their documentation differently.
    @usage ||= meth
    @desc  ||= ""

    super
  end
end

.default_command_root

Default file root to place extra files a command might need, placed one folder above the command file.

For a TestCommand placed in rails/command/test_command.rb would return rails/test.

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 139

def default_command_root
  @default_command_root = resolve_path(".") unless defined?(@default_command_root)
  @default_command_root
end

.desc(usage = nil, description = nil, options = {})

Tries to get the description from a USAGE file one folder above the command root.

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 34

def desc(usage = nil, description = nil, options = {})
  if usage
    super
  else
    class_usage
  end
end

.executable(command_name = self.command_name)

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 82

def executable(command_name = self.command_name)
  "#{bin} #{namespaced_name(command_name)}"
end

.help(shell)

This method is for internal use only.

Override Thor’s class-level help to also show the USAGE.

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 98

def help(shell, *) # :nodoc:
  super
  shell.say class_usage if class_usage
end

.hide_command!

Convenience method to hide this command from the available ones when running rails command.

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 55

def hide_command!
  Rails::Command.hidden_commands << self
end

.inherited(base)

This method is for internal use only.
[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 59

def inherited(base) # :nodoc:
  super

  if base.name && !base.name.end_with?("Base")
    Rails::Command.subclasses << base
  end
end

.namespace(name = nil)

Convenience method to get the namespace from the class name. It’s the same as Thor default except that the ::Rails::Command at the end of the class is removed.

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 45

def namespace(name = nil)
  if name
    super
  else
    @namespace ||= super.chomp("_command").sub(/:command:/, ":")
  end
end

.namespaced_name(name) (private)

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 159

def namespaced_name(name)
  *prefix, basename = namespace.delete_prefix("rails:").split(":")
  prefix.concat([basename, name.to_s].uniq).join(":")
end

.perform(command, args, config)

This method is for internal use only.
[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 67

def perform(command, args, config) # :nodoc:
  if Rails::Command::HELP_MAPPINGS.include?(args.first)
    command, args = "help", [command]
    args.clear if instance_method(:help).arity.zero?
  end

  dispatch(command, args.dup, nil, config)
end

.printing_commands

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 76

def printing_commands
  commands.filter_map do |name, command|
    [namespaced_name(name), command.description] unless command.hidden?
  end
end

.resolve_path(path) (private)

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 164

def resolve_path(path)
  path = File.join("../commands", *namespace.delete_prefix("rails:").split(":"), path)
  path = File.expand_path(path, __dir__)
  path if File.exist?(path)
end

.usage_path

Path to lookup a USAGE description in a file.

[ GitHub ]

  
# File 'railties/lib/rails/command/base.rb', line 129

def usage_path
  @usage_path = resolve_path("USAGE") unless defined?(@usage_path)
  @usage_path
end