Skip to content

Commit a8009fb

Browse files
committed
remote/client: sphinx autoprogram workarounds
Hide intentionally undocumented subcommands and overlong lists of choices. Work around shortcomings of autoprogram's subcommand handling: - Don't show the --help, -h option for each subparser - Display aliases as `command subcommand|alias --option` - Show the "help" message of the subparser Signed-off-by: Jonas Rebmann <jre@pengutronix.de>
1 parent bacb0b3 commit a8009fb

File tree

2 files changed

+203
-541
lines changed

2 files changed

+203
-541
lines changed

labgrid/remote/client.py

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1708,8 +1708,46 @@ def __str__(self):
17081708
return self.value
17091709

17101710

1711-
def get_parser() -> argparse.ArgumentParser:
1712-
parser = argparse.ArgumentParser()
1711+
class ManpageArgumentParser(argparse.ArgumentParser):
1712+
def __init__(self, *args, **kwargs):
1713+
# print help texts in fixed width
1714+
os.environ["COLUMNS"] = "180"
1715+
1716+
# hide --help, -h
1717+
kwargs.setdefault("add_help", False)
1718+
super().__init__(*args, **kwargs)
1719+
1720+
def add_subparsers(self, **kwargs):
1721+
subparsers = super().add_subparsers(**kwargs)
1722+
original_add_parser = subparsers.add_parser
1723+
1724+
def man_add_parser(name, **kwargs):
1725+
# hide --help, -h
1726+
kwargs.setdefault("add_help", False)
1727+
1728+
# aliases are not supported by autoprogram, they lead to duplicate entries
1729+
# instead, show them as command subcommand|alias --option
1730+
aliases = kwargs.pop("aliases", [])
1731+
if aliases:
1732+
name = "|".join([name] + list(aliases))
1733+
1734+
# the "help" text is ignore by autoprogram. Move to "description" instead.
1735+
if "description" not in kwargs and "help" in kwargs:
1736+
kwargs["description"] = kwargs.pop("help")
1737+
1738+
return original_add_parser(name, **kwargs)
1739+
1740+
subparsers.add_parser = man_add_parser
1741+
return subparsers
1742+
1743+
1744+
def get_parser(for_manpage=True) -> argparse.ArgumentParser:
1745+
# if the parser is requested for manpage generation, some workarounds are needed
1746+
if for_manpage:
1747+
parser = ManpageArgumentParser()
1748+
else:
1749+
parser = argparse.ArgumentParser()
1750+
17131751
parser.add_argument(
17141752
"-x",
17151753
"--coordinator",
@@ -1747,11 +1785,13 @@ def get_parser() -> argparse.ArgumentParser:
17471785
metavar="COMMAND",
17481786
)
17491787

1750-
subparser = subparsers.add_parser("help")
1788+
# if the argparse object is to be used for manpage generation, hide some subcommands
1789+
if not for_manpage:
1790+
subparser = subparsers.add_parser("help")
17511791

1752-
subparser = subparsers.add_parser("complete")
1753-
subparser.add_argument("type", choices=["resources", "places", "matches", "match-names"])
1754-
subparser.set_defaults(func=ClientSession.complete)
1792+
subparser = subparsers.add_parser("complete")
1793+
subparser.add_argument("type", choices=["resources", "places", "matches", "match-names"])
1794+
subparser.set_defaults(func=ClientSession.complete)
17551795

17561796
subparser = subparsers.add_parser("monitor", help="monitor events from the coordinator")
17571797
subparser.set_defaults(func=ClientSession.do_monitor)
@@ -2000,7 +2040,7 @@ def get_parser() -> argparse.ArgumentParser:
20002040
"-p",
20012041
"--partition",
20022042
type=int,
2003-
choices=range(0, 256),
2043+
choices=(None if for_manpage else range(0, 256)),
20042044
metavar="0-255",
20052045
default=1,
20062046
help="partition number to mount or 0 to mount whole disk (default: %(default)s)",
@@ -2094,7 +2134,7 @@ def main():
20942134
initial_state = os.environ.get("LG_INITIAL_STATE", None)
20952135
token = os.environ.get("LG_TOKEN", None)
20962136

2097-
parser = get_parser()
2137+
parser = get_parser(for_manpage=False)
20982138

20992139
# make any leftover arguments available for some commands
21002140
args, leftover = parser.parse_known_args()

0 commit comments

Comments
 (0)