diff options
| -rw-r--r-- | migrate/changeset/schema.py | 10 | ||||
| -rw-r--r-- | migrate/exceptions.py | 4 | ||||
| -rw-r--r-- | migrate/tests/changeset/test_changeset.py | 13 | ||||
| -rw-r--r-- | migrate/tests/versioning/test_version.py | 4 | ||||
| -rw-r--r-- | migrate/versioning/util/__init__.py | 9 | ||||
| -rw-r--r-- | migrate/versioning/version.py | 17 |
6 files changed, 51 insertions, 6 deletions
diff --git a/migrate/changeset/schema.py b/migrate/changeset/schema.py index a0e42cc..931ef7b 100644 --- a/migrate/changeset/schema.py +++ b/migrate/changeset/schema.py @@ -353,8 +353,14 @@ class ColumnDelta(six.with_metaclass(MyMeta, DictMixin, sqlalchemy.schema.Schema self.process_column(self.result_column) # create an instance of class type if not yet - if 'type' in diffs and callable(self.result_column.type): - self.result_column.type = self.result_column.type() + if 'type' in diffs: + if callable(self.result_column.type): + self.result_column.type = self.result_column.type() + if self.result_column.autoincrement and \ + not issubclass( + self.result_column.type._type_affinity, + sqlalchemy.Integer): + self.result_column.autoincrement = False # add column to the table if self.table is not None and self.alter_metadata: diff --git a/migrate/exceptions.py b/migrate/exceptions.py index cb8c409..31c8cd9 100644 --- a/migrate/exceptions.py +++ b/migrate/exceptions.py @@ -27,6 +27,10 @@ class InvalidVersionError(ControlledSchemaError): """Invalid version number.""" +class VersionNotFoundError(KeyError): + """Specified version is not present.""" + + class DatabaseNotControlledError(ControlledSchemaError): """Database should be under version control, but it's not.""" diff --git a/migrate/tests/changeset/test_changeset.py b/migrate/tests/changeset/test_changeset.py index 57d0380..93e9965 100644 --- a/migrate/tests/changeset/test_changeset.py +++ b/migrate/tests/changeset/test_changeset.py @@ -687,12 +687,25 @@ class TestColumnChange(fixture.DB): self.assertTrue(isinstance(self.table.c.id.type, Integer)) self.assertEqual(self.table.c.id.nullable, False) + # SQLAlchemy 1.1 adds a third state to "autoincrement" called + # "auto". + self.assertTrue(self.table.c.id.autoincrement in ('auto', True)) + if not self.engine.name == 'firebird': self.table.c.id.alter(type=String(20)) self.assertEqual(self.table.c.id.nullable, False) + + # a rule makes sure that autoincrement is set to False + # when we change off of Integer + self.assertEqual(self.table.c.id.autoincrement, False) self.refresh_table(self.table.name) self.assertTrue(isinstance(self.table.c.id.type, String)) + # note that after reflection, "autoincrement" is likely + # to change back to a database-generated value. Should be + # False or "auto". if True, it's a bug; at least one of these + # exists prior to SQLAlchemy 1.1.3 + @fixture.usedb() def test_default(self): """Can change a column's server_default value (DefaultClauses only) diff --git a/migrate/tests/versioning/test_version.py b/migrate/tests/versioning/test_version.py index df50072..286dd59 100644 --- a/migrate/tests/versioning/test_version.py +++ b/migrate/tests/versioning/test_version.py @@ -103,6 +103,10 @@ class TestVersion(fixture.Pathed): self.assertEqual(coll.latest, 4) self.assertEqual(len(coll.versions), 4) self.assertEqual(coll.version(4), coll.version(coll.latest)) + # Check for non-existing version + self.assertRaises(VersionNotFoundError, coll.version, 5) + # Check for the current version + self.assertEqual('4', coll.version(4).version) coll2 = Collection(self.temp_usable_dir) self.assertEqual(coll.versions, coll2.versions) diff --git a/migrate/versioning/util/__init__.py b/migrate/versioning/util/__init__.py index 7ad226b..55c72c9 100644 --- a/migrate/versioning/util/__init__.py +++ b/migrate/versioning/util/__init__.py @@ -33,7 +33,14 @@ def load_model(dotted_name): warnings.warn('model should be in form of module.model:User ' 'and not module.model.User', exceptions.MigrateDeprecationWarning) dotted_name = ':'.join(dotted_name.rsplit('.', 1)) - return EntryPoint.parse('x=%s' % dotted_name).load(False) + + ep = EntryPoint.parse('x=%s' % dotted_name) + if hasattr(ep, 'resolve'): + # this is available on setuptools >= 10.2 + return ep.resolve() + else: + # this causes a DeprecationWarning on setuptools >= 11.3 + return ep.load(False) else: # Assume it's already loaded. return dotted_name diff --git a/migrate/versioning/version.py b/migrate/versioning/version.py index 3ab814c..0633e1b 100644 --- a/migrate/versioning/version.py +++ b/migrate/versioning/version.py @@ -156,11 +156,22 @@ class Collection(pathed.Pathed): self.versions[ver].add_script(filepath) def version(self, vernum=None): - """Returns latest Version if vernum is not given. - Otherwise, returns wanted version""" + """Returns required version. + + If vernum is not given latest version will be returned otherwise + required version will be returned. + :raises: : exceptions.VersionNotFoundError if respective migration + script file of version is not present in the migration repository. + """ if vernum is None: vernum = self.latest - return self.versions[VerNum(vernum)] + + try: + return self.versions[VerNum(vernum)] + except KeyError: + raise exceptions.VersionNotFoundError( + ("Database schema file with version %(args)s doesn't " + "exist.") % {'args': VerNum(vernum)}) @classmethod def clear(cls): |
