]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Fix write hook issue in python < 3.9.
authorFederico Caselli <cfederico87@gmail.com>
Thu, 30 Sep 2021 13:06:13 +0000 (15:06 +0200)
committerFederico Caselli <cfederico87@gmail.com>
Thu, 30 Sep 2021 16:31:34 +0000 (18:31 +0200)
Adjust require of importlib_metadata also include py3.8.

Fixes: #934
Change-Id: Id64163a0dc53226d62795d40190b6cec0aee522b

alembic/script/write_hooks.py
alembic/util/compat.py
docs/build/unreleased/934.rst [new file with mode: 0644]
setup.cfg
tests/test_post_write.py

index 7c8acab1b500616f2f5e69d73034f980d9ce4ddd..0cc9bb8eee6c79f70db504ae25643461fea82f43 100644 (file)
@@ -5,6 +5,7 @@ from typing import Any
 from typing import Callable
 from typing import Dict
 from typing import List
+from typing import Optional
 from typing import Union
 
 from .. import util
@@ -113,7 +114,9 @@ def _parse_cmdline_options(cmdline_options_str: str, path: str) -> List[str]:
 
 
 @register("console_scripts")
-def console_scripts(path, options, ignore_output=False):
+def console_scripts(
+    path: str, options: dict, ignore_output: bool = False
+) -> None:
 
     try:
         entrypoint_name = options["entrypoint"]
@@ -124,17 +127,17 @@ def console_scripts(path, options, ignore_output=False):
         ) from ke
     for entry in compat.importlib_metadata_get("console_scripts"):
         if entry.name == entrypoint_name:
-            impl = entry
+            impl: Any = entry
             break
     else:
         raise util.CommandError(
             f"Could not find entrypoint console_scripts.{entrypoint_name}"
         )
-    cwd = options.get("cwd", None)
+    cwd: Optional[str] = options.get("cwd", None)
     cmdline_options_str = options.get("options", "")
     cmdline_options_list = _parse_cmdline_options(cmdline_options_str, path)
 
-    kw = {}
+    kw: Dict[str, Any] = {}
     if ignore_output:
         kw["stdout"] = kw["stderr"] = subprocess.DEVNULL
 
index 91b5cf9fe3714148cba296842becf71d1179f279..48218ab2772533524534e807965c76ca2f90891f 100644 (file)
@@ -1,6 +1,7 @@
 import io
 import os
 import sys
+from typing import Tuple
 
 from sqlalchemy.util import inspect_getfullargspec  # noqa
 from sqlalchemy.util.compat import inspect_formatargspec  # noqa
@@ -26,19 +27,18 @@ class EncodedIO(io.TextIOWrapper):
 
 if py39:
     from importlib import resources as importlib_resources
-else:
-    import importlib_resources  # type:ignore[no-redef] # noqa
-
-if py38:
     from importlib import metadata as importlib_metadata
+    from importlib.metadata import EntryPoint
 else:
+    import importlib_resources  # type:ignore[no-redef] # noqa
     import importlib_metadata  # type:ignore[no-redef] # noqa
+    from importlib_metadata import EntryPoint  # type:ignore # noqa
 
 
-def importlib_metadata_get(group):
+def importlib_metadata_get(group: str) -> Tuple[EntryPoint, ...]:
     ep = importlib_metadata.entry_points()
     if hasattr(ep, "select"):
-        return ep.select(group=group)
+        return ep.select(group=group)  # type:ignore[attr-defined]
     else:
         return ep.get(group, ())
 
diff --git a/docs/build/unreleased/934.rst b/docs/build/unreleased/934.rst
new file mode 100644 (file)
index 0000000..27febdd
--- /dev/null
@@ -0,0 +1,6 @@
+.. change::
+    :tags: bug, regression
+    :tickets: 934
+
+    Fixed a regression that prevented the use of post write hooks
+    on python version lower than 3.9
index d034e617266433ee1f64974933132af0c78bd3b2..5865d48cb3b7f63802c8129c1003fff7b5dcdae4 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -42,7 +42,7 @@ python_requires = >=3.6
 install_requires =
     SQLAlchemy>=1.3.0
     Mako
-    importlib-metadata;python_version<"3.8"
+    importlib-metadata;python_version<"3.9"
     importlib-resources;python_version<"3.9"
 
 [options.extras_require]
index 82a91743a95fcede0288915862792be3af8346d1..a8bcd2fd7f5773bb8a8b2de7df786772158bd3dc 100644 (file)
@@ -134,12 +134,20 @@ class RunHookTest(TestBase):
     ):
         self.cfg = _no_sql_testing_config(directives=input_config)
 
-        class MocksCantName:
-            name = "black"
-            attr = "bar"
-            module = "black_module.foo"
-
-        importlib_metadata_get = mock.Mock(return_value=iter([MocksCantName]))
+        retVal = [
+            compat.EntryPoint(
+                name="black",
+                value="black.foo:patched_main",
+                group="console_scripts",
+            ),
+            compat.EntryPoint(
+                name="alembic",
+                value="alembic.config:main",
+                group="console_scripts",
+            ),
+        ]
+
+        importlib_metadata_get = mock.Mock(return_value=retVal)
         with mock.patch(
             "alembic.util.compat.importlib_metadata_get",
             importlib_metadata_get,
@@ -157,7 +165,7 @@ class RunHookTest(TestBase):
                     [
                         sys.executable,
                         "-c",
-                        "import black_module.foo; black_module.foo.bar()",
+                        "import black.foo; black.foo.patched_main()",
                     ]
                     + expected_additional_arguments_fn(rev.path),
                     cwd=cwd,