From: Federico Caselli Date: Thu, 30 Sep 2021 13:06:13 +0000 (+0200) Subject: Fix write hook issue in python < 3.9. X-Git-Tag: rel_1_7_4~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d166b17aa7b1c4ec058fa31e489a57b3a7f5cbf;p=thirdparty%2Fsqlalchemy%2Falembic.git Fix write hook issue in python < 3.9. Adjust require of importlib_metadata also include py3.8. Fixes: #934 Change-Id: Id64163a0dc53226d62795d40190b6cec0aee522b --- diff --git a/alembic/script/write_hooks.py b/alembic/script/write_hooks.py index 7c8acab1..0cc9bb8e 100644 --- a/alembic/script/write_hooks.py +++ b/alembic/script/write_hooks.py @@ -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 diff --git a/alembic/util/compat.py b/alembic/util/compat.py index 91b5cf9f..48218ab2 100644 --- a/alembic/util/compat.py +++ b/alembic/util/compat.py @@ -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 index 00000000..27febddc --- /dev/null +++ b/docs/build/unreleased/934.rst @@ -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 diff --git a/setup.cfg b/setup.cfg index d034e617..5865d48c 100644 --- 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] diff --git a/tests/test_post_write.py b/tests/test_post_write.py index 82a91743..a8bcd2fd 100644 --- a/tests/test_post_write.py +++ b/tests/test_post_write.py @@ -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,