qvm-template: Tidy up code responsible for output in {info,list} operations.

This commit is contained in:
WillyPillow 2020-08-07 02:10:57 +08:00
parent d11e74ae99
commit ed35802ca2
No known key found for this signature in database
GPG Key ID: 3839E194B1415A9C

View File

@ -865,44 +865,55 @@ def list_templates(args: argparse.Namespace,
def append_info(data, status, install_time=None): def append_info(data, status, install_time=None):
tpl_list.append((status, data, install_time)) tpl_list.append((status, data, install_time))
def list_to_output(tpls):
outputs = []
for status, grp in itertools.groupby(tpls, lambda x: x[0]):
outputs.append((status, list(map(lambda x: x[1:], grp))))
return outputs
def info_to_human_output(tpls): def info_to_human_output(tpls):
output = [] outputs = []
# TODO: Do groupby here to avoid including ``status`` in each row. for status, grp in itertools.groupby(tpls, lambda x: x[0]):
for status, data, install_time in tpls: output = []
output.append((status, 'Name', ':', data.name)) for _, data, install_time in grp:
output.append((status, 'Epoch', ':', data.epoch)) output.append(('Name', ':', data.name))
output.append((status, 'Version', ':', data.version)) output.append(('Epoch', ':', data.epoch))
output.append((status, 'Release', ':', data.release)) output.append(('Version', ':', data.version))
output.append((status, 'Size', ':', output.append(('Release', ':', data.release))
qubesadmin.utils.size_to_human(data.dlsize))) output.append(('Size', ':',
output.append((status, 'Repository', ':', data.reponame)) qubesadmin.utils.size_to_human(data.dlsize)))
output.append((status, 'Buildtime', ':', str(data.buildtime))) output.append(('Repository', ':', data.reponame))
if install_time: output.append(('Buildtime', ':', str(data.buildtime)))
output.append((status, 'Install time', ':', str(install_time))) if install_time:
output.append((status, 'URL', ':', data.url)) output.append(('Install time', ':', str(install_time)))
output.append((status, 'License', ':', data.licence)) output.append(('URL', ':', data.url))
output.append((status, 'Summary', ':', data.summary)) output.append(('License', ':', data.licence))
# Only show "Description" for the first line output.append(('Summary', ':', data.summary))
title = 'Description' # Only show "Description" for the first line
for line in data.description.splitlines(): title = 'Description'
output.append((status, title, ':', line)) for line in data.description.splitlines():
title = '' output.append((title, ':', line))
output.append((status, ' ', ' ', ' ')) # empty line title = ''
return output output.append((' ', ' ', ' ')) # empty line
outputs.append((status, output))
return outputs
def info_to_machine_output(tpls): def info_to_machine_output(tpls):
output = [] outputs = []
for status, data, install_time in tpls: for status, grp in itertools.groupby(tpls, lambda x: x[0]):
name, epoch, version, release, reponame, dlsize, \ output = []
buildtime, licence, url, summary, description = data for _, data, install_time in grp:
dlsize = str(dlsize) name, epoch, version, release, reponame, dlsize, \
buildtime = str(buildtime) buildtime, licence, url, summary, description = data
install_time = str(install_time) if install_time else '' dlsize = str(dlsize)
# TODO: Escape newlines in description? buildtime = str(buildtime)
output.append((status, name, epoch, version, release, reponame, install_time = str(install_time) if install_time else ''
dlsize, buildtime, install_time, licence, url, summary, # TODO: Escape newlines in description?
description)) output.append((name, epoch, version, release, reponame,
return output dlsize, buildtime, install_time, licence, url, summary,
description))
outputs.append((status, output))
return outputs
if operation == 'list': if operation == 'list':
append = append_list append = append_list
@ -966,16 +977,20 @@ def list_templates(args: argparse.Namespace,
if not args.machine_readable: if not args.machine_readable:
if operation == 'info': if operation == 'info':
tpl_list = info_to_human_output(tpl_list) tpl_list = info_to_human_output(tpl_list)
for status, grp in itertools.groupby(tpl_list, lambda x: x[0]): elif operation == 'list':
tpl_list = list_to_output(tpl_list)
for status, grp in tpl_list:
print(status.title()) print(status.title())
qubesadmin.tools.print_table(list(map(lambda x: x[1:], grp))) qubesadmin.tools.print_table(grp)
else: else:
if operation == 'info': if operation == 'info':
tpl_list = info_to_machine_output(tpl_list) tpl_list = info_to_machine_output(tpl_list)
for status, grp in itertools.groupby(tpl_list, lambda x: x[0]): elif operation == 'list':
tpl_list = list_to_output(tpl_list)
for status, grp in tpl_list:
print('|' + status.value) print('|' + status.value)
for line in grp: for line in grp:
print('|'.join(line[1:]) + '|') print('|'.join(line) + '|')
def search(args: argparse.Namespace, app: qubesadmin.app.QubesBase) -> None: def search(args: argparse.Namespace, app: qubesadmin.app.QubesBase) -> None:
"""Command that searches template details for given patterns. """Command that searches template details for given patterns.