From: Mike Bayer Date: Wed, 28 Apr 2010 02:22:40 +0000 (-0400) Subject: full round of revision file tests X-Git-Tag: rel_0_1_0~104 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aad081fbf70b424ca1a3dcf6b1bf148048799f05;p=thirdparty%2Fsqlalchemy%2Falembic.git full round of revision file tests --- diff --git a/alembic/command.py b/alembic/command.py index de3f27e2..cd4508ae 100644 --- a/alembic/command.py +++ b/alembic/command.py @@ -65,7 +65,7 @@ def revision(opts): """Create a new revision file.""" script = ScriptDirectory.from_options(opts) - script.generate_rev(uuid.uuid4(), opts.cmd_line_options.message) + script.generate_rev(str(uuid.uuid4().hex), opts.cmd_line_options.message) def upgrade(opts): """Upgrade to the latest version.""" diff --git a/alembic/script.py b/alembic/script.py index ddd8ea5f..27e84df2 100644 --- a/alembic/script.py +++ b/alembic/script.py @@ -4,8 +4,8 @@ import shutil import re import inspect -_uuid_re = re.compile(r'[a-z0-9]{32}\.py$') -_mod_def_re = re.compile(r'(upgrade|downgrade)_([a-z0-9]{32})') +_rev_file = re.compile(r'[a-z0-9]+\.py$') +_mod_def_re = re.compile(r'(upgrade|downgrade)_([a-z0-9]+)') class ScriptDirectory(object): def __init__(self, dir, options): @@ -50,7 +50,7 @@ class ScriptDirectory(object): heads = [] for script in self._revision_map.values(): if script.nextrev is None: - heads.append(script) + heads.append(script.upgrade) return heads def _get_origin(self): @@ -84,13 +84,19 @@ class ScriptDirectory(object): current_head = current_heads[0] else: current_head = None + filename = "%s.py" % revid self.generate_template( os.path.join(self.dir, "script.py.mako"), - os.path.join(self.versions, "%s.py" % revid.hex), - up_revision=str(revid.hex), - down_revision=current_head.upgrade if current_head else None, - message=message if message is not None else ("Alembic revision %s" % revid.hex) + os.path.join(self.versions, filename), + up_revision=str(revid), + down_revision=current_head, + message=message if message is not None else ("Alembic revision %s" % revid) ) + script = Script.from_path(self.versions, filename) + self._revision_map[script.upgrade] = script + if script.downgrade: + self._revision_map[script.downgrade].nextrev = script.upgrade + return script class Script(object): nextrev = None @@ -117,10 +123,9 @@ class Script(object): @classmethod def from_path(cls, dir_, filename): - if not _uuid_re.match(filename): + if not _rev_file.match(filename): return None - print "LOAD PYTHON FILE", filename module = util.load_python_file(dir_, filename) return Script(module) \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py index c889154d..ee5eb28c 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -5,7 +5,7 @@ import shutil import os import itertools -testing_directory = os.path.join(os.path.dirname(__file__), 'scratch') +staging_directory = os.path.join(os.path.dirname(__file__), 'scratch') _dialects = defaultdict(lambda name:url.URL(drivername).get_dialect()()) def _get_dialect(name): @@ -19,26 +19,27 @@ def assert_compiled(element, assert_string, dialect=None): dialect = _get_dialect(dialect) eq_(unicode(element.compile(dialect=dialect)), assert_string) - def _testing_options(**kw): from alembic.options import Options, get_option_parser - os.mkdir(testing_directory) + if not os.access(staging_directory, os.F_OK): + os.mkdir(staging_directory) kw.setdefault( 'config', - os.path.join(testing_directory, 'test_alembic.ini') + os.path.join(staging_directory, 'test_alembic.ini') ) return Options( get_option_parser(), list(itertools.chain(*[["--%s" % k, "%r" % v] for k, v in kw.items()]) ) - + [os.path.join(testing_directory, 'scripts')] + + [os.path.join(staging_directory, 'scripts')] ) -def _testing_env(): +def staging_env(create=True): from alembic import command, script opt = _testing_options() - command.init(opt) + if create: + command.init(opt) return script.ScriptDirectory.from_options(opt) -def _clear_testing_directory(): - shutil.rmtree(testing_directory, True) +def clear_staging_env(): + shutil.rmtree(staging_directory, True) \ No newline at end of file diff --git a/tests/test_revisions.py b/tests/test_revisions.py index 2a40f272..f704cde0 100644 --- a/tests/test_revisions.py +++ b/tests/test_revisions.py @@ -1,15 +1,49 @@ -from tests import _clear_testing_directory, _testing_env, eq_ +from tests import clear_staging_env, staging_env, eq_ import os -def test_environment(): - env = _testing_env() +def test_001_environment(): assert_set = set(['env.py', 'script.py.mako', 'README']) eq_( - assert_set.intersection( - os.listdir(env.dir) - ), + assert_set.intersection(os.listdir(env.dir)), assert_set ) + +def test_002_heads(): + eq_(env._get_heads(), []) + +def test_003_rev(): + script = env.generate_rev("abc", "this is a message") + eq_(script.module.__doc__,"this is a message") + eq_(script.upgrade, "abc") + eq_(script.downgrade, None) + assert os.access(os.path.join(env.dir, 'versions', 'abc.py'), os.F_OK) + assert callable(script.module.upgrade_abc) + eq_(env._get_heads(), ["abc"]) + +def test_004_nextrev(): + script = env.generate_rev("def", "this is the next rev") + eq_(script.upgrade, "def") + eq_(script.downgrade, "abc") + eq_(env._revision_map["abc"].nextrev, "def") + assert callable(script.module.upgrade_def) + assert callable(script.module.downgrade_abc) + eq_(env._get_heads(), ["def"]) + +def test_005_from_clean_env(): + # test the environment so far with a + # new ScriptDirectory instance. + + env = staging_env(create=False) + abc = env._revision_map["abc"] + def_ = env._revision_map["def"] + eq_(abc.nextrev, "def") + eq_(abc.upgrade, "abc") + eq_(def_.downgrade, "abc") + eq_(env._get_heads(), ["def"]) + +def setup(): + global env + env = staging_env() def teardown(): - _clear_testing_directory() \ No newline at end of file + clear_staging_env() \ No newline at end of file