From: Daniele Varrazzo Date: Wed, 4 Oct 2023 20:02:58 +0000 (+0200) Subject: refactor(pool): add psycopg_pool.abc module X-Git-Tag: pool-3.2.0~12^2~27 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=047b7a89df682c84a35034cb2b9c6e99cae25ee1;p=thirdparty%2Fpsycopg.git refactor(pool): add psycopg_pool.abc module --- diff --git a/psycopg_pool/psycopg_pool/abc.py b/psycopg_pool/psycopg_pool/abc.py new file mode 100644 index 000000000..5cc72f7fe --- /dev/null +++ b/psycopg_pool/psycopg_pool/abc.py @@ -0,0 +1,31 @@ +""" +Types used in the psycopg_pool package +""" + +# Copyright (C) 2023 The Psycopg Team + +from __future__ import annotations + +from typing import Any, Awaitable, Callable, TypeVar, Union, TYPE_CHECKING + +from typing_extensions import TypeAlias + +if TYPE_CHECKING: + from .pool import ConnectionPool + from .pool_async import AsyncConnectionPool + from psycopg import Connection, AsyncConnection + +# Connection types to make the pool generic +CT = TypeVar("CT", bound="Connection[Any]") +ACT = TypeVar("ACT", bound="AsyncConnection[Any]") + +# Callbacks taking a connection from the pool +ConnectionCB: TypeAlias = Callable[[CT], None] +AsyncConnectionCB: TypeAlias = Callable[[ACT], Awaitable[None]] + +# Callbacks to pass the pool to on connection failure +ConnectFailedCB: TypeAlias = Callable[["ConnectionPool[Any]"], None] +AsyncConnectFailedCB: TypeAlias = Union[ + Callable[["AsyncConnectionPool[Any]"], None], + Callable[["AsyncConnectionPool[Any]"], Awaitable[None]], +] diff --git a/psycopg_pool/psycopg_pool/null_pool.py b/psycopg_pool/psycopg_pool/null_pool.py index b4e640b74..d0b33931e 100644 --- a/psycopg_pool/psycopg_pool/null_pool.py +++ b/psycopg_pool/psycopg_pool/null_pool.py @@ -6,13 +6,14 @@ Psycopg null connection pools import logging import threading -from typing import Any, Callable, cast, Dict, Optional, overload, Tuple, Type +from typing import Any, cast, Dict, Optional, overload, Tuple, Type from psycopg import Connection from psycopg.pq import TransactionStatus from psycopg.rows import TupleRow -from .pool import ConnectionPool, CT, AddConnection, ConnectFailedCB +from .abc import CT, ConnectionCB, ConnectFailedCB +from .pool import ConnectionPool, AddConnection from .errors import PoolTimeout, TooManyRequests from ._compat import ConnectionTimeout @@ -48,8 +49,8 @@ class NullConnectionPool(_BaseNullConnectionPool, ConnectionPool[CT]): conninfo: str = "", *, open: bool = ..., - configure: Optional[Callable[[CT], None]] = ..., - reset: Optional[Callable[[CT], None]] = ..., + configure: Optional[ConnectionCB[CT]] = ..., + reset: Optional[ConnectionCB[CT]] = ..., kwargs: Optional[Dict[str, Any]] = ..., min_size: int = ..., max_size: Optional[int] = ..., @@ -71,8 +72,8 @@ class NullConnectionPool(_BaseNullConnectionPool, ConnectionPool[CT]): *, open: bool = ..., connection_class: Type[CT], - configure: Optional[Callable[[CT], None]] = ..., - reset: Optional[Callable[[CT], None]] = ..., + configure: Optional[ConnectionCB[CT]] = ..., + reset: Optional[ConnectionCB[CT]] = ..., kwargs: Optional[Dict[str, Any]] = ..., min_size: int = ..., max_size: Optional[int] = ..., @@ -93,8 +94,8 @@ class NullConnectionPool(_BaseNullConnectionPool, ConnectionPool[CT]): *, open: bool = True, connection_class: Type[CT] = cast(Type[CT], Connection), - configure: Optional[Callable[[CT], None]] = None, - reset: Optional[Callable[[CT], None]] = None, + configure: Optional[ConnectionCB[CT]] = None, + reset: Optional[ConnectionCB[CT]] = None, kwargs: Optional[Dict[str, Any]] = None, # Note: default value changed to 0. min_size: int = 0, diff --git a/psycopg_pool/psycopg_pool/null_pool_async.py b/psycopg_pool/psycopg_pool/null_pool_async.py index ca9db8bcd..b1553ee5b 100644 --- a/psycopg_pool/psycopg_pool/null_pool_async.py +++ b/psycopg_pool/psycopg_pool/null_pool_async.py @@ -6,16 +6,17 @@ psycopg asynchronous null connection pool import asyncio import logging -from typing import Any, Awaitable, Callable, cast, Dict, Optional, overload, Type +from typing import Any, cast, Dict, Optional, overload, Type from psycopg import AsyncConnection from psycopg.pq import TransactionStatus from psycopg.rows import TupleRow +from .abc import ACT, AsyncConnectionCB, AsyncConnectFailedCB from .errors import PoolTimeout, TooManyRequests from ._compat import ConnectionTimeout from .null_pool import _BaseNullConnectionPool -from .pool_async import AsyncConnectionPool, ACT, AddConnection, AsyncConnectFailedCB +from .pool_async import AsyncConnectionPool, AddConnection logger = logging.getLogger("psycopg.pool") @@ -27,8 +28,8 @@ class AsyncNullConnectionPool(_BaseNullConnectionPool, AsyncConnectionPool[ACT]) conninfo: str = "", *, open: bool = ..., - configure: Optional[Callable[[ACT], Awaitable[None]]] = ..., - reset: Optional[Callable[[ACT], Awaitable[None]]] = ..., + configure: Optional[AsyncConnectionCB[ACT]] = ..., + reset: Optional[AsyncConnectionCB[ACT]] = ..., kwargs: Optional[Dict[str, Any]] = ..., min_size: int = ..., max_size: Optional[int] = ..., @@ -50,8 +51,8 @@ class AsyncNullConnectionPool(_BaseNullConnectionPool, AsyncConnectionPool[ACT]) *, open: bool = ..., connection_class: Type[ACT], - configure: Optional[Callable[[ACT], Awaitable[None]]] = ..., - reset: Optional[Callable[[ACT], Awaitable[None]]] = ..., + configure: Optional[AsyncConnectionCB[ACT]] = ..., + reset: Optional[AsyncConnectionCB[ACT]] = ..., kwargs: Optional[Dict[str, Any]] = ..., min_size: int = ..., max_size: Optional[int] = ..., @@ -72,8 +73,8 @@ class AsyncNullConnectionPool(_BaseNullConnectionPool, AsyncConnectionPool[ACT]) *, open: bool = True, connection_class: Type[ACT] = cast(Type[ACT], AsyncConnection), - configure: Optional[Callable[[ACT], Awaitable[None]]] = None, - reset: Optional[Callable[[ACT], Awaitable[None]]] = None, + configure: Optional[AsyncConnectionCB[ACT]] = None, + reset: Optional[AsyncConnectionCB[ACT]] = None, kwargs: Optional[Dict[str, Any]] = None, # Note: default value changed to 0. min_size: int = 0, diff --git a/psycopg_pool/psycopg_pool/pool.py b/psycopg_pool/psycopg_pool/pool.py index 6e5876eb7..cbf3520fb 100644 --- a/psycopg_pool/psycopg_pool/pool.py +++ b/psycopg_pool/psycopg_pool/pool.py @@ -10,9 +10,8 @@ from abc import ABC, abstractmethod from time import monotonic from queue import Queue, Empty from types import TracebackType -from typing import Any, Callable, cast, Dict, Generic, Iterator, List +from typing import Any, cast, Dict, Generic, Iterator, List from typing import Optional, overload, Sequence, Type, TypeVar -from typing_extensions import TypeAlias from weakref import ref from contextlib import contextmanager @@ -21,6 +20,7 @@ from psycopg import Connection from psycopg.pq import TransactionStatus from psycopg.rows import TupleRow +from .abc import CT, ConnectionCB, ConnectFailedCB from .base import ConnectionAttempt, BasePool from .sched import Scheduler from .errors import PoolClosed, PoolTimeout, TooManyRequests @@ -28,10 +28,6 @@ from ._compat import Deque logger = logging.getLogger("psycopg.pool") -ConnectFailedCB: TypeAlias = Callable[["ConnectionPool"], None] - -CT = TypeVar("CT", bound="Connection[Any]") - class ConnectionPool(Generic[CT], BasePool): _Self = TypeVar("_Self", bound="ConnectionPool[CT]") @@ -43,8 +39,8 @@ class ConnectionPool(Generic[CT], BasePool): conninfo: str = "", *, open: bool = ..., - configure: Optional[Callable[[CT], None]] = ..., - reset: Optional[Callable[[CT], None]] = ..., + configure: Optional[ConnectionCB[CT]] = ..., + reset: Optional[ConnectionCB[CT]] = ..., kwargs: Optional[Dict[str, Any]] = ..., min_size: int = ..., max_size: Optional[int] = ..., @@ -66,8 +62,8 @@ class ConnectionPool(Generic[CT], BasePool): *, open: bool = ..., connection_class: Type[CT], - configure: Optional[Callable[[CT], None]] = ..., - reset: Optional[Callable[[CT], None]] = ..., + configure: Optional[ConnectionCB[CT]] = ..., + reset: Optional[ConnectionCB[CT]] = ..., kwargs: Optional[Dict[str, Any]] = ..., min_size: int = ..., max_size: Optional[int] = ..., @@ -88,8 +84,8 @@ class ConnectionPool(Generic[CT], BasePool): *, open: bool = True, connection_class: Type[CT] = cast(Type[CT], Connection[TupleRow]), - configure: Optional[Callable[[CT], None]] = None, - reset: Optional[Callable[[CT], None]] = None, + configure: Optional[ConnectionCB[CT]] = None, + reset: Optional[ConnectionCB[CT]] = None, kwargs: Optional[Dict[str, Any]] = None, min_size: int = 4, max_size: Optional[int] = None, diff --git a/psycopg_pool/psycopg_pool/pool_async.py b/psycopg_pool/psycopg_pool/pool_async.py index 5daced6b3..82ad0e562 100644 --- a/psycopg_pool/psycopg_pool/pool_async.py +++ b/psycopg_pool/psycopg_pool/pool_async.py @@ -9,9 +9,8 @@ import logging from abc import ABC, abstractmethod from time import monotonic from types import TracebackType -from typing import Any, AsyncIterator, Awaitable, Callable, cast, Generic -from typing import Dict, List, Optional, overload, Sequence, Type, TypeVar, Union -from typing_extensions import TypeAlias +from typing import Any, AsyncIterator, cast, Generic +from typing import Dict, List, Optional, overload, Sequence, Type, TypeVar from asyncio import create_task, Task from weakref import ref from contextlib import asynccontextmanager @@ -21,6 +20,7 @@ from psycopg import AsyncConnection from psycopg.pq import TransactionStatus from psycopg.rows import TupleRow +from .abc import ACT, AsyncConnectionCB, AsyncConnectFailedCB from .base import ConnectionAttempt, BasePool from .errors import PoolClosed, PoolTimeout, TooManyRequests from ._compat import Deque @@ -28,13 +28,6 @@ from .sched_async import AsyncScheduler logger = logging.getLogger("psycopg.pool") -AsyncConnectFailedCB: TypeAlias = Union[ - Callable[["AsyncConnectionPool"], None], - Callable[["AsyncConnectionPool"], Awaitable[None]], -] - -ACT = TypeVar("ACT", bound="AsyncConnection[Any]") - class AsyncConnectionPool(Generic[ACT], BasePool): _Self = TypeVar("_Self", bound="AsyncConnectionPool[ACT]") @@ -46,8 +39,8 @@ class AsyncConnectionPool(Generic[ACT], BasePool): conninfo: str = "", *, open: bool = ..., - configure: Optional[Callable[[ACT], Awaitable[None]]] = ..., - reset: Optional[Callable[[ACT], Awaitable[None]]] = ..., + configure: Optional[AsyncConnectionCB[ACT]] = ..., + reset: Optional[AsyncConnectionCB[ACT]] = ..., kwargs: Optional[Dict[str, Any]] = ..., min_size: int = ..., max_size: Optional[int] = ..., @@ -69,8 +62,8 @@ class AsyncConnectionPool(Generic[ACT], BasePool): *, open: bool = ..., connection_class: Type[ACT], - configure: Optional[Callable[[ACT], Awaitable[None]]] = ..., - reset: Optional[Callable[[ACT], Awaitable[None]]] = ..., + configure: Optional[AsyncConnectionCB[ACT]] = ..., + reset: Optional[AsyncConnectionCB[ACT]] = ..., kwargs: Optional[Dict[str, Any]] = ..., min_size: int = ..., max_size: Optional[int] = ..., @@ -91,8 +84,8 @@ class AsyncConnectionPool(Generic[ACT], BasePool): *, open: bool = True, connection_class: Type[ACT] = cast(Type[ACT], AsyncConnection), - configure: Optional[Callable[[ACT], Awaitable[None]]] = None, - reset: Optional[Callable[[ACT], Awaitable[None]]] = None, + configure: Optional[AsyncConnectionCB[ACT]] = None, + reset: Optional[AsyncConnectionCB[ACT]] = None, kwargs: Optional[Dict[str, Any]] = None, min_size: int = 4, max_size: Optional[int] = None,