[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
 =============
 
+[![Build Status](https://travis-ci.org/miguelgrinberg/Flask-Migrate.png?branch=master)](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