diff options
author | Martin Kosek <mkosek@redhat.com> | 2011-12-21 14:44:58 +0100 |
---|---|---|
committer | Martin Kosek <mkosek@redhat.com> | 2012-01-12 09:43:13 +0100 |
commit | 2188dae0c91712015cd5947fc9d61597ec2e95fa (patch) | |
tree | ce7f033e5d03e4bfb99699a62f077bbab86e3249 /ipalib | |
parent | 1f36ab1b780f488869f2880b79a3127840438cc9 (diff) | |
download | freeipa-2188dae0c91712015cd5947fc9d61597ec2e95fa.tar.gz freeipa-2188dae0c91712015cd5947fc9d61597ec2e95fa.tar.xz freeipa-2188dae0c91712015cd5947fc9d61597ec2e95fa.zip |
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
Diffstat (limited to 'ipalib')
-rw-r--r-- | ipalib/cli.py | 27 | ||||
-rw-r--r-- | ipalib/parameters.py | 1 |
2 files changed, 24 insertions, 4 deletions
diff --git a/ipalib/cli.py b/ipalib/cli.py index 7d79775ef..667a7cdc4 100644 --- a/ipalib/cli.py +++ b/ipalib/cli.py @@ -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): diff --git a/ipalib/parameters.py b/ipalib/parameters.py index 22144b7cb..be210864f 100644 --- a/ipalib/parameters.py +++ b/ipalib/parameters.py @@ -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), |