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:
parent
9059e9538a
commit
748ef2b230
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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('.'))
|
||||
)
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue