]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Fix issues in autogenerate of function index removal
authorCaselIT <cfederico87@gmail.com>
Mon, 3 Apr 2023 21:15:45 +0000 (23:15 +0200)
committerCaselIT <cfederico87@gmail.com>
Mon, 3 Apr 2023 22:01:37 +0000 (00:01 +0200)
Fixed error raised by alembic when running autogenerate after removing
a function based index.

Fixes: #1212
Change-Id: Idc565d661229afda89d44e36786bb0357323e604

alembic/testing/requirements.py
alembic/testing/warnings.py
alembic/util/sqla_compat.py
docs/build/unreleased/1212.rst [new file with mode: 0644]
tests/test_autogen_render.py
tests/test_batch.py
tests/test_sqlite.py

index 989c7cd519bdf7f7cf4a170e2755242adf75d092..a4a6045e88c8eed0cbca5721d365507893d6f19b 100644 (file)
@@ -74,13 +74,6 @@ class SuiteRequirements(Requirements):
     def reflects_fk_options(self):
         return exclusions.closed()
 
-    @property
-    def sqlalchemy_13(self):
-        return exclusions.skip_if(
-            lambda config: not util.sqla_13,
-            "SQLAlchemy 1.3 or greater required",
-        )
-
     @property
     def sqlalchemy_14(self):
         return exclusions.skip_if(
index 86d45a0dd558e2696ae34d277418eb43928cb8a7..e87136b85f380dbc741ee7f860740d3423bab383 100644 (file)
@@ -10,6 +10,8 @@ import warnings
 
 from sqlalchemy import exc as sa_exc
 
+from ..util import sqla_14
+
 
 def setup_filters():
     """Set global warning behavior for the test suite."""
@@ -21,6 +23,13 @@ def setup_filters():
 
     # some selected deprecations...
     warnings.filterwarnings("error", category=DeprecationWarning)
+    if not sqla_14:
+        # 1.3 uses pkg_resources in PluginLoader
+        warnings.filterwarnings(
+            "ignore",
+            "pkg_resources is deprecated as an API",
+            DeprecationWarning,
+        )
     try:
         import pytest
     except ImportError:
index a767e7da2826045b01e5e91c7df9d117ddec4fdd..cab99494bddd328b21f42cfd1df5c07ac705b2b3 100644 (file)
@@ -415,6 +415,8 @@ def _textual_index_column(
         return c
     elif isinstance(text_, TextClause):
         return _textual_index_element(table, text_)
+    elif isinstance(text_, _textual_index_element):
+        return _textual_index_column(table, text_.text)
     elif isinstance(text_, sql.ColumnElement):
         return _copy_expression(text_, table)
     else:
diff --git a/docs/build/unreleased/1212.rst b/docs/build/unreleased/1212.rst
new file mode 100644 (file)
index 0000000..e27ecb1
--- /dev/null
@@ -0,0 +1,6 @@
+.. change::
+    :tags: bug, autogenerate
+    :tickets: 1212
+
+    Fixed error raised by alembic when running autogenerate after removing
+    a function based index.
index ada2a12372fee932638fce8826eff86d03a04d34..14a0001ca7eac691936cef6e97a1b96190259694 100644 (file)
@@ -67,10 +67,7 @@ class AutogenRenderTest(TestBase):
 
         self.autogen_context = api.AutogenContext(context)
 
-    def test_render_add_index(self):
-        """
-        autogenerate.render._add_index
-        """
+    def table(self, *args, **kwargs):
         m = MetaData()
         t = Table(
             "test",
@@ -78,7 +75,16 @@ class AutogenRenderTest(TestBase):
             Column("id", Integer, primary_key=True),
             Column("active", Boolean()),
             Column("code", String(255)),
+            *args,
+            **kwargs,
         )
+        return t
+
+    def test_render_add_index(self):
+        """
+        autogenerate.render._add_index
+        """
+        t = self.table()
         idx = Index("test_active_code_idx", t.c.active, t.c.code)
         op_obj = ops.CreateIndexOp.from_index(idx)
         eq_ignore_whitespace(
@@ -89,13 +95,7 @@ class AutogenRenderTest(TestBase):
 
     @testing.emits_warning("Can't validate argument ")
     def test_render_add_index_custom_kwarg(self):
-        t = Table(
-            "test",
-            MetaData(),
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-        )
+        t = self.table()
         idx = Index(None, t.c.active, t.c.code, somedialect_foobar="option")
         op_obj = ops.CreateIndexOp.from_index(idx)
         eq_ignore_whitespace(
@@ -108,14 +108,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._add_index
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-        )
+        t = self.table()
         idx = Index("test_active_code_idx", t.c.active, t.c.code)
         op_obj = ops.CreateIndexOp.from_index(idx)
         with self.autogen_context._within_batch():
@@ -129,15 +122,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._add_index using schema
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-            schema="CamelSchema",
-        )
+        t = self.table(schema="CamelSchema")
         idx = Index("test_active_code_idx", t.c.active, t.c.code)
         op_obj = ops.CreateIndexOp.from_index(idx)
         eq_ignore_whitespace(
@@ -150,15 +135,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._add_index using schema
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-            schema="CamelSchema",
-        )
+        t = self.table(schema="CamelSchema")
         idx = Index("test_active_code_idx", t.c.active, t.c.code)
         op_obj = ops.CreateIndexOp.from_index(idx)
         with self.autogen_context._within_batch():
@@ -168,14 +145,26 @@ class AutogenRenderTest(TestBase):
                 "['active', 'code'], unique=False)",
             )
 
-    def test_render_add_index_func(self):
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("code", String(255)),
+    def test_render_add_index_text(self):
+        """
+        autogenerate.render._add_index
+        """
+        t = self.table()
+        idx = Index("test_active_code_idx", t.c.active, text("lower(code)"))
+        op_obj = ops.CreateIndexOp.from_index(idx)
+        eq_ignore_whitespace(
+            autogenerate.render_op_text(self.autogen_context, op_obj),
+            "op.create_index('test_active_code_idx', 'test', "
+            "['active', sa.text('lower(code)')], unique=False)",
         )
+        op_obj_rev = op_obj.reverse()
+        eq_ignore_whitespace(
+            autogenerate.render_op_text(self.autogen_context, op_obj_rev),
+            "op.drop_index('test_active_code_idx', table_name='test')",
+        )
+
+    def test_render_add_index_func(self):
+        t = self.table()
         idx = Index("test_lower_code_idx", func.lower(t.c.code))
         op_obj = ops.CreateIndexOp.from_index(idx)
 
@@ -184,15 +173,14 @@ class AutogenRenderTest(TestBase):
             "op.create_index('test_lower_code_idx', 'test', "
             "[sa.text('lower(code)')], unique=False)",
         )
