summaryrefslogtreecommitdiff
path: root/cliff/display.py
diff options
context:
space:
mode:
Diffstat (limited to 'cliff/display.py')
-rw-r--r--cliff/display.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/cliff/display.py b/cliff/display.py
new file mode 100644
index 0000000..14497fe
--- /dev/null
+++ b/cliff/display.py
@@ -0,0 +1,75 @@
+"""Application base class for displaying data.
+"""
+import abc
+import logging
+
+import pkg_resources
+
+from .command import Command
+
+
+LOG = logging.getLogger(__name__)
+
+
+class DisplayCommandBase(Command):
+ """Command base class for displaying data about a single object.
+ """
+ __metaclass__ = abc.ABCMeta
+
+ def __init__(self, app, app_args):
+ super(DisplayCommandBase, self).__init__(app, app_args)
+ self.load_formatter_plugins()
+
+ @abc.abstractproperty
+ def formatter_namespace(self):
+ "String specifying the namespace to use for loading formatter plugins."
+
+ @abc.abstractproperty
+ 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 get_parser(self, prog_name):
+ parser = super(DisplayCommandBase, self).get_parser(prog_name)
+ formatter_group = parser.add_argument_group(
+ title='output formatters',
+ description='output formatter options',
+ )
+ formatter_choices = sorted(self.formatters.keys())
+ formatter_default = self.formatter_default
+ if formatter_default not in formatter_choices:
+ formatter_default = formatter_choices[0]
+ formatter_group.add_argument(
+ '-f', '--format',
+ dest='formatter',
+ action='store',
+ choices=formatter_choices,
+ default=formatter_default,
+ help='the output format to use, defaults to %s' % formatter_default,
+ )
+ for name, formatter in sorted(self.formatters.items()):
+ formatter.add_argument_group(parser)
+ return parser
+
+ @abc.abstractmethod
+ def get_data(self, parsed_args):
+ """Return a two-part tuple with a tuple of column names
+ and a tuple of values.
+ """
+
+ @abc.abstractmethod
+ def run(self, parsed_args):
+ column_names, data = self.get_data(parsed_args)
+ formatter = self.formatters[parsed_args.formatter]
+ formatter.emit_one(column_names, data, self.app.stdout, parsed_args)
+ return 0