From 748ef2b230588c66e240ceb93471b0ceaeca1f8e Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Fri, 1 Jun 2012 10:54:18 -0400 Subject: 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 2d9a7f7..6d9f522 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 abf3771..c3fb909 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 34af0b4..39e94b1 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 124997f..3dcee4a 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 54d98be..9351148 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', -- cgit v1.2.1 From 62724e12dc51b054a8f7f5698749cb464b7b873c Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Fri, 1 Jun 2012 11:08:51 -0500 Subject: Move take_action() to Command --- cliff/command.py | 7 +++++++ cliff/display.py | 6 ------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cliff/command.py b/cliff/command.py index 7ff526e..e369988 100644 --- a/cliff/command.py +++ b/cliff/command.py @@ -32,6 +32,13 @@ class Command(object): return parser @abc.abstractmethod + 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): """Do something useful. """ + self.take_action(parsed_args) + return 0 diff --git a/cliff/display.py b/cliff/display.py index 6d9f522..9dd2718 100644 --- a/cliff/display.py +++ b/cliff/display.py @@ -69,12 +69,6 @@ class DisplayCommandBase(Command): formatter.add_argument_group(parser) return parser - @abc.abstractmethod - 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. -- cgit v1.2.1 From 1473b678ce4219f5119ae9e98af0fa5d7e21992d Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Mon, 18 Jun 2012 18:06:32 -0400 Subject: fix help and tests for API change --- cliff/help.py | 5 +++-- tests/test_command.py | 2 +- tests/test_help.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cliff/help.py b/cliff/help.py index 1e4793e..58c1ead 100644 --- a/cliff/help.py +++ b/cliff/help.py @@ -36,10 +36,11 @@ class HelpCommand(Command): ) return parser - def run(self, parsed_args): + def take_action(self, parsed_args): if parsed_args.cmd: try: - cmd_factory, cmd_name, search_args = self.app.command_manager.find_command(parsed_args.cmd) + info = self.app.command_manager.find_command(parsed_args.cmd) + cmd_factory, cmd_name, search_args = info except ValueError: # Did not find an exact match cmd = parsed_args.cmd[0] diff --git a/tests/test_command.py b/tests/test_command.py index 8b0d217..39fde51 100644 --- a/tests/test_command.py +++ b/tests/test_command.py @@ -6,7 +6,7 @@ class TestCommand(Command): """Description of command. """ - def run(self, parsed_args): + def take_action(self, parsed_args): return diff --git a/tests/test_help.py b/tests/test_help.py index 8c7e7ed..6d67356 100644 --- a/tests/test_help.py +++ b/tests/test_help.py @@ -28,7 +28,7 @@ class TestCommand(Command): # so parse_args() is called. return TestParser() - def run(self, args): + def take_action(self, args): return -- cgit v1.2.1