From: Daniele Varrazzo Date: Sat, 6 Mar 2021 04:02:29 +0000 (+0100) Subject: Add compat module for python versions compatibility X-Git-Tag: 3.0.dev0~87^2~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8399223ada6aa16af7a0265660d4d36925eeb6b;p=thirdparty%2Fpsycopg.git Add compat module for python versions compatibility --- diff --git a/psycopg3/psycopg3/connection.py b/psycopg3/psycopg3/connection.py index c0cd4d555..7cdb90f81 100644 --- a/psycopg3/psycopg3/connection.py +++ b/psycopg3/psycopg3/connection.py @@ -4,7 +4,6 @@ psycopg3 connection objects # Copyright (C) 2020-2021 The Psycopg Team -import sys import asyncio import logging import warnings @@ -16,11 +15,6 @@ from weakref import ref, ReferenceType from functools import partial from contextlib import contextmanager -if sys.version_info >= (3, 7): - from contextlib import asynccontextmanager -else: - from .utils.context import asynccontextmanager - from . import pq from . import adapt from . import errors as e @@ -34,9 +28,10 @@ from .proto import AdaptContext, ConnectionType from .cursor import Cursor, AsyncCursor from .conninfo import make_conninfo from .generators import notifies +from ._preparing import PrepareManager from .transaction import Transaction, AsyncTransaction +from .utils.compat import asynccontextmanager from .server_cursor import ServerCursor, AsyncServerCursor -from ._preparing import PrepareManager logger = logging.getLogger(__name__) package_logger = logging.getLogger("psycopg3") diff --git a/psycopg3/psycopg3/copy.py b/psycopg3/psycopg3/copy.py index 9fe7846a3..28e4be484 100644 --- a/psycopg3/psycopg3/copy.py +++ b/psycopg3/psycopg3/copy.py @@ -20,6 +20,7 @@ from .pq import ExecStatus from .adapt import Format from .proto import ConnectionType, PQGen, Transformer from .generators import copy_from, copy_to, copy_end +from .utils.compat import create_task if TYPE_CHECKING: from .pq.proto import PGresult @@ -359,8 +360,7 @@ class AsyncCopy(BaseCopy["AsyncConnection"]): return if not self._worker: - # TODO: can be asyncio.create_task once Python 3.6 is dropped - self._worker = asyncio.ensure_future(self.worker()) + self._worker = create_task(self.worker()) await self._queue.put(data) diff --git a/psycopg3/psycopg3/cursor.py b/psycopg3/psycopg3/cursor.py index e33640829..a6897fc98 100644 --- a/psycopg3/psycopg3/cursor.py +++ b/psycopg3/psycopg3/cursor.py @@ -23,11 +23,7 @@ from .proto import Row, RowFactory from ._column import Column from ._queries import PostgresQuery from ._preparing import Prepare - -if sys.version_info >= (3, 7): - from contextlib import asynccontextmanager -else: - from .utils.context import asynccontextmanager +from .utils.compat import asynccontextmanager if TYPE_CHECKING: from .proto import Transformer diff --git a/psycopg3/psycopg3/pool/async_pool.py b/psycopg3/psycopg3/pool/async_pool.py index c3494dd41..7adcd888d 100644 --- a/psycopg3/psycopg3/pool/async_pool.py +++ b/psycopg3/psycopg3/pool/async_pool.py @@ -4,7 +4,6 @@ psycopg3 synchronous connection pool # Copyright (C) 2021 The Psycopg Team -import sys import asyncio import logging from time import monotonic @@ -15,21 +14,12 @@ from collections import deque from ..pq import TransactionStatus from ..connection import AsyncConnection +from ..utils.compat import asynccontextmanager, get_running_loop from . import tasks from .base import ConnectionAttempt, BasePool from .errors import PoolClosed, PoolTimeout -if sys.version_info >= (3, 7): - from contextlib import asynccontextmanager - - get_running_loop = asyncio.get_running_loop - -else: - from ..utils.context import asynccontextmanager - - get_running_loop = asyncio.get_event_loop - logger = logging.getLogger(__name__) diff --git a/psycopg3/psycopg3/utils/compat.py b/psycopg3/psycopg3/utils/compat.py new file mode 100644 index 000000000..57ae8d2f5 --- /dev/null +++ b/psycopg3/psycopg3/utils/compat.py @@ -0,0 +1,44 @@ +""" +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 + + get_running_loop = asyncio.get_running_loop + +else: + from .context import asynccontextmanager + + get_running_loop = asyncio.get_event_loop + + +if sys.version_info >= (3, 8): + create_task = asyncio.create_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) + + +else: + + def create_task( + coro: FutureT[T], name: Optional[str] = None + ) -> "asyncio.Future[T]": + return asyncio.ensure_future(coro) + + +__all__ = ["asynccontextmanager", "get_running_loop", "create_task"] diff --git a/tests/pool/test_pool_async.py b/tests/pool/test_pool_async.py index b0c59db7f..3fad68414 100644 --- a/tests/pool/test_pool_async.py +++ b/tests/pool/test_pool_async.py @@ -1,4 +1,3 @@ -import sys import asyncio import logging import weakref @@ -10,12 +9,7 @@ import pytest import psycopg3 from psycopg3 import pool from psycopg3.pq import TransactionStatus - -create_task = ( - asyncio.create_task - if sys.version_info >= (3, 7) - else asyncio.ensure_future -) +from psycopg3.utils.compat import create_task pytestmark = pytest.mark.asyncio diff --git a/tests/test_concurrency_async.py b/tests/test_concurrency_async.py index c6fbe4c90..c7fc960bb 100644 --- a/tests/test_concurrency_async.py +++ b/tests/test_concurrency_async.py @@ -4,6 +4,7 @@ import asyncio from asyncio.queues import Queue import psycopg3 +from psycopg3.utils.compat import create_task pytestmark = pytest.mark.asyncio @@ -144,7 +145,7 @@ async def test_identify_closure(aconn, dsn): ev = asyncio.Event() loop = asyncio.get_event_loop() loop.add_reader(aconn.fileno(), ev.set) - asyncio.ensure_future(closer()) + create_task(closer()) await asyncio.wait_for(ev.wait(), 1.0) with pytest.raises(psycopg3.OperationalError):