# Path: alembic/util.py
# class CommandError(Exception):
# class memoized_property(object):
# class immutabledict(dict):
# def _safe_int(value):
# def requires_07(feature):
# def template_to_file(template_file, dest, **kw):
# def create_module_class_proxy(cls, globals_, locals_):
#     def _install_proxy(obj):
#     def _remove_proxy():
#     def _create_op_proxy(name):
#         def _name_error(name):
# def coerce_resource_to_filename(fname):
# def status(_statmsg, fn, *arg, **kw):
# def err(message):
# def obfuscate_url_pw(u):
# def asbool(value):
# def warn(msg):
# def msg(msg, newline=True):
# def load_python_file(dir_, filename):
# def pyc_file_from_path(path):
# def rev_id():
#     def __init__(self, fget, doc=None):
#     def __get__(self, obj, cls):
#     def _immutable(self, *arg, **kw):
#     def __new__(cls, *args):
#     def __init__(self, *args):
#     def __reduce__(self):
#     def union(self, d):
#     def __repr__(self):


import os
import shutil
import re
import inspect
import datetime
from alembic import util
_mod_def_re = re.compile(r'(upgrade|downgrade)_([a-z0-9]+)')
_slug_re = re.compile(r'\w+')
_default_file_template = "%(rev)s_%(slug)s"
_relative_destination = re.compile(r'(?:\+|-)\d+')

class ScriptDirectory(object):
    """Provides operations upon an Alembic script directory.

    This object is useful to get information as to current revisions,
    most notably being able to get at the "head" revision, for schemes
    that want to test if the current revision in the database is the most
    recent::

        from alembic.script import ScriptDirectory
        from alembic.config import Config
        config = Config()
        config.set_main_option("script_location", "myapp:migrations")
        script = ScriptDirectory.from_config(config)

        head_revision = script.get_current_head()



    """
    def __init__(self, dir, file_template=_default_file_template):
        self.dir = dir
        self.versions = os.path.join(self.dir, 'versions')
        self.file_template = file_template

        if not os.access(dir, os.F_OK):

# Path: alembic/util.py
# class CommandError(Exception):
# class memoized_property(object):
# class immutabledict(dict):
# def _safe_int(value):
# def requires_07(feature):
# def template_to_file(template_file, dest, **kw):
# def create_module_class_proxy(cls, globals_, locals_):
#     def _install_proxy(obj):
#     def _remove_proxy():
#     def _create_op_proxy(name):
#         def _name_error(name):
# def coerce_resource_to_filename(fname):
# def status(_statmsg, fn, *arg, **kw):
# def err(message):
# def obfuscate_url_pw(u):
# def asbool(value):
# def warn(msg):
# def msg(msg, newline=True):
# def load_python_file(dir_, filename):
# def pyc_file_from_path(path):
# def rev_id():
#     def __init__(self, fget, doc=None):
#     def __get__(self, obj, cls):
#     def _immutable(self, *arg, **kw):
#     def __new__(cls, *args):
#     def __init__(self, *args):
#     def __reduce__(self):
#     def union(self, d):
#     def __repr__(self):


# Path: alembic/script.py
import os
import shutil
import re
import inspect
import datetime
from alembic import util

_mod_def_re = re.compile(r'(upgrade|downgrade)_([a-z0-9]+)')
_slug_re = re.compile(r'\w+')
_default_file_template = "%(rev)s_%(slug)s"
_relative_destination = re.compile(r'(?:\+|-)\d+')

class ScriptDirectory(object):
    """Provides operations upon an Alembic script directory.

    This object is useful to get information as to current revisions,
    most notably being able to get at the "head" revision, for schemes
    that want to test if the current revision in the database is the most
    recent::

        from alembic.script import ScriptDirectory
        from alembic.config import Config
        config = Config()
        config.set_main_option("script_location", "myapp:migrations")
        script = ScriptDirectory.from_config(config)

        head_revision = script.get_current_head()



    """
    def __init__(self, dir, file_template=_default_file_template):
        self.dir = dir
        self.versions = os.path.join(self.dir, 'versions')
        self.file_template = file_template

        if not os.access(dir, os.F_OK):

            raise util.CommandError("Path doesn't exist: %r.  Please use "