From: Daniele Varrazzo Date: Wed, 7 May 2025 01:44:46 +0000 (+0200) Subject: chore: drop pre-3.10 compatibility hacks X-Git-Tag: 3.3.0.dev1~68^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f4aafc1bdba302ac2b5bca2b238b4a3f9633b3b2;p=thirdparty%2Fpsycopg.git chore: drop pre-3.10 compatibility hacks --- diff --git a/psycopg/psycopg/_acompat.py b/psycopg/psycopg/_acompat.py index 4f9043c6f..de8d8de6a 100644 --- a/psycopg/psycopg/_acompat.py +++ b/psycopg/psycopg/_acompat.py @@ -13,10 +13,10 @@ from __future__ import annotations import queue import asyncio import threading -from typing import Any, Callable +from typing import Any, Callable, TypeAlias from collections.abc import Coroutine -from ._compat import TypeAlias, TypeVar +from ._compat import TypeVar Worker: TypeAlias = threading.Thread AWorker: TypeAlias = "asyncio.Task[None]" diff --git a/psycopg/psycopg/_compat.py b/psycopg/psycopg/_compat.py index 5a3e72204..e5f912169 100644 --- a/psycopg/psycopg/_compat.py +++ b/psycopg/psycopg/_compat.py @@ -6,11 +6,6 @@ compatibility functions for different Python versions import sys -if sys.version_info >= (3, 10): - from typing import TypeAlias, TypeGuard -else: - from typing_extensions import TypeAlias, TypeGuard - if sys.version_info >= (3, 11): from typing import LiteralString, Self else: @@ -24,7 +19,5 @@ else: __all__ = [ "LiteralString", "Self", - "TypeAlias", - "TypeGuard", "TypeVar", ] diff --git a/psycopg/psycopg/_connection_base.py b/psycopg/psycopg/_connection_base.py index 11616828b..9a7754f55 100644 --- a/psycopg/psycopg/_connection_base.py +++ b/psycopg/psycopg/_connection_base.py @@ -8,7 +8,7 @@ from __future__ import annotations import sys import logging -from typing import TYPE_CHECKING, Callable, Generic, NamedTuple +from typing import TYPE_CHECKING, Callable, Generic, NamedTuple, TypeAlias from weakref import ReferenceType, ref from warnings import warn from functools import partial @@ -22,7 +22,7 @@ from ._tpc import Xid from .rows import Row from .adapt import AdaptersMap from ._enums import IsolationLevel -from ._compat import LiteralString, Self, TypeAlias, TypeVar +from ._compat import LiteralString, Self, TypeVar from .pq.misc import connection_summary from ._pipeline import BasePipeline from ._preparing import PrepareManager diff --git a/psycopg/psycopg/_pipeline.py b/psycopg/psycopg/_pipeline.py index 4b5edf11e..dcc225c9f 100644 --- a/psycopg/psycopg/_pipeline.py +++ b/psycopg/psycopg/_pipeline.py @@ -8,13 +8,13 @@ from __future__ import annotations import logging from types import TracebackType -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, TypeAlias from collections import deque from . import errors as e from . import pq from .abc import PipelineCommand, PQGen -from ._compat import Self, TypeAlias +from ._compat import Self from .pq.misc import connection_summary from .generators import fetch_many, pipeline_communicate, send from ._capabilities import capabilities diff --git a/psycopg/psycopg/_preparing.py b/psycopg/psycopg/_preparing.py index 97e6a0dc1..2be4a3c66 100644 --- a/psycopg/psycopg/_preparing.py +++ b/psycopg/psycopg/_preparing.py @@ -7,13 +7,12 @@ Support for prepared statements from __future__ import annotations from enum import IntEnum, auto -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, TypeAlias from collections import OrderedDict, deque from collections.abc import Sequence from . import pq from .abc import PQGen -from ._compat import TypeAlias from ._queries import PostgresQuery if TYPE_CHECKING: diff --git a/psycopg/psycopg/_py_transformer.py b/psycopg/psycopg/_py_transformer.py index 4f76c6a0c..0f449b620 100644 --- a/psycopg/psycopg/_py_transformer.py +++ b/psycopg/psycopg/_py_transformer.py @@ -11,7 +11,7 @@ dependencies problems). from __future__ import annotations -from typing import TYPE_CHECKING, Any, DefaultDict +from typing import TYPE_CHECKING, Any, DefaultDict, TypeAlias from collections import defaultdict from collections.abc import Sequence @@ -21,7 +21,6 @@ from . import pq from .abc import AdaptContext, Buffer, LoadFunc, NoneType, PyFormat from .rows import Row, RowMaker from ._oids import INVALID_OID, TEXT_OID -from ._compat import TypeAlias from ._encodings import conn_encoding if TYPE_CHECKING: diff --git a/psycopg/psycopg/_queries.py b/psycopg/psycopg/_queries.py index 2da919ad7..4da8a0d0b 100644 --- a/psycopg/psycopg/_queries.py +++ b/psycopg/psycopg/_queries.py @@ -7,7 +7,7 @@ Utility module to manipulate queries from __future__ import annotations import re -from typing import TYPE_CHECKING, Any, Callable, NamedTuple +from typing import TYPE_CHECKING, Any, Callable, NamedTuple, TypeAlias, TypeGuard from functools import lru_cache from collections.abc import Mapping, Sequence @@ -16,7 +16,6 @@ from . import pq from .abc import Buffer, Params, Query from .sql import Composable from ._enums import PyFormat -from ._compat import TypeAlias, TypeGuard from ._encodings import conn_encoding if TYPE_CHECKING: diff --git a/psycopg/psycopg/_struct.py b/psycopg/psycopg/_struct.py index 72536d6bd..ddbee086c 100644 --- a/psycopg/psycopg/_struct.py +++ b/psycopg/psycopg/_struct.py @@ -7,11 +7,10 @@ Utility functions to deal with binary structs. from __future__ import annotations import struct -from typing import Callable, Protocol, cast +from typing import Callable, Protocol, TypeAlias, cast from . import errors as e from .abc import Buffer -from ._compat import TypeAlias PackInt: TypeAlias = Callable[[int], bytes] UnpackInt: TypeAlias = Callable[[Buffer], "tuple[int]"] diff --git a/psycopg/psycopg/_typeinfo.py b/psycopg/psycopg/_typeinfo.py index 648b51dc8..1f897b33b 100644 --- a/psycopg/psycopg/_typeinfo.py +++ b/psycopg/psycopg/_typeinfo.py @@ -9,14 +9,14 @@ information to the adapters if needed. from __future__ import annotations -from typing import TYPE_CHECKING, Any, overload +from typing import TYPE_CHECKING, Any, TypeAlias, overload from collections.abc import Iterator, Sequence from . import errors as e from . import sql from .abc import AdaptContext, Query from .rows import dict_row -from ._compat import TypeAlias, TypeVar +from ._compat import TypeVar from ._typemod import TypeModifier from ._encodings import conn_encoding diff --git a/psycopg/psycopg/abc.py b/psycopg/psycopg/abc.py index d63e97141..029df2118 100644 --- a/psycopg/psycopg/abc.py +++ b/psycopg/psycopg/abc.py @@ -6,12 +6,12 @@ Protocol objects representing different implementations of the same classes. from __future__ import annotations -from typing import TYPE_CHECKING, Any, Callable, Protocol, Union +from typing import TYPE_CHECKING, Any, Callable, Protocol, TypeAlias, Union from collections.abc import Generator, Mapping, Sequence from . import pq from ._enums import PyFormat as PyFormat -from ._compat import LiteralString, TypeAlias, TypeVar +from ._compat import LiteralString, TypeVar if TYPE_CHECKING: from . import sql # noqa: F401 diff --git a/psycopg/psycopg/errors.py b/psycopg/psycopg/errors.py index 40eb3ac83..0385daa6c 100644 --- a/psycopg/psycopg/errors.py +++ b/psycopg/psycopg/errors.py @@ -20,13 +20,12 @@ DBAPI-defined Exceptions are defined in the following hierarchy:: from __future__ import annotations -from typing import TYPE_CHECKING, Any, Callable, NoReturn +from typing import TYPE_CHECKING, Any, Callable, NoReturn, TypeAlias, TypeGuard from asyncio import CancelledError from dataclasses import dataclass, field, fields from collections.abc import Sequence from .pq.abc import PGconn, PGresult -from ._compat import TypeAlias, TypeGuard from .pq._enums import ConnStatus, DiagnosticField, PipelineStatus, TransactionStatus if TYPE_CHECKING: diff --git a/psycopg/psycopg/pq/abc.py b/psycopg/psycopg/pq/abc.py index 105c47f8b..f67a6611f 100644 --- a/psycopg/psycopg/pq/abc.py +++ b/psycopg/psycopg/pq/abc.py @@ -6,11 +6,11 @@ Protocol objects to represent objects exposed by different pq implementations. from __future__ import annotations -from typing import TYPE_CHECKING, Any, Callable, Protocol, Union +from typing import TYPE_CHECKING, Any, Callable, Protocol, TypeAlias, Union from collections.abc import Sequence from ._enums import Format, Trace -from .._compat import Self, TypeAlias +from .._compat import Self if TYPE_CHECKING: from .misc import ConninfoOption, PGnotify, PGresAttDesc diff --git a/psycopg/psycopg/rows.py b/psycopg/psycopg/rows.py index 2f965e099..c9c806eb4 100644 --- a/psycopg/psycopg/rows.py +++ b/psycopg/psycopg/rows.py @@ -8,12 +8,13 @@ from __future__ import annotations import functools from typing import TYPE_CHECKING, Any, Callable, NamedTuple, NoReturn, Protocol +from typing import TypeAlias from collections import namedtuple from collections.abc import Sequence from . import errors as e from . import pq -from ._compat import TypeAlias, TypeVar +from ._compat import TypeVar from ._encodings import _as_python_identifier if TYPE_CHECKING: diff --git a/psycopg/psycopg/types/enum.py b/psycopg/psycopg/types/enum.py index 787883b57..fef2f1e40 100644 --- a/psycopg/psycopg/types/enum.py +++ b/psycopg/psycopg/types/enum.py @@ -5,7 +5,7 @@ Adapters for the enum type. from __future__ import annotations from enum import Enum -from typing import TYPE_CHECKING, Any, Generic, cast +from typing import TYPE_CHECKING, Any, Generic, TypeAlias, cast from functools import cache from collections.abc import Mapping, Sequence @@ -14,7 +14,7 @@ from .. import postgres, sql from ..pq import Format from ..abc import AdaptContext, Query from ..adapt import Buffer, Dumper, Loader -from .._compat import TypeAlias, TypeVar +from .._compat import TypeVar from .._typeinfo import TypeInfo from .._encodings import conn_encoding diff --git a/psycopg/psycopg/types/hstore.py b/psycopg/psycopg/types/hstore.py index 6ed323fbd..cf91f6142 100644 --- a/psycopg/psycopg/types/hstore.py +++ b/psycopg/psycopg/types/hstore.py @@ -8,6 +8,7 @@ from __future__ import annotations import re from struct import Struct +from typing import TypeAlias from functools import cache from .. import errors as e @@ -16,7 +17,6 @@ from ..pq import Format from ..abc import AdaptContext, Buffer from .._oids import TEXT_OID from ..adapt import Loader, PyFormat, RecursiveDumper, RecursiveLoader -from .._compat import TypeAlias from .._typeinfo import TypeInfo from .._encodings import conn_encoding diff --git a/psycopg/psycopg/types/json.py b/psycopg/psycopg/types/json.py index 869e07873..ec8516be5 100644 --- a/psycopg/psycopg/types/json.py +++ b/psycopg/psycopg/types/json.py @@ -7,7 +7,7 @@ Adapters for JSON types. from __future__ import annotations import json -from typing import Any, Callable +from typing import Any, Callable, TypeAlias from functools import cache from .. import _oids, abc @@ -15,7 +15,6 @@ from .. import errors as e from ..pq import Format from ..adapt import AdaptersMap, Buffer, Dumper, Loader, PyFormat from ..errors import DataError -from .._compat import TypeAlias JsonDumpsFunction: TypeAlias = Callable[[Any], "str | bytes"] JsonLoadsFunction: TypeAlias = Callable[["str | bytes"], Any] diff --git a/psycopg/psycopg/types/net.py b/psycopg/psycopg/types/net.py index 31b9a961a..ccc47c4ed 100644 --- a/psycopg/psycopg/types/net.py +++ b/psycopg/psycopg/types/net.py @@ -6,13 +6,12 @@ Adapters for network types. from __future__ import annotations -from typing import TYPE_CHECKING, Callable +from typing import TYPE_CHECKING, Callable, TypeAlias from .. import _oids from ..pq import Format from ..abc import AdaptContext from ..adapt import Buffer, Dumper, Loader -from .._compat import TypeAlias if TYPE_CHECKING: import ipaddress diff --git a/psycopg_pool/psycopg_pool/_acompat.py b/psycopg_pool/psycopg_pool/_acompat.py index aede93137..4ec60afe3 100644 --- a/psycopg_pool/psycopg_pool/_acompat.py +++ b/psycopg_pool/psycopg_pool/_acompat.py @@ -15,10 +15,10 @@ import queue import asyncio import logging import threading -from typing import Any, Callable +from typing import Any, Callable, TypeAlias from collections.abc import Coroutine -from ._compat import TypeAlias, TypeVar +from ._compat import TypeVar logger = logging.getLogger("psycopg.pool") T = TypeVar("T") diff --git a/psycopg_pool/psycopg_pool/_compat.py b/psycopg_pool/psycopg_pool/_compat.py index be6a967e0..142896ad4 100644 --- a/psycopg_pool/psycopg_pool/_compat.py +++ b/psycopg_pool/psycopg_pool/_compat.py @@ -8,11 +8,6 @@ from __future__ import annotations import sys -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing_extensions import TypeAlias - if sys.version_info >= (3, 11): from typing import Self else: @@ -27,7 +22,6 @@ import psycopg.errors as e __all__ = [ "Self", - "TypeAlias", "TypeVar", ] diff --git a/psycopg_pool/psycopg_pool/abc.py b/psycopg_pool/psycopg_pool/abc.py index a9783626f..19b225041 100644 --- a/psycopg_pool/psycopg_pool/abc.py +++ b/psycopg_pool/psycopg_pool/abc.py @@ -6,10 +6,10 @@ Types used in the psycopg_pool package from __future__ import annotations -from typing import TYPE_CHECKING, Callable, Union +from typing import TYPE_CHECKING, Callable, TypeAlias, Union from collections.abc import Awaitable -from ._compat import TypeAlias, TypeVar +from ._compat import TypeVar if TYPE_CHECKING: from typing import Any # noqa: F401 diff --git a/tests/acompat.py b/tests/acompat.py index 0605b5a6e..b65d16d55 100644 --- a/tests/acompat.py +++ b/tests/acompat.py @@ -8,12 +8,10 @@ when generating the sync version. from __future__ import annotations -import sys import time import queue import asyncio import inspect -import builtins import threading import contextlib from typing import Any @@ -41,23 +39,6 @@ def is_async(obj): return "Async" in obj.__name__ -if sys.version_info >= (3, 10): - anext = builtins.anext - aclosing = contextlib.aclosing - -else: - - async def anext(it): - return await it.__anext__() - - @contextlib.asynccontextmanager - async def aclosing(thing): - try: - yield thing - finally: - await thing.aclose() - - async def alist(it): """Consume an async iterator into a list. Async equivalent of list(it).""" return [i async for i in it] diff --git a/tests/test_cursor_common.py b/tests/test_cursor_common.py index 89f91e677..d7bc92c74 100644 --- a/tests/test_cursor_common.py +++ b/tests/test_cursor_common.py @@ -8,6 +8,7 @@ Tests common to psycopg.Cursor and its subclasses. import weakref import datetime as dt from typing import Any +from contextlib import closing import pytest from packaging.version import parse as ver @@ -19,7 +20,6 @@ from psycopg.types import TypeInfo from . import _test_cursor from .utils import raiseif -from .acompat import closing from .fix_crdb import crdb_encoding from ._test_cursor import my_row_factory, ph diff --git a/tests/test_cursor_common_async.py b/tests/test_cursor_common_async.py index ac8ca65fb..7c7a10e35 100644 --- a/tests/test_cursor_common_async.py +++ b/tests/test_cursor_common_async.py @@ -5,6 +5,7 @@ Tests common to psycopg.AsyncCursor and its subclasses. import weakref import datetime as dt from typing import Any +from contextlib import aclosing import pytest from packaging.version import parse as ver @@ -16,7 +17,7 @@ from psycopg.types import TypeInfo from . import _test_cursor from .utils import raiseif -from .acompat import aclosing, alist, anext +from .acompat import alist from .fix_crdb import crdb_encoding from ._test_cursor import my_row_factory, ph diff --git a/tests/test_pipeline_async.py b/tests/test_pipeline_async.py index 56a76bfef..608b23475 100644 --- a/tests/test_pipeline_async.py +++ b/tests/test_pipeline_async.py @@ -11,7 +11,7 @@ import psycopg from psycopg import errors as e from psycopg import pq -from .acompat import anext, is_async +from .acompat import is_async pytestmark = [ pytest.mark.pipeline, diff --git a/tools/update_oids.py b/tools/update_oids.py index 0b2050dcb..51d877734 100755 --- a/tools/update_oids.py +++ b/tools/update_oids.py @@ -19,13 +19,13 @@ from __future__ import annotations import re import argparse import subprocess as sp +from typing import TypeAlias from pathlib import Path import psycopg from psycopg.pq import version_pretty from psycopg.crdb import CrdbConnection from psycopg.rows import TupleRow -from psycopg._compat import TypeAlias Connection: TypeAlias = psycopg.Connection[TupleRow]