Add 'command list' command

* Add method to CommandManager to retrieve command names by group
* Add ListCommands

To list command groups loaded by cliff

Change-Id: I37fe2471aa2fafa8aa223159452d52b1981021d6
This commit is contained in:
Dean Troyer 2014-08-27 23:26:42 -05:00
parent 5b6c24fdb0
commit d32185cb34
5 changed files with 81 additions and 0 deletions

View File

@ -16,6 +16,7 @@
"""Modify cliff.CommandManager"""
import logging
import pkg_resources
import cliff.commandmanager
@ -46,3 +47,17 @@ class CommandManager(cliff.commandmanager.CommandManager):
def get_command_groups(self):
"""Returns a list of the loaded command groups"""
return self.group_list
def get_command_names(self, group=None):
"""Returns a list of commands loaded for the specified group"""
group_list = []
if group is not None:
for ep in pkg_resources.iter_entry_points(group):
cmd_name = (
ep.name.replace('_', ' ')
if self.convert_underscores
else ep.name
)
group_list.append(cmd_name)
return group_list
return self.commands.keys()

View File

@ -19,9 +19,25 @@ import logging
import six
import sys
from cliff import lister
from cliff import show
class ListCommand(lister.Lister):
"""List recognized commands by group"""
auth_required = False
log = logging.getLogger(__name__ + '.ListCommand')
def take_action(self, parsed_args):
self.log.debug('take_action(%s)', parsed_args)
cm = self.app.command_manager
groups = cm.get_command_groups()
columns = ('Command Group', 'Commands')
return (columns, ((c, cm.get_command_names(group=c)) for c in groups))
class ListModule(show.ShowOne):
"""List module versions"""

View File

@ -86,3 +86,20 @@ class TestCommandManager(utils.TestCase):
gl = mgr.get_command_groups()
self.assertEqual(['test', 'greek'], gl)
def test_get_command_names(self):
mock_cmd_one = mock.Mock()
mock_cmd_one.name = 'one'
mock_cmd_two = mock.Mock()
mock_cmd_two.name = 'cmd two'
mock_pkg_resources = mock.Mock(
return_value=[mock_cmd_one, mock_cmd_two],
)
with mock.patch(
'pkg_resources.iter_entry_points',
mock_pkg_resources,
) as iter_entry_points:
mgr = commandmanager.CommandManager('test')
assert iter_entry_points.called_once_with('test')
cmds = mgr.get_command_names('test')
self.assertEqual(['one', 'cmd two'], cmds)

View File

@ -42,6 +42,38 @@ MODULES = {
}
class TestCommandList(utils.TestCommand):
def setUp(self):
super(TestCommandList, self).setUp()
self.app.command_manager = mock.Mock()
self.app.command_manager.get_command_groups.return_value = ['test']
self.app.command_manager.get_command_names.return_value = [
'one',
'cmd two',
]
# Get the command object to test
self.cmd = osc_module.ListCommand(self.app, None)
def test_command_list_no_options(self):
arglist = []
verifylist = []
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
# DisplayCommandBase.take_action() returns two tuples
columns, data = self.cmd.take_action(parsed_args)
collist = ('Command Group', 'Commands')
self.assertEqual(collist, columns)
datalist = ((
'test',
['one', 'cmd two'],
), )
self.assertEqual(datalist, tuple(data))
@mock.patch.dict(
'openstackclient.common.module.sys.modules',
values=MODULES,

View File

@ -28,6 +28,7 @@ console_scripts =
openstack = openstackclient.shell:main
openstack.cli =
command_list = openstackclient.common.module:ListCommand
module_list = openstackclient.common.module:ListModule
openstack.cli.base =