From a2f093d714aa937fb9332d5bead8d7269ce260fe Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Tue, 27 Jan 2026 08:19:31 +0100 Subject: [PATCH] Move standard library imports into a type-checking block --- infrahub_sdk/async_typer.py | 6 ++++-- infrahub_sdk/batch.py | 3 ++- infrahub_sdk/client.py | 4 ++-- infrahub_sdk/ctl/cli_commands.py | 3 ++- infrahub_sdk/ctl/graphql.py | 5 ++++- infrahub_sdk/ctl/schema.py | 2 +- infrahub_sdk/ctl/utils.py | 3 ++- infrahub_sdk/exceptions.py | 6 ++++-- infrahub_sdk/node/attribute.py | 3 ++- infrahub_sdk/node/node.py | 3 ++- infrahub_sdk/node/relationship.py | 3 ++- infrahub_sdk/protocols_generator/generator.py | 5 ++++- infrahub_sdk/pytest_plugin/loader.py | 6 ++++-- infrahub_sdk/query_groups.py | 3 ++- infrahub_sdk/schema/__init__.py | 3 ++- infrahub_sdk/schema/main.py | 2 +- infrahub_sdk/task/models.py | 2 +- infrahub_sdk/template/__init__.py | 6 ++++-- infrahub_sdk/topological_sort.py | 6 ++++-- infrahub_sdk/transfer/exporter/interface.py | 5 ++++- infrahub_sdk/transfer/exporter/json.py | 5 +++-- infrahub_sdk/transfer/importer/json.py | 5 +++-- infrahub_sdk/transfer/schema_sorter.py | 3 ++- pyproject.toml | 1 - tests/integration/test_infrahub_client.py | 8 +++++--- tests/integration/test_infrahub_client_sync.py | 3 ++- tests/unit/sdk/checks/test_checks.py | 3 ++- tests/unit/sdk/conftest.py | 5 +++-- 28 files changed, 73 insertions(+), 39 deletions(-) diff --git a/infrahub_sdk/async_typer.py b/infrahub_sdk/async_typer.py index aab67824..5ddca12f 100644 --- a/infrahub_sdk/async_typer.py +++ b/infrahub_sdk/async_typer.py @@ -2,12 +2,14 @@ import asyncio import inspect -from collections.abc import Callable from functools import partial, wraps -from typing import Any +from typing import TYPE_CHECKING, Any from typer import Typer +if TYPE_CHECKING: + from collections.abc import Callable + class AsyncTyper(Typer): @staticmethod diff --git a/infrahub_sdk/batch.py b/infrahub_sdk/batch.py index c86d7c77..ec29231a 100644 --- a/infrahub_sdk/batch.py +++ b/infrahub_sdk/batch.py @@ -1,12 +1,13 @@ from __future__ import annotations import asyncio -from collections.abc import AsyncGenerator, Awaitable, Callable, Generator from concurrent.futures import ThreadPoolExecutor from dataclasses import dataclass from typing import TYPE_CHECKING, Any if TYPE_CHECKING: + from collections.abc import AsyncGenerator, Awaitable, Callable, Generator + from .node import InfrahubNode, InfrahubNodeSync diff --git a/infrahub_sdk/client.py b/infrahub_sdk/client.py index 33487ebf..927ec987 100644 --- a/infrahub_sdk/client.py +++ b/infrahub_sdk/client.py @@ -5,8 +5,6 @@ import logging import time import warnings -from collections.abc import Callable, Coroutine, Mapping, MutableMapping -from datetime import datetime from functools import wraps from time import sleep from typing import ( @@ -61,6 +59,8 @@ from .utils import decode_json, get_user_permissions, is_valid_uuid if TYPE_CHECKING: + from collections.abc import Callable, Coroutine, Mapping, MutableMapping + from datetime import datetime from types import TracebackType from httpx._transports.base import AsyncBaseTransport, BaseTransport diff --git a/infrahub_sdk/ctl/cli_commands.py b/infrahub_sdk/ctl/cli_commands.py index accebe4b..2c528583 100644 --- a/infrahub_sdk/ctl/cli_commands.py +++ b/infrahub_sdk/ctl/cli_commands.py @@ -7,7 +7,6 @@ import logging import platform import sys -from collections.abc import Callable from pathlib import Path from typing import TYPE_CHECKING, Any @@ -56,6 +55,8 @@ from .parameters import CONFIG_PARAM if TYPE_CHECKING: + from collections.abc import Callable + from ..schema.repository import InfrahubRepositoryConfig app = AsyncTyper(pretty_exceptions_show_locals=False) diff --git a/infrahub_sdk/ctl/graphql.py b/infrahub_sdk/ctl/graphql.py index ea0158ce..21d84e30 100644 --- a/infrahub_sdk/ctl/graphql.py +++ b/infrahub_sdk/ctl/graphql.py @@ -1,8 +1,8 @@ from __future__ import annotations -import ast from collections import defaultdict from pathlib import Path +from typing import TYPE_CHECKING import typer from ariadne_codegen.client_generators.package import PackageGenerator, get_package_generator @@ -30,6 +30,9 @@ ) from .parameters import CONFIG_PARAM +if TYPE_CHECKING: + import ast + app = AsyncTyper() console = Console() diff --git a/infrahub_sdk/ctl/schema.py b/infrahub_sdk/ctl/schema.py index 5a977b59..701063fe 100644 --- a/infrahub_sdk/ctl/schema.py +++ b/infrahub_sdk/ctl/schema.py @@ -2,7 +2,7 @@ import asyncio import time -from pathlib import Path +from pathlib import Path # noqa: TC003 from typing import TYPE_CHECKING, Any import typer diff --git a/infrahub_sdk/ctl/utils.py b/infrahub_sdk/ctl/utils.py index 968f6093..ba90e153 100644 --- a/infrahub_sdk/ctl/utils.py +++ b/infrahub_sdk/ctl/utils.py @@ -3,7 +3,6 @@ import inspect import logging import traceback -from collections.abc import Callable, Coroutine from functools import wraps from pathlib import Path from typing import TYPE_CHECKING, Any, NoReturn, TypeVar @@ -32,6 +31,8 @@ from .exceptions import QueryNotFoundError if TYPE_CHECKING: + from collections.abc import Callable, Coroutine + from ..schema.repository import InfrahubRepositoryConfig from ..spec.object import ObjectFile diff --git a/infrahub_sdk/exceptions.py b/infrahub_sdk/exceptions.py index e1dba1d5..2124c413 100644 --- a/infrahub_sdk/exceptions.py +++ b/infrahub_sdk/exceptions.py @@ -1,7 +1,9 @@ from __future__ import annotations -from collections.abc import Mapping -from typing import Any +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from collections.abc import Mapping class Error(Exception): diff --git a/infrahub_sdk/node/attribute.py b/infrahub_sdk/node/attribute.py index 8043d567..f81b61a9 100644 --- a/infrahub_sdk/node/attribute.py +++ b/infrahub_sdk/node/attribute.py @@ -1,7 +1,6 @@ from __future__ import annotations import ipaddress -from collections.abc import Callable from typing import TYPE_CHECKING, Any, get_args from ..protocols_base import CoreNodeBase @@ -10,6 +9,8 @@ from .property import NodeProperty if TYPE_CHECKING: + from collections.abc import Callable + from ..schema import AttributeSchemaAPI diff --git a/infrahub_sdk/node/node.py b/infrahub_sdk/node/node.py index 25d9d191..b520d54d 100644 --- a/infrahub_sdk/node/node.py +++ b/infrahub_sdk/node/node.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Iterable from copy import copy, deepcopy from typing import TYPE_CHECKING, Any @@ -28,6 +27,8 @@ from .relationship import RelationshipManager, RelationshipManagerBase, RelationshipManagerSync if TYPE_CHECKING: + from collections.abc import Iterable + from typing_extensions import Self from ..client import InfrahubClient, InfrahubClientSync diff --git a/infrahub_sdk/node/relationship.py b/infrahub_sdk/node/relationship.py index dcd33c9c..a10ad303 100644 --- a/infrahub_sdk/node/relationship.py +++ b/infrahub_sdk/node/relationship.py @@ -1,7 +1,6 @@ from __future__ import annotations from collections import defaultdict -from collections.abc import Iterable from typing import TYPE_CHECKING, Any from ..exceptions import ( @@ -14,6 +13,8 @@ from .related_node import RelatedNode, RelatedNodeSync if TYPE_CHECKING: + from collections.abc import Iterable + from ..client import InfrahubClient, InfrahubClientSync from ..schema import RelationshipSchemaAPI from .node import InfrahubNode, InfrahubNodeSync diff --git a/infrahub_sdk/protocols_generator/generator.py b/infrahub_sdk/protocols_generator/generator.py index ee80732f..c1743bd9 100644 --- a/infrahub_sdk/protocols_generator/generator.py +++ b/infrahub_sdk/protocols_generator/generator.py @@ -1,7 +1,7 @@ from __future__ import annotations -from collections.abc import Mapping from pathlib import Path +from typing import TYPE_CHECKING import jinja2 @@ -19,6 +19,9 @@ ) from .constants import ATTRIBUTE_KIND_MAP, CORE_BASE_CLASS_TO_SYNCIFY, TEMPLATE_FILE_NAME +if TYPE_CHECKING: + from collections.abc import Mapping + def load_template() -> str: path = Path(__file__).parent / TEMPLATE_FILE_NAME diff --git a/infrahub_sdk/pytest_plugin/loader.py b/infrahub_sdk/pytest_plugin/loader.py index 590a4ed7..a808871f 100644 --- a/infrahub_sdk/pytest_plugin/loader.py +++ b/infrahub_sdk/pytest_plugin/loader.py @@ -1,8 +1,7 @@ from __future__ import annotations import contextlib -from collections.abc import Iterable -from typing import Any +from typing import TYPE_CHECKING, Any import pytest import yaml @@ -25,6 +24,9 @@ ) from .models import InfrahubTestFileV1, InfrahubTestGroup +if TYPE_CHECKING: + from collections.abc import Iterable + MARKER_MAPPING = { "Check": pytest.mark.infrahub_check, "GraphQLQuery": pytest.mark.infrahub_graphql_query, diff --git a/infrahub_sdk/query_groups.py b/infrahub_sdk/query_groups.py index 696aa260..971344d6 100644 --- a/infrahub_sdk/query_groups.py +++ b/infrahub_sdk/query_groups.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Sequence from typing import TYPE_CHECKING, Any from .constants import InfrahubClientMode @@ -8,6 +7,8 @@ from .utils import dict_hash if TYPE_CHECKING: + from collections.abc import Sequence + from .client import InfrahubClient, InfrahubClientSync from .node import InfrahubNode, InfrahubNodeSync, RelatedNodeBase from .schema import MainSchemaTypesAPI diff --git a/infrahub_sdk/schema/__init__.py b/infrahub_sdk/schema/__init__.py index 3e61ad2a..996bc66e 100644 --- a/infrahub_sdk/schema/__init__.py +++ b/infrahub_sdk/schema/__init__.py @@ -4,7 +4,6 @@ import inspect import json import warnings -from collections.abc import MutableMapping from enum import Enum from time import sleep from typing import TYPE_CHECKING, Any, TypeAlias, TypedDict @@ -42,6 +41,8 @@ ) if TYPE_CHECKING: + from collections.abc import MutableMapping + from ..client import InfrahubClient, InfrahubClientSync, SchemaType, SchemaTypeSync from ..node import InfrahubNode, InfrahubNodeSync diff --git a/infrahub_sdk/schema/main.py b/infrahub_sdk/schema/main.py index 34a35177..a0755053 100644 --- a/infrahub_sdk/schema/main.py +++ b/infrahub_sdk/schema/main.py @@ -1,7 +1,7 @@ from __future__ import annotations import warnings -from collections.abc import MutableMapping +from collections.abc import MutableMapping # noqa: TC003 - Required at runtime for Pydantic field validation from enum import Enum from typing import TYPE_CHECKING, Any diff --git a/infrahub_sdk/task/models.py b/infrahub_sdk/task/models.py index 2525bda2..f06e2941 100644 --- a/infrahub_sdk/task/models.py +++ b/infrahub_sdk/task/models.py @@ -1,6 +1,6 @@ from __future__ import annotations -from datetime import datetime +from datetime import datetime # noqa: TC003 - Required at runtime for Pydantic field validation from enum import Enum from pydantic import BaseModel, Field diff --git a/infrahub_sdk/template/__init__.py b/infrahub_sdk/template/__init__.py index 910ec216..ea417d94 100644 --- a/infrahub_sdk/template/__init__.py +++ b/infrahub_sdk/template/__init__.py @@ -1,9 +1,8 @@ from __future__ import annotations import linecache -from collections.abc import Callable from pathlib import Path -from typing import Any, NoReturn +from typing import TYPE_CHECKING, Any, NoReturn import jinja2 from jinja2 import meta, nodes @@ -22,6 +21,9 @@ from .filters import AVAILABLE_FILTERS from .models import UndefinedJinja2Error +if TYPE_CHECKING: + from collections.abc import Callable + netutils_filters = jinja2_convenience_function() diff --git a/infrahub_sdk/topological_sort.py b/infrahub_sdk/topological_sort.py index a323d440..5daffb6f 100644 --- a/infrahub_sdk/topological_sort.py +++ b/infrahub_sdk/topological_sort.py @@ -1,8 +1,10 @@ from __future__ import annotations -from collections.abc import Iterable, Mapping, Sequence from itertools import chain -from typing import Any +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from collections.abc import Iterable, Mapping, Sequence class DependencyCycleExistsError(Exception): diff --git a/infrahub_sdk/transfer/exporter/interface.py b/infrahub_sdk/transfer/exporter/interface.py index dcc90682..3697141a 100644 --- a/infrahub_sdk/transfer/exporter/interface.py +++ b/infrahub_sdk/transfer/exporter/interface.py @@ -1,7 +1,10 @@ from __future__ import annotations from abc import ABC, abstractmethod -from pathlib import Path +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from pathlib import Path class ExporterInterface(ABC): diff --git a/infrahub_sdk/transfer/exporter/json.py b/infrahub_sdk/transfer/exporter/json.py index 077ee8fa..af731674 100644 --- a/infrahub_sdk/transfer/exporter/json.py +++ b/infrahub_sdk/transfer/exporter/json.py @@ -1,8 +1,6 @@ from __future__ import annotations -from collections.abc import Generator from contextlib import contextmanager -from pathlib import Path from typing import TYPE_CHECKING, Any import ujson @@ -15,6 +13,9 @@ from .interface import ExporterInterface if TYPE_CHECKING: + from collections.abc import Generator + from pathlib import Path + from rich.console import Console from ...client import InfrahubClient diff --git a/infrahub_sdk/transfer/importer/json.py b/infrahub_sdk/transfer/importer/json.py index 9c0b7ab9..a2715e41 100644 --- a/infrahub_sdk/transfer/importer/json.py +++ b/infrahub_sdk/transfer/importer/json.py @@ -1,9 +1,7 @@ from __future__ import annotations from collections import defaultdict -from collections.abc import Generator, Mapping, Sequence from contextlib import contextmanager -from pathlib import Path from typing import TYPE_CHECKING, Any import pyarrow.json as pa_json @@ -16,6 +14,9 @@ from .interface import ImporterInterface if TYPE_CHECKING: + from collections.abc import Generator, Mapping, Sequence + from pathlib import Path + from rich.console import Console from ...batch import InfrahubBatch diff --git a/infrahub_sdk/transfer/schema_sorter.py b/infrahub_sdk/transfer/schema_sorter.py index fc1ba34d..62462b03 100644 --- a/infrahub_sdk/transfer/schema_sorter.py +++ b/infrahub_sdk/transfer/schema_sorter.py @@ -1,12 +1,13 @@ from __future__ import annotations -from collections.abc import Sequence from typing import TYPE_CHECKING from ..topological_sort import DependencyCycleExistsError, topological_sort from .exceptions import SchemaImportError if TYPE_CHECKING: + from collections.abc import Sequence + from ..schema import NodeSchema diff --git a/pyproject.toml b/pyproject.toml index 7361ba1d..6349478c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -255,7 +255,6 @@ ignore = [ "S311", # Standard pseudo-random generators are not suitable for cryptographic purposes "S701", # By default, jinja2 sets `autoescape` to `False`. Consider using `autoescape=True` "SIM108", # Use ternary operator `key_str = f"{value[ALIAS_KEY]}: {key}" if ALIAS_KEY in value and value[ALIAS_KEY] else key` instead of `if`-`else`-block - "TC003", # Move standard library import `collections.abc.Iterable` into a type-checking block "UP031", # Use format specifiers instead of percent format ] diff --git a/tests/integration/test_infrahub_client.py b/tests/integration/test_infrahub_client.py index 2fe9d801..b94508dd 100644 --- a/tests/integration/test_infrahub_client.py +++ b/tests/integration/test_infrahub_client.py @@ -1,8 +1,6 @@ from __future__ import annotations -from collections.abc import AsyncGenerator -from pathlib import Path -from typing import Any +from typing import TYPE_CHECKING, Any import pytest @@ -19,6 +17,10 @@ from infrahub_sdk.testing.schemas.animal import TESTING_ANIMAL, TESTING_CAT, TESTING_DOG, TESTING_PERSON, SchemaAnimal from infrahub_sdk.types import Order +if TYPE_CHECKING: + from collections.abc import AsyncGenerator + from pathlib import Path + class TestInfrahubNode(TestInfrahubDockerClient, SchemaAnimal): @pytest.fixture(scope="class") diff --git a/tests/integration/test_infrahub_client_sync.py b/tests/integration/test_infrahub_client_sync.py index 472c3378..7bfff472 100644 --- a/tests/integration/test_infrahub_client_sync.py +++ b/tests/integration/test_infrahub_client_sync.py @@ -1,6 +1,5 @@ from __future__ import annotations -from pathlib import Path from typing import TYPE_CHECKING, Any import pytest @@ -19,6 +18,8 @@ from infrahub_sdk.types import Order if TYPE_CHECKING: + from pathlib import Path + from infrahub_sdk import InfrahubClient from infrahub_sdk.node import InfrahubNode diff --git a/tests/unit/sdk/checks/test_checks.py b/tests/unit/sdk/checks/test_checks.py index 6433b8b4..3d4c8c3f 100644 --- a/tests/unit/sdk/checks/test_checks.py +++ b/tests/unit/sdk/checks/test_checks.py @@ -1,6 +1,5 @@ from __future__ import annotations -from pathlib import Path from typing import TYPE_CHECKING import pytest @@ -9,6 +8,8 @@ from infrahub_sdk.checks import InfrahubCheck if TYPE_CHECKING: + from pathlib import Path + from pytest_httpx import HTTPXMock pytestmark = pytest.mark.httpx_mock(can_send_already_matched_responses=True) diff --git a/tests/unit/sdk/conftest.py b/tests/unit/sdk/conftest.py index 8fb9ecf2..12207325 100644 --- a/tests/unit/sdk/conftest.py +++ b/tests/unit/sdk/conftest.py @@ -2,9 +2,7 @@ import re import sys -from collections.abc import AsyncGenerator, Callable, Mapping from dataclasses import dataclass -from inspect import Parameter from io import StringIO from typing import TYPE_CHECKING, Any @@ -16,6 +14,9 @@ from infrahub_sdk.utils import get_fixtures_dir if TYPE_CHECKING: + from collections.abc import AsyncGenerator, Callable, Mapping + from inspect import Parameter + from pytest_httpx import HTTPXMock pytestmark = pytest.mark.httpx_mock(can_send_already_matched_responses=True)