]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
full round of revision file tests
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 28 Apr 2010 02:22:40 +0000 (22:22 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 28 Apr 2010 02:22:40 +0000 (22:22 -0400)
alembic/command.py
alembic/script.py
tests/__init__.py
tests/test_revisions.py

index de3f27e244a18368fc89ddb4d6c069836141267a..cd4508ae97ffa5f06d4e035bc85e6c1121264a76 100644 (file)
@@ -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."""
index ddd8ea5f23322a78daf6c8e9c2f8821178b0a9a6..27e84df2e99a35fc94096663b75dd487b3b9e89d 100644 (file)
@@ -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
index c889154d6677f64d83f25399e93df848e15385f8..ee5eb28ccdc884337f3b03da5e7bce83e4da9ea7 100644 (file)
@@ -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
index 2a40f2729093071711d18db8efb6999514afa96d..f704cde05f361000be2764b5a4309ef92eded3dc 100644 (file)
@@ -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