From 748ef2b230588c66e240ceb93471b0ceaeca1f8e Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Fri, 1 Jun 2012 10:54:18 -0400 Subject: [PATCH] Refactor DisplayBase.run() to make it easier to override separate parts in subclasses. Rename get_data() to take_action() so subclasses that do something other than query for values have a clear place to override. --- cliff/display.py | 17 +++++++++++++---- cliff/lister.py | 11 ++++++----- cliff/show.py | 11 ++++++----- demoapp/cliffdemo/list.py | 2 +- demoapp/cliffdemo/show.py | 2 +- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/cliff/display.py b/cliff/display.py index 2d9a7f7c..6d9f522c 100644 --- a/cliff/display.py +++ b/cliff/display.py @@ -70,14 +70,23 @@ class DisplayCommandBase(Command): return parser @abc.abstractmethod - def get_data(self, parsed_args): + def take_action(self, parsed_args): """Return a two-part tuple with a tuple of column names and a tuple of values. """ @abc.abstractmethod + def produce_output(self, parsed_args, column_names, data): + """Use the formatter to generate the output. + + :param parsed_args: argparse.Namespace instance with argument values + :param column_names: sequence of strings containing names + of output columns + :param data: iterable with values matching the column names + """ + 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) + column_names, data = self.take_action(parsed_args) + self.formatter = self.formatters[parsed_args.formatter] + self.produce_output(parsed_args, column_names, data) return 0 diff --git a/cliff/lister.py b/cliff/lister.py index abf37711..c3fb9095 100644 --- a/cliff/lister.py +++ b/cliff/lister.py @@ -24,13 +24,12 @@ class Lister(DisplayCommandBase): return 'table' @abc.abstractmethod - def get_data(self, parsed_args): + def take_action(self, parsed_args): """Return a tuple containing the column names and an iterable containing the data to be listed. """ - def run(self, parsed_args): - column_names, data = self.get_data(parsed_args) + def produce_output(self, parsed_args, column_names, data): if not parsed_args.columns: columns_to_include = column_names data_gen = data @@ -50,6 +49,8 @@ class Lister(DisplayCommandBase): # list so the table formatter can ask for its length. data_gen = (list(itertools.compress(row, selector)) for row in data) - formatter = self.formatters[parsed_args.formatter] - formatter.emit_list(columns_to_include, data_gen, self.app.stdout, parsed_args) + self.formatter.emit_list(columns_to_include, + data_gen, + self.app.stdout, + parsed_args) return 0 diff --git a/cliff/show.py b/cliff/show.py index 34af0b41..39e94b13 100644 --- a/cliff/show.py +++ b/cliff/show.py @@ -24,13 +24,12 @@ class ShowOne(DisplayCommandBase): return 'table' @abc.abstractmethod - def get_data(self, parsed_args): + def take_action(self, parsed_args): """Return a two-part tuple with a tuple of column names and a tuple of values. """ - def run(self, parsed_args): - column_names, data = self.get_data(parsed_args) + def produce_output(self, parsed_args, column_names, data): if not parsed_args.columns: columns_to_include = column_names else: @@ -40,6 +39,8 @@ class ShowOne(DisplayCommandBase): selector = [(c in columns_to_include) for c in column_names] data = list(itertools.compress(data, selector)) - formatter = self.formatters[parsed_args.formatter] - formatter.emit_one(columns_to_include, data, self.app.stdout, parsed_args) + self.formatter.emit_one(columns_to_include, + data, + self.app.stdout, + parsed_args) return 0 diff --git a/demoapp/cliffdemo/list.py b/demoapp/cliffdemo/list.py index 124997fb..3dcee4ab 100644 --- a/demoapp/cliffdemo/list.py +++ b/demoapp/cliffdemo/list.py @@ -12,7 +12,7 @@ class Files(Lister): log = logging.getLogger(__name__) - def get_data(self, parsed_args): + def take_action(self, parsed_args): return (('Name', 'Size'), ((n, os.stat(n).st_size) for n in os.listdir('.')) ) diff --git a/demoapp/cliffdemo/show.py b/demoapp/cliffdemo/show.py index 54d98bea..9351148c 100644 --- a/demoapp/cliffdemo/show.py +++ b/demoapp/cliffdemo/show.py @@ -14,7 +14,7 @@ class File(ShowOne): parser.add_argument('filename', nargs='?', default='.') return parser - def get_data(self, parsed_args): + def take_action(self, parsed_args): stat_data = os.stat(parsed_args.filename) columns = ('Name', 'Size',