From 0ec2c32ff8e3007d4e64d9ed78ba329afbeb3b88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Wed, 20 Aug 2025 14:18:30 +0200 Subject: [PATCH] ruff: apply automatic unsafe fixes --- docs/nix/render_options/__init__.py | 2 +- pkgs/clan-app/clan_app/deps/webview/_webview_ffi.py | 2 +- pkgs/clan-app/tests/conftest.py | 5 ++++- pkgs/clan-cli/clan_cli/cli.py | 2 +- pkgs/clan-cli/clan_cli/facts/public_modules/__init__.py | 7 +++++-- pkgs/clan-cli/clan_cli/facts/secret_modules/__init__.py | 9 ++++++--- pkgs/clan-cli/clan_cli/machines/install.py | 2 +- pkgs/clan-cli/clan_cli/machines/update.py | 6 ++++-- pkgs/clan-cli/clan_cli/network/list.py | 4 ++-- pkgs/clan-cli/clan_cli/secrets/groups.py | 2 +- pkgs/clan-cli/clan_cli/select.py | 4 +++- pkgs/clan-cli/clan_cli/templates/list.py | 5 ++++- pkgs/clan-cli/clan_cli/vars/generate.py | 5 ++++- pkgs/clan-cli/clan_cli/vars/generator.py | 6 ++++-- pkgs/clan-cli/clan_cli/vars/graph.py | 3 ++- pkgs/clan-cli/clan_cli/vars/prompt.py | 2 +- pkgs/clan-cli/clan_lib/colors/__init__.py | 4 ++-- pkgs/clan-cli/clan_lib/dirs/__init__.py | 6 ++++-- pkgs/clan-cli/clan_lib/flake/flake.py | 8 ++++---- pkgs/clan-cli/clan_lib/machines/delete.py | 5 ++++- pkgs/clan-cli/clan_lib/network/network.py | 6 ++++-- pkgs/clan-cli/clan_lib/network/tor/__init__.py | 4 ---- pkgs/clan-cli/clan_lib/persist/util.py | 2 +- pkgs/clan-cli/clan_lib/services/instances.py | 2 +- pkgs/clan-cli/clan_lib/services/modules.py | 2 +- pkgs/clan-cli/clan_lib/templates/template_url.py | 6 +----- pkgs/clan-vm-manager/clan_vm_manager/singletons/toast.py | 6 ++++-- .../clan_vm_manager/singletons/use_vms.py | 6 ++++-- pkgs/clan-vm-manager/clan_vm_manager/views/list.py | 6 ++++-- 29 files changed, 78 insertions(+), 51 deletions(-) diff --git a/docs/nix/render_options/__init__.py b/docs/nix/render_options/__init__.py index 4537abb78..acf5fe568 100644 --- a/docs/nix/render_options/__init__.py +++ b/docs/nix/render_options/__init__.py @@ -352,7 +352,7 @@ Learn how to use `clanServices` in practice in the [Using clanServices guide](.. output += f"The {module_name} module has the following roles:\n\n" - for role_name, _ in module_info["roles"].items(): + for role_name in module_info["roles"]: output += f"- {role_name}\n" for role_name, role_filename in module_info["roles"].items(): diff --git a/pkgs/clan-app/clan_app/deps/webview/_webview_ffi.py b/pkgs/clan-app/clan_app/deps/webview/_webview_ffi.py index 8b5e39f3a..1c303d447 100644 --- a/pkgs/clan-app/clan_app/deps/webview/_webview_ffi.py +++ b/pkgs/clan-app/clan_app/deps/webview/_webview_ffi.py @@ -21,7 +21,7 @@ def _get_lib_names() -> list[str]: machine = platform.machine().lower() if system == "windows": - if machine == "amd64" or machine == "x86_64": + if machine in {"amd64", "x86_64"}: return ["webview.dll", "WebView2Loader.dll"] if machine == "arm64": msg = "arm64 is not supported on Windows" diff --git a/pkgs/clan-app/tests/conftest.py b/pkgs/clan-app/tests/conftest.py index a9edb0832..d10bce208 100644 --- a/pkgs/clan-app/tests/conftest.py +++ b/pkgs/clan-app/tests/conftest.py @@ -2,12 +2,15 @@ from __future__ import annotations import logging import subprocess -from pathlib import Path +from typing import TYPE_CHECKING import pytest from clan_lib.custom_logger import setup_logging from clan_lib.nix import nix_shell +if TYPE_CHECKING: + from pathlib import Path + pytest_plugins = [ "temporary_dir", "root", diff --git a/pkgs/clan-cli/clan_cli/cli.py b/pkgs/clan-cli/clan_cli/cli.py index d54a1a21a..4494e6da4 100644 --- a/pkgs/clan-cli/clan_cli/cli.py +++ b/pkgs/clan-cli/clan_cli/cli.py @@ -96,7 +96,7 @@ def register_common_flags(parser: argparse.ArgumentParser) -> None: has_subparsers = False for action in parser._actions: # noqa: SLF001 if isinstance(action, argparse._SubParsersAction): # noqa: SLF001 - for _choice, child_parser in action.choices.items(): + for child_parser in action.choices.values(): has_subparsers = True register_common_flags(child_parser) diff --git a/pkgs/clan-cli/clan_cli/facts/public_modules/__init__.py b/pkgs/clan-cli/clan_cli/facts/public_modules/__init__.py index 501d69ecb..502794c44 100644 --- a/pkgs/clan-cli/clan_cli/facts/public_modules/__init__.py +++ b/pkgs/clan-cli/clan_cli/facts/public_modules/__init__.py @@ -1,9 +1,12 @@ from __future__ import annotations from abc import ABC, abstractmethod -from pathlib import Path +from typing import TYPE_CHECKING -from clan_lib.machines import machines +if TYPE_CHECKING: + from pathlib import Path + + from clan_lib.machines import machines class FactStoreBase(ABC): diff --git a/pkgs/clan-cli/clan_cli/facts/secret_modules/__init__.py b/pkgs/clan-cli/clan_cli/facts/secret_modules/__init__.py index ea9d4c792..aaab12a09 100644 --- a/pkgs/clan-cli/clan_cli/facts/secret_modules/__init__.py +++ b/pkgs/clan-cli/clan_cli/facts/secret_modules/__init__.py @@ -1,10 +1,13 @@ from __future__ import annotations from abc import ABC, abstractmethod -from pathlib import Path +from typing import TYPE_CHECKING -from clan_lib.machines import machines -from clan_lib.ssh.host import Host +if TYPE_CHECKING: + from pathlib import Path + + from clan_lib.machines import machines + from clan_lib.ssh.host import Host class SecretStoreBase(ABC): diff --git a/pkgs/clan-cli/clan_cli/machines/install.py b/pkgs/clan-cli/clan_cli/machines/install.py index 063b1df4d..ce1e75095 100644 --- a/pkgs/clan-cli/clan_cli/machines/install.py +++ b/pkgs/clan-cli/clan_cli/machines/install.py @@ -71,7 +71,7 @@ def install_command(args: argparse.Namespace) -> None: ) if ask == "y": break - if ask == "n" or ask == "": + if ask in {"n", ""}: return None print( f"Invalid input '{ask}'. Please enter 'y' for yes or 'n' for no.", diff --git a/pkgs/clan-cli/clan_cli/machines/update.py b/pkgs/clan-cli/clan_cli/machines/update.py index 811cd5d3d..53308cf76 100644 --- a/pkgs/clan-cli/clan_cli/machines/update.py +++ b/pkgs/clan-cli/clan_cli/machines/update.py @@ -1,7 +1,7 @@ import argparse import logging import sys -from typing import get_args +from typing import TYPE_CHECKING, get_args from clan_lib.async_run import AsyncContext, AsyncOpts, AsyncRuntime from clan_lib.errors import ClanError @@ -14,7 +14,6 @@ from clan_lib.machines.suggestions import validate_machine_names from clan_lib.machines.update import run_machine_update from clan_lib.network.network import get_best_remote from clan_lib.nix import nix_config -from clan_lib.ssh.host import Host from clan_lib.ssh.host_key import HostKeyCheck from clan_lib.ssh.localhost import LocalHost from clan_lib.ssh.remote import Remote @@ -25,6 +24,9 @@ from clan_cli.completions import ( complete_tags, ) +if TYPE_CHECKING: + from clan_lib.ssh.host import Host + log = logging.getLogger(__name__) diff --git a/pkgs/clan-cli/clan_cli/network/list.py b/pkgs/clan-cli/clan_cli/network/list.py index b09a38e50..73bb9abb0 100644 --- a/pkgs/clan-cli/clan_cli/network/list.py +++ b/pkgs/clan-cli/clan_cli/network/list.py @@ -16,10 +16,10 @@ def list_command(args: argparse.Namespace) -> None: return # Calculate column widths - col_network = max(12, max(len(name) for name in networks)) + col_network = max(12, *(len(name) for name in networks)) col_priority = 8 col_module = max( - 10, max(len(net.module_name.split(".")[-1]) for net in networks.values()), + 10, *(len(net.module_name.split(".")[-1]) for net in networks.values()) ) col_running = 8 diff --git a/pkgs/clan-cli/clan_cli/secrets/groups.py b/pkgs/clan-cli/clan_cli/secrets/groups.py index 98ddbf5f1..e245bbb51 100644 --- a/pkgs/clan-cli/clan_cli/secrets/groups.py +++ b/pkgs/clan-cli/clan_cli/secrets/groups.py @@ -262,7 +262,7 @@ def add_secret( def get_groups(flake_dir: Path, what: str, name: str) -> list[str]: """Returns the list of group names the given user or machine is part of.""" - assert what == "users" or what == "machines" + assert what in {"users", "machines"} groups_dir = sops_groups_folder(flake_dir) if not groups_dir.exists(): diff --git a/pkgs/clan-cli/clan_cli/select.py b/pkgs/clan-cli/clan_cli/select.py index 18cdbc306..1ffa0dbe9 100644 --- a/pkgs/clan-cli/clan_cli/select.py +++ b/pkgs/clan-cli/clan_cli/select.py @@ -1,7 +1,9 @@ import argparse import json +from typing import TYPE_CHECKING -from clan_lib.flake import Flake +if TYPE_CHECKING: + from clan_lib.flake import Flake def select_command(args: argparse.Namespace) -> None: diff --git a/pkgs/clan-cli/clan_cli/templates/list.py b/pkgs/clan-cli/clan_cli/templates/list.py index c3d281f59..2d891c8f2 100644 --- a/pkgs/clan-cli/clan_cli/templates/list.py +++ b/pkgs/clan-cli/clan_cli/templates/list.py @@ -1,9 +1,12 @@ import argparse import logging +from typing import TYPE_CHECKING -from clan_lib.nix_models.clan import TemplateClanType from clan_lib.templates import list_templates +if TYPE_CHECKING: + from clan_lib.nix_models.clan import TemplateClanType + log = logging.getLogger(__name__) diff --git a/pkgs/clan-cli/clan_cli/vars/generate.py b/pkgs/clan-cli/clan_cli/vars/generate.py index bcee89f64..a2e19297e 100644 --- a/pkgs/clan-cli/clan_cli/vars/generate.py +++ b/pkgs/clan-cli/clan_cli/vars/generate.py @@ -1,4 +1,5 @@ import argparse +from typing import TYPE_CHECKING from clan_cli.completions import ( add_dynamic_completer, @@ -7,10 +8,12 @@ from clan_cli.completions import ( ) from clan_lib.flake import require_flake from clan_lib.machines.list import list_full_machines -from clan_lib.machines.machines import Machine from clan_lib.nix import nix_config from clan_lib.vars.generate import run_generators +if TYPE_CHECKING: + from clan_lib.machines.machines import Machine + def generate_command(args: argparse.Namespace) -> None: flake = require_flake(args.flake) diff --git a/pkgs/clan-cli/clan_cli/vars/generator.py b/pkgs/clan-cli/clan_cli/vars/generator.py index f7d678569..9d67e8b69 100644 --- a/pkgs/clan-cli/clan_cli/vars/generator.py +++ b/pkgs/clan-cli/clan_cli/vars/generator.py @@ -4,14 +4,16 @@ from functools import cached_property from pathlib import Path from typing import TYPE_CHECKING -from clan_lib.flake import Flake -from clan_lib.machines.machines import Machine from clan_lib.nix import nix_test_store from .check import check_vars from .prompt import Prompt from .var import Var +if TYPE_CHECKING: + from clan_lib.flake import Flake + from clan_lib.machines.machines import Machine + if TYPE_CHECKING: from ._types import StoreBase diff --git a/pkgs/clan-cli/clan_cli/vars/graph.py b/pkgs/clan-cli/clan_cli/vars/graph.py index b32e6af99..1c4f4cb9b 100644 --- a/pkgs/clan-cli/clan_cli/vars/graph.py +++ b/pkgs/clan-cli/clan_cli/vars/graph.py @@ -1,12 +1,13 @@ from __future__ import annotations -from collections.abc import Iterable from graphlib import TopologicalSorter from typing import TYPE_CHECKING from clan_lib.errors import ClanError if TYPE_CHECKING: + from collections.abc import Iterable + from .generator import Generator, GeneratorKey diff --git a/pkgs/clan-cli/clan_cli/vars/prompt.py b/pkgs/clan-cli/clan_cli/vars/prompt.py index 4862bbe05..1213179c2 100644 --- a/pkgs/clan-cli/clan_cli/vars/prompt.py +++ b/pkgs/clan-cli/clan_cli/vars/prompt.py @@ -91,7 +91,7 @@ def get_multiline_hidden_input() -> str: raise KeyboardInterrupt # Handle Enter key - if char == "\r" or char == "\n": + if char in {"\r", "\n"}: lines.append("".join(current_line)) current_line = [] # Print newline for visual feedback diff --git a/pkgs/clan-cli/clan_lib/colors/__init__.py b/pkgs/clan-cli/clan_lib/colors/__init__.py index 73774830f..f0a99f4e9 100644 --- a/pkgs/clan-cli/clan_lib/colors/__init__.py +++ b/pkgs/clan-cli/clan_lib/colors/__init__.py @@ -145,9 +145,9 @@ def color( if __name__ == "__main__": print("====ANSI Colors====") - for _, value in AnsiColor.__members__.items(): + for value in AnsiColor.__members__.values(): print(color_by_tuple(f"{value}", fg=value.value)) print("====CSS Colors====") - for _, cs_value in RgbColor.__members__.items(): + for cs_value in RgbColor.__members__.values(): print(color_by_tuple(f"{cs_value}", fg=cs_value.value)) diff --git a/pkgs/clan-cli/clan_lib/dirs/__init__.py b/pkgs/clan-cli/clan_lib/dirs/__init__.py index 76a0d1ef8..814237dd1 100644 --- a/pkgs/clan-cli/clan_lib/dirs/__init__.py +++ b/pkgs/clan-cli/clan_lib/dirs/__init__.py @@ -4,10 +4,12 @@ import sys import urllib.parse from enum import Enum from pathlib import Path -from typing import Protocol +from typing import TYPE_CHECKING, Protocol from clan_lib.errors import ClanError -from clan_lib.flake import Flake + +if TYPE_CHECKING: + from clan_lib.flake import Flake log = logging.getLogger(__name__) diff --git a/pkgs/clan-cli/clan_lib/flake/flake.py b/pkgs/clan-cli/clan_lib/flake/flake.py index 2c0569933..a4c3b3a6c 100644 --- a/pkgs/clan-cli/clan_lib/flake/flake.py +++ b/pkgs/clan-cli/clan_lib/flake/flake.py @@ -318,7 +318,7 @@ def parse_selector(selector: str) -> list[Selector]: stack.pop() acc_str += c - elif mode == "str" or mode == "maybe": + elif mode in {"str", "maybe"}: if c == ".": stack.pop() if mode == "maybe": @@ -517,9 +517,9 @@ class FlakeCacheEntry: return True # string and maybe work the same for cache checking - if ( - selector.type == SelectorType.STR or selector.type == SelectorType.MAYBE - ) and isinstance(self.value, dict): + if (selector.type in (SelectorType.STR, SelectorType.MAYBE)) and isinstance( + self.value, dict + ): assert isinstance(selector.value, str) val = selector.value if val not in self.value: diff --git a/pkgs/clan-cli/clan_lib/machines/delete.py b/pkgs/clan-cli/clan_lib/machines/delete.py index 86eb30266..79114f908 100644 --- a/pkgs/clan-cli/clan_lib/machines/delete.py +++ b/pkgs/clan-cli/clan_lib/machines/delete.py @@ -1,6 +1,6 @@ import logging import shutil -from pathlib import Path +from typing import TYPE_CHECKING from clan_cli.secrets.folders import sops_secrets_folder from clan_cli.secrets.machines import has_machine as secrets_has_machine @@ -14,6 +14,9 @@ from clan_lib.dirs import specific_machine_dir from clan_lib.machines.machines import Machine from clan_lib.persist.inventory_store import InventoryStore +if TYPE_CHECKING: + from pathlib import Path + log = logging.getLogger(__name__) diff --git a/pkgs/clan-cli/clan_lib/network/network.py b/pkgs/clan-cli/clan_lib/network/network.py index ca1acdaba..116ea6c67 100644 --- a/pkgs/clan-cli/clan_lib/network/network.py +++ b/pkgs/clan-cli/clan_lib/network/network.py @@ -5,16 +5,18 @@ from collections.abc import Iterator from contextlib import contextmanager from dataclasses import dataclass from functools import cached_property -from typing import Any +from typing import TYPE_CHECKING, Any from clan_cli.vars.get import get_machine_var from clan_lib.errors import ClanError from clan_lib.flake import Flake from clan_lib.import_utils import ClassSource, import_with_source -from clan_lib.machines.machines import Machine from clan_lib.ssh.remote import Remote +if TYPE_CHECKING: + from clan_lib.machines.machines import Machine + log = logging.getLogger(__name__) diff --git a/pkgs/clan-cli/clan_lib/network/tor/__init__.py b/pkgs/clan-cli/clan_lib/network/tor/__init__.py index 801cc3a1c..f4a0f58dc 100644 --- a/pkgs/clan-cli/clan_lib/network/tor/__init__.py +++ b/pkgs/clan-cli/clan_lib/network/tor/__init__.py @@ -10,10 +10,6 @@ from clan_lib.network.tor.lib import is_tor_running, spawn_tor from clan_lib.ssh.remote import Remote from clan_lib.ssh.socks_wrapper import tor_wrapper -if TYPE_CHECKING: - from clan_lib.ssh.remote import Remote - - log = logging.getLogger(__name__) diff --git a/pkgs/clan-cli/clan_lib/persist/util.py b/pkgs/clan-cli/clan_lib/persist/util.py index 3fc31c2ce..ed3cc927f 100644 --- a/pkgs/clan-cli/clan_lib/persist/util.py +++ b/pkgs/clan-cli/clan_lib/persist/util.py @@ -87,7 +87,7 @@ def path_match(path: list[str], whitelist_paths: list[list[str]]) -> bool: continue match = True for p, w in zip(path, wp, strict=False): - if w != "*" and p != w: + if w not in ("*", p): match = False break if match: diff --git a/pkgs/clan-cli/clan_lib/services/instances.py b/pkgs/clan-cli/clan_lib/services/instances.py index e453cb047..a29506b2e 100644 --- a/pkgs/clan-cli/clan_lib/services/instances.py +++ b/pkgs/clan-cli/clan_lib/services/instances.py @@ -30,7 +30,7 @@ def list_service_instances(flake: Flake) -> InventoryInstancesType: def collect_tags(machines: InventoryMachinesType) -> set[str]: res = set() - for _, machine in machines.items(): + for machine in machines.values(): res |= set(machine.get("tags", [])) return res diff --git a/pkgs/clan-cli/clan_lib/services/modules.py b/pkgs/clan-cli/clan_lib/services/modules.py index e6b31cadf..ed1b5a2b6 100644 --- a/pkgs/clan-cli/clan_lib/services/modules.py +++ b/pkgs/clan-cli/clan_lib/services/modules.py @@ -267,7 +267,7 @@ def create_service_instance( # TODO: Check the roles against the schema schema = get_service_module_schema(flake, module_ref) - for role_name, _role in roles.items(): + for role_name in roles: if role_name not in schema: msg = f"Role '{role_name}' is not defined in the module schema" raise ClanError(msg) diff --git a/pkgs/clan-cli/clan_lib/templates/template_url.py b/pkgs/clan-cli/clan_lib/templates/template_url.py index 24d520bcf..95bdaeb5f 100644 --- a/pkgs/clan-cli/clan_lib/templates/template_url.py +++ b/pkgs/clan-cli/clan_lib/templates/template_url.py @@ -83,11 +83,7 @@ def transform_url(template_type: str, identifier: str, flake: Flake) -> tuple[st if "#" not in identifier: # Local path references are not transformed # return flake_ref=identifier, template='default' - if ( - identifier.startswith(("/", "~/", "./", "../")) - or identifier == "." - or identifier == ".." - ): + if identifier.startswith(("/", "~/", "./", "../")) or identifier in {".", ".."}: return (identifier, f"clan.templates.{template_type}.default") # No fragment, so we assume its a builtin template diff --git a/pkgs/clan-vm-manager/clan_vm_manager/singletons/toast.py b/pkgs/clan-vm-manager/clan_vm_manager/singletons/toast.py index 73ce5a203..86f9d3d03 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/singletons/toast.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/singletons/toast.py @@ -1,6 +1,6 @@ import logging from collections.abc import Callable -from typing import Any +from typing import TYPE_CHECKING, Any import gi @@ -10,7 +10,9 @@ gi.require_version("Adw", "1") from gi.repository import Adw from clan_vm_manager.singletons.use_views import ViewStack -from clan_vm_manager.views.logs import Logs + +if TYPE_CHECKING: + from clan_vm_manager.views.logs import Logs log = logging.getLogger(__name__) diff --git a/pkgs/clan-vm-manager/clan_vm_manager/singletons/use_vms.py b/pkgs/clan-vm-manager/clan_vm_manager/singletons/use_vms.py index b10d7891c..1386b0fb1 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/singletons/use_vms.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/singletons/use_vms.py @@ -1,7 +1,7 @@ import logging from collections.abc import Callable from pathlib import Path -from typing import Any, ClassVar +from typing import TYPE_CHECKING, Any, ClassVar import gi from clan_lib.flake import Flake @@ -13,12 +13,14 @@ from clan_vm_manager.components.gkvstore import GKVStore from clan_vm_manager.components.vmobj import VMObject from clan_vm_manager.history import HistoryEntry from clan_vm_manager.singletons.use_views import ViewStack -from clan_vm_manager.views.logs import Logs gi.require_version("GObject", "2.0") gi.require_version("Gtk", "4.0") from gi.repository import Gio, GLib, GObject +if TYPE_CHECKING: + from clan_vm_manager.views.logs import Logs + log = logging.getLogger(__name__) diff --git a/pkgs/clan-vm-manager/clan_vm_manager/views/list.py b/pkgs/clan-vm-manager/clan_vm_manager/views/list.py index d149e6a48..a2868ca7d 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/views/list.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/views/list.py @@ -2,7 +2,7 @@ import base64 import logging from collections.abc import Callable from functools import partial -from typing import Any, TypeVar +from typing import TYPE_CHECKING, Any, TypeVar import gi from clan_lib.errors import ClanError @@ -21,11 +21,13 @@ from clan_vm_manager.singletons.toast import ( from clan_vm_manager.singletons.use_join import JoinList, JoinValue from clan_vm_manager.singletons.use_views import ViewStack from clan_vm_manager.singletons.use_vms import ClanStore, VMStore -from clan_vm_manager.views.logs import Logs gi.require_version("Adw", "1") from gi.repository import Adw, Gdk, Gio, GLib, GObject, Gtk +if TYPE_CHECKING: + from clan_vm_manager.views.logs import Logs + log = logging.getLogger(__name__) ListItem = TypeVar("ListItem", bound=GObject.Object)