diff --git a/podman_compose.py b/podman_compose.py index 69a6a6d8..5bd05bc0 100755 --- a/podman_compose.py +++ b/podman_compose.py @@ -862,6 +862,85 @@ def flat_deps(services, with_extends=False): for name, srv in services.items(): rec_deps(services, name) + +def argparse2dict(parser): + from collections import OrderedDict + jsonargs = OrderedDict() + jsonargs["program"] = parser.prog or "" + jsonargs["usage"] = parser.usage or "" # or parser.format_usage() + + jsonargs["commands"] = [] + # https://stackoverflow.com/questions/20094215/argparse#20096044 + # parser._subparsers -> _ArgumentGroup + # parser._actions -> [...] + for action in parser._actions: + # filter commands + if isinstance(action, argparse._SubParsersAction): + # _SubParsersAction.choices -> {'command': ArgumentParser, ...} + # _SubParsersAction._choices_actions -> [_ChoicesPseudoAction, ...] + for pseudo_action in action._choices_actions: + command = pseudo_action.dest + help_ = pseudo_action.help + entry = OrderedDict(command=command, help=help_) + jsonargs["commands"].append(entry) + + jsonargs["options"] = [] + for action in parser._actions: + # filter options + if not isinstance(action, argparse._SubParsersAction): + # option_strings -> ["-h", "--help"] + opts = action.option_strings + if len(opts) == 1: + short, long = opts[0], "" + if opts[0].startswith('--'): + short, long = long, short + elif len(opts) == 2: + short, long = opts + else: + sys.exit("too many options, please fill an issue") + + choices = [] + if action.metavar: + metavar = action.metavar + elif action.choices: + metavar = action.dest + choices = action.choices + else: + metavar = "" + default = action.default or "" + + entry = OrderedDict(short=short, long=long, metavar=metavar, + choices=choices, default=default, + help=action.help) + + jsonargs["options"].append(entry) + return jsonargs + +def argparse2json(parser): + argdict = argparse2dict(parser) + return json.dumps(argdict, indent=2) + +def print_help(parser): + argdict = argparse2dict(parser) + + print("""\ +usage: {program} [options] [command] +""".format(**argdict)) + + print("commands:") + commands = sorted(argdict["commands"], key=lambda x: x["command"]) + comwidth = max([len(x["command"]) for x in commands])+1 + for c in commands: + print(" {c[command]:{width}} {c[help]}".format(c=c, width=comwidth)) + + print("\noptions:") + for o in argdict["options"]: + olong = f"{o['long']} {o['metavar'].upper()}" + print(f" {o['short']:2} {olong:26} {o['help']}") + # o['choices'] o['default'] + + #parser.print_help() + ################### # podman and compose classes ################### @@ -1212,7 +1291,7 @@ def _parse_args(self): if self.global_args.version: self.global_args.command = "version" if not self.global_args.command or self.global_args.command=='help': - parser.print_help() + print_help(parser) exit(-1) return self.global_args