Class: Gem::CommandManager

Inherits:
Object
  • Object
show all
Includes:
UserInteraction
Defined in:
lib/rubygems/command_manager.rb

Overview

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'

class Gem::Commands::EditCommand < Gem::Command
  # ...
end

Gem::CommandManager.instance.register_command :edit

See Gem::Command for instructions on writing gem commands.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from UserInteraction

#alert, #alert_error, #alert_warning, #ask, #ask_for_password, #ask_yes_no, #choose_from_list, #say, #terminate_interaction

Methods included from DefaultUserInteraction

ui, #ui, ui=, #ui=, use_ui, #use_ui

Constructor Details

#initializeCommandManager

Register all the subcommands supported by the gem command.



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/rubygems/command_manager.rb', line 50

def initialize
  require 'timeout'
  @commands = {}
  register_command :build
  register_command :cert
  register_command :check
  register_command :cleanup
  register_command :contents
  register_command :dependency
  register_command :environment
  register_command :fetch
  register_command :generate_index
  register_command :help
  register_command :install
  register_command :list
  register_command :lock
  register_command :outdated
  register_command :owner
  register_command :pristine
  register_command :push
  register_command :query
  register_command :rdoc
  register_command :search
  register_command :server
  register_command :sources
  register_command :specification
  register_command :stale
  register_command :uninstall
  register_command :unpack
  register_command :update
  register_command :which
end

Class Method Details

.instanceObject

Return the authoritative instance of the command manager.



36
37
38
# File 'lib/rubygems/command_manager.rb', line 36

def self.instance
  @command_manager ||= new
end

.resetObject

Reset the authoritative instance of the command manager.



43
44
45
# File 'lib/rubygems/command_manager.rb', line 43

def self.reset
  @command_manager = nil
end

Instance Method Details

#[](command_name) ⇒ Object

Return the registered command from the command name.



100
101
102
103
104
# File 'lib/rubygems/command_manager.rb', line 100

def [](command_name)
  command_name = command_name.intern
  return nil if @commands[command_name].nil?
  @commands[command_name] ||= load_and_instantiate(command_name)
end

#command_namesObject

Return a sorted list of all command names (as strings).



109
110
111
# File 'lib/rubygems/command_manager.rb', line 109

def command_names
  @commands.keys.collect {|key| key.to_s}.sort
end

#find_command(cmd_name) ⇒ Object



151
152
153
154
155
156
157
158
159
160
# File 'lib/rubygems/command_manager.rb', line 151

def find_command(cmd_name)
  possibilities = find_command_possibilities cmd_name
  if possibilities.size > 1 then
    raise "Ambiguous command #{cmd_name} matches [#{possibilities.join(', ')}]"
  elsif possibilities.size < 1 then
    raise "Unknown command #{cmd_name}"
  end

  self[possibilities.first]
end

#find_command_possibilities(cmd_name) ⇒ Object



162
163
164
165
166
# File 'lib/rubygems/command_manager.rb', line 162

def find_command_possibilities(cmd_name)
  len = cmd_name.length

  command_names.select { |n| cmd_name == n[0, len] }
end

#process_args(args) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/rubygems/command_manager.rb', line 128

def process_args(args)
  args = args.to_str.split(/\s+/) if args.respond_to?(:to_str)
  if args.size == 0
    say Gem::Command::HELP
    terminate_interaction(1)
  end
  case args[0]
  when '-h', '--help'
    say Gem::Command::HELP
    terminate_interaction(0)
  when '-v', '--version'
    say Gem::VERSION
    terminate_interaction(0)
  when /^-/
    alert_error "Invalid option: #{args[0]}.  See 'gem --help'."
    terminate_interaction(1)
  else
    cmd_name = args.shift.downcase
    cmd = find_command(cmd_name)
    cmd.invoke(*args)
  end
end

#register_command(command) ⇒ Object

Register the Symbol command as a gem command.



86
87
88
# File 'lib/rubygems/command_manager.rb', line 86

def register_command(command)
  @commands[command] = false
end

#run(args) ⇒ Object

Run the config specified by args.



116
117
118
119
120
121
122
123
124
125
126
# File 'lib/rubygems/command_manager.rb', line 116

def run(args)
  process_args(args)
rescue StandardError, Timeout::Error => ex
  alert_error "While executing gem ... (#{ex.class})\n    #{ex.to_s}"
  ui.errs.puts "\t#{ex.backtrace.join "\n\t"}" if
    Gem.configuration.backtrace
  terminate_interaction(1)
rescue Interrupt
  alert_error "Interrupted"
  terminate_interaction(1)
end

#unregister_command(command) ⇒ Object

Unregister the Symbol command as a gem command.



93
94
95
# File 'lib/rubygems/command_manager.rb', line 93

def unregister_command(command)
  @commands.delete command
end