summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Hellmann <doug.hellmann@dreamhost.com>2012-06-01 10:54:18 -0400
committerDoug Hellmann <doug.hellmann@dreamhost.com>2012-06-01 10:54:18 -0400
commit748ef2b230588c66e240ceb93471b0ceaeca1f8e (patch)
tree17ad5c9ba4e374cd3668a7201d47c1724b2cb204
parent9059e9538a449f0fc36ad4b43cadc6bd8a2f1e0e (diff)
downloadcliff-tablib-748ef2b230588c66e240ceb93471b0ceaeca1f8e.tar.gz
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.
-rw-r--r--cliff/display.py17
-rw-r--r--cliff/lister.py11
-rw-r--r--cliff/show.py11
-rw-r--r--demoapp/cliffdemo/list.py2
-rw-r--r--demoapp/cliffdemo/show.py2
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',