"""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."""
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):
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):
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
@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
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):
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
-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