summaryrefslogtreecommitdiff
path: root/migrate
diff options
context:
space:
mode:
authorPete Keen <pete@bugsplat.info>2011-06-10 10:59:39 -0700
committerPete Keen <pete@bugsplat.info>2011-06-10 10:59:39 -0700
commitcbebf76ade778042e3b38f3b14455fec6b7e3bee (patch)
treefddcb3771800fd1c20a32dbfb9151de19fc85807 /migrate
parent7681155af78731b785b1764ed25fcc170086f272 (diff)
downloadsqalchemy-migrate-cbebf76ade778042e3b38f3b14455fec6b7e3bee.tar.gz
Optionally number versions with timestamps instead of sequences
Diffstat (limited to 'migrate')
-rw-r--r--migrate/tests/versioning/test_repository.py19
-rw-r--r--migrate/versioning/repository.py11
-rw-r--r--migrate/versioning/templates/repository/default/migrate.cfg5
-rw-r--r--migrate/versioning/version.py13
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.