From: Daniele Varrazzo Date: Sat, 13 Nov 2021 22:41:42 +0000 (+0100) Subject: Add psycopg_pool._compat module. X-Git-Tag: 3.0.4~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=da5005e9186bdcf158420cec6e32bcf478dcafeb;p=thirdparty%2Fpsycopg.git Add psycopg_pool._compat module. Using psycopg._compat creates an unwanted coupling between the modules. As it is now psycopg_pool 3.0.1 is not compatible with psycopg < 3.0.3 because of the dependency on Deque added in 1a5b09b2. --- diff --git a/psycopg/psycopg/_compat.py b/psycopg/psycopg/_compat.py index 0576b71ad..226da669d 100644 --- a/psycopg/psycopg/_compat.py +++ b/psycopg/psycopg/_compat.py @@ -29,7 +29,6 @@ else: if sys.version_info >= (3, 8): create_task = asyncio.create_task - Task = asyncio.Task elif sys.version_info >= (3, 7): @@ -38,7 +37,6 @@ elif sys.version_info >= (3, 7): ) -> "asyncio.Future[T]": return asyncio.create_task(coro) - Task = asyncio.Future else: @@ -47,7 +45,6 @@ else: ) -> "asyncio.Future[T]": return asyncio.ensure_future(coro) - Task = asyncio.Future if sys.version_info >= (3, 9): from zoneinfo import ZoneInfo diff --git a/psycopg_pool/psycopg_pool/_compat.py b/psycopg_pool/psycopg_pool/_compat.py new file mode 100644 index 000000000..d91ca7b3e --- /dev/null +++ b/psycopg_pool/psycopg_pool/_compat.py @@ -0,0 +1,60 @@ +""" +compatibility functions for different Python versions +""" + +# Copyright (C) 2021 The Psycopg Team + +import sys +import asyncio +from typing import Any, Awaitable, Generator, Optional, Union, TypeVar + +T = TypeVar("T") +FutureT = Union["asyncio.Future[T]", Generator[Any, None, T], Awaitable[T]] + +if sys.version_info >= (3, 7): + from contextlib import asynccontextmanager +else: + + def asynccontextmanager(func): + def helper(*args, **kwds): + raise NotImplementedError( + "async pool not implemented on Python 3.6" + ) + + return helper + + +if sys.version_info >= (3, 8): + create_task = asyncio.create_task + Task = asyncio.Task + +elif sys.version_info >= (3, 7): + + def create_task( + coro: FutureT[T], name: Optional[str] = None + ) -> "asyncio.Future[T]": + return asyncio.create_task(coro) + + Task = asyncio.Future + +else: + + def create_task( + coro: FutureT[T], name: Optional[str] = None + ) -> "asyncio.Future[T]": + return asyncio.ensure_future(coro) + + Task = asyncio.Future + +if sys.version_info >= (3, 9): + from collections import Counter, deque as Deque +else: + from typing import Counter, Deque + +__all__ = [ + "Counter", + "Deque", + "Task", + "asynccontextmanager", + "create_task", +] diff --git a/psycopg_pool/psycopg_pool/base.py b/psycopg_pool/psycopg_pool/base.py index afb4bc533..160221507 100644 --- a/psycopg_pool/psycopg_pool/base.py +++ b/psycopg_pool/psycopg_pool/base.py @@ -8,7 +8,8 @@ from random import random from typing import Any, Callable, Dict, Generic, Optional from psycopg.abc import ConnectionType -from psycopg._compat import Counter, Deque + +from ._compat import Counter, Deque class BasePool(Generic[ConnectionType]): diff --git a/psycopg_pool/psycopg_pool/pool.py b/psycopg_pool/psycopg_pool/pool.py index 74dda9e7a..dcbcde02a 100644 --- a/psycopg_pool/psycopg_pool/pool.py +++ b/psycopg_pool/psycopg_pool/pool.py @@ -18,11 +18,11 @@ from contextlib import contextmanager from psycopg import errors as e from psycopg import Connection from psycopg.pq import TransactionStatus -from psycopg._compat import Deque from .base import ConnectionAttempt, BasePool from .sched import Scheduler from .errors import PoolClosed, PoolTimeout, TooManyRequests +from ._compat import Deque logger = logging.getLogger("psycopg.pool") diff --git a/psycopg_pool/psycopg_pool/pool_async.py b/psycopg_pool/psycopg_pool/pool_async.py index f1da22240..80dc00f83 100644 --- a/psycopg_pool/psycopg_pool/pool_async.py +++ b/psycopg_pool/psycopg_pool/pool_async.py @@ -16,12 +16,12 @@ from weakref import ref from psycopg import errors as e from psycopg.pq import TransactionStatus -from psycopg._compat import Task, asynccontextmanager, create_task, Deque from psycopg.connection_async import AsyncConnection from .base import ConnectionAttempt, BasePool from .sched import AsyncScheduler from .errors import PoolClosed, PoolTimeout, TooManyRequests +from ._compat import Task, asynccontextmanager, create_task, Deque logger = logging.getLogger("psycopg.pool")