]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Fixed a bug where paths defined in post-write hook options
authorCaselIT <cfederico87@gmail.com>
Tue, 11 May 2021 18:17:00 +0000 (20:17 +0200)
committerCaselIT <cfederico87@gmail.com>
Tue, 11 May 2021 19:26:10 +0000 (21:26 +0200)
would be wrongly escaped in non posix environment (Windows).

Fixes: #841
Change-Id: Ife74d9291523378da113c259e3c173a8bc054e47

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

index 133bf0462722572a0cff02da0c401c3620e3072a..c69ce5a42f31fef7d7ab6120d7b66ec1ad1fb916 100644 (file)
@@ -99,7 +99,9 @@ def _parse_cmdline_options(cmdline_options_str, path):
     """
     if REVISION_SCRIPT_TOKEN not in cmdline_options_str:
         cmdline_options_str = REVISION_SCRIPT_TOKEN + " " + cmdline_options_str
-    cmdline_options_list = shlex.split(cmdline_options_str)
+    cmdline_options_list = shlex.split(
+        cmdline_options_str, posix=compat.is_posix
+    )
     cmdline_options_list = [
         option.replace(REVISION_SCRIPT_TOKEN, path)
         for option in cmdline_options_list
index c8919b62ece82d3dda37daf3d0f9c5418784c491..a4433d0bad68719f1effc665f1a1a4888408ecb7 100644 (file)
@@ -1,11 +1,13 @@
 import collections
 import inspect
 import io
+import os
 import sys
 
 py2k = sys.version_info.major < 3
 py3k = sys.version_info.major >= 3
 py36 = sys.version_info >= (3, 6)
+is_posix = os.name == "posix"
 
 
 ArgSpec = collections.namedtuple(
diff --git a/docs/build/unreleased/841.rst b/docs/build/unreleased/841.rst
new file mode 100644 (file)
index 0000000..294e543
--- /dev/null
@@ -0,0 +1,6 @@
+.. change::
+    :tags: bug, autogenerate
+    :tickets: 839
+
+    Fixed a bug where paths defined in post-write hook options
+    would be wrongly escaped in non posix environment (Windows).
\ No newline at end of file
index 9beb1f6a9ee036984160561367f7fb68112b8ac0..18c1d82c8919ad6a1d29a2553fc1106dfdb00733 100644 (file)
@@ -1,15 +1,19 @@
+import os
 import sys
 
 from alembic import command
 from alembic import util
 from alembic.script import write_hooks
 from alembic.testing import assert_raises_message
+from alembic.testing import combinations
 from alembic.testing import eq_
 from alembic.testing import mock
 from alembic.testing import TestBase
+from alembic.testing.env import _get_staging_directory
 from alembic.testing.env import _no_sql_testing_config
 from alembic.testing.env import clear_staging_env
 from alembic.testing.env import staging_env
+from alembic.util import compat
 
 
 class HookTest(TestBase):
@@ -171,7 +175,9 @@ black.options = -l 79
             input_config, expected_additional_arguments_fn
         )
 
-    def test_filename_interpolation(self):
+    @combinations(True, False)
+    def test_filename_interpolation(self, posix):
+
         input_config = """
 [post_write_hooks]
 hooks = black
@@ -182,7 +188,43 @@ black.options = arg1 REVISION_SCRIPT_FILENAME 'multi-word arg' \
         """
 
         def expected_additional_arguments_fn(rev_path):
-            return ["arg1", rev_path, "multi-word arg", "--flag1=" + rev_path]
+            if compat.is_posix:
+                return [
+                    "arg1",
+                    rev_path,
+                    "multi-word arg",
+                    "--flag1=" + rev_path,
+                ]
+            else:
+                return [
+                    "arg1",
+                    rev_path,
+                    "'multi-word arg'",
+                    "--flag1='%s'" % rev_path,
+                ]
+
+        with mock.patch("alembic.util.compat.is_posix", posix):
+            self._run_black_with_config(
+                input_config, expected_additional_arguments_fn
+            )
+
+    def test_path_in_config(self):
+
+        input_config = """
+[post_write_hooks]
+hooks = black
+black.type = console_scripts
+black.entrypoint = black
+black.options = arg1 REVISION_SCRIPT_FILENAME --config %(here)s/pyproject.toml
+        """
+
+        def expected_additional_arguments_fn(rev_path):
+            return [
+                "arg1",
+                rev_path,
+                "--config",
+                os.path.abspath(_get_staging_directory()) + "/pyproject.toml",
+            ]
 
         self._run_black_with_config(
             input_config, expected_additional_arguments_fn