Merge pull request 'Init 'clan_lib' namespace and migrate clan_cli.api' (#3414) from hsjobeki/clan-core:clan-lib into main

Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3414
This commit is contained in:
hsjobeki
2025-04-26 18:29:35 +00:00
38 changed files with 81 additions and 36 deletions

View File

@@ -29,8 +29,8 @@ from dataclasses import dataclass, field
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
from clan_cli.api.modules import Frontmatter, extract_frontmatter, get_roles
from clan_cli.errors import ClanError from clan_cli.errors import ClanError
from clan_lib.api.modules import Frontmatter, extract_frontmatter, get_roles
# Get environment variables # Get environment variables
CLAN_CORE_PATH = Path(os.environ["CLAN_CORE_PATH"]) CLAN_CORE_PATH = Path(os.environ["CLAN_CORE_PATH"])

View File

@@ -8,8 +8,8 @@ import time
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
from clan_cli.api import ApiError, ErrorDataClass, SuccessDataClass from clan_lib.api import ApiError, ErrorDataClass, SuccessDataClass
from clan_cli.api.directory import FileRequest from clan_lib.api.directory import FileRequest
from gi.repository import Gio, GLib, Gtk from gi.repository import Gio, GLib, Gtk
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View File

@@ -9,8 +9,8 @@ import os
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from clan_cli.api import API
from clan_cli.custom_logger import setup_logging 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.api.file_gtk import open_file
from clan_app.deps.webview.webview import Size, SizeHint, Webview from clan_app.deps.webview.webview import Size, SizeHint, Webview

View File

@@ -6,7 +6,7 @@ from collections.abc import Callable
from enum import IntEnum from enum import IntEnum
from typing import Any from typing import Any
from clan_cli.api import ( from clan_lib.api import (
ApiError, ApiError,
ErrorDataClass, ErrorDataClass,
MethodRegistry, MethodRegistry,

View File

@@ -1,9 +1,35 @@
import importlib
import json import json
import pkgutil
from types import ModuleType
from clan_cli.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: 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() schema = API.to_json_schema()
print(f"""{json.dumps(schema, indent=2)}""") print(f"""{json.dumps(schema, indent=2)}""")

View File

@@ -6,7 +6,8 @@ from pathlib import Path
from types import ModuleType from types import ModuleType
# These imports are unused, but necessary for @API.register to run once. # 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 .arg_actions import AppendOptionAction
from .clan import show, update 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: The error that would be thrown by argparse:
- argparse.ArgumentError - 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"): if not argument_exists(parser, "--debug"):
parser.add_argument( parser.add_argument(

View File

@@ -4,7 +4,8 @@ import logging
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path 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.cmd import CmdOut, RunOpts, run
from clan_cli.errors import ClanError from clan_cli.errors import ClanError
from clan_cli.flake import Flake from clan_cli.flake import Flake

View File

@@ -4,7 +4,8 @@ import logging
from pathlib import Path from pathlib import Path
from urllib.parse import urlparse 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.cmd import run_no_stdout
from clan_cli.errors import ClanCmdError, ClanError from clan_cli.errors import ClanCmdError, ClanError
from clan_cli.inventory import Meta from clan_cli.inventory import Meta

View File

@@ -1,6 +1,7 @@
from dataclasses import dataclass 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 from clan_cli.inventory import Inventory, Meta, load_inventory_json, set_inventory

View File

@@ -6,7 +6,8 @@ from pathlib import Path
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
from typing import Any 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.cmd import Log, RunOpts, cmd_with_root, run
from clan_cli.errors import ClanError from clan_cli.errors import ClanError
from clan_cli.facts.generate import generate_facts from clan_cli.facts.generate import generate_facts

View File

@@ -3,7 +3,8 @@ import logging
import os import os
from pathlib import Path 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.cmd import Log, RunOpts, run
from clan_cli.errors import ClanError from clan_cli.errors import ClanError
from clan_cli.nix import nix_build from clan_cli.nix import nix_build

View File

@@ -19,7 +19,8 @@ from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import Any 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.cmd import run_no_stdout
from clan_cli.errors import ClanCmdError, ClanError from clan_cli.errors import ClanCmdError, ClanError
from clan_cli.git import commit_file from clan_cli.git import commit_file

View File

@@ -4,7 +4,8 @@ import re
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path 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.completions import add_dynamic_completer, complete_tags
from clan_cli.dirs import get_clan_flake_toplevel_or_env from clan_cli.dirs import get_clan_flake_toplevel_or_env
from clan_cli.errors import ClanError from clan_cli.errors import ClanError

View File

@@ -3,8 +3,9 @@ import logging
import shutil import shutil
from pathlib import Path from pathlib import Path
from clan_lib.api import API
from clan_cli import Flake, inventory from clan_cli import Flake, inventory
from clan_cli.api import API
from clan_cli.completions import add_dynamic_completer, complete_machines from clan_cli.completions import add_dynamic_completer, complete_machines
from clan_cli.dirs import specific_machine_dir from clan_cli.dirs import specific_machine_dir
from clan_cli.secrets.folders import sops_secrets_folder from clan_cli.secrets.folders import sops_secrets_folder

View File

@@ -5,7 +5,8 @@ from dataclasses import dataclass
from enum import Enum from enum import Enum
from pathlib import Path 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.cmd import RunOpts, run, run_no_stdout
from clan_cli.completions import add_dynamic_completer, complete_machines from clan_cli.completions import add_dynamic_completer, complete_machines
from clan_cli.dirs import specific_machine_dir from clan_cli.dirs import specific_machine_dir

View File

@@ -7,7 +7,8 @@ from enum import Enum
from pathlib import Path from pathlib import Path
from tempfile import TemporaryDirectory 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.cmd import Log, RunOpts, run
from clan_cli.completions import ( from clan_cli.completions import (
add_dynamic_completer, add_dynamic_completer,

View File

@@ -6,10 +6,11 @@ from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import Literal from typing import Literal
from clan_cli.api import API from clan_lib.api import API
from clan_cli.api.disk import MachineDiskMatter from clan_lib.api.disk import MachineDiskMatter
from clan_cli.api.modules import parse_frontmatter from clan_lib.api.modules import parse_frontmatter
from clan_cli.api.serde import dataclass_to_dict from clan_lib.api.serde import dataclass_to_dict
from clan_cli.cmd import RunOpts, run_no_stdout from clan_cli.cmd import RunOpts, run_no_stdout
from clan_cli.completions import add_dynamic_completer, complete_tags from clan_cli.completions import add_dynamic_completer, complete_tags
from clan_cli.dirs import specific_machine_dir from clan_cli.dirs import specific_machine_dir

View File

@@ -6,7 +6,8 @@ import re
import shlex import shlex
import sys 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.async_run import AsyncContext, AsyncOpts, AsyncRuntime, is_async_cancelled
from clan_cli.cmd import MsgColor, RunOpts, run from clan_cli.cmd import MsgColor, RunOpts, run
from clan_cli.colors import AnsiColor from clan_cli.colors import AnsiColor

View File

@@ -12,7 +12,8 @@ from pathlib import Path
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
from typing import IO, Any 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.cmd import Log, RunOpts, run
from clan_cli.dirs import user_config_dir from clan_cli.dirs import user_config_dir
from clan_cli.errors import ClanError from clan_cli.errors import ClanError

View File

@@ -5,9 +5,9 @@ import sys
from dataclasses import is_dataclass from dataclasses import is_dataclass
from pathlib import Path 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_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: def should_skip(file_path: Path, excludes: list[Path]) -> bool:

View File

@@ -3,12 +3,12 @@ from pathlib import Path
from typing import Any, Literal from typing import Any, Literal
import pytest import pytest
# Functions to test
from clan_cli.api import dataclass_to_dict, from_dict
from clan_cli.errors import ClanError from clan_cli.errors import ClanError
from clan_cli.machines import machines from clan_cli.machines import machines
# Functions to test
from clan_lib.api import dataclass_to_dict, from_dict
def test_simple() -> None: def test_simple() -> None:
@dataclass @dataclass

View File

@@ -3,7 +3,6 @@ import subprocess
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
import pytest import pytest
from clan_cli.api.modules import list_modules
from clan_cli.flake import Flake from clan_cli.flake import Flake
from clan_cli.inventory import ( from clan_cli.inventory import (
Inventory, Inventory,
@@ -14,6 +13,7 @@ from clan_cli.inventory import (
from clan_cli.machines.create import CreateOptions, create_machine from clan_cli.machines.create import CreateOptions, create_machine
from clan_cli.nix import nix_eval, run_no_stdout from clan_cli.nix import nix_eval, run_no_stdout
from clan_cli.tests.fixtures_flakes import FlakeForTest from clan_cli.tests.fixtures_flakes import FlakeForTest
from clan_lib.api.modules import list_modules
if TYPE_CHECKING: if TYPE_CHECKING:
from .age_keys import KeyPair from .age_keys import KeyPair

View File

@@ -1,7 +1,7 @@
from dataclasses import dataclass, field from dataclasses import dataclass, field
# Functions to test # Functions to test
from clan_cli.api import ( from clan_lib.api import (
dataclass_to_dict, dataclass_to_dict,
sanitize_string, sanitize_string,
) )

View File

@@ -2,10 +2,10 @@ import argparse
import logging import logging
import sys import sys
from clan_cli.api import API
from clan_cli.completions import add_dynamic_completer, complete_machines from clan_cli.completions import add_dynamic_completer, complete_machines
from clan_cli.errors import ClanError from clan_cli.errors import ClanError
from clan_cli.flake import Flake from clan_cli.flake import Flake
from clan_lib.api import API
from .generate import Var from .generate import Var
from .list import get_vars from .list import get_vars

View File

@@ -1,11 +1,11 @@
import argparse import argparse
import logging import logging
from clan_cli.api import API
from clan_cli.completions import add_dynamic_completer, complete_machines from clan_cli.completions import add_dynamic_completer, complete_machines
from clan_cli.errors import ClanError from clan_cli.errors import ClanError
from clan_cli.flake import Flake from clan_cli.flake import Flake
from clan_cli.machines.machines import Machine from clan_cli.machines.machines import Machine
from clan_lib.api import API
from ._types import GeneratorUpdate from ._types import GeneratorUpdate
from .generate import Generator, Prompt, Var, execute_generator from .generate import Generator, Prompt, Var, execute_generator

View File

View File

@@ -6,13 +6,14 @@ from pathlib import Path
from typing import Any, TypedDict from typing import Any, TypedDict
from uuid import uuid4 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.dirs import TemplateType, clan_templates
from clan_cli.errors import ClanError from clan_cli.errors import ClanError
from clan_cli.git import commit_file from clan_cli.git import commit_file
from clan_cli.machines.hardware import HardwareConfig, show_machine_hardware_config 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__) log = logging.getLogger(__name__)

View File

@@ -19,7 +19,7 @@ from typing import (
is_typeddict, is_typeddict,
) )
from clan_cli.api.serde import dataclass_to_dict from clan_lib.api.serde import dataclass_to_dict
class JSchemaTypeError(Exception): class JSchemaTypeError(Exception):

View File

View File

@@ -15,6 +15,7 @@ Documentation = "https://docs.clan.lol/"
Repository = "https://git.clan.lol/clan/clan-core" Repository = "https://git.clan.lol/clan/clan-core"
[tool.setuptools.packages.find] [tool.setuptools.packages.find]
include = ["clan_lib*", "clan_cli*"]
exclude = ["clan_cli.nixpkgs*", "result"] exclude = ["clan_cli.nixpkgs*", "result"]
[tool.setuptools.package-data] [tool.setuptools.package-data]