# Copyright (C) 2020-2021 The Psycopg Team
-import sys
import asyncio
import logging
import warnings
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
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")
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
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)
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
# Copyright (C) 2021 The Psycopg Team
-import sys
import asyncio
import logging
from time import monotonic
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__)
--- /dev/null
+"""
+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"]
-import sys
import asyncio
import logging
import weakref
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
from asyncio.queues import Queue
import psycopg3
+from psycopg3.utils.compat import create_task
pytestmark = pytest.mark.asyncio
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):