Skip to Content Skip to Search

class Rails::Command::Base

Inherits From

Public class methods

Source code GitHub
# File railties/lib/rails/command/base.rb, line 86
def banner(command = nil, *)
  if command
    # Similar to Thor's banner, but show the namespace (minus the
    # "rails:" prefix), and show the command's declared bin instead of
    # the command runner.
    command.formatted_usage(self).gsub(/^#{namespace}:(\w+)/) { executable($1) }
  else
    executable
  end
end

Sets the base_name taking into account the current class namespace.

Rails::Command::TestCommand.base_name # => 'rails'
Source code 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

Return command name without namespaces.

Rails::Command::TestCommand.command_name # => 'test'
Source code 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

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

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

Source code 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

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

Source code 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

Returns true when the app is a Rails engine.

Source code GitHub
# File railties/lib/rails/command/base.rb, line 28
def engine?
  defined?(ENGINE_ROOT)
end
Source code GitHub
# File railties/lib/rails/command/base.rb, line 82
def executable(command_name = self.command_name)
  "#{bin} #{namespaced_name(command_name)}"
end

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

Source code GitHub
# File railties/lib/rails/command/base.rb, line 55
def hide_command!
  Rails::Command.hidden_commands << self
end

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

Source code 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
Source code 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

Path to lookup a USAGE description in a file.

Source code 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

Public instance methods

Source code GitHub
# File railties/lib/rails/command/base.rb, line 199
def tty?
  STDOUT.tty?
end
Source code GitHub
# File railties/lib/rails/command/base.rb, line 184
def with_actionable_errors_retried(&block)
  block.call
rescue ActiveSupport::ActionableError => e
  puts e.to_s.strip
  exit 1 unless tty?

  ActiveSupport::ActionableError.actions(e).each_key do |action_name|
    if yes? "#{action_name}? [Yn]"
      ActiveSupport::ActionableError.dispatch(e, action_name)
      return with_actionable_errors_retried(&block)
    end
  end
  exit 1
end

Definition files