You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.7 KiB
Python
114 lines
2.7 KiB
Python
import subprocess
|
|
import sys
|
|
|
|
from .. import util
|
|
from ..util import compat
|
|
|
|
|
|
_registry = {}
|
|
|
|
|
|
def register(name):
|
|
"""A function decorator that will register that function as a write hook.
|
|
|
|
See the documentation linked below for an example.
|
|
|
|
.. versionadded:: 1.2.0
|
|
|
|
.. seealso::
|
|
|
|
:ref:`post_write_hooks_custom`
|
|
|
|
|
|
"""
|
|
|
|
def decorate(fn):
|
|
_registry[name] = fn
|
|
|
|
return decorate
|
|
|
|
|
|
def _invoke(name, revision, options):
|
|
"""Invokes the formatter registered for the given name.
|
|
|
|
:param name: The name of a formatter in the registry
|
|
:param revision: A :class:`.MigrationRevision` instance
|
|
:param options: A dict containing kwargs passed to the
|
|
specified formatter.
|
|
:raises: :class:`alembic.util.CommandError`
|
|
"""
|
|
try:
|
|
hook = _registry[name]
|
|
except KeyError:
|
|
compat.raise_from_cause(
|
|
util.CommandError("No formatter with name '%s' registered" % name)
|
|
)
|
|
else:
|
|
return hook(revision, options)
|
|
|
|
|
|
def _run_hooks(path, hook_config):
|
|
"""Invoke hooks for a generated revision.
|
|
|
|
"""
|
|
|
|
from .base import _split_on_space_comma
|
|
|
|
names = _split_on_space_comma.split(hook_config.get("hooks", ""))
|
|
|
|
for name in names:
|
|
if not name:
|
|
continue
|
|
opts = {
|
|
key[len(name) + 1 :]: hook_config[key]
|
|
for key in hook_config
|
|
if key.startswith(name + ".")
|
|
}
|
|
opts["_hook_name"] = name
|
|
try:
|
|
type_ = opts["type"]
|
|
except KeyError:
|
|
compat.raise_from_cause(
|
|
util.CommandError(
|
|
"Key %s.type is required for post write hook %r"
|
|
% (name, name)
|
|
)
|
|
)
|
|
else:
|
|
util.status(
|
|
'Running post write hook "%s"' % name,
|
|
_invoke,
|
|
type_,
|
|
path,
|
|
opts,
|
|
newline=True,
|
|
)
|
|
|
|
|
|
@register("console_scripts")
|
|
def console_scripts(path, options):
|
|
import pkg_resources
|
|
|
|
try:
|
|
entrypoint_name = options["entrypoint"]
|
|
except KeyError:
|
|
compat.raise_from_cause(
|
|
util.CommandError(
|
|
"Key %s.entrypoint is required for post write hook %r"
|
|
% (options["_hook_name"], options["_hook_name"])
|
|
)
|
|
)
|
|
iter_ = pkg_resources.iter_entry_points("console_scripts", entrypoint_name)
|
|
impl = next(iter_)
|
|
options = options.get("options", "")
|
|
subprocess.run(
|
|
[
|
|
sys.executable,
|
|
"-c",
|
|
"import %s; %s()"
|
|
% (impl.module_name, ".".join((impl.module_name,) + impl.attrs)),
|
|
path,
|
|
]
|
|
+ options.split()
|
|
)
|