From: Daniele Varrazzo Date: Tue, 13 Dec 2022 04:25:46 +0000 (+0000) Subject: fix: don't re-export TypeAlias from _compat module X-Git-Tag: 3.1.5~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a1e12bfbde655a7001172abd8fd0f0396e4afd63;p=thirdparty%2Fpsycopg.git fix: don't re-export TypeAlias from _compat module Pyright special-cases that type and requires to import it from typing or typing_extensions only (see https://github.com/microsoft/pyright/issues/4197). Drop conditional dependency on typing_extension and always import TypeAlias from there. Fix #439. --- diff --git a/docs/news.rst b/docs/news.rst index 69bc87208..6189d7cba 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -19,6 +19,7 @@ Psycopg 3.1.5 (unreleased) (:ticket:`#422`). - Fix `Cursor.rownumber` to return `!None` when the result has no row to fetch (:ticket:`#437`). +- Avoid error in pyright caused by aliasing TypeAlias (:ticket:`#439`). - Fix `Copy.set_types()` used with `varchar` and `name` types (:ticket:`#452`). diff --git a/docs/news_pool.rst b/docs/news_pool.rst index ce6f98ba1..866b04548 100644 --- a/docs/news_pool.rst +++ b/docs/news_pool.rst @@ -7,6 +7,15 @@ ``psycopg_pool`` release notes ============================== +Future releases +--------------- + +psycopg_pool 3.1.5 (unreleased) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Avoid error in pyright caused by aliasing TypeAlias (:ticket:`#439`). + + Current release --------------- diff --git a/psycopg/psycopg/_compat.py b/psycopg/psycopg/_compat.py index 91c87b8d2..7dbae7968 100644 --- a/psycopg/psycopg/_compat.py +++ b/psycopg/psycopg/_compat.py @@ -8,13 +8,18 @@ import sys import asyncio from typing import Any, Awaitable, Generator, Optional, Sequence, Union, TypeVar +# NOTE: TypeAlias cannot be exported by this module, as pyright special-cases it. +# For this raisin it must be imported directly from typing_extension where used. +# See https://github.com/microsoft/pyright/issues/4197 +from typing_extensions import TypeAlias + if sys.version_info >= (3, 8): from typing import Protocol else: from typing_extensions import Protocol T = TypeVar("T") -FutureT: "TypeAlias" = Union["asyncio.Future[T]", Generator[Any, None, T], Awaitable[T]] +FutureT: TypeAlias = Union["asyncio.Future[T]", Generator[Any, None, T], Awaitable[T]] if sys.version_info >= (3, 8): create_task = asyncio.create_task @@ -45,9 +50,9 @@ else: cache = lru_cache(maxsize=None) if sys.version_info >= (3, 10): - from typing import TypeAlias, TypeGuard + from typing import TypeGuard else: - from typing_extensions import TypeAlias, TypeGuard + from typing_extensions import TypeGuard if sys.version_info >= (3, 11): from typing import LiteralString @@ -59,7 +64,6 @@ __all__ = [ "Deque", "LiteralString", "Protocol", - "TypeAlias", "TypeGuard", "ZoneInfo", "cache", diff --git a/psycopg/psycopg/_pipeline.py b/psycopg/psycopg/_pipeline.py index fe4bf54fc..c818d86e8 100644 --- a/psycopg/psycopg/_pipeline.py +++ b/psycopg/psycopg/_pipeline.py @@ -7,11 +7,12 @@ commands pipeline management import logging from types import TracebackType from typing import Any, List, Optional, Union, Tuple, Type, TypeVar, TYPE_CHECKING +from typing_extensions import TypeAlias from . import pq from . import errors as e from .abc import PipelineCommand, PQGen -from ._compat import Deque, TypeAlias +from ._compat import Deque from ._encodings import pgconn_encoding from ._preparing import Key, Prepare from .generators import pipeline_communicate, fetch_many, send diff --git a/psycopg/psycopg/_preparing.py b/psycopg/psycopg/_preparing.py index 622aeff41..f60c0cbb3 100644 --- a/psycopg/psycopg/_preparing.py +++ b/psycopg/psycopg/_preparing.py @@ -7,9 +7,10 @@ Support for prepared statements from enum import IntEnum, auto from typing import Iterator, Optional, Sequence, Tuple, TYPE_CHECKING from collections import OrderedDict +from typing_extensions import TypeAlias from . import pq -from ._compat import Deque, TypeAlias +from ._compat import Deque from ._queries import PostgresQuery if TYPE_CHECKING: diff --git a/psycopg/psycopg/_struct.py b/psycopg/psycopg/_struct.py index 191c4013d..28a608447 100644 --- a/psycopg/psycopg/_struct.py +++ b/psycopg/psycopg/_struct.py @@ -6,10 +6,11 @@ Utility functions to deal with binary structs. import struct from typing import Callable, cast, Optional, Tuple +from typing_extensions import TypeAlias from .abc import Buffer from . import errors as e -from ._compat import Protocol, TypeAlias +from ._compat import Protocol PackInt: TypeAlias = Callable[[int], bytes] UnpackInt: TypeAlias = Callable[[Buffer], Tuple[int]] diff --git a/psycopg/psycopg/_transform.py b/psycopg/psycopg/_transform.py index 0e9dcaf7a..19bd6aec7 100644 --- a/psycopg/psycopg/_transform.py +++ b/psycopg/psycopg/_transform.py @@ -7,13 +7,13 @@ Helper object to transform values between Python and PostgreSQL from typing import Any, Dict, List, Optional, Sequence, Tuple from typing import DefaultDict, TYPE_CHECKING from collections import defaultdict +from typing_extensions import TypeAlias from . import pq from . import postgres from . import errors as e from .abc import Buffer, LoadFunc, AdaptContext, PyFormat, DumperKey, NoneType from .rows import Row, RowMaker -from ._compat import TypeAlias from .postgres import INVALID_OID, TEXT_OID from ._encodings import pgconn_encoding diff --git a/psycopg/psycopg/_typeinfo.py b/psycopg/psycopg/_typeinfo.py index 048b5232c..2f1a24d93 100644 --- a/psycopg/psycopg/_typeinfo.py +++ b/psycopg/psycopg/_typeinfo.py @@ -9,11 +9,11 @@ information to the adapters if needed. from enum import Enum from typing import Any, Dict, Iterator, Optional, overload from typing import Sequence, Tuple, Type, TypeVar, Union, TYPE_CHECKING +from typing_extensions import TypeAlias from . import errors as e from .abc import AdaptContext from .rows import dict_row -from ._compat import TypeAlias if TYPE_CHECKING: from .connection import Connection diff --git a/psycopg/psycopg/abc.py b/psycopg/psycopg/abc.py index 12a5f93e7..80c8fbfb3 100644 --- a/psycopg/psycopg/abc.py +++ b/psycopg/psycopg/abc.py @@ -7,10 +7,11 @@ Protocol objects representing different implementations of the same classes. from typing import Any, Callable, Generator, Mapping from typing import List, Optional, Sequence, Tuple, TypeVar, Union from typing import TYPE_CHECKING +from typing_extensions import TypeAlias from . import pq from ._enums import PyFormat as PyFormat -from ._compat import Protocol, TypeAlias, LiteralString +from ._compat import Protocol, LiteralString if TYPE_CHECKING: from . import sql diff --git a/psycopg/psycopg/connection.py b/psycopg/psycopg/connection.py index d40b4807f..78ad57751 100644 --- a/psycopg/psycopg/connection.py +++ b/psycopg/psycopg/connection.py @@ -14,6 +14,7 @@ from weakref import ref, ReferenceType from warnings import warn from functools import partial from contextlib import contextmanager +from typing_extensions import TypeAlias from . import pq from . import errors as e @@ -27,7 +28,7 @@ from .rows import Row, RowFactory, tuple_row, TupleRow, args_row from .adapt import AdaptersMap from ._enums import IsolationLevel from .cursor import Cursor -from ._compat import TypeAlias, LiteralString +from ._compat import LiteralString from .conninfo import make_conninfo, conninfo_to_dict, ConnectionInfo from ._pipeline import BasePipeline, Pipeline from .generators import notifies, connect, execute diff --git a/psycopg/psycopg/errors.py b/psycopg/psycopg/errors.py index 65f001703..e1769546b 100644 --- a/psycopg/psycopg/errors.py +++ b/psycopg/psycopg/errors.py @@ -19,10 +19,11 @@ DBAPI-defined Exceptions are defined in the following hierarchy:: # Copyright (C) 2020 The Psycopg Team from typing import Any, Dict, Optional, Sequence, Tuple, Type, Union +from typing_extensions import TypeAlias from .pq.abc import PGconn, PGresult from .pq._enums import DiagnosticField -from ._compat import TypeAlias, TypeGuard +from ._compat import TypeGuard ErrorInfo: TypeAlias = Union[None, PGresult, Dict[int, Optional[bytes]]] diff --git a/psycopg/psycopg/pq/abc.py b/psycopg/psycopg/pq/abc.py index 9ee21c288..9c45f64d1 100644 --- a/psycopg/psycopg/pq/abc.py +++ b/psycopg/psycopg/pq/abc.py @@ -6,9 +6,10 @@ Protocol objects to represent objects exposed by different pq implementations. from typing import Any, Callable, List, Optional, Sequence, Tuple from typing import Union, TYPE_CHECKING +from typing_extensions import TypeAlias from ._enums import Format, Trace -from .._compat import Protocol, TypeAlias +from .._compat import Protocol if TYPE_CHECKING: from .misc import PGnotify, ConninfoOption, PGresAttDesc diff --git a/psycopg/psycopg/rows.py b/psycopg/psycopg/rows.py index 3652b637c..bab954d2c 100644 --- a/psycopg/psycopg/rows.py +++ b/psycopg/psycopg/rows.py @@ -8,9 +8,10 @@ import functools from typing import Any, Callable, Dict, NamedTuple, NoReturn, Sequence, Tuple from typing import TYPE_CHECKING, Type, TypeVar from collections import namedtuple +from typing_extensions import TypeAlias from . import errors as e -from ._compat import Protocol, TypeAlias +from ._compat import Protocol from ._encodings import _as_python_identifier if TYPE_CHECKING: diff --git a/psycopg/psycopg/types/enum.py b/psycopg/psycopg/types/enum.py index 3e195443d..d3c73874f 100644 --- a/psycopg/psycopg/types/enum.py +++ b/psycopg/psycopg/types/enum.py @@ -4,13 +4,13 @@ Adapters for the enum type. from enum import Enum from typing import Any, Dict, Generic, Optional, Mapping, Sequence from typing import Tuple, Type, TypeVar, Union, cast +from typing_extensions import TypeAlias from .. import postgres from .. import errors as e from ..pq import Format from ..abc import AdaptContext from ..adapt import Buffer, Dumper, Loader -from .._compat import TypeAlias from .._encodings import conn_encoding from .._typeinfo import EnumInfo as EnumInfo # exported here diff --git a/psycopg/psycopg/types/hstore.py b/psycopg/psycopg/types/hstore.py index f1467db16..e1ab1d580 100644 --- a/psycopg/psycopg/types/hstore.py +++ b/psycopg/psycopg/types/hstore.py @@ -6,12 +6,12 @@ Dict to hstore adaptation import re from typing import Dict, List, Optional +from typing_extensions import TypeAlias from .. import errors as e from .. import postgres from ..abc import Buffer, AdaptContext from ..adapt import PyFormat, RecursiveDumper, RecursiveLoader -from .._compat import TypeAlias from ..postgres import TEXT_OID from .._typeinfo import TypeInfo diff --git a/psycopg/psycopg/types/net.py b/psycopg/psycopg/types/net.py index b07cfb696..2f2c05b1e 100644 --- a/psycopg/psycopg/types/net.py +++ b/psycopg/psycopg/types/net.py @@ -5,12 +5,12 @@ Adapters for network types. # Copyright (C) 2020 The Psycopg Team from typing import Callable, Optional, Type, Union, TYPE_CHECKING +from typing_extensions import TypeAlias from .. import postgres 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/setup.cfg b/psycopg/setup.cfg index af9e7afab..fdcb6127f 100644 --- a/psycopg/setup.cfg +++ b/psycopg/setup.cfg @@ -40,7 +40,7 @@ packages = find: zip_safe = False install_requires = backports.zoneinfo >= 0.2.0; python_version < "3.9" - typing-extensions >= 4.1; python_version < "3.11" + typing-extensions >= 4.1 tzdata; sys_platform == "win32" [options.package_data] diff --git a/psycopg_pool/psycopg_pool/_compat.py b/psycopg_pool/psycopg_pool/_compat.py index 10c570e7f..9fb2b9b56 100644 --- a/psycopg_pool/psycopg_pool/_compat.py +++ b/psycopg_pool/psycopg_pool/_compat.py @@ -7,11 +7,12 @@ compatibility functions for different Python versions import sys import asyncio from typing import Any, Awaitable, Generator, Optional, Union, Type, TypeVar +from typing_extensions import TypeAlias import psycopg.errors as e T = TypeVar("T") -FutureT: "TypeAlias" = Union["asyncio.Future[T]", Generator[Any, None, T], Awaitable[T]] +FutureT: TypeAlias = Union["asyncio.Future[T]", Generator[Any, None, T], Awaitable[T]] if sys.version_info >= (3, 8): create_task = asyncio.create_task @@ -31,16 +32,10 @@ if sys.version_info >= (3, 9): else: from typing import Counter, Deque -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing_extensions import TypeAlias - __all__ = [ "Counter", "Deque", "Task", - "TypeAlias", "create_task", ] diff --git a/psycopg_pool/setup.cfg b/psycopg_pool/setup.cfg index 70f2d985f..1a3274e63 100644 --- a/psycopg_pool/setup.cfg +++ b/psycopg_pool/setup.cfg @@ -39,7 +39,7 @@ python_requires = >= 3.7 packages = find: zip_safe = False install_requires = - typing-extensions >= 3.10; python_version < "3.10" + typing-extensions >= 3.10 [options.package_data] psycopg_pool = py.typed diff --git a/tools/update_oids.py b/tools/update_oids.py index cdae2e55e..df4f969c7 100755 --- a/tools/update_oids.py +++ b/tools/update_oids.py @@ -19,11 +19,11 @@ import argparse import subprocess as sp from typing import List from pathlib import Path +from typing_extensions import TypeAlias import psycopg from psycopg.rows import TupleRow from psycopg.crdb import CrdbConnection -from psycopg._compat import TypeAlias Connection: TypeAlias = psycopg.Connection[TupleRow]