merge API refactoring work

This commit is contained in:
Doug Hellmann 2012-06-18 18:13:59 -04:00
commit 9bb0a4a13a
9 changed files with 35 additions and 30 deletions

View File

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

View File

@ -70,14 +70,17 @@ class DisplayCommandBase(Command):
return parser
@abc.abstractmethod
def get_data(self, parsed_args):
"""Return a two-part tuple with a tuple of column names
and a tuple of values.
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
"""
@abc.abstractmethod
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)
self.formatter = self.formatters[parsed_args.formatter]
column_names, data = self.take_action(parsed_args)
self.produce_output(parsed_args, column_names, data)
return 0

View File

@ -36,7 +36,7 @@ class HelpCommand(Command):
)
return parser
def run(self, parsed_args):
def take_action(self, parsed_args):
if parsed_args.cmd:
try:
the_cmd = self.app.command_manager.find_command(

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,10 +49,9 @@ 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,10 +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',

View File

@ -6,7 +6,7 @@ class TestCommand(Command):
"""Description of command.
"""
def run(self, parsed_args):
def take_action(self, parsed_args):
return

View File

@ -28,7 +28,7 @@ class TestCommand(Command):
# so parse_args() is called.
return TestParser()
def run(self, args):
def take_action(self, args):
return