From 1e5cce99a9ad91df1bb0b2d91368718853a7f639 Mon Sep 17 00:00:00 2001 From: DavHau Date: Fri, 21 Jul 2023 01:00:06 +0200 Subject: [PATCH] clan-cli: manage sub-commands via python argparse --- pkgs/clan-cli/clan.py | 29 ++++-------- pkgs/clan-cli/clan_admin.py | 90 +++++++++++++++++++----------------- pkgs/clan-cli/pyproject.toml | 2 +- 3 files changed, 58 insertions(+), 63 deletions(-) diff --git a/pkgs/clan-cli/clan.py b/pkgs/clan-cli/clan.py index 2310d8b7..8fcdf0c7 100755 --- a/pkgs/clan-cli/clan.py +++ b/pkgs/clan-cli/clan.py @@ -1,24 +1,15 @@ # !/usr/bin/env python3 -import subprocess -import sys +import argparse + +import clan_admin -def showhelp() -> None: - print(''' - usage: - clan admin ... - clan join ... - clan delete ... - ''') +# this will be the entrypoint under /bin/clan (see pyproject.toml config) +def clan() -> None: + parser = argparse.ArgumentParser(description="cLAN tool") + subparsers = parser.add_subparsers() + # init clan admin + parser_admin = subparsers.add_parser("admin") + clan_admin.make_parser(parser_admin) -try: - cmd = f'clan-{sys.argv[1]}' -except: # noqa - showhelp() - -try: - subprocess.Popen([cmd] + sys.argv[2:]) -except FileNotFoundError: - print(f'command {cmd} not found') - exit(2) diff --git a/pkgs/clan-cli/clan_admin.py b/pkgs/clan-cli/clan_admin.py index cafd5974..537aa275 100755 --- a/pkgs/clan-cli/clan_admin.py +++ b/pkgs/clan-cli/clan_admin.py @@ -69,54 +69,58 @@ def git(args: argparse.Namespace) -> None: ] + args.git_args ) +# takes a (sub)parser and configures it +def make_parser(parser: argparse.ArgumentParser) -> None: + parser.add_argument( + "-f", + "--folder", + help="the folder where the clan is defined, default to the current folder", + default=os.environ["PWD"], + ) + subparser = parser.add_subparsers( + title="command", + description="the command to run", + help="the command to run", + required=True, + ) -parser = argparse.ArgumentParser(description="clan-admin") -parser.add_argument( - "-f", - "--folder", - help="the folder where the clan is defined, default to the current folder", - default=os.environ["PWD"], -) -subparser = parser.add_subparsers( - title="command", - description="the command to run", - help="the command to run", - required=True, -) + parser_create = subparser.add_parser("create", help="create a new clan") + parser_create.set_defaults(func=create) -parser_create = subparser.add_parser("create", help="create a new clan") -parser_create.set_defaults(func=create) + parser_edit = subparser.add_parser("edit", help="edit a clan") + parser_edit.set_defaults(func=edit) -parser_edit = subparser.add_parser("edit", help="edit a clan") -parser_edit.set_defaults(func=edit) + parser_rebuild = subparser.add_parser( + "rebuild", help="build configuration of a clan and push it to the target" + ) + parser_rebuild.add_argument( + "--host", help="specify single host to rebuild", default=None + ) + parser_rebuild.set_defaults(func=rebuild) -parser_rebuild = subparser.add_parser( - "rebuild", help="build configuration of a clan and push it to the target" -) -parser_rebuild.add_argument( - "--host", help="specify single host to rebuild", default=None -) -parser_rebuild.set_defaults(func=rebuild) + parser_destroy = subparser.add_parser( + "destroy", help="destroy a clan, including all the machines" + ) + parser_destroy.add_argument( + "--yes", help="specify single host to rebuild", action="store_true" + ) + parser_destroy.set_defaults(func=destroy) -parser_destroy = subparser.add_parser( - "destroy", help="destroy a clan, including all the machines" -) -parser_destroy.add_argument( - "--yes", help="specify single host to rebuild", action="store_true" -) -parser_destroy.set_defaults(func=destroy) + parser_backup = subparser.add_parser( + "backup", help="backup all the state of all machines in a clan or just a single one" + ) + parser_backup.add_argument( + "--host", help="specify single host to rebuild", default=None + ) + parser_backup.set_defaults(func=backup) -parser_backup = subparser.add_parser( - "backup", help="backup all the state of all machines in a clan or just a single one" -) -parser_backup.add_argument( - "--host", help="specify single host to rebuild", default=None -) -parser_backup.set_defaults(func=backup) + parser_git = subparser.add_parser("git", help="control the clan repo via git") + parser_git.add_argument("git_args", nargs="*") + parser_git.set_defaults(func=git) -parser_git = subparser.add_parser("git", help="control the clan repo via git") -parser_git.add_argument("git_args", nargs="*") -parser_git.set_defaults(func=git) -args = parser.parse_args() -args.func(args) +# entry point if this file is executed directly +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="clan-admin") + args = parser.parse_args() + args.func(args) diff --git a/pkgs/clan-cli/pyproject.toml b/pkgs/clan-cli/pyproject.toml index cbf9dc67..f395f23d 100644 --- a/pkgs/clan-cli/pyproject.toml +++ b/pkgs/clan-cli/pyproject.toml @@ -9,7 +9,7 @@ include = ["clan.py"] name = "clan" description = "cLAN CLI tool" dynamic = ["version"] -scripts = {clan = "clan:my_cli"} +scripts = {clan = "clan:clan"} [tool.pytest.ini_options] addopts = "--cov . --cov-report term --cov-fail-under=100 --no-cov-on-fail"