123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #!/usr/bin/env python
- import os
- import click
- from click.formatting import join_options
- from sentry.runner import cli as root_command
- def get_opts(param):
- any_prefix_is_slash = []
- def _write(opts):
- rv, any_slashes = join_options(opts)
- if any_slashes:
- any_prefix_is_slash[:] = [True]
- if not param.is_flag and not param.count:
- rv += " " + param.make_metavar()
- return rv
- rv = [_write(param.opts)]
- if param.secondary_opts:
- rv.append(_write(param.secondary_opts))
- return (any_prefix_is_slash and "; " or " / ").join(rv)
- def write_page(out, data):
- path = data["path"]
- filename = os.path.join(out, *path[1:]) + "/index.rst"
- if len(path) == 1:
- filename += ".inc"
- dirname = os.path.dirname(filename)
- os.makedirs(dirname, exist_ok=True)
- args = [x["metavar"] for x in data["arguments"]]
- title = "`%s`" % " ".join(data["path"] + args)
- body = [title, "-" * len(title), "", data["help"] or ""]
- body.append("")
- body.append("Options")
- body.append("```````")
- body.append("")
- for opt in data["options"]:
- prefix = "- ``%s``: " % opt["opt_string"]
- for line in click.wrap_text(opt["help"], 74, prefix, " ").splitlines() or [""]:
- body.append(line)
- body.append("- ``--help``: print this help page.")
- if data["subcommands"]:
- body.append("")
- body.append("Subcommands")
- body.append("```````````")
- body.append("")
- body.append(".. toctree::")
- body.append(" :maxdepth: 1")
- body.append("")
- for subcmd in data["subcommands"]:
- body.append(f" {subcmd} <{subcmd}/index>")
- body.append("")
- with open(filename, "w") as f:
- for line in body:
- f.write("%s\n" % line.encode("utf-8"))
- class NoHelp(Exception):
- pass
- def dump_command(out, cmd, path):
- if cmd.help is None:
- raise NoHelp
- data = {
- "path": path,
- "help": cmd.help.replace("\b", ""),
- "options": [],
- "arguments": [],
- "subcommands": [],
- }
- for param in cmd.params:
- if isinstance(param, click.Option):
- help_text = param.help or ""
- if param.show_default:
- help_text += " [default: %s]" % (
- ", ".join("%s" % d for d in param.default)
- if isinstance(param.default, (list, tuple))
- else (param.default,)
- )
- data["options"].append({"opt_string": get_opts(param), "help": help_text})
- else:
- data["arguments"].append({"metavar": param.make_metavar()})
- if isinstance(cmd, click.Group):
- for child_name, child_cmd in cmd.commands.items():
- try:
- dump_command(out, child_cmd, path + [child_name])
- except NoHelp:
- pass
- else:
- data["subcommands"].append(child_name)
- write_page(out, data)
- @click.command()
- @click.option("--output-path", "out", type=click.Path(), default="build/cli-help")
- def cli(out):
- dump_command(out, root_command, ["sentry"])
- if __name__ == "__main__":
- cli()
|