Improve CLI output for complex commands

Complex commands may have many options or non-standard output. This
patch adds 2 improvements to handle these commands better:
  1) Add "option_group" parameter attribute
     Make command help more readable by specifying an option group
     for the parameter. All parameters in the same option group are
     then placed to one named option group
  2) Allow nested entries in the output
     Current CLI output module cannot handle a list of nested entries
     (dictionaries) contained in an entry attribute. Make sure they
     are printed properly (with indentation)

https://fedorahosted.org/freeipa/ticket/2082
This commit is contained in:
Martin Kosek 2011-12-21 14:44:58 +01:00
parent 1f36ab1b78
commit 2188dae0c9
2 changed files with 24 additions and 4 deletions

View File

@ -375,9 +375,16 @@ class textui(backend.Backend):
indent=indent+1
)
else:
self.print_attribute(
label, value, format, indent, one_value_per_line
)
if isinstance(value, (list, tuple)) and \
all(isinstance(val, dict) for val in value):
# this is a list of entries (dicts), not values
self.print_attribute(label, u'', format, indent)
self.print_entries(value, order, labels, flags, print_all,
format, indent+1)
else:
self.print_attribute(
label, value, format, indent, one_value_per_line
)
del entry[key]
if print_all:
for key in sorted(entry):
@ -1002,6 +1009,7 @@ class cli(backend.Executioner):
parser = optparse.OptionParser(
usage=' '.join(self.usage_iter(cmd))
)
option_groups = {}
for option in cmd.options():
kw = dict(
dest=option.name,
@ -1025,7 +1033,18 @@ class cli(backend.Executioner):
o = optparse.make_option('-%s' % option.cli_short_name, '--%s' % to_cli(option.cli_name), **kw)
else:
o = optparse.make_option('--%s' % to_cli(option.cli_name), **kw)
parser.add_option(o)
if option.option_group is not None:
option_group = option_groups.get(option.option_group)
if option_group is None:
option_group = optparse.OptionGroup(parser,
option.option_group)
parser.add_option_group(option_group)
option_groups[option.option_group] = option_group
option_group.add_option(o)
else:
parser.add_option(o)
return parser
def usage_iter(self, cmd):

View File

@ -384,6 +384,7 @@ class Param(ReadOnly):
('csv', bool, False),
('csv_separator', str, ','),
('csv_skipspace', bool, True),
('option_group', unicode, None),
# The 'default' kwarg gets appended in Param.__init__():
# ('default', self.type, None),