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.
This commit is contained in:
Doug Hellmann 2012-06-01 10:54:18 -04:00
parent 9059e9538a
commit 748ef2b230
5 changed files with 27 additions and 16 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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('.'))
)

View File

@ -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',