From: Mike Bayer Date: Sat, 20 Sep 2014 17:17:33 +0000 (-0400) Subject: Merge remote-tracking branch 'github/pr/16' into pr16 X-Git-Tag: rel_0_7_0~78 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3da31bc1c68e7546c21b975fca6dc0e6f6e6b42;p=thirdparty%2Fsqlalchemy%2Falembic.git Merge remote-tracking branch 'github/pr/16' into pr16 --- b3da31bc1c68e7546c21b975fca6dc0e6f6e6b42 diff --cc alembic/autogenerate/compare.py index 1a909349,b59816d8..bfca75e6 --- a/alembic/autogenerate/compare.py +++ b/alembic/autogenerate/compare.py @@@ -1,7 -1,8 +1,9 @@@ +from sqlalchemy import schema as sa_schema, types as sqltypes + from sqlalchemy.exc import NoSuchTableError -from sqlalchemy import schema as sa_schema, types as sqltypes, sql ++from sqlalchemy import sql import logging from .. import compat - from .render import _render_server_default + from .render import _render_server_default, _render_potential_expr from sqlalchemy.util import OrderedSet diff --cc alembic/autogenerate/render.py index 8a086ef0,3ecef3a4..981ee1e7 --- a/alembic/autogenerate/render.py +++ b/alembic/autogenerate/render.py @@@ -88,34 -82,35 +88,44 @@@ def _drop_table(table, autogen_context) text += ")" return text -def _get_index_rendered_expressions(idx, autogen_context=None): + ++def _get_index_rendered_expressions(idx, autogen_context): + if compat.sqla_08: + return [repr(getattr(exp, "name", None)) + if isinstance(exp, sql.schema.Column) + else _render_potential_expr(exp, autogen_context) + for exp in idx.expressions] + else: + return [repr(getattr(col, "name", None)) for col in idx.columns] + ++ def _add_index(index, autogen_context): """ Generate Alembic operations for the CREATE INDEX of an :class:`~sqlalchemy.schema.Index` instance. """ - from .compare import _get_index_column_names + - text = "%(prefix)screate_index(%(name)r, '%(table)s', %(columns)s, "\ + text = "%(prefix)screate_index(%(name)r, '%(table)s', [%(columns)s], "\ - "unique=%(unique)r%(schema)s%(kwargs)s)" % { - 'prefix': _alembic_autogenerate_prefix(autogen_context), - 'name': _render_gen_name(autogen_context, index.name), - 'table': index.table.name, - 'columns': ", ".join(_get_index_rendered_expressions(index, autogen_context)), - 'unique': index.unique or False, - 'schema': (", schema='%s'" % index.table.schema) if index.table.schema else '', - 'kwargs': (', '+', '.join( - ["%s=%s" % (key, _render_potential_expr(val, autogen_context)) - for key, val in index.kwargs.items()]))\ + "unique=%(unique)r%(schema)s%(kwargs)s)" % { + 'prefix': _alembic_autogenerate_prefix(autogen_context), + 'name': _render_gen_name(autogen_context, index.name), + 'table': index.table.name, - 'columns': _get_index_column_names(index), ++ 'columns': ", ".join( ++ _get_index_rendered_expressions(index, autogen_context)), + 'unique': index.unique or False, + 'schema': (", schema='%s'" % index.table.schema) + if index.table.schema else '', + 'kwargs': ( + ', ' + + ', '.join( + ["%s=%s" % + (key, _render_potential_expr(val, autogen_context)) + for key, val in index.kwargs.items()])) if len(index.kwargs) else '' - } + } return text + def _drop_index(index, autogen_context): """ Generate Alembic operations for the DROP INDEX of an @@@ -349,21 -328,13 +359,14 @@@ def _render_server_default(default, aut return rendered if isinstance(default, sa_schema.DefaultClause): - if isinstance(default.arg, string_types): - default = default.arg - else: - default = str(default.arg.compile( - dialect=autogen_context['dialect'])) - if isinstance(default, string_types): - if repr_: - default = re.sub(r"^'|'$", "", default) - return repr(default) - else: - return default - else: - return None + default = _render_potential_expr(default.arg, autogen_context) + + elif isinstance(default, string_types) and repr_: + default = repr(re.sub(r"^'|'$", "", default)) + + return default + def _repr_type(type_, autogen_context): rendered = _user_defined_render("type", type_, autogen_context) if rendered is not False: diff --cc tests/test_autogen_render.py index ece16179,981649cf..c6127e83 --- a/tests/test_autogen_render.py +++ b/tests/test_autogen_render.py @@@ -1,21 -1,20 +1,22 @@@ import re import sys -from unittest import TestCase +from alembic.testing import TestBase -from sqlalchemy import MetaData, Column, Table, Integer, String, Text, \ - Numeric, CHAR, ForeignKey, DATETIME, INTEGER, \ - TypeDecorator, CheckConstraint, Unicode, Enum,\ +from sqlalchemy import MetaData, Column, Table, String, \ + Numeric, CHAR, ForeignKey, DATETIME, Integer, \ + CheckConstraint, Unicode, Enum,\ UniqueConstraint, Boolean, ForeignKeyConstraint,\ - PrimaryKeyConstraint, Index + PrimaryKeyConstraint, Index, func, text ++ from sqlalchemy.types import TIMESTAMP from sqlalchemy.dialects import mysql, postgresql - from sqlalchemy.sql import and_, column, literal_column + from sqlalchemy.sql import and_, column, literal_column, false -from . import patch +from alembic.testing.mock import patch from alembic import autogenerate, util, compat -from . import eq_, eq_ignore_whitespace, requires_092, requires_09, requires_094 +from alembic.testing import eq_, eq_ignore_whitespace, config + py3k = sys.version_info >= (3, ) @@@ -98,29 -95,37 +99,39 @@@ class AutogenRenderTest(TestBase) else: eq_ignore_whitespace( autogenerate.render._add_index(idx, autogen_context), - """op.create_index('foo_idx', 't', ['x', 'y'], unique=False, """ - """postgresql_where=sa.text('t.y = %(y_1)s'))""" + """op.create_index('foo_idx', 't', ['x', 'y'], \ +unique=False, """ + """postgresql_where=sa.text('t.y = %(y_1)s'))""" ) - # def test_render_add_index_func(self): - # """ - # autogenerate.render._drop_index using func -- TODO: SQLA needs to - # reflect expressions as well as columns - # """ - # m = MetaData() - # t = Table('test', m, - # Column('id', Integer, primary_key=True), - # Column('active', Boolean()), - # Column('code', String(255)), - # ) - # idx = Index( - # 'test_active_lower_code_idx', t.c.active, func.lower(t.c.code)) - # eq_ignore_whitespace( - # autogenerate.render._add_index(idx, self.autogen_context), - # "" - # ) + def test_render_add_index_func(self): + m = MetaData() - t = Table('test', m, ++ t = Table( ++ 'test', m, + Column('id', Integer, primary_key=True), + Column('code', String(255)) + ) + idx = Index('test_lower_code_idx', func.lower(t.c.code)) + eq_ignore_whitespace( + autogenerate.render._add_index(idx, self.autogen_context), + "op.create_index('test_lower_code_idx', 'test', " + "[sa.text('lower(test.code)')], unique=False)" + ) + + def test_render_add_index_desc(self): + m = MetaData() - t = Table('test', m, ++ t = Table( ++ 'test', m, + Column('id', Integer, primary_key=True), + Column('code', String(255)) + ) + idx = Index('test_desc_code_idx', t.c.code.desc()) + eq_ignore_whitespace( + autogenerate.render._add_index(idx, self.autogen_context), + "op.create_index('test_desc_code_idx', 'test', " + "[sa.text('test.code DESC')], unique=False)" + ) - def test_drop_index(self): """ autogenerate.render._drop_index