+        op_obj_rev = op_obj.reverse()
+        eq_ignore_whitespace(
+            autogenerate.render_op_text(self.autogen_context, op_obj_rev),
+            "op.drop_index('test_lower_code_idx', table_name='test')",
+        )
 
     def test_render_add_index_cast(self):
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("code", String(255)),
-        )
+        t = self.table()
         idx = Index("test_lower_code_idx", cast(t.c.code, String))
         op_obj = ops.CreateIndexOp.from_index(idx)
 
@@ -203,13 +191,7 @@ class AutogenRenderTest(TestBase):
         )
 
     def test_render_add_index_desc(self):
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("code", String(255)),
-        )
+        t = self.table()
         idx = Index("test_desc_code_idx", t.c.code.desc())
         op_obj = ops.CreateIndexOp.from_index(idx)
         eq_ignore_whitespace(
@@ -222,14 +204,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._drop_index
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-        )
+        t = self.table()
         idx = Index("test_active_code_idx", t.c.active, t.c.code)
         op_obj = ops.DropIndexOp.from_index(idx)
         eq_ignore_whitespace(
@@ -237,15 +212,45 @@ class AutogenRenderTest(TestBase):
             "op.drop_index('test_active_code_idx', table_name='test')",
         )
 
+    def test_drop_index_text(self):
+        """
+        autogenerate.render._drop_index
+        """
+        t = self.table()
+        idx = Index("test_active_code_idx", t.c.active, text("lower(code)"))
+        op_obj = ops.DropIndexOp.from_index(idx)
+        eq_ignore_whitespace(
+            autogenerate.render_op_text(self.autogen_context, op_obj),
+            "op.drop_index('test_active_code_idx', table_name='test')",
+        )
+        op_obj_rev = op_obj.reverse()
+        eq_ignore_whitespace(
+            autogenerate.render_op_text(self.autogen_context, op_obj_rev),
+            "op.create_index('test_active_code_idx', 'test', "
+            "['active', sa.text('lower(code)')], unique=False)",
+        )
+
+    def test_drop_index_func(self):
+        """
+        autogenerate.render._drop_index
+        """
+        t = self.table()
+        idx = Index("test_lower_code_idx", func.lower(t.c.code))
+        op_obj = ops.DropIndexOp.from_index(idx)
+        eq_ignore_whitespace(
+            autogenerate.render_op_text(self.autogen_context, op_obj),
+            "op.drop_index('test_lower_code_idx', table_name='test')",
+        )
+        op_obj_rev = op_obj.reverse()
+        eq_ignore_whitespace(
+            autogenerate.render_op_text(self.autogen_context, op_obj_rev),
+            "op.create_index('test_lower_code_idx', 'test', "
+            "[sa.text('lower(code)')], unique=False)",
+        )
+
     @testing.emits_warning("Can't validate argument ")
     def test_render_drop_index_custom_kwarg(self):
-        t = Table(
-            "test",
-            MetaData(),
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-        )
+        t = self.table()
         idx = Index(None, t.c.active, t.c.code, somedialect_foobar="option")
         op_obj = ops.DropIndexOp.from_index(idx)
         eq_ignore_whitespace(
@@ -258,14 +263,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._drop_index
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-        )
+        t = self.table()
         idx = Index("test_active_code_idx", t.c.active, t.c.code)
         op_obj = ops.DropIndexOp.from_index(idx)
         with self.autogen_context._within_batch():
@@ -278,15 +276,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._drop_index using schema
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-            schema="CamelSchema",
-        )
+        t = self.table(schema="CamelSchema")
         idx = Index("test_active_code_idx", t.c.active, t.c.code)
         op_obj = ops.DropIndexOp.from_index(idx)
         eq_ignore_whitespace(
@@ -299,15 +289,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._drop_index using schema
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-            schema="CamelSchema",
-        )
+        t = self.table(schema="CamelSchema")
         idx = Index("test_active_code_idx", t.c.active, t.c.code)
         op_obj = ops.DropIndexOp.from_index(idx)
         with self.autogen_context._within_batch():
@@ -320,14 +302,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._add_unique_constraint
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-        )
+        t = self.table()
         uq = UniqueConstraint(t.c.code, name="uq_test_code")
         op_obj = ops.AddConstraintOp.from_constraint(uq)
         eq_ignore_whitespace(
@@ -339,14 +314,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._add_unique_constraint
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-        )
+        t = self.table()
         uq = UniqueConstraint(t.c.code, name="uq_test_code")
         op_obj = ops.AddConstraintOp.from_constraint(uq)
         with self.autogen_context._within_batch():
@@ -359,15 +327,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._add_unique_constraint using schema
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-            schema="CamelSchema",
-        )
+        t = self.table(schema="CamelSchema")
         uq = UniqueConstraint(t.c.code, name="uq_test_code")
         op_obj = ops.AddConstraintOp.from_constraint(uq)
         eq_ignore_whitespace(
@@ -380,15 +340,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._add_unique_constraint using schema
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-            schema="CamelSchema",
-        )
+        t = self.table(schema="CamelSchema")
         uq = UniqueConstraint(t.c.code, name="uq_test_code")
         op_obj = ops.AddConstraintOp.from_constraint(uq)
         with self.autogen_context._within_batch():
@@ -402,14 +354,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._drop_constraint
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-        )
+        t = self.table()
         uq = UniqueConstraint(t.c.code, name="uq_test_code")
         op_obj = ops.DropConstraintOp.from_constraint(uq)
         eq_ignore_whitespace(
@@ -421,15 +366,7 @@ class AutogenRenderTest(TestBase):
         """
         autogenerate.render._drop_constraint using schema
         """
-        m = MetaData()
-        t = Table(
-            "test",
-            m,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-            schema="CamelSchema",
-        )
+        t = self.table(schema="CamelSchema")
         uq = UniqueConstraint(t.c.code, name="uq_test_code")
         op_obj = ops.DropConstraintOp.from_constraint(uq)
         eq_ignore_whitespace(
@@ -1126,7 +1063,6 @@ class AutogenRenderTest(TestBase):
             "server_default='5', nullable=True))",
         )
 
-    @config.requirements.sqlalchemy_13
     @testing.emits_warning("Can't validate argument ")
     def test_render_add_column_custom_kwarg(self):
         col = Column(
@@ -2302,14 +2238,20 @@ class RenderNamingConventionTest(TestBase):
             "sa.UniqueConstraint('c', name='q')",
         )
 
-    def test_render_add_index(self):
+    def table(self, *args, **kwargs):
         t = Table(
             "test",
             self.metadata,
             Column("id", Integer, primary_key=True),
             Column("active", Boolean()),
             Column("code", String(255)),
+            *args,
+            **kwargs,
         )
+        return t
+
+    def test_render_add_index(self):
+        t = self.table()
         idx = Index(None, t.c.active, t.c.code)
         op_obj = ops.CreateIndexOp.from_index(idx)
         eq_ignore_whitespace(
@@ -2319,13 +2261,7 @@ class RenderNamingConventionTest(TestBase):
         )
 
     def test_render_drop_index(self):
-        t = Table(
-            "test",
-            self.metadata,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-        )
+        t = self.table()
         idx = Index(None, t.c.active, t.c.code)
         op_obj = ops.DropIndexOp.from_index(idx)
         eq_ignore_whitespace(
@@ -2334,14 +2270,7 @@ class RenderNamingConventionTest(TestBase):
         )
 
     def test_render_add_index_schema(self):
-        t = Table(
-            "test",
-            self.metadata,
-            Column("id", Integer, primary_key=True),
-            Column("active", Boolean()),
-            Column("code", String(255)),
-            schema="CamelSchema",
-        )
+        t = self.table(schema="CamelSchema")
         idx = Index(None, t.c.active, t.c.code)
         op_obj = ops.CreateIndexOp.from_index(idx)
         eq_ignore_whitespace(
index 3b678953e186b0a2f033405aabd7cfc027d9edf0..52f9bafc9b4665fd9e5828a2c4d3191d009bf3d3 100644 (file)
@@ -1129,7 +1129,6 @@ class CopyFromTest(TestBase):
         self.op = Operations(context)
         return context
 
-    @config.requirements.sqlalchemy_13
     def test_change_type(self):
         context = self._fixture()
         self.table.append_column(Column("toj", Text))
index 4c60ce48e8fc758eed96757c12a9de2d274cac88..a580eb208283e1c5c9fc6b96be872f3150d58698 100644 (file)
@@ -267,7 +267,6 @@ class SQLiteAutogenRenderTest(TestBase):
             "nullable=True)",
         )
 
-    @config.requirements.sqlalchemy_13
     def test_render_add_column_w_on_conflict(self):
         c = Column("int_value", Integer, sqlite_on_conflict_not_null="FAIL")