The command manager registers and installs all the individual sub-commands supported by the gem command.
Extra commands can be provided by writing a rubygems_plugin.rb file in an installed gem. You should register your command against the Gem::CommandManager instance, like this:
# file rubygems_plugin.rb require 'rubygems/command_manager' Gem::CommandManager.instance.register_command :edit
You should put the implementation of your command in rubygems/commands.
# file rubygems/commands/edit_command.rb class Gem::Commands::EditCommand < Gem::Command # ... end
See Gem::Command for instructions on writing gem commands.
Return the authoritative instance of the command manager.
# File rubygems/command_manager.rb, line 73
def self.instance
@command_manager ||= new
end
Returns a Command instance for command_name
# File rubygems/command_manager.rb, line 121
def [](command_name)
command_name = command_name.intern
return nil if @commands[command_name].nil?
@commands[command_name] ||= load_and_instantiate(command_name)
end
Return a sorted list of all command names as strings.
# File rubygems/command_manager.rb, line 130
def command_names
@commands.keys.collect {|key| key.to_s}.sort
end
# File rubygems/command_manager.rb, line 172
def find_command(cmd_name)
possibilities = find_command_possibilities cmd_name
if possibilities.size > 1 then
raise Gem::CommandLineError,
"Ambiguous command #{cmd_name} matches [#{possibilities.join(', ')}]"
elsif possibilities.empty? then
raise Gem::CommandLineError, "Unknown command #{cmd_name}"
end
self[possibilities.first]
end
# File rubygems/command_manager.rb, line 185
def find_command_possibilities(cmd_name)
len = cmd_name.length
found = command_names.select { |name| cmd_name == name[0, len] }
exact = found.find { |name| name == cmd_name }
exact ? [exact] : found
end
Returns self. Allows a CommandManager instance to stand in for the class itself.
# File rubygems/command_manager.rb, line 81
def instance
self
end
# File rubygems/command_manager.rb, line 149
def process_args(args, build_args=nil)
if args.empty? then
say Gem::Command::HELP
terminate_interaction 1
end
case args.first
when '-h', '--help' then
say Gem::Command::HELP
terminate_interaction 0
when '-v', '--version' then
say Gem::VERSION
terminate_interaction 0
when /^-/ then
alert_error "Invalid option: #{args.first}. See 'gem --help'."
terminate_interaction 1
else
cmd_name = args.shift.downcase
cmd = find_command cmd_name
cmd.invoke_with_build_args args, build_args
end
end
Register the Symbol command as a gem command.
# File rubygems/command_manager.rb, line 107
def register_command(command, obj=false)
@commands[command] = obj
end
Run the command specified by args.
# File rubygems/command_manager.rb, line 137
def run(args, build_args=nil)
process_args(args, build_args)
rescue StandardError, Timeout::Error => ex
alert_error "While executing gem ... (#{ex.class})\n #{ex}"
ui.backtrace ex
terminate_interaction(1)
rescue Interrupt
alert_error "Interrupted"
terminate_interaction(1)
end
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.