[Python-modules-commits] [flask-migrate] 01/06: Import flask-migrate_1.7.0.orig.tar.gz
Orestis Ioannou
oorestisime-guest at moszumanska.debian.org
Tue Feb 23 09:30:13 UTC 2016
This is an automated email from the git hooks/post-receive script.
oorestisime-guest pushed a commit to branch master
in repository flask-migrate.
commit cadc1194629a6fcb63832a3c153877fbf17b6f5a
Author: Orestis Ioannou <orestis at oioannou.com>
Date: Thu Feb 18 13:15:06 2016 +0100
Import flask-migrate_1.7.0.orig.tar.gz
---
Flask_Migrate.egg-info/PKG-INFO | 3 +-
Flask_Migrate.egg-info/SOURCES.txt | 18 +-
Flask_Migrate.egg-info/not-zip-safe | 2 +-
Flask_Migrate.egg-info/requires.txt | 2 +-
MANIFEST.in | 3 +-
PKG-INFO | 3 +-
README.md | 41 +-
flask_migrate/__init__.py | 413 ++++++++++++++++-----
flask_migrate/templates/flask-multidb/README | 1 +
.../templates/flask-multidb/alembic.ini.mako | 45 +++
flask_migrate/templates/flask-multidb/env.py | 158 ++++++++
.../templates/flask-multidb/script.py.mako | 46 +++
flask_migrate/templates/flask/env.py | 34 +-
setup.cfg | 4 +-
setup.py | 8 +-
tests/.sql | 0
tests/__init__.pyc | Bin 151 -> 151 bytes
tests/app.db | Bin 0 -> 2048 bytes
tests/app.py | 11 +-
tests/app.pyc | Bin 1034 -> 1022 bytes
tests/app2.py | 21 --
tests/{app.py => app_compare_type1.py} | 12 +-
tests/app_compare_type1.pyc | Bin 0 -> 1078 bytes
tests/{app.py => app_compare_type2.py} | 14 +-
tests/app_compare_type2.pyc | Bin 0 -> 1078 bytes
tests/{app.py => app_custom_directory.py} | 13 +-
tests/app_custom_directory.pyc | Bin 0 -> 1108 bytes
tests/app_multidb.py | 33 ++
tests/app_multidb.pyc | Bin 0 -> 1434 bytes
tests/test_migrate.py | 66 +++-
tests/test_migrate.pyc | Bin 1785 -> 4111 bytes
tests/test_migrate_custom_directory.py | 39 --
tests/test_multidb_migrate.py | 92 +++++
tests/test_multidb_migrate.pyc | Bin 0 -> 3433 bytes
34 files changed, 867 insertions(+), 215 deletions(-)
diff --git a/Flask_Migrate.egg-info/PKG-INFO b/Flask_Migrate.egg-info/PKG-INFO
index e35f909..04e13e4 100644
--- a/Flask_Migrate.egg-info/PKG-INFO
+++ b/Flask_Migrate.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: Flask-Migrate
-Version: 1.2.0
+Version: 1.7.0
Summary: SQLAlchemy database migrations for Flask applications using Alembic
Home-page: http://github.com/miguelgrinberg/flask-migrate/
Author: Miguel Grinberg
@@ -18,5 +18,6 @@ Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff --git a/Flask_Migrate.egg-info/SOURCES.txt b/Flask_Migrate.egg-info/SOURCES.txt
index f5736ff..d22e4ab 100644
--- a/Flask_Migrate.egg-info/SOURCES.txt
+++ b/Flask_Migrate.egg-info/SOURCES.txt
@@ -13,11 +13,25 @@ flask_migrate/templates/flask/README
flask_migrate/templates/flask/alembic.ini.mako
flask_migrate/templates/flask/env.py
flask_migrate/templates/flask/script.py.mako
+flask_migrate/templates/flask-multidb/README
+flask_migrate/templates/flask-multidb/alembic.ini.mako
+flask_migrate/templates/flask-multidb/env.py
+flask_migrate/templates/flask-multidb/script.py.mako
+tests/.sql
tests/__init__.py
tests/__init__.pyc
+tests/app.db
tests/app.py
tests/app.pyc
-tests/app2.py
+tests/app_compare_type1.py
+tests/app_compare_type1.pyc
+tests/app_compare_type2.py
+tests/app_compare_type2.pyc
+tests/app_custom_directory.py
+tests/app_custom_directory.pyc
+tests/app_multidb.py
+tests/app_multidb.pyc
tests/test_migrate.py
tests/test_migrate.pyc
-tests/test_migrate_custom_directory.py
\ No newline at end of file
+tests/test_multidb_migrate.py
+tests/test_multidb_migrate.pyc
\ No newline at end of file
diff --git a/Flask_Migrate.egg-info/not-zip-safe b/Flask_Migrate.egg-info/not-zip-safe
index 8b13789..d3f5a12 100644
--- a/Flask_Migrate.egg-info/not-zip-safe
+++ b/Flask_Migrate.egg-info/not-zip-safe
@@ -1 +1 @@
-
+
diff --git a/Flask_Migrate.egg-info/requires.txt b/Flask_Migrate.egg-info/requires.txt
index 0426413..cc9b1ed 100644
--- a/Flask_Migrate.egg-info/requires.txt
+++ b/Flask_Migrate.egg-info/requires.txt
@@ -1,4 +1,4 @@
Flask>=0.9
Flask-SQLAlchemy>=1.0
alembic>=0.6
-Flask-Script>=0.6
\ No newline at end of file
+Flask-Script>=0.6
diff --git a/MANIFEST.in b/MANIFEST.in
index 8fcb4ff..c23cd96 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,2 +1,3 @@
-include README.md LICENSE flask_migrate/templates/flask/* tests/*
+include README.md LICENSE flask_migrate/templates/flask/* \
+flask_migrate/templates/flask-multidb/* tests/*
diff --git a/PKG-INFO b/PKG-INFO
index e35f909..04e13e4 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: Flask-Migrate
-Version: 1.2.0
+Version: 1.7.0
Summary: SQLAlchemy database migrations for Flask applications using Alembic
Home-page: http://github.com/miguelgrinberg/flask-migrate/
Author: Miguel Grinberg
@@ -18,5 +18,6 @@ Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff --git a/README.md b/README.md
index 0643304..6c45493 100644
--- a/README.md
+++ b/README.md
@@ -1,33 +1,44 @@
Flask-Migrate
=============
+[](https://travis-ci.org/miguelgrinberg/Flask-Migrate)
+
Flask-Migrate is an extension that handles SQLAlchemy database migrations for Flask applications using Alembic. The database operations are provided as command line arguments for Flask-Script.
+Installation
+------------
+
+Install Flask-Migrate with `pip`:
+
+ pip install Flask-Migrate
+
Example
-------
This is an example application that handles database migrations through Flask-Migrate:
- from flask import Flask
- from flask.ext.sqlalchemy import SQLAlchemy
- from flask.ext.script import Manager
- from flask.ext.migrate import Migrate, MigrateCommand
+```python
+from flask import Flask
+from flask.ext.sqlalchemy import SQLAlchemy
+from flask.ext.script import Manager
+from flask.ext.migrate import Migrate, MigrateCommand
- app = Flask(__name__)
- app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
+app = Flask(__name__)
+app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
- db = SQLAlchemy(app)
- migrate = Migrate(app, db)
+db = SQLAlchemy(app)
+migrate = Migrate(app, db)
- manager = Manager(app)
- manager.add_command('db', MigrateCommand)
+manager = Manager(app)
+manager.add_command('db', MigrateCommand)
- class User(db.Model):
- id = db.Column(db.Integer, primary_key = True)
- name = db.Column(db.String(128))
+class User(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ name = db.Column(db.String(128))
- if __name__ == '__main__':
- manager.run()
+if __name__ == '__main__':
+ manager.run()
+```
With the above application you can create the database or enable migrations if the database already exists with the following command:
diff --git a/flask_migrate/__init__.py b/flask_migrate/__init__.py
old mode 100644
new mode 100755
index a8a9f87..6beaf96
--- a/flask_migrate/__init__.py
+++ b/flask_migrate/__init__.py
@@ -1,113 +1,354 @@
import os
+import argparse
from flask import current_app
from flask.ext.script import Manager
+from alembic import __version__ as __alembic_version__
from alembic.config import Config as AlembicConfig
from alembic import command
+
+alembic_version = tuple([int(v) for v in __alembic_version__.split('.')[0:3]])
+
+
class _MigrateConfig(object):
- def __init__(self, db, directory):
+ def __init__(self, migrate, db, **kwargs):
+ self.migrate = migrate
self.db = db
- self.directory = directory
+ self.directory = migrate.directory
+ self.configure_args = kwargs
@property
def metadata(self):
- """Backwards compatibility, in old releases app.extensions['migrate']
- was set to db, and env.py accessed app.extensions['migrate'].metadata"""
+ """
+ Backwards compatibility, in old releases app.extensions['migrate']
+ was set to db, and env.py accessed app.extensions['migrate'].metadata
+ """
return self.db.metadata
+
+class Config(AlembicConfig):
+ def get_template_directory(self):
+ package_dir = os.path.abspath(os.path.dirname(__file__))
+ return os.path.join(package_dir, 'templates')
+
+
class Migrate(object):
- def __init__(self, app = None, db = None, directory = 'migrations'):
+ def __init__(self, app=None, db=None, directory='migrations', **kwargs):
+ self.configure_callbacks = []
+ self.directory = directory
if app is not None and db is not None:
- self.init_app(app, db, directory)
+ self.init_app(app, db, directory, **kwargs)
- def init_app(self, app, db, directory = 'migrations'):
+ def init_app(self, app, db, directory=None, **kwargs):
+ self.directory = directory or self.directory
if not hasattr(app, 'extensions'):
app.extensions = {}
- app.extensions['migrate'] = _MigrateConfig(db, directory)
+ app.extensions['migrate'] = _MigrateConfig(self, db, **kwargs)
-class Config(AlembicConfig):
- def get_template_directory(self):
- package_dir = os.path.abspath(os.path.dirname(__file__))
- return os.path.join(package_dir, 'templates')
+ def configure(self, f):
+ self.configure_callbacks.append(f)
+ return f
+
+ def call_configure_callbacks(self, config):
+ for f in self.configure_callbacks:
+ config = f(config)
+ return config
+
+ def get_config(self, directory, x_arg=None, opts=None):
+ if directory is None:
+ directory = self.directory
+ config = Config(os.path.join(directory, 'alembic.ini'))
+ config.set_main_option('script_location', directory)
+ if config.cmd_opts is None:
+ config.cmd_opts = argparse.Namespace()
+ for opt in opts or []:
+ setattr(config.cmd_opts, opt, True)
+ if x_arg is not None:
+ if not getattr(config.cmd_opts, 'x', None):
+ setattr(config.cmd_opts, 'x', [x_arg])
+ else:
+ config.cmd_opts.x.append(x_arg)
+ return self.call_configure_callbacks(config)
-def _get_config(directory):
- if directory is None:
- directory = current_app.extensions['migrate'].directory
- config = Config(os.path.join(directory, 'alembic.ini'))
- config.set_main_option('script_location', directory)
- return config
-MigrateCommand = Manager(usage = 'Perform database migrations')
+MigrateCommand = Manager(usage='Perform database migrations')
- at MigrateCommand.option('-d', '--directory', dest = 'directory', default = None, help = "migration script directory (default is 'migrations')")
-def init(directory = None):
- "Generates a new migration"
+
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+ at MigrateCommand.option('--multidb', dest='multidb', action='store_true',
+ default=False,
+ help=("Multiple databases migraton (default is "
+ "False)"))
+def init(directory=None, multidb=False):
+ """Generates a new migration"""
if directory is None:
directory = current_app.extensions['migrate'].directory
config = Config()
config.set_main_option('script_location', directory)
config.config_file_name = os.path.join(directory, 'alembic.ini')
- command.init(config, directory, 'flask')
-
- at MigrateCommand.option('-d', '--directory', dest = 'directory', default = None, help = "Migration script directory (default is 'migrations')")
-def current(directory = None):
- "Display the current revision for each database."
- config = _get_config(directory)
- command.current(config)
-
- at MigrateCommand.option('-r', '--rev-range', dest = 'rev_range', default = None, help = "Specify a revision range; format is [start]:[end]")
- at MigrateCommand.option('-d', '--directory', dest = 'directory', default = None, help = "Migration script directory (default is 'migrations')")
-def history(directory = None, rev_range = None):
- "List changeset scripts in chronological order."
- config = _get_config(directory)
- command.history(config, rev_range)
-
- at MigrateCommand.option('--sql', dest = 'sql', action = 'store_true', default = False, help = "Don't emit SQL to database - dump to standard output instead")
- at MigrateCommand.option('--autogenerate', dest = 'autogenerate', action = 'store_true', default = False, help = "Populate revision script with andidate migration operatons, based on comparison of database to model")
- at MigrateCommand.option('-m', '--message', dest = 'message', default = None)
- at MigrateCommand.option('-d', '--directory', dest = 'directory', default = None, help = "Migration script directory (default is 'migrations')")
-def revision(directory = None, message = None, autogenerate = False, sql = False):
- "Create a new revision file."
- config = _get_config(directory)
- command.revision(config, message, autogenerate = autogenerate, sql = sql)
-
- at MigrateCommand.option('--sql', dest = 'sql', action = 'store_true', default = False, help = "Don't emit SQL to database - dump to standard output instead")
- at MigrateCommand.option('-m', '--message', dest = 'message', default = None)
- at MigrateCommand.option('-d', '--directory', dest = 'directory', default = None, help = "Migration script directory (default is 'migrations')")
-def migrate(directory = None, message = None, sql = False):
- "Alias for 'revision --autogenerate'"
- config = _get_config(directory)
- command.revision(config, message, autogenerate = True, sql = sql)
-
- at MigrateCommand.option('--tag', dest = 'tag', default = None, help = "Arbitrary 'tag' name - can be used by custom env.py scripts")
- at MigrateCommand.option('--sql', dest = 'sql', action = 'store_true', default = False, help = "Don't emit SQL to database - dump to standard output instead")
- at MigrateCommand.option('revision', default = None, help = "revision identifier")
- at MigrateCommand.option('-d', '--directory', dest = 'directory', default = None, help = "Migration script directory (default is 'migrations')")
-def stamp(directory = None, revision = 'head', sql = False, tag = None):
- "'stamp' the revision table with the given revision; don't run any migrations"
- config = _get_config(directory)
- command.stamp(config, revision, sql = sql, tag = tag)
-
- at MigrateCommand.option('--tag', dest = 'tag', default = None, help = "Arbitrary 'tag' name - can be used by custom env.py scripts")
- at MigrateCommand.option('--sql', dest = 'sql', action = 'store_true', default = False, help = "Don't emit SQL to database - dump to standard output instead")
- at MigrateCommand.option('revision', nargs = '?', default = 'head', help = "revision identifier")
- at MigrateCommand.option('-d', '--directory', dest = 'directory', default = None, help = "Migration script directory (default is 'migrations')")
-def upgrade(directory = None, revision = 'head', sql = False, tag = None):
- "Upgrade to a later version"
- config = _get_config(directory)
- command.upgrade(config, revision, sql = sql, tag = tag)
-
- at MigrateCommand.option('--tag', dest = 'tag', default = None, help = "Arbitrary 'tag' name - can be used by custom env.py scripts")
- at MigrateCommand.option('--sql', dest = 'sql', action = 'store_true', default = False, help = "Don't emit SQL to database - dump to standard output instead")
- at MigrateCommand.option('revision', nargs = '?', default = "-1", help = "revision identifier")
- at MigrateCommand.option('-d', '--directory', dest = 'directory', default = None, help = "Migration script directory (default is 'migrations')")
-def downgrade(directory = None, revision = '-1', sql = False, tag = None):
- "Revert to a previous version"
- config = _get_config(directory)
- command.downgrade(config, revision, sql = sql, tag = tag)
-
- at MigrateCommand.option('-d', '--directory', dest = 'directory', default = None, help = "Migration script directory (default is 'migrations')")
-def branches(directory = None):
- "Lists revisions that have broken the source tree into two versions representing two independent sets of changes"
- config = _get_config(directory)
- command.branches(config)
+ config = current_app.extensions['migrate'].\
+ migrate.call_configure_callbacks(config)
+ if multidb:
+ command.init(config, directory, 'flask-multidb')
+ else:
+ command.init(config, directory, 'flask')
+
+
+ at MigrateCommand.option('--rev-id', dest='rev_id', default=None,
+ help=('Specify a hardcoded revision id instead of '
+ 'generating one'))
+ at MigrateCommand.option('--version-path', dest='version_path', default=None,
+ help=('Specify specific path from config for version '
+ 'file'))
+ at MigrateCommand.option('--branch-label', dest='branch_label', default=None,
+ help=('Specify a branch label to apply to the new '
+ 'revision'))
+ at MigrateCommand.option('--splice', dest='splice', action='store_true',
+ default=False,
+ help=('Allow a non-head revision as the "head" to '
+ 'splice onto'))
+ at MigrateCommand.option('--head', dest='head', default='head',
+ help=('Specify head revision or <branchname>@head to '
+ 'base new revision on'))
+ at MigrateCommand.option('--sql', dest='sql', action='store_true', default=False,
+ help=("Don't emit SQL to database - dump to standard "
+ "output instead"))
+ at MigrateCommand.option('--autogenerate', dest='autogenerate',
+ action='store_true', default=False,
+ help=('Populate revision script with andidate migration '
+ 'operatons, based on comparison of database to '
+ 'model'))
+ at MigrateCommand.option('-m', '--message', dest='message', default=None)
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+def revision(directory=None, message=None, autogenerate=False, sql=False,
+ head='head', splice=False, branch_label=None, version_path=None,
+ rev_id=None):
+ """Create a new revision file."""
+ config = current_app.extensions['migrate'].migrate.get_config(directory)
+ if alembic_version >= (0, 7, 0):
+ command.revision(config, message, autogenerate=autogenerate, sql=sql,
+ head=head, splice=splice, branch_label=branch_label,
+ version_path=version_path, rev_id=rev_id)
+ else:
+ command.revision(config, message, autogenerate=autogenerate, sql=sql)
+
+
+ at MigrateCommand.option('--rev-id', dest='rev_id', default=None,
+ help=('Specify a hardcoded revision id instead of '
+ 'generating one'))
+ at MigrateCommand.option('--version-path', dest='version_path', default=None,
+ help=('Specify specific path from config for version '
+ 'file'))
+ at MigrateCommand.option('--branch-label', dest='branch_label', default=None,
+ help=('Specify a branch label to apply to the new '
+ 'revision'))
+ at MigrateCommand.option('--splice', dest='splice', action='store_true',
+ default=False,
+ help=('Allow a non-head revision as the "head" to '
+ 'splice onto'))
+ at MigrateCommand.option('--head', dest='head', default='head',
+ help=('Specify head revision or <branchname>@head to '
+ 'base new revision on'))
+ at MigrateCommand.option('--sql', dest='sql', action='store_true', default=False,
+ help=("Don't emit SQL to database - dump to standard "
+ "output instead"))
+ at MigrateCommand.option('-m', '--message', dest='message', default=None)
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+def migrate(directory=None, message=None, sql=False, head='head', splice=False,
+ branch_label=None, version_path=None, rev_id=None):
+ """Alias for 'revision --autogenerate'"""
+ config = current_app.extensions['migrate'].migrate.get_config(
+ directory, opts=['autogenerate'])
+ if alembic_version >= (0, 7, 0):
+ command.revision(config, message, autogenerate=True, sql=sql,
+ head=head, splice=splice, branch_label=branch_label,
+ version_path=version_path, rev_id=rev_id)
+ else:
+ command.revision(config, message, autogenerate=True, sql=sql)
+
+
+ at MigrateCommand.option('revision', nargs='?', default='head',
+ help="revision identifier")
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+def edit(revision='current', directory=None):
+ """Edit current revision."""
+ if alembic_version >= (0, 8, 0):
+ config = current_app.extensions['migrate'].migrate.get_config(
+ directory)
+ command.edit(config, revision)
+ else:
+ raise RuntimeError('Alembic 0.8.0 or greater is required')
+
+
+ at MigrateCommand.option('--rev-id', dest='rev_id', default=None,
+ help=('Specify a hardcoded revision id instead of '
+ 'generating one'))
+ at MigrateCommand.option('--branch-label', dest='branch_label', default=None,
+ help=('Specify a branch label to apply to the new '
+ 'revision'))
+ at MigrateCommand.option('-m', '--message', dest='message', default=None)
+ at MigrateCommand.option('revisions', nargs='+',
+ help='one or more revisions, or "heads" for all heads')
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+def merge(directory=None, revisions='', message=None, branch_label=None,
+ rev_id=None):
+ """Merge two revisions together. Creates a new migration file"""
+ if alembic_version >= (0, 7, 0):
+ config = current_app.extensions['migrate'].migrate.get_config(
+ directory)
+ command.merge(config, revisions, message=message,
+ branch_label=branch_label, rev_id=rev_id)
+ else:
+ raise RuntimeError('Alembic 0.7.0 or greater is required')
+
+
+ at MigrateCommand.option('--tag', dest='tag', default=None,
+ help=("Arbitrary 'tag' name - can be used by custom "
+ "env.py scripts"))
+ at MigrateCommand.option('--sql', dest='sql', action='store_true', default=False,
+ help=("Don't emit SQL to database - dump to standard "
+ "output instead"))
+ at MigrateCommand.option('revision', nargs='?', default='head',
+ help="revision identifier")
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+ at MigrateCommand.option('-x', '--x-arg', dest='x_arg', default=None,
+ help=("Additional arguments consumed by "
+ "custom env.py scripts"))
+def upgrade(directory=None, revision='head', sql=False, tag=None, x_arg=None):
+ """Upgrade to a later version"""
+ config = current_app.extensions['migrate'].migrate.get_config(directory,
+ x_arg=x_arg)
+ command.upgrade(config, revision, sql=sql, tag=tag)
+
+
+ at MigrateCommand.option('--tag', dest='tag', default=None,
+ help=("Arbitrary 'tag' name - can be used by custom "
+ "env.py scripts"))
+ at MigrateCommand.option('--sql', dest='sql', action='store_true', default=False,
+ help=("Don't emit SQL to database - dump to standard "
+ "output instead"))
+ at MigrateCommand.option('revision', nargs='?', default="-1",
+ help="revision identifier")
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+ at MigrateCommand.option('-x', '--x-arg', dest='x_arg', default=None,
+ help=("Additional arguments consumed by "
+ "custom env.py scripts"))
+def downgrade(directory=None, revision='-1', sql=False, tag=None, x_arg=None):
+ """Revert to a previous version"""
+ config = current_app.extensions['migrate'].migrate.get_config(directory,
+ x_arg=x_arg)
+ if sql and revision == '-1':
+ revision = 'head:-1'
+ command.downgrade(config, revision, sql=sql, tag=tag)
+
+
+ at MigrateCommand.option('revision', nargs='?', default="head",
+ help="revision identifier")
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+def show(directory=None, revision='head'):
+ """Show the revision denoted by the given symbol."""
+ if alembic_version >= (0, 7, 0):
+ config = current_app.extensions['migrate'].migrate.get_config(
+ directory)
+ command.show(config, revision)
+ else:
+ raise RuntimeError('Alembic 0.7.0 or greater is required')
+
+
+ at MigrateCommand.option('-v', '--verbose', dest='verbose', action='store_true',
+ default=False, help='Use more verbose output')
+ at MigrateCommand.option('-r', '--rev-range', dest='rev_range', default=None,
+ help='Specify a revision range; format is [start]:[end]')
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+def history(directory=None, rev_range=None, verbose=False):
+ """List changeset scripts in chronological order."""
+ config = current_app.extensions['migrate'].migrate.get_config(directory)
+ if alembic_version >= (0, 7, 0):
+ command.history(config, rev_range, verbose=verbose)
+ else:
+ command.history(config, rev_range)
+
+
+ at MigrateCommand.option('--resolve-dependencies', dest='resolve_dependencies',
+ action='store_true', default=False,
+ help='Treat dependency versions as down revisions')
+ at MigrateCommand.option('-v', '--verbose', dest='verbose', action='store_true',
+ default=False, help='Use more verbose output')
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+def heads(directory=None, verbose=False, resolve_dependencies=False):
+ """Show current available heads in the script directory"""
+ if alembic_version >= (0, 7, 0):
+ config = current_app.extensions['migrate'].migrate.get_config(
+ directory)
+ command.heads(config, verbose=verbose,
+ resolve_dependencies=resolve_dependencies)
+ else:
+ raise RuntimeError('Alembic 0.7.0 or greater is required')
+
+
+ at MigrateCommand.option('-v', '--verbose', dest='verbose', action='store_true',
+ default=False, help='Use more verbose output')
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+def branches(directory=None, verbose=False):
+ """Show current branch points"""
+ config = current_app.extensions['migrate'].migrate.get_config(directory)
+ if alembic_version >= (0, 7, 0):
+ command.branches(config, verbose=verbose)
+ else:
+ command.branches(config)
+
+
+ at MigrateCommand.option('--head-only', dest='head_only', action='store_true',
+ default=False,
+ help='Deprecated. Use --verbose for additional output')
+ at MigrateCommand.option('-v', '--verbose', dest='verbose', action='store_true',
+ default=False, help='Use more verbose output')
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+def current(directory=None, verbose=False, head_only=False):
+ """Display the current revision for each database."""
+ config = current_app.extensions['migrate'].migrate.get_config(directory)
+ if alembic_version >= (0, 7, 0):
+ command.current(config, verbose=verbose, head_only=head_only)
+ else:
+ command.current(config)
+
+
+ at MigrateCommand.option('--tag', dest='tag', default=None,
+ help=("Arbitrary 'tag' name - can be used by custom "
+ "env.py scripts"))
+ at MigrateCommand.option('--sql', dest='sql', action='store_true', default=False,
+ help=("Don't emit SQL to database - dump to standard "
+ "output instead"))
+ at MigrateCommand.option('revision', default=None, help="revision identifier")
+ at MigrateCommand.option('-d', '--directory', dest='directory', default=None,
+ help=("migration script directory (default is "
+ "'migrations')"))
+def stamp(directory=None, revision='head', sql=False, tag=None):
+ """'stamp' the revision table with the given revision; don't run any
+ migrations"""
+ config = current_app.extensions['migrate'].migrate.get_config(directory)
+ command.stamp(config, revision, sql=sql, tag=tag)
diff --git a/flask_migrate/templates/flask-multidb/README b/flask_migrate/templates/flask-multidb/README
new file mode 100755
index 0000000..98e4f9c
--- /dev/null
+++ b/flask_migrate/templates/flask-multidb/README
@@ -0,0 +1 @@
+Generic single-database configuration.
\ No newline at end of file
diff --git a/flask_migrate/templates/flask-multidb/alembic.ini.mako b/flask_migrate/templates/flask-multidb/alembic.ini.mako
new file mode 100644
index 0000000..f8ed480
--- /dev/null
+++ b/flask_migrate/templates/flask-multidb/alembic.ini.mako
@@ -0,0 +1,45 @@
+# A generic, single database configuration.
+
+[alembic]
+# template used to generate migration files
+# file_template = %%(rev)s_%%(slug)s
+
+# set to 'true' to run the environment during
+# the 'revision' command, regardless of autogenerate
+# revision_environment = false
+
+
+# Logging configuration
+[loggers]
+keys = root,sqlalchemy,alembic
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = WARN
+handlers = console
+qualname =
+
+[logger_sqlalchemy]
+level = WARN
+handlers =
+qualname = sqlalchemy.engine
+
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %H:%M:%S
diff --git a/flask_migrate/templates/flask-multidb/env.py b/flask_migrate/templates/flask-multidb/env.py
new file mode 100755
index 0000000..71659dc
--- /dev/null
+++ b/flask_migrate/templates/flask-multidb/env.py
@@ -0,0 +1,158 @@
+from __future__ import with_statement
+from alembic import context
+from sqlalchemy import engine_from_config, pool, MetaData
+from logging.config import fileConfig
+import logging
+
+USE_TWOPHASE = False
+
+# this is the Alembic Config object, which provides
+# access to the values within the .ini file in use.
+config = context.config
+
+# Interpret the config file for Python logging.
+# This line sets up loggers basically.
+fileConfig(config.config_file_name)
+logger = logging.getLogger('alembic.env')
+
+# add your model's MetaData object here
+# for 'autogenerate' support
+# from myapp import mymodel
+# target_metadata = mymodel.Base.metadata
+from flask import current_app
+config.set_main_option('sqlalchemy.url',
+ current_app.config.get('SQLALCHEMY_DATABASE_URI'))
+bind_names = []
+for name, url in current_app.config.get("SQLALCHEMY_BINDS").items():
+ context.config.set_section_option(name, "sqlalchemy.url", url)
+ bind_names.append(name)
+target_metadata = current_app.extensions['migrate'].db.metadata
+
+
+# other values from the config, defined by the needs of env.py,
+# can be acquired:
+# my_important_option = config.get_main_option("my_important_option")
+# ... etc.
+
+
+def get_metadata(bind):
+ """Return the metadata for a bind."""
+ if bind == '':
+ bind = None
+ m = MetaData()
+ for t in target_metadata.tables.values():
+ if t.info.get('bind_key') == bind:
+ t.tometadata(m)
+ return m
+
+
+def run_migrations_offline():
+ """Run migrations in 'offline' mode.
+
+ This configures the context with just a URL
+ and not an Engine, though an Engine is acceptable
+ here as well. By skipping the Engine creation
+ we don't even need a DBAPI to be available.
+
+ Calls to context.execute() here emit the given string to the
+ script output.
+
+ """
+ # for the --sql use case, run migrations for each URL into
+ # individual files.
+
+ engines = {'': {'url': context.config.get_main_option('sqlalchemy.url')}}
+ for name in bind_names:
+ engines[name] = rec = {}
+ rec['url'] = context.config.get_section_option(name,
+ "sqlalchemy.url")
+
+ for name, rec in engines.items():
+ logger.info("Migrating database %s" % (name or '<default>'))
+ file_ = "%s.sql" % name
+ logger.info("Writing output to %s" % file_)
+ with open(file_, 'w') as buffer:
+ context.configure(url=rec['url'], output_buffer=buffer,
+ target_metadata=get_metadata(name),
+ literal_binds=True)
+ with context.begin_transaction():
+ context.run_migrations(engine_name=name)
+
+
+def run_migrations_online():
+ """Run migrations in 'online' mode.
+
+ In this scenario we need to create an Engine
+ and associate a connection with the context.
+
+ """
+
+ # this callback is used to prevent an auto-migration from being generated
+ # when there are no changes to the schema
+ # reference: http://alembic.readthedocs.org/en/latest/cookbook.html
+ def process_revision_directives(context, revision, directives):
+ if getattr(config.cmd_opts, 'autogenerate', False):
+ script = directives[0]
+ if len(script.upgrade_ops_list) >= len(bind_names) + 1:
+ empty = True
+ for upgrade_ops in script.upgrade_ops_list:
+ if not upgrade_ops.is_empty():
+ empty = False
+ if empty:
+ directives[:] = []
+ logger.info('No changes in schema detected.')
+
+ # for the direct-to-DB use case, start a transaction on all
+ # engines, then run all migrations, then commit all transactions.
+ engines = {'': {'engine': engine_from_config(
+ config.get_section(config.config_ini_section),
+ prefix='sqlalchemy.',
+ poolclass=pool.NullPool)}}
+ for name in bind_names:
+ engines[name] = rec = {}
+ rec['engine'] = engine_from_config(
+ context.config.get_section(name),
+ prefix='sqlalchemy.',
+ poolclass=pool.NullPool)
+
+ for name, rec in engines.items():
+ engine = rec['engine']
+ rec['connection'] = conn = engine.connect()
+
+ if USE_TWOPHASE:
+ rec['transaction'] = conn.begin_twophase()
+ else:
+ rec['transaction'] = conn.begin()
+
+ try:
+ for name, rec in engines.items():
+ logger.info("Migrating database %s" % (name or '<default>'))
+ context.configure(
+ connection=rec['connection'],
+ upgrade_token="%s_upgrades" % name,
+ downgrade_token="%s_downgrades" % name,
+ target_metadata=get_metadata(name),
+ process_revision_directives=process_revision_directives,
+ **current_app.extensions['migrate'].configure_args
+ )
+ context.run_migrations(engine_name=name)
+
+ if USE_TWOPHASE:
+ for rec in engines.values():
+ rec['transaction'].prepare()
+
+ for rec in engines.values():
+ rec['transaction'].commit()
+ except:
+ for rec in engines.values():
+ rec['transaction'].rollback()
+ raise
+ finally:
+ for rec in engines.values():
+ rec['connection'].close()
+
+
+if context.is_offline_mode():
+ run_migrations_offline()
+else:
+ run_migrations_online()
diff --git a/flask_migrate/templates/flask-multidb/script.py.mako b/flask_migrate/templates/flask-multidb/script.py.mako
new file mode 100755
index 0000000..a3f466e
--- /dev/null
+++ b/flask_migrate/templates/flask-multidb/script.py.mako
@@ -0,0 +1,46 @@
+<%!
+import re
+
+%>"""${message}
+
+Revision ID: ${up_revision}
+Revises: ${down_revision | comma,n}
+Create Date: ${create_date}
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = ${repr(up_revision)}
+down_revision = ${repr(down_revision)}
+branch_labels = ${repr(branch_labels)}
+depends_on = ${repr(depends_on)}
+
+from alembic import op
+import sqlalchemy as sa
+${imports if imports else ""}
+
+def upgrade(engine_name):
+ globals()["upgrade_%s" % engine_name]()
+
+
+def downgrade(engine_name):
+ globals()["downgrade_%s" % engine_name]()
+
+<%
+ from flask import current_app
+ db_names = [''] + list(current_app.config.get("SQLALCHEMY_BINDS").keys())
+%>
+
+## generate an "upgrade_<xyz>() / downgrade_<xyz>()" function
+## for each database name in the ini file.
+
+% for db_name in db_names:
+
+def upgrade_${db_name}():
+ ${context.get("%s_upgrades" % db_name, "pass")}
+
+
+def downgrade_${db_name}():
+ ${context.get("%s_downgrades" % db_name, "pass")}
+
+% endfor
diff --git a/flask_migrate/templates/flask/env.py b/flask_migrate/templates/flask/env.py
old mode 100644
new mode 100755
index 70961ce..4593816
--- a/flask_migrate/templates/flask/env.py
+++ b/flask_migrate/templates/flask/env.py
@@ -2,6 +2,7 @@ from __future__ import with_statement
from alembic import context
from sqlalchemy import engine_from_config, pool
from logging.config import fileConfig
+import logging
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
@@ -10,13 +11,15 @@ config = context.config
# Interpret the config file for Python logging.
# This line sets up loggers basically.
fileConfig(config.config_file_name)
+logger = logging.getLogger('alembic.env')
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
from flask import current_app
-config.set_main_option('sqlalchemy.url', current_app.config.get('SQLALCHEMY_DATABASE_URI'))
+config.set_main_option('sqlalchemy.url',
+ current_app.config.get('SQLALCHEMY_DATABASE_URI'))
target_metadata = current_app.extensions['migrate'].db.metadata
# other values from the config, defined by the needs of env.py,
@@ -24,6 +27,7 @@ target_metadata = current_app.extensions['migrate'].db.metadata
# my_important_option = config.get_main_option("my_important_option")
# ... etc.
+
def run_migrations_offline():
"""Run migrations in 'offline' mode.
@@ -42,6 +46,7 @@ def run_migrations_offline():
with context.begin_transaction():
context.run_migrations()
+
def run_migrations_online():
"""Run migrations in 'online' mode.
@@ -49,16 +54,26 @@ def run_migrations_online():
and associate a connection with the context.
"""
- engine = engine_from_config(
- config.get_section(config.config_ini_section),
- prefix='sqlalchemy.',
- poolclass=pool.NullPool)
+
+ # this callback is used to prevent an auto-migration from being generated
+ # when there are no changes to the schema
+ # reference: http://alembic.readthedocs.org/en/latest/cookbook.html
+ def process_revision_directives(context, revision, directives):
+ if getattr(config.cmd_opts, 'autogenerate', False):
+ script = directives[0]
+ if script.upgrade_ops.is_empty():
+ directives[:] = []
+ logger.info('No changes in schema detected.')
+
+ engine = engine_from_config(config.get_section(config.config_ini_section),
+ prefix='sqlalchemy.',
+ poolclass=pool.NullPool)
connection = engine.connect()
- context.configure(
- connection=connection,
... 547 lines suppressed ...
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/flask-migrate.git
More information about the Python-modules-commits
mailing list