From 3b889649ec02f7b80d6771e8fadb796750226adc Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Sat, 26 Apr 2025 19:47:37 +0200 Subject: [PATCH 1/3] Refactor(clan_cli): init clan_lib folder --- pkgs/clan-cli/clan_lib/__init__.py | 0 pkgs/clan-cli/clan_lib/py.typed | 0 pkgs/clan-cli/pyproject.toml | 1 + 3 files changed, 1 insertion(+) create mode 100644 pkgs/clan-cli/clan_lib/__init__.py create mode 100644 pkgs/clan-cli/clan_lib/py.typed diff --git a/pkgs/clan-cli/clan_lib/__init__.py b/pkgs/clan-cli/clan_lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pkgs/clan-cli/clan_lib/py.typed b/pkgs/clan-cli/clan_lib/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/pkgs/clan-cli/pyproject.toml b/pkgs/clan-cli/pyproject.toml index 1fcfaf7fd..2d4cc5d63 100644 --- a/pkgs/clan-cli/pyproject.toml +++ b/pkgs/clan-cli/pyproject.toml @@ -15,6 +15,7 @@ Documentation = "https://docs.clan.lol/" Repository = "https://git.clan.lol/clan/clan-core" [tool.setuptools.packages.find] +include = ["clan_lib*", "clan_cli*"] exclude = ["clan_cli.nixpkgs*", "result"] [tool.setuptools.package-data] From acbe619883eb573514171862446af0a74d6c901e Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Sat, 26 Apr 2025 19:48:00 +0200 Subject: [PATCH 2/3] Refactor(clan_lib): move clan_cli.api into clan_lib.api --- docs/nix/render_options/__init__.py | 2 +- pkgs/clan-app/clan_app/api/file_gtk.py | 4 ++-- pkgs/clan-app/clan_app/app.py | 2 +- pkgs/clan-app/clan_app/deps/webview/webview.py | 2 +- pkgs/clan-cli/api.py | 2 +- pkgs/clan-cli/clan_cli/__init__.py | 8 ++++++-- pkgs/clan-cli/clan_cli/clan/create.py | 3 ++- pkgs/clan-cli/clan_cli/clan/show.py | 3 ++- pkgs/clan-cli/clan_cli/clan/update.py | 3 ++- pkgs/clan-cli/clan_cli/flash/flash.py | 3 ++- pkgs/clan-cli/clan_cli/flash/list.py | 3 ++- pkgs/clan-cli/clan_cli/inventory/__init__.py | 3 ++- pkgs/clan-cli/clan_cli/machines/create.py | 3 ++- pkgs/clan-cli/clan_cli/machines/delete.py | 2 +- pkgs/clan-cli/clan_cli/machines/hardware.py | 3 ++- pkgs/clan-cli/clan_cli/machines/install.py | 3 ++- pkgs/clan-cli/clan_cli/machines/list.py | 9 +++++---- pkgs/clan-cli/clan_cli/machines/update.py | 3 ++- pkgs/clan-cli/clan_cli/secrets/sops.py | 3 ++- .../clan-cli/clan_cli/tests/test_api_dataclass_compat.py | 4 ++-- pkgs/clan-cli/clan_cli/tests/test_deserializers.py | 6 +++--- pkgs/clan-cli/clan_cli/tests/test_modules.py | 2 +- pkgs/clan-cli/clan_cli/tests/test_serializers.py | 2 +- pkgs/clan-cli/clan_cli/vars/get.py | 2 +- pkgs/clan-cli/clan_cli/vars/list.py | 2 +- pkgs/clan-cli/{clan_cli => clan_lib}/api/__init__.py | 0 pkgs/clan-cli/{clan_cli => clan_lib}/api/admin.py | 0 pkgs/clan-cli/{clan_cli => clan_lib}/api/cli.py | 0 pkgs/clan-cli/{clan_cli => clan_lib}/api/directory.py | 0 pkgs/clan-cli/{clan_cli => clan_lib}/api/disk.py | 5 +++-- pkgs/clan-cli/{clan_cli => clan_lib}/api/iwd.py | 0 .../{clan_cli => clan_lib}/api/mdns_discovery.py | 0 pkgs/clan-cli/{clan_cli => clan_lib}/api/modules.py | 0 pkgs/clan-cli/{clan_cli => clan_lib}/api/serde.py | 0 pkgs/clan-cli/{clan_cli => clan_lib}/api/util.py | 2 +- 35 files changed, 53 insertions(+), 36 deletions(-) rename pkgs/clan-cli/{clan_cli => clan_lib}/api/__init__.py (100%) rename pkgs/clan-cli/{clan_cli => clan_lib}/api/admin.py (100%) rename pkgs/clan-cli/{clan_cli => clan_lib}/api/cli.py (100%) rename pkgs/clan-cli/{clan_cli => clan_lib}/api/directory.py (100%) rename pkgs/clan-cli/{clan_cli => clan_lib}/api/disk.py (98%) rename pkgs/clan-cli/{clan_cli => clan_lib}/api/iwd.py (100%) rename pkgs/clan-cli/{clan_cli => clan_lib}/api/mdns_discovery.py (100%) rename pkgs/clan-cli/{clan_cli => clan_lib}/api/modules.py (100%) rename pkgs/clan-cli/{clan_cli => clan_lib}/api/serde.py (100%) rename pkgs/clan-cli/{clan_cli => clan_lib}/api/util.py (99%) diff --git a/docs/nix/render_options/__init__.py b/docs/nix/render_options/__init__.py index e8602960a..fa63c2592 100644 --- a/docs/nix/render_options/__init__.py +++ b/docs/nix/render_options/__init__.py @@ -29,8 +29,8 @@ from dataclasses import dataclass, field from pathlib import Path from typing import Any -from clan_cli.api.modules import Frontmatter, extract_frontmatter, get_roles from clan_cli.errors import ClanError +from clan_lib.api.modules import Frontmatter, extract_frontmatter, get_roles # Get environment variables CLAN_CORE_PATH = Path(os.environ["CLAN_CORE_PATH"]) diff --git a/pkgs/clan-app/clan_app/api/file_gtk.py b/pkgs/clan-app/clan_app/api/file_gtk.py index fd63f3b9c..aef9a06d7 100644 --- a/pkgs/clan-app/clan_app/api/file_gtk.py +++ b/pkgs/clan-app/clan_app/api/file_gtk.py @@ -8,8 +8,8 @@ import time from pathlib import Path from typing import Any -from clan_cli.api import ApiError, ErrorDataClass, SuccessDataClass -from clan_cli.api.directory import FileRequest +from clan_lib.api import ApiError, ErrorDataClass, SuccessDataClass +from clan_lib.api.directory import FileRequest from gi.repository import Gio, GLib, Gtk log = logging.getLogger(__name__) diff --git a/pkgs/clan-app/clan_app/app.py b/pkgs/clan-app/clan_app/app.py index e78b45caf..836e6e294 100644 --- a/pkgs/clan-app/clan_app/app.py +++ b/pkgs/clan-app/clan_app/app.py @@ -9,8 +9,8 @@ import os from dataclasses import dataclass from pathlib import Path -from clan_cli.api import API from clan_cli.custom_logger import setup_logging +from clan_lib.api import API from clan_app.api.file_gtk import open_file from clan_app.deps.webview.webview import Size, SizeHint, Webview diff --git a/pkgs/clan-app/clan_app/deps/webview/webview.py b/pkgs/clan-app/clan_app/deps/webview/webview.py index 9a6338703..4948f6754 100644 --- a/pkgs/clan-app/clan_app/deps/webview/webview.py +++ b/pkgs/clan-app/clan_app/deps/webview/webview.py @@ -6,7 +6,7 @@ from collections.abc import Callable from enum import IntEnum from typing import Any -from clan_cli.api import ( +from clan_lib.api import ( ApiError, ErrorDataClass, MethodRegistry, diff --git a/pkgs/clan-cli/api.py b/pkgs/clan-cli/api.py index da92b9f12..e9d9c09a5 100644 --- a/pkgs/clan-cli/api.py +++ b/pkgs/clan-cli/api.py @@ -1,6 +1,6 @@ import json -from clan_cli.api import API +from clan_lib.api import API def main() -> None: diff --git a/pkgs/clan-cli/clan_cli/__init__.py b/pkgs/clan-cli/clan_cli/__init__.py index cedf7e430..07b45347e 100644 --- a/pkgs/clan-cli/clan_cli/__init__.py +++ b/pkgs/clan-cli/clan_cli/__init__.py @@ -6,7 +6,8 @@ from pathlib import Path from types import ModuleType # These imports are unused, but necessary for @API.register to run once. -from .api import admin, directory, disk, iwd, mdns_discovery, modules +from clan_lib.api import admin, directory, disk, iwd, mdns_discovery, modules + from .arg_actions import AppendOptionAction from .clan import show, update @@ -65,7 +66,10 @@ def add_common_flags(parser: argparse.ArgumentParser) -> None: The error that would be thrown by argparse: - argparse.ArgumentError """ - return any(arg in action.option_strings for action in parser._actions) # noqa: SLF001 -> private_member accessed + return any( + arg in action.option_strings + for action in parser._actions # noqa: SLF001 + ) if not argument_exists(parser, "--debug"): parser.add_argument( diff --git a/pkgs/clan-cli/clan_cli/clan/create.py b/pkgs/clan-cli/clan_cli/clan/create.py index fbd4e0bc5..861206790 100644 --- a/pkgs/clan-cli/clan_cli/clan/create.py +++ b/pkgs/clan-cli/clan_cli/clan/create.py @@ -4,7 +4,8 @@ import logging from dataclasses import dataclass from pathlib import Path -from clan_cli.api import API +from clan_lib.api import API + from clan_cli.cmd import CmdOut, RunOpts, run from clan_cli.errors import ClanError from clan_cli.flake import Flake diff --git a/pkgs/clan-cli/clan_cli/clan/show.py b/pkgs/clan-cli/clan_cli/clan/show.py index d99c180f2..281f8f744 100644 --- a/pkgs/clan-cli/clan_cli/clan/show.py +++ b/pkgs/clan-cli/clan_cli/clan/show.py @@ -4,7 +4,8 @@ import logging from pathlib import Path from urllib.parse import urlparse -from clan_cli.api import API +from clan_lib.api import API + from clan_cli.cmd import run_no_stdout from clan_cli.errors import ClanCmdError, ClanError from clan_cli.inventory import Meta diff --git a/pkgs/clan-cli/clan_cli/clan/update.py b/pkgs/clan-cli/clan_cli/clan/update.py index 635a5a792..4955ac0cc 100644 --- a/pkgs/clan-cli/clan_cli/clan/update.py +++ b/pkgs/clan-cli/clan_cli/clan/update.py @@ -1,6 +1,7 @@ from dataclasses import dataclass -from clan_cli.api import API +from clan_lib.api import API + from clan_cli.inventory import Inventory, Meta, load_inventory_json, set_inventory diff --git a/pkgs/clan-cli/clan_cli/flash/flash.py b/pkgs/clan-cli/clan_cli/flash/flash.py index 709083ad6..92949f2b3 100644 --- a/pkgs/clan-cli/clan_cli/flash/flash.py +++ b/pkgs/clan-cli/clan_cli/flash/flash.py @@ -6,7 +6,8 @@ from pathlib import Path from tempfile import TemporaryDirectory from typing import Any -from clan_cli.api import API +from clan_lib.api import API + from clan_cli.cmd import Log, RunOpts, cmd_with_root, run from clan_cli.errors import ClanError from clan_cli.facts.generate import generate_facts diff --git a/pkgs/clan-cli/clan_cli/flash/list.py b/pkgs/clan-cli/clan_cli/flash/list.py index 3e993cc6c..fb66d696b 100644 --- a/pkgs/clan-cli/clan_cli/flash/list.py +++ b/pkgs/clan-cli/clan_cli/flash/list.py @@ -3,7 +3,8 @@ import logging import os from pathlib import Path -from clan_cli.api import API +from clan_lib.api import API + from clan_cli.cmd import Log, RunOpts, run from clan_cli.errors import ClanError from clan_cli.nix import nix_build diff --git a/pkgs/clan-cli/clan_cli/inventory/__init__.py b/pkgs/clan-cli/clan_cli/inventory/__init__.py index 64a791b6b..43a0d6479 100644 --- a/pkgs/clan-cli/clan_cli/inventory/__init__.py +++ b/pkgs/clan-cli/clan_cli/inventory/__init__.py @@ -19,7 +19,8 @@ from dataclasses import dataclass from pathlib import Path from typing import Any -from clan_cli.api import API, dataclass_to_dict, from_dict +from clan_lib.api import API, dataclass_to_dict, from_dict + from clan_cli.cmd import run_no_stdout from clan_cli.errors import ClanCmdError, ClanError from clan_cli.git import commit_file diff --git a/pkgs/clan-cli/clan_cli/machines/create.py b/pkgs/clan-cli/clan_cli/machines/create.py index 3c901d2b7..8ea74c9ad 100644 --- a/pkgs/clan-cli/clan_cli/machines/create.py +++ b/pkgs/clan-cli/clan_cli/machines/create.py @@ -4,7 +4,8 @@ import re from dataclasses import dataclass from pathlib import Path -from clan_cli.api import API +from clan_lib.api import API + from clan_cli.completions import add_dynamic_completer, complete_tags from clan_cli.dirs import get_clan_flake_toplevel_or_env from clan_cli.errors import ClanError diff --git a/pkgs/clan-cli/clan_cli/machines/delete.py b/pkgs/clan-cli/clan_cli/machines/delete.py index 1522b5001..470a38cc2 100644 --- a/pkgs/clan-cli/clan_cli/machines/delete.py +++ b/pkgs/clan-cli/clan_cli/machines/delete.py @@ -4,7 +4,7 @@ import shutil from pathlib import Path from clan_cli import Flake, inventory -from clan_cli.api import API +from clan_lib.api import API from clan_cli.completions import add_dynamic_completer, complete_machines from clan_cli.dirs import specific_machine_dir from clan_cli.secrets.folders import sops_secrets_folder diff --git a/pkgs/clan-cli/clan_cli/machines/hardware.py b/pkgs/clan-cli/clan_cli/machines/hardware.py index c69ac7279..e13545589 100644 --- a/pkgs/clan-cli/clan_cli/machines/hardware.py +++ b/pkgs/clan-cli/clan_cli/machines/hardware.py @@ -5,7 +5,8 @@ from dataclasses import dataclass from enum import Enum from pathlib import Path -from clan_cli.api import API +from clan_lib.api import API + from clan_cli.cmd import RunOpts, run, run_no_stdout from clan_cli.completions import add_dynamic_completer, complete_machines from clan_cli.dirs import specific_machine_dir diff --git a/pkgs/clan-cli/clan_cli/machines/install.py b/pkgs/clan-cli/clan_cli/machines/install.py index f62d6ad00..d58ed287d 100644 --- a/pkgs/clan-cli/clan_cli/machines/install.py +++ b/pkgs/clan-cli/clan_cli/machines/install.py @@ -7,7 +7,8 @@ from enum import Enum from pathlib import Path from tempfile import TemporaryDirectory -from clan_cli.api import API +from clan_lib.api import API + from clan_cli.cmd import Log, RunOpts, run from clan_cli.completions import ( add_dynamic_completer, diff --git a/pkgs/clan-cli/clan_cli/machines/list.py b/pkgs/clan-cli/clan_cli/machines/list.py index 30360c364..eefa30512 100644 --- a/pkgs/clan-cli/clan_cli/machines/list.py +++ b/pkgs/clan-cli/clan_cli/machines/list.py @@ -6,10 +6,11 @@ from dataclasses import dataclass from pathlib import Path from typing import Literal -from clan_cli.api import API -from clan_cli.api.disk import MachineDiskMatter -from clan_cli.api.modules import parse_frontmatter -from clan_cli.api.serde import dataclass_to_dict +from clan_lib.api import API +from clan_lib.api.disk import MachineDiskMatter +from clan_lib.api.modules import parse_frontmatter +from clan_lib.api.serde import dataclass_to_dict + from clan_cli.cmd import RunOpts, run_no_stdout from clan_cli.completions import add_dynamic_completer, complete_tags from clan_cli.dirs import specific_machine_dir diff --git a/pkgs/clan-cli/clan_cli/machines/update.py b/pkgs/clan-cli/clan_cli/machines/update.py index c8d7a763c..fe87f236f 100644 --- a/pkgs/clan-cli/clan_cli/machines/update.py +++ b/pkgs/clan-cli/clan_cli/machines/update.py @@ -6,7 +6,8 @@ import re import shlex import sys -from clan_cli.api import API +from clan_lib.api import API + from clan_cli.async_run import AsyncContext, AsyncOpts, AsyncRuntime, is_async_cancelled from clan_cli.cmd import MsgColor, RunOpts, run from clan_cli.colors import AnsiColor diff --git a/pkgs/clan-cli/clan_cli/secrets/sops.py b/pkgs/clan-cli/clan_cli/secrets/sops.py index e2e9ac315..388e97f4c 100644 --- a/pkgs/clan-cli/clan_cli/secrets/sops.py +++ b/pkgs/clan-cli/clan_cli/secrets/sops.py @@ -12,7 +12,8 @@ from pathlib import Path from tempfile import NamedTemporaryFile from typing import IO, Any -from clan_cli.api import API +from clan_lib.api import API + from clan_cli.cmd import Log, RunOpts, run from clan_cli.dirs import user_config_dir from clan_cli.errors import ClanError diff --git a/pkgs/clan-cli/clan_cli/tests/test_api_dataclass_compat.py b/pkgs/clan-cli/clan_cli/tests/test_api_dataclass_compat.py index 9f3c88dff..2d892c2aa 100644 --- a/pkgs/clan-cli/clan_cli/tests/test_api_dataclass_compat.py +++ b/pkgs/clan-cli/clan_cli/tests/test_api_dataclass_compat.py @@ -5,9 +5,9 @@ import sys from dataclasses import is_dataclass from pathlib import Path -from clan_cli.api import API -from clan_cli.api.util import JSchemaTypeError, type_to_dict from clan_cli.errors import ClanError +from clan_lib.api import API +from clan_lib.api.util import JSchemaTypeError, type_to_dict def should_skip(file_path: Path, excludes: list[Path]) -> bool: diff --git a/pkgs/clan-cli/clan_cli/tests/test_deserializers.py b/pkgs/clan-cli/clan_cli/tests/test_deserializers.py index 2a23159dd..695454884 100644 --- a/pkgs/clan-cli/clan_cli/tests/test_deserializers.py +++ b/pkgs/clan-cli/clan_cli/tests/test_deserializers.py @@ -3,12 +3,12 @@ from pathlib import Path from typing import Any, Literal import pytest - -# Functions to test -from clan_cli.api import dataclass_to_dict, from_dict from clan_cli.errors import ClanError from clan_cli.machines import machines +# Functions to test +from clan_lib.api import dataclass_to_dict, from_dict + def test_simple() -> None: @dataclass diff --git a/pkgs/clan-cli/clan_cli/tests/test_modules.py b/pkgs/clan-cli/clan_cli/tests/test_modules.py index 17c1090b1..46d4620b3 100644 --- a/pkgs/clan-cli/clan_cli/tests/test_modules.py +++ b/pkgs/clan-cli/clan_cli/tests/test_modules.py @@ -3,7 +3,6 @@ import subprocess from typing import TYPE_CHECKING import pytest -from clan_cli.api.modules import list_modules from clan_cli.flake import Flake from clan_cli.inventory import ( Inventory, @@ -14,6 +13,7 @@ from clan_cli.inventory import ( from clan_cli.machines.create import CreateOptions, create_machine from clan_cli.nix import nix_eval, run_no_stdout from clan_cli.tests.fixtures_flakes import FlakeForTest +from clan_lib.api.modules import list_modules if TYPE_CHECKING: from .age_keys import KeyPair diff --git a/pkgs/clan-cli/clan_cli/tests/test_serializers.py b/pkgs/clan-cli/clan_cli/tests/test_serializers.py index b265720ca..07697383d 100644 --- a/pkgs/clan-cli/clan_cli/tests/test_serializers.py +++ b/pkgs/clan-cli/clan_cli/tests/test_serializers.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field # Functions to test -from clan_cli.api import ( +from clan_lib.api import ( dataclass_to_dict, sanitize_string, ) diff --git a/pkgs/clan-cli/clan_cli/vars/get.py b/pkgs/clan-cli/clan_cli/vars/get.py index 589782a80..2f14990d8 100644 --- a/pkgs/clan-cli/clan_cli/vars/get.py +++ b/pkgs/clan-cli/clan_cli/vars/get.py @@ -2,10 +2,10 @@ import argparse import logging import sys -from clan_cli.api import API from clan_cli.completions import add_dynamic_completer, complete_machines from clan_cli.errors import ClanError from clan_cli.flake import Flake +from clan_lib.api import API from .generate import Var from .list import get_vars diff --git a/pkgs/clan-cli/clan_cli/vars/list.py b/pkgs/clan-cli/clan_cli/vars/list.py index 496c05a20..b12657db9 100644 --- a/pkgs/clan-cli/clan_cli/vars/list.py +++ b/pkgs/clan-cli/clan_cli/vars/list.py @@ -1,11 +1,11 @@ import argparse import logging -from clan_cli.api import API from clan_cli.completions import add_dynamic_completer, complete_machines from clan_cli.errors import ClanError from clan_cli.flake import Flake from clan_cli.machines.machines import Machine +from clan_lib.api import API from ._types import GeneratorUpdate from .generate import Generator, Prompt, Var, execute_generator diff --git a/pkgs/clan-cli/clan_cli/api/__init__.py b/pkgs/clan-cli/clan_lib/api/__init__.py similarity index 100% rename from pkgs/clan-cli/clan_cli/api/__init__.py rename to pkgs/clan-cli/clan_lib/api/__init__.py diff --git a/pkgs/clan-cli/clan_cli/api/admin.py b/pkgs/clan-cli/clan_lib/api/admin.py similarity index 100% rename from pkgs/clan-cli/clan_cli/api/admin.py rename to pkgs/clan-cli/clan_lib/api/admin.py diff --git a/pkgs/clan-cli/clan_cli/api/cli.py b/pkgs/clan-cli/clan_lib/api/cli.py similarity index 100% rename from pkgs/clan-cli/clan_cli/api/cli.py rename to pkgs/clan-cli/clan_lib/api/cli.py diff --git a/pkgs/clan-cli/clan_cli/api/directory.py b/pkgs/clan-cli/clan_lib/api/directory.py similarity index 100% rename from pkgs/clan-cli/clan_cli/api/directory.py rename to pkgs/clan-cli/clan_lib/api/directory.py diff --git a/pkgs/clan-cli/clan_cli/api/disk.py b/pkgs/clan-cli/clan_lib/api/disk.py similarity index 98% rename from pkgs/clan-cli/clan_cli/api/disk.py rename to pkgs/clan-cli/clan_lib/api/disk.py index 39736c304..a524a6b6b 100644 --- a/pkgs/clan-cli/clan_cli/api/disk.py +++ b/pkgs/clan-cli/clan_lib/api/disk.py @@ -6,13 +6,14 @@ from pathlib import Path from typing import Any, TypedDict from uuid import uuid4 -from clan_cli.api import API -from clan_cli.api.modules import Frontmatter, extract_frontmatter from clan_cli.dirs import TemplateType, clan_templates from clan_cli.errors import ClanError from clan_cli.git import commit_file from clan_cli.machines.hardware import HardwareConfig, show_machine_hardware_config +from clan_lib.api import API +from clan_lib.api.modules import Frontmatter, extract_frontmatter + log = logging.getLogger(__name__) diff --git a/pkgs/clan-cli/clan_cli/api/iwd.py b/pkgs/clan-cli/clan_lib/api/iwd.py similarity index 100% rename from pkgs/clan-cli/clan_cli/api/iwd.py rename to pkgs/clan-cli/clan_lib/api/iwd.py diff --git a/pkgs/clan-cli/clan_cli/api/mdns_discovery.py b/pkgs/clan-cli/clan_lib/api/mdns_discovery.py similarity index 100% rename from pkgs/clan-cli/clan_cli/api/mdns_discovery.py rename to pkgs/clan-cli/clan_lib/api/mdns_discovery.py diff --git a/pkgs/clan-cli/clan_cli/api/modules.py b/pkgs/clan-cli/clan_lib/api/modules.py similarity index 100% rename from pkgs/clan-cli/clan_cli/api/modules.py rename to pkgs/clan-cli/clan_lib/api/modules.py diff --git a/pkgs/clan-cli/clan_cli/api/serde.py b/pkgs/clan-cli/clan_lib/api/serde.py similarity index 100% rename from pkgs/clan-cli/clan_cli/api/serde.py rename to pkgs/clan-cli/clan_lib/api/serde.py diff --git a/pkgs/clan-cli/clan_cli/api/util.py b/pkgs/clan-cli/clan_lib/api/util.py similarity index 99% rename from pkgs/clan-cli/clan_cli/api/util.py rename to pkgs/clan-cli/clan_lib/api/util.py index ae884aea6..d06de4f0d 100644 --- a/pkgs/clan-cli/clan_cli/api/util.py +++ b/pkgs/clan-cli/clan_lib/api/util.py @@ -19,7 +19,7 @@ from typing import ( is_typeddict, ) -from clan_cli.api.serde import dataclass_to_dict +from clan_lib.api.serde import dataclass_to_dict class JSchemaTypeError(Exception): From 070114ae9f94fc3ecbad47799627d00b3c52be4e Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Sat, 26 Apr 2025 20:19:23 +0200 Subject: [PATCH 3/3] Fix(clan_lib.api): fix cyclic import problem for api schema export --- pkgs/clan-cli/api.py | 28 ++++++++++++++++++++++- pkgs/clan-cli/clan_cli/machines/delete.py | 3 ++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/pkgs/clan-cli/api.py b/pkgs/clan-cli/api.py index e9d9c09a5..033f8360d 100644 --- a/pkgs/clan-cli/api.py +++ b/pkgs/clan-cli/api.py @@ -1,9 +1,35 @@ +import importlib import json +import pkgutil +from types import ModuleType -from clan_lib.api import API + +def import_all_modules_from_package(pkg: ModuleType) -> None: + for _loader, module_name, _is_pkg in pkgutil.walk_packages( + pkg.__path__, prefix=f"{pkg.__name__}." + ): + base_name = module_name.split(".")[-1] + + # Skip test modules + if ( + base_name.startswith("test_") + or base_name.endswith("_test") + or base_name == "conftest" + ): + continue + + importlib.import_module(module_name) def main() -> None: + import clan_cli + import clan_lib + + import_all_modules_from_package(clan_cli) + import_all_modules_from_package(clan_lib) + + from clan_lib.api import API + schema = API.to_json_schema() print(f"""{json.dumps(schema, indent=2)}""") diff --git a/pkgs/clan-cli/clan_cli/machines/delete.py b/pkgs/clan-cli/clan_cli/machines/delete.py index 470a38cc2..4f0698798 100644 --- a/pkgs/clan-cli/clan_cli/machines/delete.py +++ b/pkgs/clan-cli/clan_cli/machines/delete.py @@ -3,8 +3,9 @@ import logging import shutil from pathlib import Path -from clan_cli import Flake, inventory from clan_lib.api import API + +from clan_cli import Flake, inventory from clan_cli.completions import add_dynamic_completer, complete_machines from clan_cli.dirs import specific_machine_dir from clan_cli.secrets.folders import sops_secrets_folder