From 1192cf679b105a00785f8ee3e360afb36f8e9e03 Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Tue, 12 Nov 2013 18:14:37 -0500 Subject: [PATCH] use entry points for completion plugins --- cliff/complete.py | 24 +++++++++++++++--------- cliff/tests/test_complete.py | 1 + setup.py | 8 +++++++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/cliff/complete.py b/cliff/complete.py index 340eb7f..fa1dd5c 100644 --- a/cliff/complete.py +++ b/cliff/complete.py @@ -5,6 +5,8 @@ import logging import six +import stevedore + from cliff import command @@ -134,6 +136,12 @@ class CompleteCommand(command.Command): log = logging.getLogger(__name__ + '.CompleteCommand') + def __init__(self, app, app_args): + super(CompleteCommand, self).__init__(app, app_args) + self._formatters = stevedore.ExtensionManager( + namespace='cliff.formatter.completion', + ) + def get_parser(self, prog_name): parser = super(CompleteCommand, self).get_parser(prog_name) parser.add_argument( @@ -146,7 +154,7 @@ class CompleteCommand(command.Command): "--shell", default='bash', metavar='', - choices=['bash', 'none'], + choices=sorted(self._formatters.names()), help="Shell being used. Use none for data only (default: bash)" ) return parser @@ -165,14 +173,12 @@ class CompleteCommand(command.Command): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - if parsed_args.name: - name = parsed_args.name - else: - name = self.app.NAME - if parsed_args.shell == "none": - shell = CompleteNoCode(name, self.app.stdout) - else: - shell = CompleteBash(name, self.app.stdout) + name = parsed_args.name or self.app.NAME + try: + shell_factory = self._formatters[parsed_args.shell].plugin + except KeyError: + raise RuntimeError('Unknown shell syntax %r' % parsed_args.shell) + shell = shell_factory(name, self.app.stdout) dicto = CompleteDictionary() for cmd in self.app.command_manager: diff --git a/cliff/tests/test_complete.py b/cliff/tests/test_complete.py index 7a650d6..b5a6bbf 100644 --- a/cliff/tests/test_complete.py +++ b/cliff/tests/test_complete.py @@ -120,6 +120,7 @@ def test_complete_command_take_action(): sot, app, cmd_mgr = given_complete_command() parsed_args = mock.Mock() parsed_args.name = "test_take" + parsed_args.shell = "bash" content = app.stdout.content assert 0 == sot.take_action(parsed_args) assert "_test_take()\n" in content[0] diff --git a/setup.py b/setup.py index 672d00c..205d5ca 100644 --- a/setup.py +++ b/setup.py @@ -17,8 +17,10 @@ except IOError: install_requires = [ 'PrettyTable>=0.6,<0.8', - 'pyparsing>=2.0.1', 'cmd2>=0.6.7', + 'pyparsing>=2.0.1', + 'six', + 'stevedore', ] try: @@ -173,6 +175,10 @@ setup( 'table = cliff.formatters.table:TableFormatter', 'shell = cliff.formatters.shell:ShellFormatter', ], + 'cliff.formatter.completion': [ + 'bash = cliff.complete:CompleteBash', + 'none = cliff.complete:CompleteNoCode', + ], }, zip_safe=False,