summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-07-02 19:31:20 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2015-07-02 19:31:20 -0400
commitddec68e73711782edabd283614eb90a2da397fad (patch)
tree178836ccccbff01aa9f6f9e36a6872b51616ae6a
parent4a4e3eb619132f21a0aab30d13ad3736e6ff7c9e (diff)
downloadalembic-ddec68e73711782edabd283614eb90a2da397fad.tar.gz
- reorganize API docs and write a new overview
-rw-r--r--docs/build/api.rst554
-rw-r--r--docs/build/api/api_overview.pngbin0 -> 123965 bytes
-rw-r--r--docs/build/api/autogenerate.rst233
-rw-r--r--docs/build/api/commands.rst38
-rw-r--r--docs/build/api/config.rst26
-rw-r--r--docs/build/api/ddl.rst54
-rw-r--r--docs/build/api/environment.rst17
-rw-r--r--docs/build/api/index.rst33
-rw-r--r--docs/build/api/migration.rst6
-rw-r--r--docs/build/api/operations.rst119
-rw-r--r--docs/build/api/overview.rst47
-rw-r--r--docs/build/api/script.rst18
-rw-r--r--docs/build/api_overview.pngbin64697 -> 0 bytes
-rw-r--r--docs/build/assets/api_overview.graffle2252
-rw-r--r--docs/build/index.rst4
15 files changed, 2485 insertions, 916 deletions
diff --git a/docs/build/api.rst b/docs/build/api.rst
deleted file mode 100644
index 3fc8ca0..0000000
--- a/docs/build/api.rst
+++ /dev/null
@@ -1,554 +0,0 @@
-.. _api:
-
-===========
-API Details
-===========
-
-This section describes some key functions used within the migration process, particularly those referenced within
-a migration environment's ``env.py`` file.
-
-Overview
-========
-
-The three main objects in use are the :class:`.EnvironmentContext`, :class:`.MigrationContext`,
-and :class:`.Operations` classes, pictured below.
-
-.. image:: api_overview.png
-
-An Alembic command begins by instantiating an :class:`.EnvironmentContext` object, then
-making it available via the ``alembic.context`` proxy module. The ``env.py``
-script, representing a user-configurable migration environment, is then
-invoked. The ``env.py`` script is then responsible for calling upon the
-:meth:`.EnvironmentContext.configure`, whose job it is to create
-a :class:`.MigrationContext` object.
-
-Before this method is called, there's not
-yet any database connection or dialect-specific state set up. While
-many methods on :class:`.EnvironmentContext` are usable at this stage,
-those which require database access, or at least access to the kind
-of database dialect in use, are not. Once the
-:meth:`.EnvironmentContext.configure` method is called, the :class:`.EnvironmentContext`
-is said to be *configured* with database connectivity, available via
-a new :class:`.MigrationContext` object. The :class:`.MigrationContext`
-is associated with the :class:`.EnvironmentContext` object
-via the :meth:`.EnvironmentContext.get_context` method.
-
-Finally, ``env.py`` calls upon the :meth:`.EnvironmentContext.run_migrations`
-method. Within this method, a new :class:`.Operations` object, which
-provides an API for individual database migration operations, is established
-within the ``alembic.op`` proxy module. The :class:`.Operations` object
-uses the :class:`.MigrationContext` object ultimately as a source of
-database connectivity, though in such a way that it does not care if the
-:class:`.MigrationContext` is talking to a real database or just writing
-out SQL to a file.
-
-The Environment Context
-=======================
-
-The :class:`.EnvironmentContext` class provides most of the
-API used within an ``env.py`` script. Within ``env.py``,
-the instantated :class:`.EnvironmentContext` is made available
-via a special *proxy module* called ``alembic.context``. That is,
-you can import ``alembic.context`` like a regular Python module,
-and each name you call upon it is ultimately routed towards the
-current :class:`.EnvironmentContext` in use.
-
-In particular, the key method used within ``env.py`` is :meth:`.EnvironmentContext.configure`,
-which establishes all the details about how the database will be accessed.
-
-.. automodule:: alembic.runtime.environment
- :members: EnvironmentContext
-
-The Migration Context
-=====================
-
-.. automodule:: alembic.runtime.migration
- :members: MigrationContext
-
-The Operations Object
-=====================
-
-Within migration scripts, actual database migration operations are handled
-via an instance of :class:`.Operations`. The :class:`.Operations` class
-lists out available migration operations that are linked to a
-:class:`.MigrationContext`, which communicates instructions originated
-by the :class:`.Operations` object into SQL that is sent to a database or SQL
-output stream.
-
-Most methods on the :class:`.Operations` class are generated dynamically
-using a "plugin" system, described in the next section
-:ref:`operation_plugins`. Additionally, when Alembic migration scripts
-actually run, the methods on the current :class:`.Operations` object are
-proxied out to the :mod:`alembic.op` module, so that they are available
-using module-style access.
-
-For an overview of how to use an :class:`.Operations` object directly
-in programs, as well as for reference to the standard operation methods
-as well as "batch" methods, see :ref:`ops`.
-
-.. _operation_plugins:
-
-Operation Plugins
------------------
-
-The Operations object is extensible using a plugin system. This system
-allows one to add new ``op.<some_operation>`` methods at runtime. The
-steps to use this system are to first create a subclass of
-:class:`.MigrateOperation`, register it using the :meth:`.Operations.register_operation`
-class decorator, then build a default "implementation" function which is
-established using the :meth:`.Operations.implementation_for` decorator.
-
-.. versionadded:: 0.8.0 - the :class:`.Operations` class is now an
- open namespace that is extensible via the creation of new
- :class:`.MigrateOperation` subclasses.
-
-Below we illustrate a very simple operation ``CreateSequenceOp`` which
-will implement a new method ``op.create_sequence()`` for use in
-migration scripts::
-
- from alembic.operations import Operations, MigrateOperation
-
- @Operations.register_operation("create_sequence")
- class CreateSequenceOp(MigrateOperation):
- """Create a SEQUENCE."""
-
- def __init__(self, sequence_name, **kw):
- self.sequence_name = sequence_name
- self.kw = kw
-
- @classmethod
- def create_sequence(cls, operations, sequence_name, **kw):
- """Issue a "CREATE SEQUENCE" instruction."""
-
- op = CreateSequenceOp(sequence_name, **kw)
- return operations.invoke(op)
-
-Above, the ``CreateSequenceOp`` class represents a new operation that will
-be available as ``op.create_sequence()``. The reason the operation
-is represented as a stateful class is so that an operation and a specific
-set of arguments can be represented generically; the state can then correspond
-to different kinds of operations, such as invoking the instruction against
-a database, or autogenerating Python code for the operation into a
-script.
-
-In order to establish the migrate-script behavior of the new operation,
-we use the :meth:`.Operations.implementation_for` decorator::
-
- @Operations.implementation_for(CreateSequenceOp)
- def create_sequence(operations, operation):
- operations.execute("CREATE SEQUENCE %s" % operation.sequence_name)
-
-Above, we use the simplest possible technique of invoking our DDL, which
-is just to call :meth:`.Operations.execute` with literal SQL. If this is
-all a custom operation needs, then this is fine. However, options for
-more comprehensive support include building out a custom SQL construct,
-as documented at :ref:`sqlalchemy.ext.compiles`.
-
-With the above two steps, a migration script can now use a new method
-``op.create_sequence()`` that will proxy to our object as a classmethod::
-
- def upgrade():
- op.create_sequence("my_sequence")
-
-The registration of new operations only needs to occur in time for the
-``env.py`` script to invoke :meth:`.MigrationContext.run_migrations`;
-within the module level of the ``env.py`` script is sufficient.
-
-
-.. versionadded:: 0.8 - the migration operations available via the
- :class:`.Operations` class as well as the :mod:`alembic.op` namespace
- is now extensible using a plugin system.
-
-
-.. _operation_objects:
-
-Built-in Operation Objects
---------------------------
-
-The migration operations present on :class:`.Operations` are themselves
-delivered via operation objects that represent an operation and its
-arguments. All operations descend from the :class:`.MigrateOperation`
-class, and are registered with the :class:`.Operations` class using
-the :meth:`.Operations.register_operation` class decorator. The
-:class:`.MigrateOperation` objects also serve as the basis for how the
-autogenerate system renders new migration scripts.
-
-.. seealso::
-
- :ref:`operation_plugins`
-
- :ref:`customizing_revision`
-
-The built-in operation objects are listed below.
-
-.. automodule:: alembic.operations.ops
- :members:
-
-
-Commands
-=========
-
-Alembic commands are all represented by functions in the :mod:`alembic.command`
-package. They all accept the same style of usage, being sent
-the :class:`~.alembic.config.Config` object as the first argument.
-
-Commands can be run programmatically, by first constructing a :class:`.Config`
-object, as in::
-
- from alembic.config import Config
- from alembic import command
- alembic_cfg = Config("/path/to/yourapp/alembic.ini")
- command.upgrade(alembic_cfg, "head")
-
-In many cases, and perhaps more often than not, an application will wish
-to call upon a series of Alembic commands and/or other features. It is
-usually a good idea to link multiple commands along a single connection
-and transaction, if feasible. This can be achieved using the
-:attr:`.Config.attributes` dictionary in order to share a connection::
-
- with engine.begin() as connection:
- alembic_cfg.attributes['connection'] = connection
- command.upgrade(alembic_cfg, "head")
-
-This recipe requires that ``env.py`` consumes this connection argument;
-see the example in :ref:`connection_sharing` for details.
-
-To write small API functions that make direct use of database and script directory
-information, rather than just running one of the built-in commands,
-use the :class:`.ScriptDirectory` and :class:`.MigrationContext`
-classes directly.
-
-.. currentmodule:: alembic.command
-
-.. automodule:: alembic.command
- :members:
-
-Configuration
-==============
-
-The :class:`.Config` object represents the configuration
-passed to the Alembic environment. From an API usage perspective,
-it is needed for the following use cases:
-
-* to create a :class:`.ScriptDirectory`, which allows you to work
- with the actual script files in a migration environment
-* to create an :class:`.EnvironmentContext`, which allows you to
- actually run the ``env.py`` module within the migration environment
-* to programatically run any of the commands in the :mod:`alembic.command`
- module.
-
-The :class:`.Config` is *not* needed for these cases:
-
-* to instantiate a :class:`.MigrationContext` directly - this object
- only needs a SQLAlchemy connection or dialect name.
-* to instantiate a :class:`.Operations` object - this object only
- needs a :class:`.MigrationContext`.
-
-.. currentmodule:: alembic.config
-
-.. automodule:: alembic.config
- :members:
-
-Script Directory
-================
-
-The :class:`.ScriptDirectory` object provides programmatic access
-to the Alembic version files present in the filesystem.
-
-.. automodule:: alembic.script
- :members:
-
-Revision
-========
-
-The :class:`.RevisionMap` object serves as the basis for revision
-management, used exclusively by :class:`.ScriptDirectory`.
-
-.. automodule:: alembic.script.revision
- :members:
-
-Autogeneration
-==============
-
-The autogenerate system has two areas of API that are public:
-
-1. The ability to do a "diff" of a :class:`.MetaData` object against
- a database, and receive a data structure back. This structure
- is available either as a rudimentary list of changes, or as
- a :class:`.MigrateOperation` structure.
-
-2. The ability to alter how the ``alembic revision`` command generates
- revision scripts, including support for multiple revision scripts
- generated in one pass.
-
-Getting Diffs
--------------
-
-.. autofunction:: alembic.autogenerate.compare_metadata
-
-.. autofunction:: alembic.autogenerate.produce_migrations
-
-.. _customizing_revision:
-
-Customizing Revision Generation
--------------------------------
-
-.. versionadded:: 0.8.0 - the ``alembic revision`` system is now customizable.
-
-The ``alembic revision`` command, also available programmatically
-via :func:`.command.revision`, essentially produces a single migration
-script after being run. Whether or not the ``--autogenerate`` option
-was specified basically determines if this script is a blank revision
-script with empty ``upgrade()`` and ``downgrade()`` functions, or was
-produced with alembic operation directives as the result of autogenerate.
-
-In either case, the system creates a full plan of what is to be done
-in the form of a :class:`.MigrateOperation` structure, which is then
-used to produce the script.
-
-For example, suppose we ran ``alembic revision --autogenerate``, and the
-end result was that it produced a new revision ``'eced083f5df'``
-with the following contents::
-
- """create the organization table."""
-
- # revision identifiers, used by Alembic.
- revision = 'eced083f5df'
- down_revision = 'beafc7d709f'
-
- from alembic import op
- import sqlalchemy as sa
-
-
- def upgrade():
- op.create_table(
- 'organization',
- sa.Column('id', sa.Integer(), primary_key=True),
- sa.Column('name', sa.String(50), nullable=False)
- )
- op.add_column(
- 'user',
- sa.Column('organization_id', sa.Integer())
- )
- op.create_foreign_key(
- 'org_fk', 'user', 'organization', ['organization_id'], ['id']
- )
-
- def downgrade():
- op.drop_constraint('org_fk', 'user')
- op.drop_column('user', 'organization_id')
- op.drop_table('organization')
-
-The above script is generated by a :class:`.MigrateOperation` structure
-that looks like this::
-
- from alembic.operations import ops
- import sqlalchemy as sa
-
- migration_script = ops.MigrationScript(
- 'eced083f5df',
- ops.UpgradeOps(
- ops=[
- ops.CreateTableOp(
- 'organization',
- [
- sa.Column('id', sa.Integer(), primary_key=True),
- sa.Column('name', sa.String(50), nullable=False)
- ]
- ),
- ops.ModifyTableOps(
- 'user',
- ops=[
- ops.AddColumnOp(
- 'user',
- sa.Column('organization_id', sa.Integer())
- ),
- ops.CreateForeignKeyOp(
- 'org_fk', 'user', 'organization',
- ['organization_id'], ['id']
- )
- ]
- )
- ]
- ),
- ops.DowngradeOps(
- ops=[
- ops.ModifyTableOps(
- 'user',
- ops=[
- ops.DropConstraintOp('org_fk', 'user'),
- ops.DropColumnOp('user', 'organization_id')
- ]
- ),
- ops.DropTableOp('organization')
- ]
- ),
- message='create the organization table.'
- )
-
-When we deal with a :class:`.MigrationScript` structure, we can render
-the upgrade/downgrade sections into strings for debugging purposes
-using the :func:`.render_python_code` helper function::
-
- from alembic.autogenerate import render_python_code
- print(render_python_code(migration_script.upgrade_ops))
-
-Renders::
-
- ### commands auto generated by Alembic - please adjust! ###
- op.create_table('organization',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('name', sa.String(length=50), nullable=False),
- sa.PrimaryKeyConstraint('id')
- )
- op.add_column('user', sa.Column('organization_id', sa.Integer(), nullable=True))
- op.create_foreign_key('org_fk', 'user', 'organization', ['organization_id'], ['id'])
- ### end Alembic commands ###
-
-Given that structures like the above are used to generate new revision
-files, and that we'd like to be able to alter these as they are created,
-we then need a system to access this structure when the
-:func:`.command.revision` command is used. The
-:paramref:`.EnvironmentContext.configure.process_revision_directives`
-parameter gives us a way to alter this. This is a function that
-is passed the above structure as generated by Alembic, giving us a chance
-to alter it.
-For example, if we wanted to put all the "upgrade" operations into
-a certain branch, and we wanted our script to not have any "downgrade"
-operations at all, we could build an extension as follows, illustrated
-within an ``env.py`` script::
-
- def process_revision_directives(context, revision, directives):
- script = directives[0]
-
- # set specific branch
- script.head = "mybranch@head"
-
- # erase downgrade operations
- script.downgrade_ops.ops[:] = []
-
- # ...
-
- def run_migrations_online():
-
- # ...
- with engine.connect() as connection:
-
- context.configure(
- connection=connection,
- target_metadata=target_metadata,
- process_revision_directives=process_revision_directives)
-
- with context.begin_transaction():
- context.run_migrations()
-
-Above, the ``directives`` argument is a Python list. We may alter the
-given structure within this list in-place, or replace it with a new
-structure consisting of zero or more :class:`.MigrationScript` directives.
-The :func:`.command.revision` command will then produce scripts corresponding
-to whatever is in this list.
-
-.. autofunction:: alembic.autogenerate.render_python_code
-
-Autogenerating Custom Operation Directives
-------------------------------------------
-
-In the section :ref:`operation_plugins`, we talked about adding new
-subclasses of :class:`.MigrateOperation` in order to add new ``op.``
-directives. In the preceding section :ref:`customizing_revision`, we
-also learned that these same :class:`.MigrateOperation` structures are at
-the base of how the autogenerate system knows what Python code to render.
-How to connect these two systems, so that our own custom operation
-directives can be used? First off, we'd probably be implementing
-a :paramref:`.EnvironmentContext.configure.process_revision_directives`
-plugin as described previously, so that we can add our own directives
-to the autogenerate stream. What if we wanted to add our ``CreateSequenceOp``
-to the autogenerate structure? We basically need to define an autogenerate
-renderer for it, as follows::
-
- # note: this is a continuation of the example from the
- # "Operation Plugins" section
-
- from alembic.autogenerate import renderers
-
- @renderers.dispatch_for(CreateSequenceOp)
- def render_create_sequence(autogen_context, op):
- return "op.create_sequence(%r, **%r)" % (
- op.sequence_name,
- op.kw
- )
-
-With our render function established, we can our ``CreateSequenceOp``
-generated in an autogenerate context using the :func:`.render_python_code`
-debugging function in conjunction with an :class:`.UpgradeOps` structure::
-
- from alembic.operations import ops
- from alembic.autogenerate import render_python_code
-
- upgrade_ops = ops.UpgradeOps(
- ops=[
- CreateSequenceOp("my_seq")
- ]
- )
-
- print(render_python_code(upgrade_ops))
-
-Which produces::
-
- ### commands auto generated by Alembic - please adjust! ###
- op.create_sequence('my_seq', **{})
- ### end Alembic commands ###
-
-DDL Internals
-=============
-
-These are some of the constructs used to generate migration
-instructions. The APIs here build off of the :class:`sqlalchemy.schema.DDLElement`
-and :mod:`sqlalchemy.ext.compiler` systems.
-
-For programmatic usage of Alembic's migration directives, the easiest
-route is to use the higher level functions given by :mod:`alembic.operations`.
-
-.. automodule:: alembic.ddl
- :members:
- :undoc-members:
-
-.. automodule:: alembic.ddl.base
- :members:
- :undoc-members:
-
-.. automodule:: alembic.ddl.impl
- :members:
- :undoc-members:
-
-MySQL
------
-
-.. automodule:: alembic.ddl.mysql
- :members:
- :undoc-members:
- :show-inheritance:
-
-MS-SQL
-------
-
-.. automodule:: alembic.ddl.mssql
- :members:
- :undoc-members:
- :show-inheritance:
-
-Postgresql
-----------
-
-.. automodule:: alembic.ddl.postgresql
- :members:
- :undoc-members:
- :show-inheritance:
-
-SQLite
-------
-
-.. automodule:: alembic.ddl.sqlite
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/build/api/api_overview.png b/docs/build/api/api_overview.png
new file mode 100644
index 0000000..37e7312
--- /dev/null
+++ b/docs/build/api/api_overview.png
Binary files differ
diff --git a/docs/build/api/autogenerate.rst b/docs/build/api/autogenerate.rst
new file mode 100644
index 0000000..b96a299
--- /dev/null
+++ b/docs/build/api/autogenerate.rst
@@ -0,0 +1,233 @@
+==============
+Autogeneration
+==============
+
+The autogenerate system has two areas of API that are public:
+
+1. The ability to do a "diff" of a :class:`.MetaData` object against
+ a database, and receive a data structure back. This structure
+ is available either as a rudimentary list of changes, or as
+ a :class:`.MigrateOperation` structure.
+
+2. The ability to alter how the ``alembic revision`` command generates
+ revision scripts, including support for multiple revision scripts
+ generated in one pass.
+
+Getting Diffs
+==============
+
+.. autofunction:: alembic.autogenerate.compare_metadata
+
+.. autofunction:: alembic.autogenerate.produce_migrations
+
+.. _customizing_revision:
+
+Customizing Revision Generation
+==========================================
+
+.. versionadded:: 0.8.0 - the ``alembic revision`` system is now customizable.
+
+The ``alembic revision`` command, also available programmatically
+via :func:`.command.revision`, essentially produces a single migration
+script after being run. Whether or not the ``--autogenerate`` option
+was specified basically determines if this script is a blank revision
+script with empty ``upgrade()`` and ``downgrade()`` functions, or was
+produced with alembic operation directives as the result of autogenerate.
+
+In either case, the system creates a full plan of what is to be done
+in the form of a :class:`.MigrateOperation` structure, which is then
+used to produce the script.
+
+For example, suppose we ran ``alembic revision --autogenerate``, and the
+end result was that it produced a new revision ``'eced083f5df'``
+with the following contents::
+
+ """create the organization table."""
+
+ # revision identifiers, used by Alembic.
+ revision = 'eced083f5df'
+ down_revision = 'beafc7d709f'
+
+ from alembic import op
+ import sqlalchemy as sa
+
+
+ def upgrade():
+ op.create_table(
+ 'organization',
+ sa.Column('id', sa.Integer(), primary_key=True),
+ sa.Column('name', sa.String(50), nullable=False)
+ )
+ op.add_column(
+ 'user',
+ sa.Column('organization_id', sa.Integer())
+ )
+ op.create_foreign_key(
+ 'org_fk', 'user', 'organization', ['organization_id'], ['id']
+ )
+
+ def downgrade():
+ op.drop_constraint('org_fk', 'user')
+ op.drop_column('user', 'organization_id')
+ op.drop_table('organization')
+
+The above script is generated by a :class:`.MigrateOperation` structure
+that looks like this::
+
+ from alembic.operations import ops
+ import sqlalchemy as sa
+
+ migration_script = ops.MigrationScript(
+ 'eced083f5df',
+ ops.UpgradeOps(
+ ops=[
+ ops.CreateTableOp(
+ 'organization',
+ [
+ sa.Column('id', sa.Integer(), primary_key=True),
+ sa.Column('name', sa.String(50), nullable=False)
+ ]
+ ),
+ ops.ModifyTableOps(
+ 'user',
+ ops=[
+ ops.AddColumnOp(
+ 'user',
+ sa.Column('organization_id', sa.Integer())
+ ),
+ ops.CreateForeignKeyOp(
+ 'org_fk', 'user', 'organization',
+ ['organization_id'], ['id']
+ )
+ ]
+ )
+ ]
+ ),
+ ops.DowngradeOps(
+ ops=[
+ ops.ModifyTableOps(
+ 'user',
+ ops=[
+ ops.DropConstraintOp('org_fk', 'user'),
+ ops.DropColumnOp('user', 'organization_id')
+ ]
+ ),
+ ops.DropTableOp('organization')
+ ]
+ ),
+ message='create the organization table.'
+ )
+
+When we deal with a :class:`.MigrationScript` structure, we can render
+the upgrade/downgrade sections into strings for debugging purposes
+using the :func:`.render_python_code` helper function::
+
+ from alembic.autogenerate import render_python_code
+ print(render_python_code(migration_script.upgrade_ops))
+
+Renders::
+
+ ### commands auto generated by Alembic - please adjust! ###
+ op.create_table('organization',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('name', sa.String(length=50), nullable=False),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.add_column('user', sa.Column('organization_id', sa.Integer(), nullable=True))
+ op.create_foreign_key('org_fk', 'user', 'organization', ['organization_id'], ['id'])
+ ### end Alembic commands ###
+
+Given that structures like the above are used to generate new revision
+files, and that we'd like to be able to alter these as they are created,
+we then need a system to access this structure when the
+:func:`.command.revision` command is used. The
+:paramref:`.EnvironmentContext.configure.process_revision_directives`
+parameter gives us a way to alter this. This is a function that
+is passed the above structure as generated by Alembic, giving us a chance
+to alter it.
+For example, if we wanted to put all the "upgrade" operations into
+a certain branch, and we wanted our script to not have any "downgrade"
+operations at all, we could build an extension as follows, illustrated
+within an ``env.py`` script::
+
+ def process_revision_directives(context, revision, directives):
+ script = directives[0]
+
+ # set specific branch
+ script.head = "mybranch@head"
+
+ # erase downgrade operations
+ script.downgrade_ops.ops[:] = []
+
+ # ...
+
+ def run_migrations_online():
+
+ # ...
+ with engine.connect() as connection:
+
+ context.configure(
+ connection=connection,
+ target_metadata=target_metadata,
+ process_revision_directives=process_revision_directives)
+
+ with context.begin_transaction():
+ context.run_migrations()
+
+Above, the ``directives`` argument is a Python list. We may alter the
+given structure within this list in-place, or replace it with a new
+structure consisting of zero or more :class:`.MigrationScript` directives.
+The :func:`.command.revision` command will then produce scripts corresponding
+to whatever is in this list.
+
+.. autofunction:: alembic.autogenerate.render_python_code
+
+Autogenerating Custom Operation Directives
+==========================================
+
+In the section :ref:`operation_plugins`, we talked about adding new
+subclasses of :class:`.MigrateOperation` in order to add new ``op.``
+directives. In the preceding section :ref:`customizing_revision`, we
+also learned that these same :class:`.MigrateOperation` structures are at
+the base of how the autogenerate system knows what Python code to render.
+How to connect these two systems, so that our own custom operation
+directives can be used? First off, we'd probably be implementing
+a :paramref:`.EnvironmentContext.configure.process_revision_directives`
+plugin as described previously, so that we can add our own directives
+to the autogenerate stream. What if we wanted to add our ``CreateSequenceOp``
+to the autogenerate structure? We basically need to define an autogenerate
+renderer for it, as follows::
+
+ # note: this is a continuation of the example from the
+ # "Operation Plugins" section
+
+ from alembic.autogenerate import renderers
+
+ @renderers.dispatch_for(CreateSequenceOp)
+ def render_create_sequence(autogen_context, op):
+ return "op.create_sequence(%r, **%r)" % (
+ op.sequence_name,
+ op.kw
+ )
+
+With our render function established, we can our ``CreateSequenceOp``
+generated in an autogenerate context using the :func:`.render_python_code`
+debugging function in conjunction with an :class:`.UpgradeOps` structure::
+
+ from alembic.operations import ops
+ from alembic.autogenerate import render_python_code
+
+ upgrade_ops = ops.UpgradeOps(
+ ops=[
+ CreateSequenceOp("my_seq")
+ ]
+ )
+
+ print(render_python_code(upgrade_ops))
+
+Which produces::
+
+ ### commands auto generated by Alembic - please adjust! ###
+ op.create_sequence('my_seq', **{})
+ ### end Alembic commands ###
+
diff --git a/docs/build/api/commands.rst b/docs/build/api/commands.rst
new file mode 100644
index 0000000..3d73ce5
--- /dev/null
+++ b/docs/build/api/commands.rst
@@ -0,0 +1,38 @@
+=========
+Commands
+=========
+
+Alembic commands are all represented by functions in the :mod:`alembic.command`
+package. They all accept the same style of usage, being sent
+the :class:`~.alembic.config.Config` object as the first argument.
+
+Commands can be run programmatically, by first constructing a :class:`.Config`
+object, as in::
+
+ from alembic.config import Config
+ from alembic import command
+ alembic_cfg = Config("/path/to/yourapp/alembic.ini")
+ command.upgrade(alembic_cfg, "head")
+
+In many cases, and perhaps more often than not, an application will wish
+to call upon a series of Alembic commands and/or other features. It is
+usually a good idea to link multiple commands along a single connection
+and transaction, if feasible. This can be achieved using the
+:attr:`.Config.attributes` dictionary in order to share a connection::
+
+ with engine.begin() as connection:
+ alembic_cfg.attributes['connection'] = connection
+ command.upgrade(alembic_cfg, "head")
+
+This recipe requires that ``env.py`` consumes this connection argument;
+see the example in :ref:`connection_sharing` for details.
+
+To write small API functions that make direct use of database and script directory
+information, rather than just running one of the built-in commands,
+use the :class:`.ScriptDirectory` and :class:`.MigrationContext`
+classes directly.
+
+.. currentmodule:: alembic.command
+
+.. automodule:: alembic.command
+ :members:
diff --git a/docs/build/api/config.rst b/docs/build/api/config.rst
new file mode 100644
index 0000000..9294a6d
--- /dev/null
+++ b/docs/build/api/config.rst
@@ -0,0 +1,26 @@
+==============
+Configuration
+==============
+
+The :class:`.Config` object represents the configuration
+passed to the Alembic environment. From an API usage perspective,
+it is needed for the following use cases:
+
+* to create a :class:`.ScriptDirectory`, which allows you to work
+ with the actual script files in a migration environment
+* to create an :class:`.EnvironmentContext`, which allows you to
+ actually run the ``env.py`` module within the migration environment
+* to programatically run any of the commands in the :mod:`alembic.command`
+ module.
+
+The :class:`.Config` is *not* needed for these cases:
+
+* to instantiate a :class:`.MigrationContext` directly - this object
+ only needs a SQLAlchemy connection or dialect name.
+* to instantiate a :class:`.Operations` object - this object only
+ needs a :class:`.MigrationContext`.
+
+.. currentmodule:: alembic.config
+
+.. automodule:: alembic.config
+ :members:
diff --git a/docs/build/api/ddl.rst b/docs/build/api/ddl.rst
new file mode 100644
index 0000000..aff697c
--- /dev/null
+++ b/docs/build/api/ddl.rst
@@ -0,0 +1,54 @@
+=============
+DDL Internals
+=============
+
+These are some of the constructs used to generate migration
+instructions. The APIs here build off of the :class:`sqlalchemy.schema.DDLElement`
+and :mod:`sqlalchemy.ext.compiler` systems.
+
+For programmatic usage of Alembic's migration directives, the easiest
+route is to use the higher level functions given by :mod:`alembic.operations`.
+
+.. automodule:: alembic.ddl
+ :members:
+ :undoc-members:
+
+.. automodule:: alembic.ddl.base
+ :members:
+ :undoc-members:
+
+.. automodule:: alembic.ddl.impl
+ :members:
+ :undoc-members:
+
+MySQL
+=============
+
+.. automodule:: alembic.ddl.mysql
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+MS-SQL
+=============
+
+.. automodule:: alembic.ddl.mssql
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Postgresql
+=============
+
+.. automodule:: alembic.ddl.postgresql
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+SQLite
+=============
+
+.. automodule:: alembic.ddl.sqlite
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/build/api/environment.rst b/docs/build/api/environment.rst
new file mode 100644
index 0000000..874cf98
--- /dev/null
+++ b/docs/build/api/environment.rst
@@ -0,0 +1,17 @@
+=======================
+The Environment Context
+=======================
+
+The :class:`.EnvironmentContext` class provides most of the
+API used within an ``env.py`` script. Within ``env.py``,
+the instantated :class:`.EnvironmentContext` is made available
+via a special *proxy module* called ``alembic.context``. That is,
+you can import ``alembic.context`` like a regular Python module,
+and each name you call upon it is ultimately routed towards the
+current :class:`.EnvironmentContext` in use.
+
+In particular, the key method used within ``env.py`` is :meth:`.EnvironmentContext.configure`,
+which establishes all the details about how the database will be accessed.
+
+.. automodule:: alembic.runtime.environment
+ :members: EnvironmentContext
diff --git a/docs/build/api/index.rst b/docs/build/api/index.rst
new file mode 100644
index 0000000..26ee9b4
--- /dev/null
+++ b/docs/build/api/index.rst
@@ -0,0 +1,33 @@
+.. _api:
+
+===========
+API Details
+===========
+
+Alembic's internal API has many public integration points that can be used
+to extend Alembic's functionality as well as to re-use its functionality
+in new ways. As the project has grown, more APIs are created and exposed
+for this purpose.
+
+Direct use of the vast majority of API details discussed here is not needed
+for rudimentary use of Alembic; the only API that is used normally by end users is
+the methods provided by the :class:`.Operations` class, which is discussed
+outside of this subsection, and the parameters that can be passed to
+the :meth:`.EnvironmentContext.configure` method, used when configuring
+one's ``env.py`` environment. However, real-world applications will
+usually end up using more of the internal API, in particular being able
+to run commands programmatically, as discussed in the section :doc:`api/commands`.
+
+.. toctree::
+ :maxdepth: 2
+
+ overview
+ environment
+ migration
+ config
+ commands
+ operations
+ autogenerate
+ script
+ ddl
+
diff --git a/docs/build/api/migration.rst b/docs/build/api/migration.rst
new file mode 100644
index 0000000..300c792
--- /dev/null
+++ b/docs/build/api/migration.rst
@@ -0,0 +1,6 @@
+=====================
+The Migration Context
+=====================
+
+.. automodule:: alembic.runtime.migration
+ :members: MigrationContext
diff --git a/docs/build/api/operations.rst b/docs/build/api/operations.rst
new file mode 100644
index 0000000..773cf6e
--- /dev/null
+++ b/docs/build/api/operations.rst
@@ -0,0 +1,119 @@
+=====================
+The Operations Object
+=====================
+
+Within migration scripts, actual database migration operations are handled
+via an instance of :class:`.Operations`. The :class:`.Operations` class
+lists out available migration operations that are linked to a
+:class:`.MigrationContext`, which communicates instructions originated
+by the :class:`.Operations` object into SQL that is sent to a database or SQL
+output stream.
+
+Most methods on the :class:`.Operations` class are generated dynamically
+using a "plugin" system, described in the next section
+:ref:`operation_plugins`. Additionally, when Alembic migration scripts
+actually run, the methods on the current :class:`.Operations` object are
+proxied out to the :mod:`alembic.op` module, so that they are available
+using module-style access.
+
+For an overview of how to use an :class:`.Operations` object directly
+in programs, as well as for reference to the standard operation methods
+as well as "batch" methods, see :ref:`ops`.
+
+.. _operation_plugins:
+
+Operation Plugins
+=====================
+
+The Operations object is extensible using a plugin system. This system
+allows one to add new ``op.<some_operation>`` methods at runtime. The
+steps to use this system are to first create a subclass of
+:class:`.MigrateOperation`, register it using the :meth:`.Operations.register_operation`
+class decorator, then build a default "implementation" function which is
+established using the :meth:`.Operations.implementation_for` decorator.
+
+.. versionadded:: 0.8.0 - the :class:`.Operations` class is now an
+ open namespace that is extensible via the creation of new
+ :class:`.MigrateOperation` subclasses.
+
+Below we illustrate a very simple operation ``CreateSequenceOp`` which
+will implement a new method ``op.create_sequence()`` for use in
+migration scripts::
+
+ from alembic.operations import Operations, MigrateOperation
+
+ @Operations.register_operation("create_sequence")
+ class CreateSequenceOp(MigrateOperation):
+ """Create a SEQUENCE."""
+
+ def __init__(self, sequence_name, **kw):
+ self.sequence_name = sequence_name
+ self.kw = kw
+
+ @classmethod
+ def create_sequence(cls, operations, sequence_name, **kw):
+ """Issue a "CREATE SEQUENCE" instruction."""
+
+ op = CreateSequenceOp(sequence_name, **kw)
+ return operations.invoke(op)
+
+Above, the ``CreateSequenceOp`` class represents a new operation that will
+be available as ``op.create_sequence()``. The reason the operation
+is represented as a stateful class is so that an operation and a specific
+set of arguments can be represented generically; the state can then correspond
+to different kinds of operations, such as invoking the instruction against
+a database, or autogenerating Python code for the operation into a
+script.
+
+In order to establish the migrate-script behavior of the new operation,
+we use the :meth:`.Operations.implementation_for` decorator::
+
+ @Operations.implementation_for(CreateSequenceOp)
+ def create_sequence(operations, operation):
+ operations.execute("CREATE SEQUENCE %s" % operation.sequence_name)
+
+Above, we use the simplest possible technique of invoking our DDL, which
+is just to call :meth:`.Operations.execute` with literal SQL. If this is
+all a custom operation needs, then this is fine. However, options for
+more comprehensive support include building out a custom SQL construct,
+as documented at :ref:`sqlalchemy.ext.compiles`.
+
+With the above two steps, a migration script can now use a new method
+``op.create_sequence()`` that will proxy to our object as a classmethod::
+
+ def upgrade():
+ op.create_sequence("my_sequence")
+
+The registration of new operations only needs to occur in time for the
+``env.py`` script to invoke :meth:`.MigrationContext.run_migrations`;
+within the module level of the ``env.py`` script is sufficient.
+
+
+.. versionadded:: 0.8 - the migration operations available via the
+ :class:`.Operations` class as well as the :mod:`alembic.op` namespace
+ is now extensible using a plugin system.
+
+
+.. _operation_objects:
+
+Built-in Operation Objects
+==============================
+
+The migration operations present on :class:`.Operations` are themselves
+delivered via operation objects that represent an operation and its
+arguments. All operations descend from the :class:`.MigrateOperation`
+class, and are registered with the :class:`.Operations` class using
+the :meth:`.Operations.register_operation` class decorator. The
+:class:`.MigrateOperation` objects also serve as the basis for how the
+autogenerate system renders new migration scripts.
+
+.. seealso::
+
+ :ref:`operation_plugins`
+
+ :ref:`customizing_revision`
+
+The built-in operation objects are listed below.
+
+.. automodule:: alembic.operations.ops
+ :members:
diff --git a/docs/build/api/overview.rst b/docs/build/api/overview.rst
new file mode 100644
index 0000000..4bdbfa0
--- /dev/null
+++ b/docs/build/api/overview.rst
@@ -0,0 +1,47 @@
+========
+Overview
+========
+
+A visualization of the primary features of Alembic's internals is presented
+in the following figure. The module and class boxes do not list out
+all the operations provided by each unit; only a small set of representative
+elements intended to convey the primary purpose of each system.
+
+.. image:: api_overview.png
+
+The script runner for Alembic is present in the :mod:`alembic.config` module.
+This module produces a :class:`.Config` object and passes it to the
+appropriate function in :mod:`alembic.command`. Functions within
+:mod:`alembic.command` will typically instantiate an
+:class:`.ScriptDirectory` instance, which represents the collection of
+version files, and an :class:`.EnvironmentContext`, which represents a
+configurational object passed to the environment's ``env.py`` script.
+
+Within the execution of ``env.py``, a :class:`.MigrationContext`
+object is produced when the :meth:`.EnvironmentContext.configure`
+method is called. :class:`.MigrationContext` is the gateway to the database
+for other parts of the application, and produces a :class:`.DefaultImpl`
+object which does the actual database communication, and knows how to
+create the specific SQL text of the various DDL directives such as
+ALTER TABLE; :class:`.DefaultImpl` has subclasses that are per-database-backend.
+In "offline" mode (e.g. ``--sql``), the :class:`.MigrationContext` will
+produce SQL to a file output stream instead of a database.
+
+During an upgrade or downgrade operation, a specific series of migration
+scripts are invoked starting with the :class:`.MigrationContext` in conjunction
+with the :class:`.ScriptDirectory`; the actual scripts themselves make use
+of the :class:`.Operations` object, which provide the end-user interface to
+specific database operations. The :class:`.Operations` object is generated
+based on a series of "operation directive" objects that are user-extensible,
+and start out in the :mod:`alembic.operations.ops` module.
+
+Another prominent feature of Alembic is the "autogenerate" feature, which
+produces new migration scripts that contain Python code. The autogenerate
+feature starts in :mod:`alembic.autogenerate`, and is used exclusively
+by the :func:`.alembic.command.revision` command when the ``--autogenerate``
+flag is passed. Autogenerate refers to the :class:`.MigrationContext`
+and :class:`.DefaultImpl` in order to access database connectivity and
+access per-backend rules for autogenerate comparisons. It also makes use
+of :mod:`alembic.operations.ops` in order to represent the operations that
+it will render into scripts.
+
diff --git a/docs/build/api/script.rst b/docs/build/api/script.rst
new file mode 100644
index 0000000..9ff7f2f
--- /dev/null
+++ b/docs/build/api/script.rst
@@ -0,0 +1,18 @@
+================
+Script Directory
+================
+
+The :class:`.ScriptDirectory` object provides programmatic access
+to the Alembic version files present in the filesystem.
+
+.. automodule:: alembic.script
+ :members:
+
+Revision
+========
+
+The :class:`.RevisionMap` object serves as the basis for revision
+management, used exclusively by :class:`.ScriptDirectory`.
+
+.. automodule:: alembic.script.revision
+ :members:
diff --git a/docs/build/api_overview.png b/docs/build/api_overview.png
deleted file mode 100644
index dab204b..0000000
--- a/docs/build/api_overview.png
+++ /dev/null
Binary files differ
diff --git a/docs/build/assets/api_overview.graffle b/docs/build/assets/api_overview.graffle
index 7c083e5..1e58ea5 100644
--- a/docs/build/assets/api_overview.graffle
+++ b/docs/build/assets/api_overview.graffle
@@ -4,34 +4,56 @@
<dict>
<key>ActiveLayerIndex</key>
<integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGrafflePro</string>
+ <string>139.18.0.187838</string>
+ </array>
<key>AutoAdjust</key>
<true/>
- <key>CanvasColor</key>
+ <key>BackgroundGraphic</key>
<dict>
- <key>w</key>
- <string>1</string>
+ <key>Bounds</key>
+ <string>{{0, 0}, {1176, 768}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
</dict>
+ <key>BaseZoom</key>
+ <integer>0</integer>
<key>CanvasOrigin</key>
<string>{0, 0}</string>
- <key>CanvasScale</key>
- <real>1</real>
<key>ColumnAlign</key>
<integer>1</integer>
<key>ColumnSpacing</key>
<real>36</real>
<key>CreationDate</key>
- <string>2012-01-24 16:51:07 -0500</string>
+ <string>2012-01-24 21:51:07 +0000</string>
<key>Creator</key>
<string>classic</string>
<key>DisplayScale</key>
- <string>1 in = 1 in</string>
+ <string>1 0/72 in = 1.0000 in</string>
<key>GraphDocumentVersion</key>
- <integer>5</integer>
+ <integer>8</integer>
<key>GraphicsList</key>
<array>
<dict>
<key>Bounds</key>
- <string>{{319.25, 165}, {66, 12}}</string>
+ <string>{{601.74580087231288, 420}, {84, 12}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -39,7 +61,7 @@
<key>Flow</key>
<string>Resize</string>
<key>ID</key>
- <integer>2054</integer>
+ <integer>2140</integer>
<key>Shape</key>
<string>Rectangle</string>
<key>Style</key>
@@ -60,89 +82,64 @@
<key>Align</key>
<integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
-\f0\fs20 \cf0 &lt;&lt;proxies&gt;&gt;}</string>
- </dict>
- <key>Wrap</key>
- <string>NO</string>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{444, 216.633}, {66, 12}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>FitText</key>
- <string>YES</string>
- <key>Flow</key>
- <string>Resize</string>
- <key>ID</key>
- <integer>2053</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Style</key>
- <dict>
- <key>shadow</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>stroke</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- </dict>
- <key>Text</key>
- <dict>
- <key>Align</key>
+\f0\fs20 \cf0 &lt;&lt;instantiates&gt;&gt;}</string>
+ <key>VerticalPad</key>
<integer>0</integer>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
-
-\f0\fs20 \cf0 &lt;&lt;proxies&gt;&gt;}</string>
</dict>
<key>Wrap</key>
<string>NO</string>
</dict>
<dict>
<key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>2048</integer>
- </dict>
- <key>ID</key>
- <integer>2051</integer>
- <key>Points</key>
+ <string>TableGroup</string>
+ <key>Graphics</key>
<array>
- <string>{165, 221.6}</string>
- <string>{109, 221.6}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
<dict>
- <key>HeadArrow</key>
- <string>StickArrow</string>
- <key>Pattern</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>0</string>
+ <key>Bounds</key>
+ <string>{{191, 107.40116119384766}, {102.9071044921875, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2132</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 PostgresqlImpl}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
</dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>33</integer>
- </dict>
+ </array>
+ <key>GroupConnect</key>
+ <string>YES</string>
+ <key>ID</key>
+ <integer>2131</integer>
</dict>
<dict>
<key>Class</key>
@@ -151,7 +148,7 @@
<array>
<dict>
<key>Bounds</key>
- <string>{{19, 207.6}, {90, 14}}</string>
+ <string>{{230.9169921875, 132.80233001708984}, {102.9071044921875, 14}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -159,35 +156,46 @@
<key>Flow</key>
<string>Resize</string>
<key>ID</key>
- <integer>2049</integer>
+ <integer>2130</integer>
<key>Shape</key>
<string>Rectangle</string>
<key>Style</key>
<dict>
<key>fill</key>
<dict>
- <key>GradientAngle</key>
- <real>304</real>
<key>GradientCenter</key>
- <string>{-0.294118, -0.264706}</string>
+ <string>{-0.29411799999999999, -0.264706}</string>
</dict>
</dict>
<key>Text</key>
<dict>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-\f0\b\fs24 \cf0 Config}</string>
+\f0\b\fs24 \cf0 MSSQLImpl}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>TextPlacement</key>
<integer>0</integer>
</dict>
+ </array>
+ <key>GroupConnect</key>
+ <string>YES</string>
+ <key>ID</key>
+ <integer>2129</integer>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>TableGroup</string>
+ <key>Graphics</key>
+ <array>
<dict>
<key>Bounds</key>
- <string>{{19, 221.6}, {90, 14}}</string>
+ <string>{{226, 82}, {102.9071044921875, 14}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -195,45 +203,179 @@
<key>Flow</key>
<string>Resize</string>
<key>ID</key>
- <integer>2050</integer>
+ <integer>2127</integer>
<key>Shape</key>
<string>Rectangle</string>
<key>Style</key>
<dict>
<key>fill</key>
<dict>
- <key>GradientAngle</key>
- <real>304</real>
<key>GradientCenter</key>
- <string>{-0.294118, -0.264706}</string>
+ <string>{-0.29411799999999999, -0.264706}</string>
</dict>
</dict>
<key>Text</key>
<dict>
- <key>Align</key>
- <integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-\f0\fs24 \cf0 ConfigParser}</string>
+\f0\b\fs24 \cf0 MySQLImpl}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>TextPlacement</key>
<integer>0</integer>
</dict>
</array>
- <key>GridH</key>
+ <key>GroupConnect</key>
+ <string>YES</string>
+ <key>ID</key>
+ <integer>2126</integer>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>2055</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2135</integer>
+ <key>Points</key>
<array>
- <integer>2049</integer>
- <integer>2050</integer>
- <array/>
+ <string>{280.22809604806071, 146.80233001708984}</string>
+ <string>{272.46503226582109, 172.16651000976572}</string>
</array>
- <key>GroupConnect</key>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>UMLInheritance</string>
+ <key>Legacy</key>
+ <true/>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>2129</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>2055</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2134</integer>
+ <key>Points</key>
+ <array>
+ <string>{243.64926792598939, 121.40116119384763}</string>
+ <string>{252.32082843664148, 172.16651000976572}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>UMLInheritance</string>
+ <key>Legacy</key>
+ <true/>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>2131</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>2055</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2133</integer>
+ <key>Points</key>
+ <array>
+ <string>{276.4518773872507, 95.999999999999986}</string>
+ <string>{265.55272336402226, 172.16651000976572}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>UMLInheritance</string>
+ <key>Legacy</key>
+ <true/>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>2126</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{504, 310}, {84, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
<string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
<key>ID</key>
- <integer>2048</integer>
+ <integer>2125</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs20 \cf0 &lt;&lt;instantiates&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
</dict>
<dict>
<key>Class</key>
@@ -244,15 +386,17 @@
<integer>33</integer>
</dict>
<key>ID</key>
- <integer>2046</integer>
+ <integer>2124</integer>
<key>OrthogonalBarAutomatic</key>
- <true/>
+ <false/>
+ <key>OrthogonalBarPoint</key>
+ <string>{0, 0}</string>
<key>OrthogonalBarPosition</key>
- <real>28.725006103515625</real>
+ <real>16</real>
<key>Points</key>
<array>
- <string>{385.25, 157}</string>
- <string>{304, 191.818}</string>
+ <string>{563, 340.34042553191489}</string>
+ <string>{497.13201904296875, 327.88251038766401}</string>
</array>
<key>Style</key>
<dict>
@@ -260,6 +404,8 @@
<dict>
<key>HeadArrow</key>
<string>StickArrow</string>
+ <key>Legacy</key>
+ <true/>
<key>LineType</key>
<integer>2</integer>
<key>Pattern</key>
@@ -271,7 +417,152 @@
<key>Tail</key>
<dict>
<key>ID</key>
- <integer>2042</integer>
+ <integer>2072</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{494.00001409542369, 415.9000186920166}, {55, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2123</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>2139</integer>
+ <key>Position</key>
+ <real>0.37128287553787231</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs20 \cf0 &lt;&lt;uses&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{713.35945466160774, 356.11699358749399}, {55, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2122</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>2121</integer>
+ <key>Position</key>
+ <real>0.49189183115959167</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs20 \cf0 &lt;&lt;uses&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>2081</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2121</integer>
+ <key>Points</key>
+ <array>
+ <string>{702, 363.10150901307452}</string>
+ <string>{781, 361.10002136230463}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>StickArrow</string>
+ <key>HopLines</key>
+ <true/>
+ <key>HopType</key>
+ <integer>102</integer>
+ <key>Legacy</key>
+ <true/>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>2072</integer>
</dict>
</dict>
<dict>
@@ -280,18 +571,20 @@
<key>Head</key>
<dict>
<key>ID</key>
- <integer>38</integer>
+ <integer>2059</integer>
</dict>
<key>ID</key>
- <integer>2044</integer>
+ <integer>2120</integer>
<key>OrthogonalBarAutomatic</key>
<true/>
+ <key>OrthogonalBarPoint</key>
+ <string>{0, 0}</string>
<key>OrthogonalBarPosition</key>
- <real>52.850021362304688</real>
+ <real>-1</real>
<key>Points</key>
<array>
- <string>{454.25, 177}</string>
- <string>{442.638, 294.6}</string>
+ <string>{637, 406}</string>
+ <string>{565.78369522094727, 454.05202861384231}</string>
</array>
<key>Style</key>
<dict>
@@ -299,6 +592,8 @@
<dict>
<key>HeadArrow</key>
<string>StickArrow</string>
+ <key>Legacy</key>
+ <true/>
<key>LineType</key>
<integer>2</integer>
<key>Pattern</key>
@@ -310,12 +605,12 @@
<key>Tail</key>
<dict>
<key>ID</key>
- <integer>2043</integer>
+ <integer>2072</integer>
</dict>
</dict>
<dict>
<key>Bounds</key>
- <string>{{385.25, 172}, {69, 14}}</string>
+ <string>{{717, 400}, {68, 12}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -323,20 +618,110 @@
<key>Flow</key>
<string>Resize</string>
<key>ID</key>
- <integer>2043</integer>
- <key>Magnets</key>
- <array>
- <string>{0.5, -0.142857}</string>
- </array>
+ <integer>2119</integer>
<key>Shape</key>
<string>Rectangle</string>
<key>Style</key>
<dict>
- <key>fill</key>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
<dict>
<key>Draws</key>
<string>NO</string>
</dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs20 \cf0 &lt;&lt;invokes&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>2072</integer>
+ <key>Info</key>
+ <integer>5</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2118</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <true/>
+ <key>OrthogonalBarPoint</key>
+ <string>{0, 0}</string>
+ <key>OrthogonalBarPosition</key>
+ <real>-1</real>
+ <key>Points</key>
+ <array>
+ <string>{759.34192925872742, 429.89997863769531}</string>
+ <string>{702, 384.99999999999994}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>StickArrow</string>
+ <key>Legacy</key>
+ <true/>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>2048</integer>
+ <key>Info</key>
+ <integer>3</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{603.74580087231288, 470.3107529903566}, {80, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2117</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>2116</integer>
+ <key>Position</key>
+ <real>0.47171458601951599</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
<key>shadow</key>
<dict>
<key>Draws</key>
@@ -350,20 +735,63 @@
</dict>
<key>Text</key>
<dict>
+ <key>Align</key>
+ <integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
-\f0\fs24 \cf0 alembic.op}</string>
+\f0\fs20 \cf0 &lt;&lt;configures&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>Wrap</key>
<string>NO</string>
</dict>
<dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>2059</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2116</integer>
+ <key>Points</key>
+ <array>
+ <string>{713.35941696166992, 476.88540101271974}</string>
+ <string>{565.78369522094727, 475.66718967115884}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>StickArrow</string>
+ <key>HopLines</key>
+ <true/>
+ <key>HopType</key>
+ <integer>102</integer>
+ <key>Legacy</key>
+ <true/>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>2048</integer>
+ </dict>
+ </dict>
+ <dict>
<key>Bounds</key>
- <string>{{385.25, 149.6}, {94, 14}}</string>
+ <string>{{816, 258.37493918977634}, {69, 24}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -371,20 +799,73 @@
<key>Flow</key>
<string>Resize</string>
<key>ID</key>
- <integer>2042</integer>
- <key>Magnets</key>
- <array>
- <string>{0.49734, 0.0285711}</string>
- </array>
+ <integer>2113</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>2109</integer>
+ <key>Position</key>
+ <real>0.46421170234680176</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
<key>Shape</key>
<string>Rectangle</string>
<key>Style</key>
<dict>
- <key>fill</key>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
<dict>
<key>Draws</key>
<string>NO</string>
</dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs20 \cf0 &lt;&lt;generates,\
+renders&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{705.05227716905051, 191.22492316822797}, {69, 24}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2112</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>2108</integer>
+ <key>Position</key>
+ <real>0.46593526005744934</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
<key>shadow</key>
<dict>
<key>Draws</key>
@@ -398,13 +879,18 @@
</dict>
<key>Text</key>
<dict>
+ <key>Align</key>
+ <integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
-\f0\fs24 \cf0 alembic.context}</string>
+\f0\fs20 \cf0 &lt;&lt;provides\
+operations&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>Wrap</key>
<string>NO</string>
@@ -415,14 +901,14 @@
<key>Head</key>
<dict>
<key>ID</key>
- <integer>2038</integer>
+ <integer>2098</integer>
</dict>
<key>ID</key>
- <integer>2040</integer>
+ <integer>2109</integer>
<key>Points</key>
<array>
- <string>{166.088, 336.6}</string>
- <string>{105.686, 336.6}</string>
+ <string>{850.5, 298.10002136230469}</string>
+ <string>{850.50001322861976, 238.37493896484375}</string>
</array>
<key>Style</key>
<dict>
@@ -430,6 +916,12 @@
<dict>
<key>HeadArrow</key>
<string>StickArrow</string>
+ <key>HopLines</key>
+ <true/>
+ <key>HopType</key>
+ <integer>102</integer>
+ <key>Legacy</key>
+ <true/>
<key>Pattern</key>
<integer>1</integer>
<key>TailArrow</key>
@@ -439,46 +931,113 @@
<key>Tail</key>
<dict>
<key>ID</key>
- <integer>41</integer>
+ <integer>2081</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>38</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2108</integer>
+ <key>Points</key>
+ <array>
+ <string>{781.00002098083496, 203.28096591495026}</string>
+ <string>{692.04400634765625, 203.16068579982147}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>StickArrow</string>
+ <key>Legacy</key>
+ <true/>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>2098</integer>
</dict>
</dict>
<dict>
<key>Bounds</key>
- <string>{{19, 294.6}, {86.1858, 84}}</string>
+ <string>{{623.48996514081955, 291.09998092651369}, {55, 12}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
<key>ID</key>
- <integer>2038</integer>
+ <integer>2107</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>2105</integer>
+ <key>Position</key>
+ <real>0.43473681807518005</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
<key>Shape</key>
- <string>Cylinder</string>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
<key>Text</key>
<dict>
+ <key>Align</key>
+ <integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
-\f0\fs24 \cf0 database}</string>
+\f0\fs20 \cf0 &lt;&lt;uses&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
+ <key>Wrap</key>
+ <string>NO</string>
</dict>
<dict>
<key>Bounds</key>
- <string>{{227.597, 278.569}, {55, 12}}</string>
+ <string>{{513.14304282962803, 197.37493856351756}, {55, 12}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
<string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
<key>ID</key>
- <integer>51</integer>
+ <integer>2106</integer>
<key>Line</key>
<dict>
<key>ID</key>
- <integer>50</integer>
- <key>Offset</key>
- <real>-20</real>
+ <integer>2104</integer>
<key>Position</key>
- <real>0.40689659118652344</real>
+ <real>0.3995765745639801</real>
<key>RotationType</key>
<integer>0</integer>
</dict>
@@ -502,13 +1061,17 @@
<key>Align</key>
<integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
\f0\fs20 \cf0 &lt;&lt;uses&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
+ <key>Wrap</key>
+ <string>NO</string>
</dict>
<dict>
<key>Class</key>
@@ -517,13 +1080,25 @@
<dict>
<key>ID</key>
<integer>41</integer>
+ <key>Info</key>
+ <integer>4</integer>
</dict>
<key>ID</key>
- <integer>50</integer>
+ <integer>2105</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <true/>
+ <key>OrthogonalBarPoint</key>
+ <string>{0, 0}</string>
+ <key>OrthogonalBarPosition</key>
+ <real>5.1000003814697266</real>
<key>Points</key>
<array>
- <string>{234.897, 263.6}</string>
- <string>{235.389, 315.6}</string>
+ <string>{781, 339.20153037537921}</string>
+ <string>{747, 331}</string>
+ <string>{744, 297.09998092651369}</string>
+ <string>{533, 272.33299255371094}</string>
+ <string>{526, 233}</string>
+ <string>{491.30664526513783, 232.60000610351562}</string>
</array>
<key>Style</key>
<dict>
@@ -531,6 +1106,10 @@
<dict>
<key>HeadArrow</key>
<string>StickArrow</string>
+ <key>Legacy</key>
+ <true/>
+ <key>LineType</key>
+ <integer>2</integer>
<key>Pattern</key>
<integer>1</integer>
<key>TailArrow</key>
@@ -540,26 +1119,69 @@
<key>Tail</key>
<dict>
<key>ID</key>
- <integer>33</integer>
+ <integer>2081</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>41</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2104</integer>
+ <key>Points</key>
+ <array>
+ <string>{572.95599365234375, 203}</string>
+ <string>{492.0880126953125, 203.93833970103648}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>StickArrow</string>
+ <key>HopLines</key>
+ <true/>
+ <key>HopType</key>
+ <integer>102</integer>
+ <key>Legacy</key>
+ <true/>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>38</integer>
</dict>
</dict>
<dict>
<key>Bounds</key>
- <string>{{308.265, 310.6}, {55, 12}}</string>
+ <string>{{392.47411627278478, 268.53371033283503}, {84, 12}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
<string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
<key>ID</key>
- <integer>49</integer>
+ <integer>2103</integer>
<key>Line</key>
<dict>
<key>ID</key>
- <integer>9</integer>
+ <integer>2102</integer>
<key>Offset</key>
- <real>-20</real>
+ <real>1</real>
<key>Position</key>
- <real>0.5199354887008667</real>
+ <real>0.46998947858810425</real>
<key>RotationType</key>
<integer>0</integer>
</dict>
@@ -583,13 +1205,17 @@
<key>Align</key>
<integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
-\f0\fs20 \cf0 &lt;&lt;uses&gt;&gt;}</string>
+\f0\fs20 \cf0 &lt;&lt;instantiates&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
+ <key>Wrap</key>
+ <string>NO</string>
</dict>
<dict>
<key>Class</key>
@@ -600,11 +1226,11 @@
<integer>41</integer>
</dict>
<key>ID</key>
- <integer>9</integer>
+ <integer>2102</integer>
<key>Points</key>
<array>
- <string>{368.99, 336.6}</string>
- <string>{305.088, 336.6}</string>
+ <string>{435.00741612193735, 298.09998092651369}</string>
+ <string>{436.00000000000011, 248}</string>
</array>
<key>Style</key>
<dict>
@@ -612,6 +1238,12 @@
<dict>
<key>HeadArrow</key>
<string>StickArrow</string>
+ <key>HopLines</key>
+ <true/>
+ <key>HopType</key>
+ <integer>102</integer>
+ <key>Legacy</key>
+ <true/>
<key>Pattern</key>
<integer>1</integer>
<key>TailArrow</key>
@@ -621,17 +1253,930 @@
<key>Tail</key>
<dict>
<key>ID</key>
- <integer>38</integer>
+ <integer>33</integer>
</dict>
</dict>
<dict>
+ <key>Bounds</key>
+ <string>{{320.83625227212906, 209.28763384458864}, {55, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2101</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>2040</integer>
+ <key>Position</key>
+ <real>0.39780238270759583</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs20 \cf0 &lt;&lt;uses&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
<key>Class</key>
<string>TableGroup</string>
<key>Graphics</key>
<array>
<dict>
<key>Bounds</key>
- <string>{{166.088, 315.6}, {139, 14}}</string>
+ <string>{{781.00002098083496, 168.37493896484375}, {139, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2099</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 alembic.operations.op}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{781.00002098083496, 182.37493896484375}, {139, 56}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2100</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs24 \cf0 CreateTableOp\
+AlterColumnOp\
+AddColumnOp\
+DropColumnOp}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GridH</key>
+ <array>
+ <integer>2099</integer>
+ <integer>2100</integer>
+ <array/>
+ </array>
+ <key>GroupConnect</key>
+ <string>YES</string>
+ <key>ID</key>
+ <integer>2098</integer>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{333.24926419826539, 462.28131709379346}, {78, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2090</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>2068</integer>
+ <key>Position</key>
+ <real>0.44118145108222961</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs20 \cf0 &lt;&lt;read/write&gt;&gt;}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>TableGroup</string>
+ <key>Graphics</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{781, 298.10002136230469}, {139, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2082</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 alembic.autogenerate}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{781, 312.10002136230469}, {139, 70}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2083</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs24 \cf0 compare_metadata()\
+produce_migrations()\
+compare\
+render\
+generate}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GridH</key>
+ <array>
+ <integer>2082</integer>
+ <integer>2083</integer>
+ <array/>
+ </array>
+ <key>GroupConnect</key>
+ <string>YES</string>
+ <key>ID</key>
+ <integer>2081</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0.032374100719424703, 0.5}</string>
+ <string>{-0.5071942446043165, -0.010850225176129769}</string>
+ <string>{0.52163523392711664, 0}</string>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0.24999999999999911}</string>
+ </array>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>TableGroup</string>
+ <key>Graphics</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{563, 322}, {139, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2073</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 alembic.command}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{563, 336}, {139, 70}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2074</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs24 \cf0 init()\
+revision()\
+upgrade()\
+downgrade()\
+history()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GridH</key>
+ <array>
+ <integer>2073</integer>
+ <integer>2074</integer>
+ <array/>
+ </array>
+ <key>GroupConnect</key>
+ <string>YES</string>
+ <key>ID</key>
+ <integer>2072</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0.032374100719424703, 0.5}</string>
+ <string>{-0.5071942446043165, -0.010850225176129769}</string>
+ <string>{0.26978417266187105, 0.50105453672863209}</string>
+ <string>{0.16675024238421798, -0.51583989461263036}</string>
+ <string>{0.5, 0.24999999999999911}</string>
+ <string>{0.50000000000000089, -0.010696321272922305}</string>
+ <string>{-0.50719424460431561, -0.28571428571428559}</string>
+ </array>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>2067</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2068</integer>
+ <key>Points</key>
+ <array>
+ <string>{426.78369522094727, 467.79283450278251}</string>
+ <string>{303.17371368408192, 468.90004920959467}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>StickArrow</string>
+ <key>HopLines</key>
+ <true/>
+ <key>HopType</key>
+ <integer>102</integer>
+ <key>Legacy</key>
+ <true/>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>2059</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>Group</string>
+ <key>Graphics</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{218.92971038818359, 448.71651649475098}, {74.487998962402344, 46}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>2066</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict/>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>1</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs20 \cf0 \expnd0\expndtw0\kerning0
+/versions/a.py\
+/versions/b.py\
+/versions/...}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{209.17371368408203, 424.9000186920166}, {94, 84}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>2067</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0.49999999999999911, -0.30952344621930905}</string>
+ <string>{0.49999999999999911, 0.023809887114024875}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict/>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 filesystem}</string>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>ID</key>
+ <integer>2065</integer>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>TableGroup</string>
+ <key>Graphics</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{426.78369522094727, 442.76912879943848}, {139, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2060</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 ScriptDirectory}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{426.78369522094727, 456.76912879943848}, {139, 42}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2061</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs24 \cf0 walk_revisions()\
+get_revision()\
+generate_revision()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GridH</key>
+ <array>
+ <integer>2060</integer>
+ <integer>2061</integer>
+ <array/>
+ </array>
+ <key>GroupConnect</key>
+ <string>YES</string>
+ <key>ID</key>
+ <integer>2059</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0.51040606996823534, 0.089285714285713524}</string>
+ <string>{0.25000000000000044, -0.50000000000000089}</string>
+ <string>{-0.50398241924039766, -0.053571428571430602}</string>
+ <string>{-0.00038529693823985411, 0.5357142857142847}</string>
+ <string>{0.5015561494895886, -0.29944872856140314}</string>
+ </array>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>2038</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2058</integer>
+ <key>Points</key>
+ <array>
+ <string>{259.5464429157899, 256.16651000976572}</string>
+ <string>{259.5464429157899, 299.49998778426624}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>StickArrow</string>
+ <key>Legacy</key>
+ <true/>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>2055</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>TableGroup</string>
+ <key>Graphics</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{208.09290313720703, 172.16651000976572}, {102.90709686279297, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2056</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 DefaultImpl}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{208.09290313720703, 186.16651000976572}, {102.90709686279297, 70}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2057</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs24 \cf0 execute()\
+create_table()\
+alter_column()\
+add_column()\
+drop_column()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GridH</key>
+ <array>
+ <integer>2056</integer>
+ <integer>2057</integer>
+ <array/>
+ </array>
+ <key>GroupConnect</key>
+ <string>YES</string>
+ <key>ID</key>
+ <integer>2055</integer>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>TableGroup</string>
+ <key>Graphics</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{713.35941696166992, 429.89997863769531}, {119.0880126953125, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2049</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 alembic.config}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{713.35941696166992, 443.89997863769531}, {119.0880126953125, 42}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>2050</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>GradientCenter</key>
+ <string>{-0.29411799999999999, -0.264706}</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
+
+\f0\fs24 \cf0 Config\
+Command\
+main()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GridH</key>
+ <array>
+ <integer>2049</integer>
+ <integer>2050</integer>
+ <array/>
+ </array>
+ <key>GroupConnect</key>
+ <string>YES</string>
+ <key>ID</key>
+ <integer>2048</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0.5, -4.4408920985006262e-16}</string>
+ <string>{-0.5, -0.25000000000000178}</string>
+ <string>{-0.1138779104937786, -0.5}</string>
+ <string>{-0.49999999999999911, 0.33902539955400712}</string>
+ </array>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>2055</integer>
+ </dict>
+ <key>ID</key>
+ <integer>2040</integer>
+ <key>Points</key>
+ <array>
+ <string>{373, 215.59905413254651}</string>
+ <string>{311, 214.81620239134219}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>StickArrow</string>
+ <key>Legacy</key>
+ <true/>
+ <key>Pattern</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>41</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{216.45355606079102, 299.9999877929688}, {86.1858, 84}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>2038</integer>
+ <key>Shape</key>
+ <string>Cylinder</string>
+ <key>Style</key>
+ <dict/>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 database}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>TableGroup</string>
+ <key>Graphics</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{373, 180.20000610351565}, {119.0880126953125, 14}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -646,28 +2191,28 @@
<dict>
<key>fill</key>
<dict>
- <key>GradientAngle</key>
- <real>304</real>
<key>GradientCenter</key>
- <string>{-0.294118, -0.264706}</string>
+ <string>{-0.29411799999999999, -0.264706}</string>
</dict>
</dict>
<key>Text</key>
<dict>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
\f0\b\fs24 \cf0 MigrationContext}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>TextPlacement</key>
<integer>0</integer>
</dict>
<dict>
<key>Bounds</key>
- <string>{{166.088, 329.6}, {139, 28}}</string>
+ <string>{{373, 194.20000610351565}, {119.0880126953125, 56}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -682,10 +2227,8 @@
<dict>
<key>fill</key>
<dict>
- <key>GradientAngle</key>
- <real>304</real>
<key>GradientCenter</key>
- <string>{-0.294118, -0.264706}</string>
+ <string>{-0.29411799999999999, -0.264706}</string>
</dict>
</dict>
<key>Text</key>
@@ -693,13 +2236,17 @@
<key>Align</key>
<integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
\f0\fs24 \cf0 connection\
-run_migrations()}</string>
+run_migrations()\
+execute()\
+stamp()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>TextPlacement</key>
<integer>0</integer>
@@ -715,6 +2262,14 @@ run_migrations()}</string>
<string>YES</string>
<key>ID</key>
<integer>41</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0.5, -0.16088094860684521}</string>
+ <string>{0.0042301604752394972, -0.5514285714285716}</string>
+ <string>{-0.49936690654431892, 0.0057142857142853387}</string>
+ <string>{0.49343873986566722, 0.24857142857142822}</string>
+ <string>{0.029020499831381219, 0.46857134137834766}</string>
+ </array>
</dict>
<dict>
<key>Class</key>
@@ -723,7 +2278,7 @@ run_migrations()}</string>
<array>
<dict>
<key>Bounds</key>
- <string>{{368.99, 294.6}, {139, 14}}</string>
+ <string>{{572.95599365234375, 175.59130477905273}, {119.0880126953125, 14}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -738,28 +2293,28 @@ run_migrations()}</string>
<dict>
<key>fill</key>
<dict>
- <key>GradientAngle</key>
- <real>304</real>
<key>GradientCenter</key>
- <string>{-0.294118, -0.264706}</string>
+ <string>{-0.29411799999999999, -0.264706}</string>
</dict>
</dict>
<key>Text</key>
<dict>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
\f0\b\fs24 \cf0 Operations}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>TextPlacement</key>
<integer>0</integer>
</dict>
<dict>
<key>Bounds</key>
- <string>{{368.99, 308.6}, {139, 70}}</string>
+ <string>{{572.95599365234375, 189.59130477905273}, {119.0880126953125, 70}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -774,10 +2329,8 @@ run_migrations()}</string>
<dict>
<key>fill</key>
<dict>
- <key>GradientAngle</key>
- <real>304</real>
<key>GradientCenter</key>
- <string>{-0.294118, -0.264706}</string>
+ <string>{-0.29411799999999999, -0.264706}</string>
</dict>
</dict>
<key>Text</key>
@@ -785,16 +2338,18 @@ run_migrations()}</string>
<key>Align</key>
<integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
\f0\fs24 \cf0 migration_context\
create_table()\
alter_column()\
add_column()\
drop_column()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>TextPlacement</key>
<integer>0</integer>
@@ -810,6 +2365,10 @@ drop_column()}</string>
<string>YES</string>
<key>ID</key>
<integer>38</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.49999999999999911, -0.17370600927443736}</string>
+ </array>
</dict>
<dict>
<key>Class</key>
@@ -818,7 +2377,7 @@ drop_column()}</string>
<array>
<dict>
<key>Bounds</key>
- <string>{{165, 179.6}, {139, 14}}</string>
+ <string>{{367.95599365234375, 298.09998092651369}, {129.176025390625, 14.000003814697266}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -833,28 +2392,28 @@ drop_column()}</string>
<dict>
<key>fill</key>
<dict>
- <key>GradientAngle</key>
- <real>304</real>
<key>GradientCenter</key>
- <string>{-0.294118, -0.264706}</string>
+ <string>{-0.29411799999999999, -0.264706}</string>
</dict>
</dict>
<key>Text</key>
<dict>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
\f0\b\fs24 \cf0 EnvironmentContext}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>TextPlacement</key>
<integer>0</integer>
</dict>
<dict>
<key>Bounds</key>
- <string>{{165, 193.6}, {139, 70}}</string>
+ <string>{{367.95599365234375, 312.09998855590823}, {129.176025390625, 70.000015258789062}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>FitText</key>
@@ -869,10 +2428,8 @@ drop_column()}</string>
<dict>
<key>fill</key>
<dict>
- <key>GradientAngle</key>
- <real>304</real>
<key>GradientCenter</key>
- <string>{-0.294118, -0.264706}</string>
+ <string>{-0.29411799999999999, -0.264706}</string>
</dict>
</dict>
<key>Text</key>
@@ -880,16 +2437,18 @@ drop_column()}</string>
<key>Align</key>
<integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
\f0\fs24 \cf0 migration_context\
configure()\
run_migrations()\
begin_transaction()\
is_offline_mode()}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>TextPlacement</key>
<integer>0</integer>
@@ -905,10 +2464,16 @@ is_offline_mode()}</string>
<string>YES</string>
<key>ID</key>
<integer>33</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0.5, -0.14544617445169949}</string>
+ <string>{0.019251798561151112, 0.50476190476190474}</string>
+ <string>{0.019070177820008194, -0.49999999999999956}</string>
+ </array>
</dict>
<dict>
<key>Bounds</key>
- <string>{{153.176, 149.6}, {164.824, 255}}</string>
+ <string>{{350, 148.9999938964844}, {164.82400000000001, 255.60000610351562}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>ID</key>
@@ -951,12 +2516,14 @@ is_offline_mode()}</string>
<key>Align</key>
<integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
\f0\fs24 \cf0 env.py script}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>TextPlacement</key>
<integer>0</integer>
@@ -965,11 +2532,16 @@ is_offline_mode()}</string>
</dict>
<dict>
<key>Bounds</key>
- <string>{{343.99, 259.266}, {189, 145.334}}</string>
+ <string>{{552, 149}, {169, 130.33299255371094}}</string>
<key>Class</key>
<string>ShapedGraphic</string>
<key>ID</key>
<integer>2032</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.43313956596913394, 0.50000000000000044}</string>
+ <string>{0.014211640211639676, 0.49587157857074082}</string>
+ </array>
<key>Shape</key>
<string>Rectangle</string>
<key>Style</key>
@@ -1008,12 +2580,14 @@ is_offline_mode()}</string>
<key>Align</key>
<integer>0</integer>
<key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
\f0\fs24 \cf0 migration script}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
</dict>
<key>TextPlacement</key>
<integer>0</integer>
@@ -1021,61 +2595,51 @@ is_offline_mode()}</string>
<string>NO</string>
</dict>
<dict>
- <key>Bounds</key>
- <string>{{138.176, 127.6}, {420.824, 293.4}}</string>
<key>Class</key>
- <string>ShapedGraphic</string>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>2048</integer>
+ </dict>
<key>ID</key>
- <integer>2037</integer>
- <key>Shape</key>
- <string>Rectangle</string>
+ <integer>2139</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <true/>
+ <key>OrthogonalBarPoint</key>
+ <string>{0, 0}</string>
+ <key>OrthogonalBarPosition</key>
+ <real>-1</real>
+ <key>Points</key>
+ <array>
+ <string>{435.00741612193735, 382.10000381469729}</string>
+ <string>{548, 421.9000186920166}</string>
+ <string>{601.38076234099412, 436}</string>
+ <string>{713.35941696166992, 443.8999786376952}</string>
+ </array>
<key>Style</key>
<dict>
- <key>fill</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>shadow</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- <key>Fuzziness</key>
- <real>0.0</real>
- </dict>
<key>stroke</key>
<dict>
- <key>Color</key>
- <dict>
- <key>b</key>
- <string>0.191506</string>
- <key>g</key>
- <string>0.389204</string>
- <key>r</key>
- <string>0.744565</string>
- </dict>
- <key>CornerRadius</key>
- <real>5</real>
+ <key>HeadArrow</key>
+ <string>StickArrow</string>
+ <key>Legacy</key>
+ <true/>
+ <key>LineType</key>
+ <integer>2</integer>
<key>Pattern</key>
<integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
</dict>
</dict>
- <key>Text</key>
+ <key>Tail</key>
<dict>
- <key>Align</key>
- <integer>0</integer>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
-
-\f0\fs24 \cf0 alembic command}</string>
+ <key>ID</key>
+ <integer>33</integer>
+ <key>Info</key>
+ <integer>2</integer>
</dict>
- <key>TextPlacement</key>
- <integer>0</integer>
- <key>Wrap</key>
- <string>NO</string>
</dict>
</array>
<key>GridInfo</key>
@@ -1085,11 +2649,9 @@ is_offline_mode()}</string>
<key>GuidesVisible</key>
<string>YES</string>
<key>HPages</key>
- <integer>1</integer>
+ <integer>2</integer>
<key>ImageCounter</key>
<integer>1</integer>
- <key>IsPalette</key>
- <string>NO</string>
<key>KeepToScale</key>
<false/>
<key>Layers</key>
@@ -1106,78 +2668,28 @@ is_offline_mode()}</string>
</dict>
</array>
<key>LayoutInfo</key>
- <dict/>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
<key>LinksVisible</key>
<string>NO</string>
<key>MagnetsVisible</key>
<string>NO</string>
- <key>MasterSheet</key>
- <string>Master 1</string>
<key>MasterSheets</key>
- <array>
- <dict>
- <key>ActiveLayerIndex</key>
- <integer>0</integer>
- <key>AutoAdjust</key>
- <true/>
- <key>CanvasColor</key>
- <dict>
- <key>w</key>
- <string>1</string>
- </dict>
- <key>CanvasOrigin</key>
- <string>{0, 0}</string>
- <key>CanvasScale</key>
- <real>1</real>
- <key>ColumnAlign</key>
- <integer>1</integer>
- <key>ColumnSpacing</key>
- <real>36</real>
- <key>DisplayScale</key>
- <string>1 in = 1 in</string>
- <key>GraphicsList</key>
- <array/>
- <key>GridInfo</key>
- <dict/>
- <key>HPages</key>
- <integer>1</integer>
- <key>IsPalette</key>
- <string>NO</string>
- <key>KeepToScale</key>
- <false/>
- <key>Layers</key>
- <array>
- <dict>
- <key>Lock</key>
- <string>NO</string>
- <key>Name</key>
- <string>Layer 1</string>
- <key>Print</key>
- <string>YES</string>
- <key>View</key>
- <string>YES</string>
- </dict>
- </array>
- <key>LayoutInfo</key>
- <dict/>
- <key>Orientation</key>
- <integer>2</integer>
- <key>OutlineStyle</key>
- <string>Basic</string>
- <key>RowAlign</key>
- <integer>1</integer>
- <key>RowSpacing</key>
- <real>36</real>
- <key>SheetTitle</key>
- <string>Master 1</string>
- <key>UniqueID</key>
- <integer>1</integer>
- <key>VPages</key>
- <integer>1</integer>
- </dict>
- </array>
+ <array/>
<key>ModificationDate</key>
- <string>2012-01-24 17:59:01 -0500</string>
+ <string>2015-07-02 23:12:07 +0000</string>
<key>Modifier</key>
<string>classic</string>
<key>NotesVisible</key>
@@ -1189,35 +2701,47 @@ is_offline_mode()}</string>
<key>OutlineStyle</key>
<string>Basic</string>
<key>PageBreaks</key>
- <string>YES</string>
+ <string>NO</string>
<key>PrintInfo</key>
<dict>
<key>NSBottomMargin</key>
<array>
+ <string>float</string>
+ <string>12</string>
+ </array>
+ <key>NSHorizonalPagination</key>
+ <array>
<string>coded</string>
- <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG</string>
+ <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG</string>
</array>
<key>NSLeftMargin</key>
<array>
- <string>coded</string>
- <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG</string>
+ <string>float</string>
+ <string>12</string>
</array>
<key>NSPaperSize</key>
<array>
<string>size</string>
<string>{612, 792}</string>
</array>
+ <key>NSPrintReverseOrientation</key>
+ <array>
+ <string>int</string>
+ <string>0</string>
+ </array>
<key>NSRightMargin</key>
<array>
- <string>coded</string>
- <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG</string>
+ <string>float</string>
+ <string>12</string>
</array>
<key>NSTopMargin</key>
<array>
- <string>coded</string>
- <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG</string>
+ <string>float</string>
+ <string>12</string>
</array>
</dict>
+ <key>PrintOnePage</key>
+ <false/>
<key>ReadOnly</key>
<string>NO</string>
<key>RowAlign</key>
@@ -1239,25 +2763,33 @@ is_offline_mode()}</string>
<key>WindowInfo</key>
<dict>
<key>CurrentSheet</key>
- <string>0</string>
- <key>DrawerOpen</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array/>
+ <key>Frame</key>
+ <string>{{130, 128}, {1193, 852}}</string>
+ <key>ListView</key>
<false/>
- <key>DrawerTab</key>
- <string>Outline</string>
- <key>DrawerWidth</key>
- <real>209</real>
- <key>FitInWindow</key>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
<false/>
- <key>Frame</key>
- <string>{{335, 211}, {760, 817}}</string>
- <key>ShowRuler</key>
+ <key>Sidebar</key>
<false/>
- <key>ShowStatusBar</key>
- <true/>
+ <key>SidebarWidth</key>
+ <integer>138</integer>
<key>VisibleRegion</key>
- <string>{{-84, 0}, {745, 703}}</string>
+ <string>{{-8, 1}, {1193, 755}}</string>
<key>Zoom</key>
- <string>1</string>
+ <real>1</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </array>
</dict>
</dict>
</plist>
diff --git a/docs/build/index.rst b/docs/build/index.rst
index de18f9e..17ffc06 100644
--- a/docs/build/index.rst
+++ b/docs/build/index.rst
@@ -6,7 +6,7 @@ Welcome to Alembic's documentation!
with the `SQLAlchemy <http://www.sqlalchemy.org>`_ Database Toolkit for Python.
.. toctree::
- :maxdepth: 2
+ :maxdepth: 3
front
tutorial
@@ -17,7 +17,7 @@ with the `SQLAlchemy <http://www.sqlalchemy.org>`_ Database Toolkit for Python.
branches
ops
cookbook
- api
+ api/index
changelog
Indices and tables