[libvirt] [jenkins-ci PATCH v4 1/5] lcitool: use subparsers for commands

Andrea Bolognani abologna at redhat.com
Mon Feb 25 13:43:11 UTC 2019


On Thu, 2019-02-21 at 16:33 +0000, Daniel P. Berrangé wrote:
> Currently only a single global parser is used for all commands. This
> means that every command accepts every argument which is undesirable as
> users don't know what to pass. It also prevents the parser from
> generating useful help information.
> 
> Python's argparse module supports multi-command binaries in a very easy
> way by adding subparsers, each of which has their own distinct
> arguments. It can then generate suitable help text on a per command
> basis. This also means commands can use positional arguments for data
> items that are always passed.
> 
>     $ ./guests/lcitool -h
>     usage: lcitool [-h] {install,update,build,hosts,projects,dockerfile} ...
> 
>     libvirt CI guest management tool
> 
>     positional arguments:
>       {install,update,build,hosts,projects,dockerfile}
>                             commands
>         install             perform unattended host installation
>         update              prepare hosts and keep them updated
>         build               build projects on hosts
>         hosts               list all known hosts
>         projects            list all known projects
>         dockerfile          generate a host docker file
> 
>     optional arguments:
>       -h, --help            show this help message and exit
> 
>     $ ./guests/lcitool install -h
>     usage: lcitool install [-h] hosts
> 
>     positional arguments:
>       hosts       list of hosts to act on (accepts globs)
> 
>     optional arguments:
>       -h, --help  show this help message and exit
> 
>     $ ./guests/lcitool dockerfile  -h
>     usage: lcitool dockerfile [-h] hosts projects
> 
>     positional arguments:
>       hosts       list of hosts to act on (accepts globs)
>       projects    list of projects to consider (accepts globs)
> 
>     optional arguments:
>       -h, --help  show this help message and exit

I feel like the usage examples are not really adding much to the
commit message, so I'd just leave them out.

On the other hand, all the examples in README.markdown are now
invalid, so you should make sure that file is updated along with
the script.

[...]
> +++ b/guests/lcitool
> @@ -307,43 +307,72 @@ class Application:
>              conflict_handler="resolve",
>              formatter_class=argparse.RawDescriptionHelpFormatter,

Since we're no longer providing our own, pre-formatted help text
and we're leaving its generation up to argparse instead, setting
formatter_class is no longer needed.

The same applies to all callers you introduce later.

[...]
> +        subparser = self._parser.add_subparsers(help="commands")

Please rename the variable to 'subparsers'. At the same time, drop
use of the 'help' parameter and set 'metavar' to 'ACTION' instead:
that will change the main help output from

  usage: lcitool [-h] {install,update,build,hosts,projects,dockerfile} ...

  libvirt CI guest management tool

  positional arguments:
    {install,update,build,hosts,projects,dockerfile}
                          commands
      install             perform unattended host installation
      ...

to a less unwieldy

  usage: lcitool [-h] ACTION ...

  libvirt CI guest management tool

  positional arguments:
    ACTION
      install   perform unattended host installation
      ...

As an aside, I don't much like how argparse takes over the '-h'
option as a shorthand for '--help', especially since up until now
it has been used to specify hosts, but I haven't found a way to
disable that behavior. I guess I can live with it :)

> +        subparser.required = True
> +        subparser.dest = "command"

Setting the 'dest' parameter is not necessary - you're not using
it anywhere.

[...]
> +        installparser.set_defaults(func=self._action_install)

Well, isn't this clever :)

[...]
> +        dockerfileparser = subparser.add_parser(
> +            "dockerfile", help="generate a host docker file",

I'd prefer if you kept the original help text here.


Everything else looks good.

-- 
Andrea Bolognani / Red Hat / Virtualization




More information about the libvir-list mailing list