From 73dbad0167e9d2a065b81ed9618754f76047faf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Fri, 21 Jul 2023 11:30:33 +0200 Subject: [PATCH 1/4] clan-cli: drop duplicate entrypoint not sure what's the use case of multiple main function is --- pkgs/clan-cli/clan_admin.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pkgs/clan-cli/clan_admin.py b/pkgs/clan-cli/clan_admin.py index 7b216fc..b7f8638 100755 --- a/pkgs/clan-cli/clan_admin.py +++ b/pkgs/clan-cli/clan_admin.py @@ -117,13 +117,3 @@ def make_parser(parser: argparse.ArgumentParser) -> None: 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) - - -def clan_admin() -> None: # pragma: no cover - parser = argparse.ArgumentParser(description="clan-admin") - args = parser.parse_args() - args.func(args) - -# entry point if this file is executed directly -if __name__ == "__main__": # pragma: no cover - clan_admin() From 0bf3f42812da728eff27dfbfa96c6d30309bad7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Fri, 21 Jul 2023 11:38:05 +0200 Subject: [PATCH 2/4] clan-cli: restructure according to python's module standard --- pkgs/clan-cli/{clan.py => clan_cli/__init__.py} | 10 ++++++---- pkgs/clan-cli/{clan_admin.py => clan_cli/admin.py} | 2 +- pkgs/clan-cli/pyproject.toml | 5 +---- 3 files changed, 8 insertions(+), 9 deletions(-) rename pkgs/clan-cli/{clan.py => clan_cli/__init__.py} (81%) rename pkgs/clan-cli/{clan_admin.py => clan_cli/admin.py} (98%) diff --git a/pkgs/clan-cli/clan.py b/pkgs/clan-cli/clan_cli/__init__.py similarity index 81% rename from pkgs/clan-cli/clan.py rename to pkgs/clan-cli/clan_cli/__init__.py index 45261fb..ab44842 100755 --- a/pkgs/clan-cli/clan.py +++ b/pkgs/clan-cli/clan_cli/__init__.py @@ -8,19 +8,21 @@ try: except ImportError: has_argcomplete = False -import clan_admin +from . import admin # this will be the entrypoint under /bin/clan (see pyproject.toml config) -def clan() -> None: +def main() -> 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) + admin.register_parser(parser_admin) if has_argcomplete: argcomplete.autocomplete(parser) parser.parse_args() if len(sys.argv) == 1: parser.print_help() + +if __name__ == "__main__": + main() diff --git a/pkgs/clan-cli/clan_admin.py b/pkgs/clan-cli/clan_cli/admin.py similarity index 98% rename from pkgs/clan-cli/clan_admin.py rename to pkgs/clan-cli/clan_cli/admin.py index b7f8638..8cd75c5 100755 --- a/pkgs/clan-cli/clan_admin.py +++ b/pkgs/clan-cli/clan_cli/admin.py @@ -70,7 +70,7 @@ def git(args: argparse.Namespace) -> None: # pragma: no cover ) # takes a (sub)parser and configures it -def make_parser(parser: argparse.ArgumentParser) -> None: +def register_parser(parser: argparse.ArgumentParser) -> None: parser.add_argument( "-f", "--folder", diff --git a/pkgs/clan-cli/pyproject.toml b/pkgs/clan-cli/pyproject.toml index 33d3eb4..f763cdc 100644 --- a/pkgs/clan-cli/pyproject.toml +++ b/pkgs/clan-cli/pyproject.toml @@ -2,14 +2,11 @@ requires = ["setuptools"] build-backend = "setuptools.build_meta" -[tool.setuptools.packages.find] -include = ["clan.py"] - [project] name = "clan" description = "cLAN CLI tool" dynamic = ["version"] -scripts = {clan = "clan:clan"} +scripts = {clan = "clan_cli:main"} [tool.pytest.ini_options] addopts = "--cov . --cov-report term --cov-fail-under=100 --no-cov-on-fail" From 926de547e20afe37b18aba6a1c67426c1e0c690c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Fri, 21 Jul 2023 12:48:26 +0200 Subject: [PATCH 3/4] clan-cli/tests: reformat --- pkgs/clan-cli/tests/test_cli.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkgs/clan-cli/tests/test_cli.py b/pkgs/clan-cli/tests/test_cli.py index 94d94cc..d9213dc 100644 --- a/pkgs/clan-cli/tests/test_cli.py +++ b/pkgs/clan-cli/tests/test_cli.py @@ -1,8 +1,7 @@ import sys -import pytest - import clan +import pytest def test_no_args(capsys): From 3ce01871e57cc55f22374936a51050967719db99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Fri, 21 Jul 2023 13:03:51 +0200 Subject: [PATCH 4/4] fix black and ruff checks --- pkgs/clan-cli/clan_cli/__init__.py | 5 +++-- pkgs/clan-cli/clan_cli/admin.py | 15 +++++++++------ pkgs/clan-cli/tests/test_clan_admin.py | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/pkgs/clan-cli/clan_cli/__init__.py b/pkgs/clan-cli/clan_cli/__init__.py index ab44842..77d969f 100755 --- a/pkgs/clan-cli/clan_cli/__init__.py +++ b/pkgs/clan-cli/clan_cli/__init__.py @@ -2,14 +2,14 @@ import argparse import sys +from . import admin + has_argcomplete = True try: import argcomplete except ImportError: has_argcomplete = False -from . import admin - # this will be the entrypoint under /bin/clan (see pyproject.toml config) def main() -> None: @@ -24,5 +24,6 @@ def main() -> None: if len(sys.argv) == 1: parser.print_help() + if __name__ == "__main__": main() diff --git a/pkgs/clan-cli/clan_cli/admin.py b/pkgs/clan-cli/clan_cli/admin.py index 8cd75c5..bf438f8 100755 --- a/pkgs/clan-cli/clan_cli/admin.py +++ b/pkgs/clan-cli/clan_cli/admin.py @@ -34,7 +34,7 @@ def edit(args: argparse.Namespace) -> None: # pragma: no cover ) -def rebuild(args: argparse.Namespace) -> None: # pragma: no cover +def rebuild(args: argparse.Namespace) -> None: # pragma: no cover # TODO get clients from zerotier cli? if args.host: print(f"would redeploy {args.host} from clan {args.folder}") @@ -42,7 +42,7 @@ def rebuild(args: argparse.Namespace) -> None: # pragma: no cover print(f"would redeploy all hosts from clan {args.folder}") -def destroy(args: argparse.Namespace) -> None: # pragma: no cover +def destroy(args: argparse.Namespace) -> None: # pragma: no cover # TODO get clan folder & hosts from somwhere (maybe ~/.config/clan/$name /) # send some kind of kill signal, then remove the folder if args.yes: @@ -53,22 +53,24 @@ def destroy(args: argparse.Namespace) -> None: # pragma: no cover ) -def backup(args: argparse.Namespace) -> None: # pragma: no cover +def backup(args: argparse.Namespace) -> None: # pragma: no cover if args.host: print(f"would backup {args.host} from clan {args.folder}") else: print(f"would backup all hosts from clan {args.folder}") -def git(args: argparse.Namespace) -> None: # pragma: no cover +def git(args: argparse.Namespace) -> None: # pragma: no cover subprocess.Popen( [ "git", "-C", args.folder, - ] + args.git_args + ] + + args.git_args ) + # takes a (sub)parser and configures it def register_parser(parser: argparse.ArgumentParser) -> None: parser.add_argument( @@ -107,7 +109,8 @@ def register_parser(parser: argparse.ArgumentParser) -> None: 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" + "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 diff --git a/pkgs/clan-cli/tests/test_clan_admin.py b/pkgs/clan-cli/tests/test_clan_admin.py index 4440242..a2e35ef 100644 --- a/pkgs/clan-cli/tests/test_clan_admin.py +++ b/pkgs/clan-cli/tests/test_clan_admin.py @@ -7,6 +7,7 @@ def test_make_parser(): parser = argparse.ArgumentParser() clan_admin.make_parser(parser) + # using fp fixture from pytest-subprocess def test_create(fp): cmd = ["nix", "flake", "init", "-t", fp.any()] @@ -14,4 +15,3 @@ def test_create(fp): args = argparse.Namespace(folder="./my-clan") clan_admin.create(args) assert fp.call_count(cmd) == 1 -