]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
test: fix use of aclosing in Python < 3.10
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Mon, 7 Aug 2023 16:09:26 +0000 (17:09 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 11 Oct 2023 21:45:38 +0000 (23:45 +0200)
tests/test_cursor.py
tests/test_cursor_async.py
tests/utils.py
tools/async_to_sync.py

index 18376125edc9b18c73e5c322116ebcbb7f5489e6..622d9d1f965eb7e492909334532186148169656a 100644 (file)
@@ -8,7 +8,6 @@ Tests common to psycopg.Cursor and its subclasses.
 import weakref
 import datetime as dt
 from typing import Any, List
-from contextlib import closing
 
 import pytest
 
@@ -17,7 +16,7 @@ from psycopg import sql, rows
 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
index 155d23ad9d6e0b7fdf2f6f44acd18c5f256772c7..c0c49e68a046c114a11e1bfa30dacbe127932513 100644 (file)
@@ -5,7 +5,6 @@ Tests common to psycopg.AsyncCursor and its subclasses.
 import weakref
 import datetime as dt
 from typing import Any, List
-from contextlib import aclosing
 
 import pytest
 
@@ -14,8 +13,7 @@ from psycopg import sql, rows
 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
index 57252e0dcdfcb12d623a1e2df8a20c6035911ee3..f20ca7920ef26e7b2c953129ade48c66c90ae600 100644 (file)
@@ -3,7 +3,8 @@ import re
 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
 
@@ -177,11 +178,25 @@ def gc_count() -> int:
 
 
 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
index 2e6f98dc143ba8dd5b487b8f4a0084583ebf31e9..90ab125aa77935ecb220264658fca6a3b1d39c37 100755 (executable)
@@ -114,9 +114,10 @@ class RenameAsyncToSync(ast.NodeTransformer):
     _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: