summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaselIT <cfederico87@gmail.com>2023-04-03 23:15:45 +0200
committerCaselIT <cfederico87@gmail.com>2023-04-04 00:01:37 +0200
commitdd01224a4cbc5119aa6738867b7ce28d9c65a73e (patch)
treea59a9ce120791448f32c17d96bd11d19c0232408
parent79958bf68da0684ec7c7ffe90b1c5a41360c5906 (diff)
downloadalembic-dd01224a4cbc5119aa6738867b7ce28d9c65a73e.tar.gz
Fix issues in autogenerate of function index removal
Fixed error raised by alembic when running autogenerate after removing a function based index. Fixes: #1212 Change-Id: Idc565d661229afda89d44e36786bb0357323e604
-rw-r--r--alembic/testing/requirements.py7
-rw-r--r--alembic/testing/warnings.py9
-rw-r--r--alembic/util/sqla_compat.py2
-rw-r--r--docs/build/unreleased/1212.rst6
-rw-r--r--tests/test_autogen_render.py263
-rw-r--r--tests/test_batch.py1
-rw-r--r--tests/test_sqlite.py1
7 files changed, 113 insertions, 176 deletions
diff --git a/alembic/testing/requirements.py b/alembic/testing/requirements.py
index 989c7cd..a4a6045 100644
--- a/alembic/testing/requirements.py
+++ b/alembic/testing/requirements.py
@@ -75,13 +75,6 @@ class SuiteRequirements(Requirements):
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(
lambda config: not util.sqla_14,
diff --git a/alembic/testing/warnings.py b/alembic/testing/warnings.py
index 86d45a0..e87136b 100644
--- a/alembic/testing/warnings.py
+++ b/alembic/testing/warnings.py
@@ -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:
diff --git a/alembic/util/sqla_compat.py b/alembic/util/sqla_compat.py
index a767e7d..cab9949 100644
--- a/alembic/util/sqla_compat.py
+++ b/alembic/util/sqla_compat.py
@@ -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
index 0000000..e27ecb1
--- /dev/null
+++ b/docs/build/unreleased/1212.rst
@@ -0,0 +1,6 @@
+.. change::
+ :tags: bug, autogenerate
+ :tickets: 1212
+
+ Fixed error raised by alembic when running autogenerate after removing
+ a function based index.
diff --git a/tests/test_autogen_render.py b/tests/test_autogen_render.py
index ada2a12..14a0001 100644
--- a/tests/test_autogen_render.py
+++ b/tests/test_autogen_render.py
@@ -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(
diff --git a/tests/test_batch.py b/tests/test_batch.py
index 3b67895..52f9baf 100644
--- a/tests/test_batch.py
+++ b/tests/test_batch.py
@@ -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))
diff --git a/tests/test_sqlite.py b/tests/test_sqlite.py
index 4c60ce4..a580eb2 100644
--- a/tests/test_sqlite.py
+++ b/tests/test_sqlite.py
@@ -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")