]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
enable extensions to use AutogenContext.run_name_filters
authorOliver Rice <github@oliverrice.com>
Fri, 5 Mar 2021 19:23:40 +0000 (14:23 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 5 Mar 2021 21:32:54 +0000 (16:32 -0500)
Adjusted the recently added
:paramref:`.EnvironmentContext.configure.include_name` hook to accommodate
for additional object types such as "views" that don't have a parent table,
to support third party recipes and extensions. Pull request courtesy Oliver
Rice.

Fixes: #813
Closes: #814
Pull-request: https://github.com/sqlalchemy/alembic/pull/814
Pull-request-sha: 45dbc9c3baebd02c44cdcafc7ac73f00e87d8a86

Change-Id: I75f22b745bd847638b9fdff9c19c1f0091a6b470

alembic/autogenerate/api.py
docs/build/unreleased/813.rst [new file with mode: 0644]
tests/test_autogen_diffs.py

index 030bc8bfb90e5b3c13add238198b3fcb06ebdb24..bdcfebd69bf20c6f557274f197c2f6f4a9f62432 100644 (file)
@@ -330,15 +330,16 @@ class AutogenContext(object):
             if type_ == "table":
                 table_name = name
             else:
-                table_name = parent_names["table_name"]
-            schema_name = parent_names["schema_name"]
-            if schema_name:
-                parent_names["schema_qualified_table_name"] = "%s.%s" % (
-                    schema_name,
-                    table_name,
-                )
-            else:
-                parent_names["schema_qualified_table_name"] = table_name
+                table_name = parent_names.get("table_name", None)
+            if table_name:
+                schema_name = parent_names["schema_name"]
+                if schema_name:
+                    parent_names["schema_qualified_table_name"] = "%s.%s" % (
+                        schema_name,
+                        table_name,
+                    )
+                else:
+                    parent_names["schema_qualified_table_name"] = table_name
 
         for fn in self._name_filters:
 
diff --git a/docs/build/unreleased/813.rst b/docs/build/unreleased/813.rst
new file mode 100644 (file)
index 0000000..898e180
--- /dev/null
@@ -0,0 +1,9 @@
+.. change::
+    :tags: bug, autogenerate
+    :tickets: 813
+
+    Adjusted the recently added
+    :paramref:`.EnvironmentContext.configure.include_name` hook to accommodate
+    for additional object types such as "views" that don't have a parent table,
+    to support third party recipes and extensions. Pull request courtesy Oliver
+    Rice.
index a2215affa82cc2527b578df8e08bc1c58499f2bb..02a750a2804845eb6c11a56228d05cf094090d60 100644 (file)
@@ -1188,6 +1188,60 @@ class AutogenerateCustomCompareTypeTest(AutogenTest, TestBase):
         eq_(diffs[1][0][0], "modify_type")
 
 
+class IncludeFiltersAPITest(AutogenTest, TestBase):
+    @classmethod
+    def _get_db_schema(cls):
+        return MetaData()
+
+    @classmethod
+    def _get_model_schema(cls):
+        return MetaData()
+
+    def test_run_name_filters_supports_extension_types(self):
+        include_name = mock.Mock()
+
+        self._update_context(name_filters=include_name, include_schemas=True)
+
+        self.autogen_context.run_name_filters(
+            name="some_function",
+            type_="function",
+            parent_names={"schema_name": "public"},
+        )
+
+        eq_(
+            include_name.mock_calls,
+            [
+                mock.call(
+                    "some_function", "function", {"schema_name": "public"}
+                )
+            ],
+        )
+
+    def test_run_object_filters_supports_extension_types(self):
+        include_object = mock.Mock()
+
+        self._update_context(
+            object_filters=include_object, include_schemas=True
+        )
+
+        class ExtFunction(object):
+            pass
+
+        extfunc = ExtFunction()
+        self.autogen_context.run_object_filters(
+            object_=extfunc,
+            name="some_function",
+            type_="function",
+            reflected=False,
+            compare_to=None,
+        )
+
+        eq_(
+            include_object.mock_calls,
+            [mock.call(extfunc, "some_function", "function", False, None)],
+        )
+
+
 class PKConstraintUpgradesIgnoresNullableTest(AutogenTest, TestBase):
     __backend__ = True