import weakref
import datetime as dt
from typing import Any, List
-from contextlib import closing
import pytest
from psycopg.adapt import PyFormat
from psycopg.types import TypeInfo
-from .utils import gc_collect, raiseif
+from .utils import gc_collect, raiseif, closing
from .fix_crdb import crdb_encoding
from ._test_cursor import my_row_factory, ph
from ._test_cursor import execmany, _execmany # noqa: F401
import weakref
import datetime as dt
from typing import Any, List
-from contextlib import aclosing
import pytest
from psycopg.adapt import PyFormat
from psycopg.types import TypeInfo
-from .utils import alist, anext
-from .utils import gc_collect, raiseif
+from .utils import gc_collect, raiseif, aclosing, alist, anext
from .fix_crdb import crdb_encoding
from ._test_cursor import my_row_factory, ph
from ._test_cursor import execmany, _execmany # noqa: F401
import sys
import operator
from typing import Callable, Optional, Tuple
-from contextlib import contextmanager
+from contextlib import contextmanager, asynccontextmanager
+from contextlib import closing as closing # noqa: F401 - re-export
import pytest
async def alist(it):
+ """Consume an async iterator into a list. Async equivalent of list(it)."""
return [i async for i in it]
-async def anext(it):
- return await it.__anext__()
+if sys.version_info >= (3, 10):
+ from builtins import anext as anext
+ from contextlib import aclosing as aclosing
+
+else:
+
+ async def anext(it):
+ return await it.__anext__()
+
+ @asynccontextmanager
+ async def aclosing(thing):
+ try:
+ yield thing
+ finally:
+ await thing.aclose()
@contextmanager
_skip_imports = {"alist", "anext"}
def visit_ImportFrom(self, node: ast.ImportFrom) -> ast.AST | None:
- # Remove import of async utils eclypsing builtings
+ # Remove import of async utils eclypsing builtins
if node.module == "utils":
- if {n.name for n in node.names} <= self._skip_imports:
+ node.names = [n for n in node.names if n.name not in self._skip_imports]
+ if not node.names:
return None
for n in node.names: