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'

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.

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.



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/rubygems/command_manager.rb', line 61

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 :mirror
  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
  register_command :yank
end

Class Method Details

.instanceObject

Return the authoritative instance of the command manager.



39
40
41
# File 'lib/rubygems/command_manager.rb', line 39

def self.instance
  @command_manager ||= new
end

.resetObject

Reset the authoritative instance of the command manager.



54
55
56
# File 'lib/rubygems/command_manager.rb', line 54

def self.reset
  @command_manager = nil
end

Instance Method Details

#[](command_name) ⇒ Object

Returns a Command instance for command_name



113
114
115
116
117
# File 'lib/rubygems/command_manager.rb', line 113

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.



122
123
124
# File 'lib/rubygems/command_manager.rb', line 122

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

#find_command(cmd_name) ⇒ Object



174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/rubygems/command_manager.rb', line 174

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

#find_command_possibilities(cmd_name) ⇒ Object



187
188
189
190
191
192
193
194
195
# File 'lib/rubygems/command_manager.rb', line 187

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

#instanceObject

Returns self. Allows a CommandManager instance to stand in for the class itself.



47
48
49
# File 'lib/rubygems/command_manager.rb', line 47

def instance
  self
end

#process_args(args, build_args = nil) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/rubygems/command_manager.rb', line 149

def process_args(args, build_args=nil)
  args = args.to_str.split(/\s+/) if args.respond_to?(:to_str)

  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_command(command, obj = false) ⇒ Object

Register the Symbol command as a gem command.



99
100
101
# File 'lib/rubygems/command_manager.rb', line 99

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

#run(args, build_args = nil) ⇒ Object

Run the command specified by args.



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

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.to_s}"
  ui.backtrace ex

  if Gem.configuration.really_verbose and \
       ex.kind_of?(Gem::Exception) and ex.source_exception
    e = ex.source_exception

    ui.errs.puts "Because of: (#{e.class})\n    #{e.to_s}"
    ui.backtrace e
  end

  terminate_interaction(1)
rescue Interrupt
  alert_error "Interrupted"
  terminate_interaction(1)
end

#unregister_command(command) ⇒ Object

Unregister the Symbol command as a gem command.



106
107
108
# File 'lib/rubygems/command_manager.rb', line 106

def unregister_command(command)
  @commands.delete command
end