Support for aliasing commands

This commit is contained in:
Mitchell Hashimoto 2010-08-25 16:09:51 -07:00
parent 83b2872ddb
commit 98087243a7
4 changed files with 25 additions and 5 deletions

View File

@ -7,7 +7,9 @@ module Vagrant
class CLI < Thor class CLI < Thor
# Registers the given class with the CLI so it can be accessed. # Registers the given class with the CLI so it can be accessed.
# The class must be a subclass of either {Command} or {GroupCommand}. # The class must be a subclass of either {Command} or {GroupCommand}.
def self.register(klass, name, usage, description) def self.register(klass, name, usage, description, opts=nil)
opts ||= {}
if klass <= Command::GroupBase if klass <= Command::GroupBase
# A subclass of GroupBase is a subcommand, since it contains # A subclass of GroupBase is a subcommand, since it contains
# many smaller commands within it. # many smaller commands within it.
@ -19,6 +21,12 @@ module Vagrant
desc usage, description desc usage, description
define_method(name) { |*args| invoke klass, args } define_method(name) { |*args| invoke klass, args }
end end
if opts[:alias]
# Alises are defined for this command, so properly alias the
# newly defined method/subcommand:
map opts[:alias] => name
end
end end
end end
end end

View File

@ -29,8 +29,8 @@ module Vagrant
# #
# The description added to the class via the `desc` method will be # The description added to the class via the `desc` method will be
# used as a description for the command. # used as a description for the command.
def self.register(usage) def self.register(usage, opts=nil)
CLI.register(self, extract_name_from_usage(usage), usage, desc) CLI.register(self, extract_name_from_usage(usage), usage, desc, opts)
end end
# Extracts the name of the command from a usage string. Example: # Extracts the name of the command from a usage string. Example:

View File

@ -21,8 +21,8 @@ module Vagrant
# #
# Additionally, unlike {Base}, a description must be specified to # Additionally, unlike {Base}, a description must be specified to
# this register command, since there is no class-wide description. # this register command, since there is no class-wide description.
def self.register(usage, description) def self.register(usage, description, opts=nil)
CLI.register(self, Base.extract_name_from_usage(usage), usage, description) CLI.register(self, Base.extract_name_from_usage(usage), usage, description, opts)
end end
def initialize(args=[], options={}, config={}) def initialize(args=[], options={}, config={})

View File

@ -19,5 +19,17 @@ class CLITest < Test::Unit::TestCase
@klass.register(base, name, name, "A description") @klass.register(base, name, name, "A description")
assert @klass.subcommands.include?(name) assert @klass.subcommands.include?(name)
end end
should "alias methods if the alias option is given" do
base = Class.new(Vagrant::Command::Base) do
def execute
raise "WORKED"
end
end
name = "__test_registering_with_alias"
@klass.register(base, name, name, "A description", :alias => "--ALIAS")
assert_raises(RuntimeError) { @klass.start(["--ALIAS"], :env => mock_environment) }
end
end end
end end