Class: LibGems::CommandManager

Inherits:
Object
  • Object
show all
Includes:
UserInteraction
Defined in:
lib/libgems/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 LibGems::CommandManager instance, like this:

# file rubygems_plugin.rb
require 'libgems/command_manager'

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

LibGems::CommandManager.instance.register_command :edit

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

Class Method Summary collapse

Instance Method Summary collapse

Methods included from UserInteraction

#methname

Methods included from DefaultUserInteraction

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

Constructor Details

#initializeCommandManager

Register all the subcommands supported by the gem command.



44
45
46
47
48
49
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
# File 'lib/libgems/command_manager.rb', line 44

def initialize
  @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
end

Class Method Details

.instanceObject

Return the authoritative instance of the command manager.



37
38
39
# File 'lib/libgems/command_manager.rb', line 37

def self.instance
  @command_manager ||= new
end

Instance Method Details

#[](command_name) ⇒ Object

Return the registered command from the command name.



87
88
89
90
91
# File 'lib/libgems/command_manager.rb', line 87

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).



96
97
98
# File 'lib/libgems/command_manager.rb', line 96

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

#find_command(cmd_name) ⇒ Object



138
139
140
141
142
143
144
145
146
147
# File 'lib/libgems/command_manager.rb', line 138

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



149
150
151
152
153
# File 'lib/libgems/command_manager.rb', line 149

def find_command_possibilities(cmd_name)
  len = cmd_name.length

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

#process_args(args) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/libgems/command_manager.rb', line 115

def process_args(args)
  args = args.to_str.split(/\s+/) if args.respond_to?(:to_str)
  if args.size == 0
    say LibGems::Command::HELP
    terminate_interaction(1)
  end
  case args[0]
  when '-h', '--help'
    say LibGems::Command::HELP
    terminate_interaction(0)
  when '-v', '--version'
    say "#{LibGems::NAME} #{LibGems::LIBGEMS_VERSION} (RubyGems #{LibGems::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.



80
81
82
# File 'lib/libgems/command_manager.rb', line 80

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

#run(args) ⇒ Object

Run the config specified by args.



103
104
105
106
107
108
109
110
111
112
113
# File 'lib/libgems/command_manager.rb', line 103

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
    LibGems.configuration.backtrace
  terminate_interaction(1)
rescue Interrupt
  alert_error "Interrupted"
  terminate_interaction(1)
end