pyproject.toml: Enforce import annotations style

Add new ruff rules and fix their fallout:

future-annotations = true

select = [ "TC", # type-checking import placement rules "FA", # future annotations rules ]

This comprises:

- Streamline imports and exports in cmds.xxx.Cmd

- Import base class as "Base"
- Export types Cmd and Parent via __all__

- Move all types imported only for annotation below TYPE_CHECKING

- Use "from __future__ import annotations" all over the place

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-06-01 10:04:38 +02:00
commit 5d1ba6e15a
Signed by: Jan Lindemann
GPG key ID: 3750640C9E25DD61
77 changed files with 382 additions and 196 deletions

View file

@ -4,8 +4,10 @@ import asyncio
import concurrent.futures
import contextlib
from collections.abc import Awaitable, Generator
from typing import TypeVar
from typing import TypeVar, TYPE_CHECKING
if TYPE_CHECKING:
from collections.abc import Awaitable, Generator
T = TypeVar('T')

View file

@ -3,13 +3,13 @@ from __future__ import annotations
import abc
import sys
from argparse import ArgumentParser
from typing import TYPE_CHECKING
from .log import ERR
from .Types import LoadTypes, Types
if TYPE_CHECKING:
from argparse import ArgumentParser
from typing import Any
from .App import App

View file

@ -9,11 +9,12 @@ from functools import cached_property
from typing import TYPE_CHECKING
from .log import ERR, INFO, WARNING, log
from .base import InputMode
if TYPE_CHECKING:
from typing import Iterable
from .base import InputMode, Result
from .base import Result
from .ExecContext import ExecContext
from .Package import Package
from .PackageFilter import PackageFilter

View file

@ -8,10 +8,11 @@ from typing import TYPE_CHECKING
from .log import DEBUG, ERR, log
from .Uri import Uri
from .ProcFilter import ProcPipeline
if TYPE_CHECKING:
from .base import Result, StatResult
from .ProcFilter import ProcFilter, ProcPipeline
from .ProcFilter import ProcFilter
class FileContext(abc.ABC):

View file

@ -1,7 +1,11 @@
from __future__ import annotations
import abc
import re
from .Package import Package
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .Package import Package
class PackageFilter(abc.ABC):

View file

@ -2,10 +2,10 @@ from __future__ import annotations
from typing import TYPE_CHECKING
from .base import Result
from .ProcFilter import ProcFilter
if TYPE_CHECKING:
from .base import Result
from .ExecContext import ExecContext
class ProcFilterGpg(ProcFilter):

View file

@ -6,10 +6,13 @@ import tarfile
from tarfile import TarFile, TarInfo
from .base import StatResult
from .CopyContext import CopyContext
from .ExecContext import ExecContext
from .log import DEBUG, ERR, log
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .base import StatResult
class TarIo(CopyContext):

View file

@ -1,14 +1,15 @@
from __future__ import annotations
import abc
import os
import re
import sys
from collections.abc import Iterator
from typing import TYPE_CHECKING, Generic, Iterable, TypeVar
from .log import OFF, log, parse_log_level
if TYPE_CHECKING:
from collections.abc import Iterator
from typing import Any
T = TypeVar('T')

View file

@ -1,9 +1,10 @@
from __future__ import annotations
import os
from enum import Enum, auto
from typing import NamedTuple, TypeAlias
from typing import NamedTuple, TypeAlias, TYPE_CHECKING
if TYPE_CHECKING:
import os
class InputMode(Enum):
Interactive = auto()

View file

@ -2,10 +2,10 @@ from __future__ import annotations
from typing import TYPE_CHECKING
from ..base import Result
from ..FileContext import FileContext as Base
if TYPE_CHECKING:
from ..base import Result
from ..ExecContext import ExecContext
from ..Uri import Uri
from .Local import Local

View file

@ -8,13 +8,12 @@ import sys
from enum import Flag, auto
from typing import TYPE_CHECKING
from ..base import Result
from ..ExecContext import ExecContext
from ..log import DEBUG, ERR, INFO, NOTICE, WARNING, log
from ..Uri import Uri
if TYPE_CHECKING:
from ..Uri import Uri
from ..base import Result
class SSHClient(ExecContext):

View file

@ -3,6 +3,8 @@ from __future__ import annotations
from typing import TYPE_CHECKING
import paramiko # type: ignore[import-untyped] # error: Library stubs not installed for "paramiko"
import paramiko.agent # type: ignore[import-untyped]
import paramiko.SCPClient # type: ignore[import-untyped]
from ...base import Result
from ...log import ERR, log
@ -12,9 +14,6 @@ from .util import join_cmd
if TYPE_CHECKING:
from typing import Any
import paramiko.agent # type: ignore[import-untyped]
import paramiko.SCPClient # type: ignore[import-untyped]
class Paramiko(Base):
def __init__(self, uri, *args, **kwargs) -> None:

View file

@ -4,7 +4,6 @@ import json
import os
import sys
from argparse import Namespace
from enum import Enum, auto
from typing import TYPE_CHECKING, Iterable, TypeVar, cast
@ -13,6 +12,7 @@ from .log import DEBUG, ERR, log
from .Uri import Uri
if TYPE_CHECKING:
from argparse import Namespace
from .ExecContext import ExecContext
from .FileContext import FileContext
from .ProcFilter import ProcFilter, ProcPipeline
@ -93,7 +93,7 @@ async def run_curl_into(
raise TypeError(
f'Expected {expected_type.__name__}, got {type(ret).__name__} from Curl'
)
return cast(T, ret)
return cast('T', ret)
async def run_askpass(
askpass_env: list[str],