From cbebf76ade778042e3b38f3b14455fec6b7e3bee Mon Sep 17 00:00:00 2001 From: Pete Keen Date: Fri, 10 Jun 2011 10:59:39 -0700 Subject: [PATCH] Optionally number versions with timestamps instead of sequences --- migrate/tests/versioning/test_repository.py | 19 +++++++++++++++++++ migrate/versioning/repository.py | 11 +++++++++++ .../templates/repository/default/migrate.cfg | 5 +++++ migrate/versioning/version.py | 13 +++++++++++-- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/migrate/tests/versioning/test_repository.py b/migrate/tests/versioning/test_repository.py index 2c489d5..9ef45c6 100644 --- a/migrate/tests/versioning/test_repository.py +++ b/migrate/tests/versioning/test_repository.py @@ -10,6 +10,7 @@ from migrate.versioning.script import * from nose.tools import raises from migrate.tests import fixture +from datetime import datetime class TestRepository(fixture.Pathed): @@ -96,6 +97,24 @@ class TestVersionedRepository(fixture.Pathed): self.assert_(repos.latest >= 2) self.assert_(repos.latest < 3) + + def test_timestmap_numbering_version(self): + repos = Repository(self.path_repos) + repos.config.set('db_settings', 'use_timestamp_numbering', True) + + # Get latest version, or detect if a specified version exists + self.assertEquals(repos.latest, 0) + # repos.latest isn't an integer, but a VerNum + # (so we can't just assume the following tests are correct) + self.assert_(repos.latest >= 0) + self.assert_(repos.latest < 1) + + # Create a script and test again + now = int(datetime.utcnow().strftime('%Y%m%d%H%M%S')) + repos.create_script('') + print repos.latest + self.assertEquals(repos.latest, now) + def test_source(self): """Get a script object by version number and view its source""" # Load repository and commit script diff --git a/migrate/versioning/repository.py b/migrate/versioning/repository.py index 71f3912..5032cfa 100644 --- a/migrate/versioning/repository.py +++ b/migrate/versioning/repository.py @@ -115,6 +115,7 @@ class Repository(pathed.Pathed): options.setdefault('version_table', 'migrate_version') options.setdefault('repository_id', name) options.setdefault('required_dbs', []) + options.setdefault('use_timestamp_numbering', '0') tmpl = open(os.path.join(tmpl_dir, cls._config)).read() ret = TempitaTemplate(tmpl).substitute(options) @@ -152,10 +153,13 @@ class Repository(pathed.Pathed): def create_script(self, description, **k): """API to :meth:`migrate.versioning.version.Collection.create_new_python_version`""" + + k['use_timestamp_numbering'] = self.use_timestamp_numbering self.versions.create_new_python_version(description, **k) def create_script_sql(self, database, **k): """API to :meth:`migrate.versioning.version.Collection.create_new_sql_version`""" + k['use_timestamp_numbering'] = self.use_timestamp_numbering self.versions.create_new_sql_version(database, **k) @property @@ -173,6 +177,13 @@ class Repository(pathed.Pathed): """Returns repository id specified in config""" return self.config.get('db_settings', 'repository_id') + @property + def use_timestamp_numbering(self): + """Returns use_timestamp_numbering specified in config""" + ts_numbering = self.config.get('db_settings', 'use_timestamp_numbering', raw=True) + + return ts_numbering + def version(self, *p, **k): """API to :attr:`migrate.versioning.version.Collection.version`""" return self.versions.version(*p, **k) diff --git a/migrate/versioning/templates/repository/default/migrate.cfg b/migrate/versioning/templates/repository/default/migrate.cfg index 1dc6ff6..b3380b1 100644 --- a/migrate/versioning/templates/repository/default/migrate.cfg +++ b/migrate/versioning/templates/repository/default/migrate.cfg @@ -18,3 +18,8 @@ version_table={{ locals().pop('version_table') }} # be using to ensure your updates to that database work properly. # This must be a list; example: ['postgres','sqlite'] required_dbs={{ locals().pop('required_dbs') }} + +# When creating new change scripts, Migrate will stamp the new script with +# a version number. By default this is latest_version + 1. You can set this +# to 'true' to tell Migrate to use the UTC timestamp instead. +use_timestamp_numbering='false' \ No newline at end of file diff --git a/migrate/versioning/version.py b/migrate/versioning/version.py index a09b8cd..fdb78a9 100644 --- a/migrate/versioning/version.py +++ b/migrate/versioning/version.py @@ -8,6 +8,7 @@ import logging from migrate import exceptions from migrate.versioning import pathed, script +from datetime import datetime log = logging.getLogger(__name__) @@ -88,9 +89,17 @@ class Collection(pathed.Pathed): """:returns: Latest version in Collection""" return max([VerNum(0)] + self.versions.keys()) + def _next_ver_num(self, use_timestamp_numbering): + print use_timestamp_numbering + if use_timestamp_numbering == True: + print "Creating new timestamp version!" + return VerNum(int(datetime.utcnow().strftime('%Y%m%d%H%M%S'))) + else: + return self.latest + 1 + def create_new_python_version(self, description, **k): """Create Python files for new version""" - ver = self.latest + 1 + ver = self._next_ver_num(k.pop('use_timestamp_numbering', False)) extra = str_to_filename(description) if extra: @@ -107,7 +116,7 @@ class Collection(pathed.Pathed): def create_new_sql_version(self, database, **k): """Create SQL files for new version""" - ver = self.latest + 1 + ver = self._next_ver_num(k.pop('use_timestamp_numbering', False)) self.versions[ver] = Version(ver, self.path, []) # Create new files.