diff options
author | mike bayer <mike_mp@zzzcomputing.com> | 2023-04-04 14:51:51 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2023-04-04 14:51:51 +0000 |
commit | f4c5f394956c4c767930fb81fdd81bd9154dd6b9 (patch) | |
tree | f87a9e0b44bffd3c3065d5ba75145702f6962101 | |
parent | 13d1bc65696b2cd3bb793c57bc2645f85ab9943b (diff) | |
parent | dd01224a4cbc5119aa6738867b7ce28d9c65a73e (diff) | |
download | alembic-f4c5f394956c4c767930fb81fdd81bd9154dd6b9.tar.gz |
Merge "Fix issues in autogenerate of function index removal" into main
-rw-r--r-- | alembic/testing/requirements.py | 7 | ||||
-rw-r--r-- | alembic/testing/warnings.py | 9 | ||||
-rw-r--r-- | alembic/util/sqla_compat.py | 2 | ||||
-rw-r--r-- | docs/build/unreleased/1212.rst | 6 | ||||
-rw-r--r-- | tests/test_autogen_render.py | 263 | ||||
-rw-r--r-- | tests/test_batch.py | 1 | ||||
-rw-r--r-- | tests/test_sqlite.py | 1 |
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") |