diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-06-24 18:01:13 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-06-24 18:03:12 -0400 |
commit | 433ef4d3a61481f3778d9f6ae7abef144231d94e (patch) | |
tree | a93d1b2e9b8f7813bff84c57237479fb34d78358 | |
parent | 94e2e3c6f15e6a84bedf0780e1502dfc7550bda7 (diff) | |
parent | 12ab8bd6f30b20974ab34911a6c532b8d65df682 (diff) | |
download | alembic-433ef4d3a61481f3778d9f6ae7abef144231d94e.tar.gz |
Merge branch 'ticket_301' into ticket_302
Conflicts:
alembic/autogenerate/__init__.py
alembic/command.py
-rw-r--r-- | alembic/autogenerate/__init__.py | 1 | ||||
-rw-r--r-- | alembic/autogenerate/generate.py | 63 | ||||
-rw-r--r-- | alembic/command.py | 42 | ||||
-rw-r--r-- | alembic/operations/ops.py | 1 |
4 files changed, 90 insertions, 17 deletions
diff --git a/alembic/autogenerate/__init__.py b/alembic/autogenerate/__init__.py index b215118..2acd330 100644 --- a/alembic/autogenerate/__init__.py +++ b/alembic/autogenerate/__init__.py @@ -1,3 +1,4 @@ from .api import ( # noqa compare_metadata, _produce_net_changes, _render_migration_diffs ) +from .generate import RevisionContext # noqa diff --git a/alembic/autogenerate/generate.py b/alembic/autogenerate/generate.py new file mode 100644 index 0000000..3a0ec37 --- /dev/null +++ b/alembic/autogenerate/generate.py @@ -0,0 +1,63 @@ +from .. import util +from .api import _render_migration_diffs + + +class GeneratedRevision(object): + def __init__(self, revision_context): + self.revision_context = revision_context + self.template_args = {} + self.imports = set() + self.rev_id = revision_context.command_args['rev_id'] or util.rev_id() + + self.head = self.revision_context.command_args['head'] + self.splice = self.revision_context.command_args['splice'] + self.branch_label = \ + self.revision_context.command_args['branch_label'] + self.version_path = self.revision_context.command_args['version_path'] + + def to_script(self): + for k, v in self.revision_context.template_args.items(): + self.template_args.setdefault(k, v) + + return self.revision_context.script_directory.generate_revision( + self.rev_id, + self.revision_context.command_args['message'], + refresh=True, + head=self.head, + splice=self.splice, + branch_labels=self.branch_label, + version_path=self.version_path, + **self.template_args) + + +class RevisionContext(object): + def __init__(self, config, script_directory, command_args): + self.config = config + self.script_directory = script_directory + self.command_args = command_args + self.template_args = { + 'config': config # Let templates use config for + # e.g. multiple databases + } + self.generated_revisions = [ + GeneratedRevision(self) + ] + + def run_autogenerate(self, rev, context): + if self.command_args['sql']: + raise util.CommandError( + "Using --sql with --autogenerate does not make any sense") + if set(self.script_directory.get_revisions(rev)) != \ + set(self.script_directory.get_revisions("heads")): + raise util.CommandError("Target database is not up to date.") + for generated_revision in self.generated_revisions: + _render_migration_diffs( + context, + generated_revision.template_args, generated_revision.imports) + + def run_no_autogenerate(self, rev, context): + pass + + def generate_scripts(self): + for generated_revision in self.generated_revisions: + yield generated_revision.to_script() diff --git a/alembic/command.py b/alembic/command.py index dfa9d79..3ce5131 100644 --- a/alembic/command.py +++ b/alembic/command.py @@ -71,12 +71,16 @@ def revision( version_path=None, rev_id=None): """Create a new revision file.""" - script = ScriptDirectory.from_config(config) - template_args = { - 'config': config # Let templates use config for - # e.g. multiple databases - } - imports = set() + script_directory = ScriptDirectory.from_config(config) + + command_args = dict( + message=message, + autogenerate=autogenerate, + sql=sql, head=head, splice=splice, branch_label=branch_label, + version_path=version_path, rev_id=rev_id + ) + revision_context = autogen.RevisionContext( + config, script_directory, command_args) environment = util.asbool( config.get_main_option("revision_environment") @@ -90,13 +94,11 @@ def revision( "Using --sql with --autogenerate does not make any sense") def retrieve_migrations(rev, context): - if set(script.get_revisions(rev)) != \ - set(script.get_revisions("heads")): - raise util.CommandError("Target database is not up to date.") - autogen._render_migration_diffs(context, template_args, imports) + revision_context.run_autogenerate(rev, context) return [] elif environment: def retrieve_migrations(rev, context): + revision_context.run_no_autogenerate(rev, context) return [] elif sql: raise util.CommandError( @@ -106,16 +108,22 @@ def revision( if environment: with EnvironmentContext( config, - script, + script_directory, fn=retrieve_migrations, as_sql=sql, - template_args=template_args, + template_args=revision_context.template_args, + revision_context=revision_context ): - script.run_env() - return script.generate_revision( - rev_id or util.rev_id(), message, refresh=True, - head=head, splice=splice, branch_labels=branch_label, - version_path=version_path, **template_args) + script_directory.run_env() + + scripts = [ + script for script in + revision_context.generate_scripts() + ] + if len(scripts) == 1: + return scripts[0] + else: + return scripts def merge(config, revisions, message=None, branch_label=None, rev_id=None): diff --git a/alembic/operations/ops.py b/alembic/operations/ops.py index 3567352..0046831 100644 --- a/alembic/operations/ops.py +++ b/alembic/operations/ops.py @@ -162,3 +162,4 @@ class MigrationScript(OpContainer): """ + |