diff options
author | Doug Hellmann <doug.hellmann@gmail.com> | 2013-11-12 18:22:07 -0500 |
---|---|---|
committer | Doug Hellmann <doug.hellmann@gmail.com> | 2013-11-12 18:22:07 -0500 |
commit | 95957c6d4751df8fd4aedb5f9227f7dd74b01b41 (patch) | |
tree | 71fb425fb2fd82e446fbd0fa4fec83cd1bce58b7 | |
parent | 1192cf679b105a00785f8ee3e360afb36f8e9e03 (diff) | |
download | cliff-95957c6d4751df8fd4aedb5f9227f7dd74b01b41.tar.gz |
Use stevedore to load formatter plugins
-rw-r--r-- | cliff/display.py | 28 | ||||
-rw-r--r-- | cliff/tests/test_lister.py | 7 |
2 files changed, 17 insertions, 18 deletions
diff --git a/cliff/display.py b/cliff/display.py index 44da7e1..edea1f3 100644 --- a/cliff/display.py +++ b/cliff/display.py @@ -3,7 +3,7 @@ import abc import logging -import pkg_resources +import stevedore from .command import Command @@ -18,7 +18,7 @@ class DisplayCommandBase(Command): def __init__(self, app, app_args): super(DisplayCommandBase, self).__init__(app, app_args) - self.load_formatter_plugins() + self.formatters = self._load_formatter_plugins() @abc.abstractproperty def formatter_namespace(self): @@ -28,16 +28,12 @@ class DisplayCommandBase(Command): def formatter_default(self): "String specifying the name of the default formatter." - def load_formatter_plugins(self): - self.formatters = {} - for ep in pkg_resources.iter_entry_points(self.formatter_namespace): - try: - self.formatters[ep.name] = ep.load()() - except Exception as err: - LOG.error(err) - if self.app_args.debug: - raise - return + def _load_formatter_plugins(self): + # Here so tests can override + return stevedore.ExtensionManager( + self.formatter_namespace, + invoke_on_load=True, + ) def get_parser(self, prog_name): parser = super(DisplayCommandBase, self).get_parser(prog_name) @@ -45,7 +41,7 @@ class DisplayCommandBase(Command): title='output formatters', description='output formatter options', ) - formatter_choices = sorted(self.formatters.keys()) + formatter_choices = sorted(self.formatters.names()) formatter_default = self.formatter_default if formatter_default not in formatter_choices: formatter_default = formatter_choices[0] @@ -65,8 +61,8 @@ class DisplayCommandBase(Command): metavar='COLUMN', help='specify the column(s) to include, can be repeated', ) - for name, formatter in sorted(self.formatters.items()): - formatter.add_argument_group(parser) + for formatter in self.formatters: + formatter.obj.add_argument_group(parser) return parser @abc.abstractmethod @@ -80,7 +76,7 @@ class DisplayCommandBase(Command): """ def run(self, parsed_args): - self.formatter = self.formatters[parsed_args.formatter] + self.formatter = self.formatters[parsed_args.formatter].obj column_names, data = self.take_action(parsed_args) self.produce_output(parsed_args, column_names, data) return 0 diff --git a/cliff/tests/test_lister.py b/cliff/tests/test_lister.py index c0452d5..7d1876f 100644 --- a/cliff/tests/test_lister.py +++ b/cliff/tests/test_lister.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +import weakref + from cliff.lister import Lister import mock @@ -9,6 +11,7 @@ class FauxFormatter(object): def __init__(self): self.args = [] + self.obj = weakref.proxy(self) def emit_list(self, columns, data, stdout, args): self.args.append((columns, data)) @@ -16,8 +19,8 @@ class FauxFormatter(object): class ExerciseLister(Lister): - def load_formatter_plugins(self): - self.formatters = { + def _load_formatter_plugins(self): + return { 'test': FauxFormatter(), } return |