summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Hellmann <doug.hellmann@gmail.com>2013-11-12 18:14:37 -0500
committerDoug Hellmann <doug.hellmann@gmail.com>2013-11-12 18:14:37 -0500
commit1192cf679b105a00785f8ee3e360afb36f8e9e03 (patch)
treee96975a92b5b6a8bc9af347400fb1f45d1c16f20
parent9b77b62a687359ff9a7f35f50b13ec78b6cb8ae8 (diff)
downloadcliff-1192cf679b105a00785f8ee3e360afb36f8e9e03.tar.gz
use entry points for completion plugins
-rw-r--r--cliff/complete.py24
-rw-r--r--cliff/tests/test_complete.py1
-rw-r--r--setup.py8
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='<shell>',
- 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,