diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-07-03 13:10:41 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-07-03 13:10:41 -0400 |
commit | 0e43247da4cfd2d829ee4b350e336364cb8a7ec1 (patch) | |
tree | b98e97333832e8db5f3c983f42771a2c15936ccc /docs/build | |
parent | 5ccc81701c08a482efa4b7080ca88608fd237130 (diff) | |
download | alembic-0e43247da4cfd2d829ee4b350e336364cb8a7ec1.tar.gz |
- squash merge of ticket_302 branch
- The internal system for Alembic operations has been reworked to now
build upon an extensible system of operation objects. New operations
can be added to the ``op.`` namespace, including that they are
available in custom autogenerate schemes. fixes #302
- The internal system for autogenerate been reworked to build upon
the extensible system of operation objects present in #302.
A new customization hook process_revision_directives is added
to allow manipulation of the autogen stream. Fixes #301
Diffstat (limited to 'docs/build')
-rw-r--r-- | docs/build/api.rst | 217 | ||||
-rw-r--r-- | docs/build/api/api_overview.png | bin | 0 -> 123965 bytes | |||
-rw-r--r-- | docs/build/api/autogenerate.rst | 235 | ||||
-rw-r--r-- | docs/build/api/commands.rst | 38 | ||||
-rw-r--r-- | docs/build/api/config.rst | 26 | ||||
-rw-r--r-- | docs/build/api/ddl.rst | 56 | ||||
-rw-r--r-- | docs/build/api/environment.rst | 19 | ||||
-rw-r--r-- | docs/build/api/index.rst | 33 | ||||
-rw-r--r-- | docs/build/api/migration.rst | 8 | ||||
-rw-r--r-- | docs/build/api/operations.rst | 123 | ||||
-rw-r--r-- | docs/build/api/overview.rst | 47 | ||||
-rw-r--r-- | docs/build/api/script.rst | 20 | ||||
-rw-r--r-- | docs/build/api_overview.png | bin | 64697 -> 0 bytes | |||
-rw-r--r-- | docs/build/assets/api_overview.graffle | 2252 | ||||
-rw-r--r-- | docs/build/changelog.rst | 38 | ||||
-rw-r--r-- | docs/build/cookbook.rst | 2 | ||||
-rw-r--r-- | docs/build/front.rst | 19 | ||||
-rw-r--r-- | docs/build/index.rst | 4 | ||||
-rw-r--r-- | docs/build/ops.rst | 18 |
19 files changed, 2556 insertions, 599 deletions
diff --git a/docs/build/api.rst b/docs/build/api.rst deleted file mode 100644 index fea4e14..0000000 --- a/docs/build/api.rst +++ /dev/null @@ -1,217 +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.environment - :members: - -The Migration Context -===================== - -.. automodule:: alembic.migration - :members: - -The Operations Object -===================== - -Within migration scripts, actual database migration operations are handled -via an instance of :class:`.Operations`. See :ref:`ops` for an overview -of this object. - -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.revision - :members: - -Autogeneration -============== - -Alembic 0.3 introduces a small portion of the autogeneration system -as a public API. - -.. autofunction:: alembic.autogenerate.compare_metadata - -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 Binary files differnew file mode 100644 index 0000000..37e7312 --- /dev/null +++ b/docs/build/api/api_overview.png diff --git a/docs/build/api/autogenerate.rst b/docs/build/api/autogenerate.rst new file mode 100644 index 0000000..b024ab1 --- /dev/null +++ b/docs/build/api/autogenerate.rst @@ -0,0 +1,235 @@ +.. _alembic.autogenerate.toplevel: + +============== +Autogeneration +============== + +The autogenerate system has two areas of API that are public: + +1. The ability to do a "diff" of a :class:`~sqlalchemy.schema.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..65dcc09 --- /dev/null +++ b/docs/build/api/commands.rst @@ -0,0 +1,38 @@ +.. _alembic.command.toplevel: + +========= +Commands +========= + +Alembic commands are all represented by functions in the :ref:`alembic.command.toplevel` +package. They all accept the same style of usage, being sent +the :class:`.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. + +.. automodule:: alembic.command + :members: diff --git a/docs/build/api/config.rst b/docs/build/api/config.rst new file mode 100644 index 0000000..25d934f --- /dev/null +++ b/docs/build/api/config.rst @@ -0,0 +1,26 @@ +.. _alembic.config.toplevel: + +============== +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 :ref:`alembic.command.toplevel` + 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`. + +.. automodule:: alembic.config + :members: diff --git a/docs/build/api/ddl.rst b/docs/build/api/ddl.rst new file mode 100644 index 0000000..2d114c8 --- /dev/null +++ b/docs/build/api/ddl.rst @@ -0,0 +1,56 @@ +.. _alembic.ddl.toplevel: + +============= +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 :ref:`sqlalchemy.ext.compiler_toplevel` systems. + +For programmatic usage of Alembic's migration directives, the easiest +route is to use the higher level functions given by :ref:`alembic.operations.toplevel`. + +.. 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..5a22773 --- /dev/null +++ b/docs/build/api/environment.rst @@ -0,0 +1,19 @@ +.. _alembic.runtime.environment.toplevel: + +======================= +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..aa7c1a9 --- /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..ae74818 --- /dev/null +++ b/docs/build/api/migration.rst @@ -0,0 +1,8 @@ +.. _alembic.runtime.migration.toplevel: + +===================== +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..d9ff238 --- /dev/null +++ b/docs/build/api/operations.rst @@ -0,0 +1,123 @@ +.. _alembic.operations.toplevel: + +===================== +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 ``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.compiler_toplevel`. + +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 ``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. + +.. _alembic.operations.ops.toplevel: + +.. 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..048d1e6 --- /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 :ref:`alembic.config.toplevel` module. +This module produces a :class:`.Config` object and passes it to the +appropriate function in :ref:`alembic.command.toplevel`. Functions within +:ref:`alembic.command.toplevel` 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 :ref:`alembic.operations.ops.toplevel` module. + +Another prominent feature of Alembic is the "autogenerate" feature, which +produces new migration scripts that contain Python code. The autogenerate +feature starts in :ref:`alembic.autogenerate.toplevel`, 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 :ref:`alembic.operations.ops.toplevel` 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..8dc594b --- /dev/null +++ b/docs/build/api/script.rst @@ -0,0 +1,20 @@ +.. _alembic.script.toplevel: + +================ +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 Binary files differdeleted file mode 100644 index dab204b..0000000 --- a/docs/build/api_overview.png +++ /dev/null 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 <<proxies>>}</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 <<instantiates>>}</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 <<proxies>>}</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 <<instantiates>>}</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 <<uses>>}</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 <<uses>>}</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 <<invokes>>}</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 <<configures>>}</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 <<generates,\ +renders>>}</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 <<provides\ +operations>>}</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 <<uses>>}</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 <<uses>>}</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 <<uses>>}</string> +\f0\fs20 \cf0 <<instantiates>>}</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 <<uses>>}</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 <<read/write>>}</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/changelog.rst b/docs/build/changelog.rst index 193c87f..8fd6293 100644 --- a/docs/build/changelog.rst +++ b/docs/build/changelog.rst @@ -4,6 +4,44 @@ Changelog ========== .. changelog:: + :version: 0.8.0 + + .. change:: + :tags: feature, operations + :tickets: 302 + + The internal system for Alembic operations has been reworked to now + build upon an extensible system of operation objects. New operations + can be added to the ``op.`` namespace, including that they are + available in custom autogenerate schemes. + + .. seealso:: + + :ref:`operation_plugins` + + .. change:: + :tags: feature, autogenerate + :tickets: 301 + + The internal system for autogenerate been reworked to build upon + the extensible system of operation objects present in + :ticket:`302`. As part of this change, autogenerate now produces + a full object graph representing a list of migration scripts to + be written as well as operation objects that will render all the + Python code within them; a new hook + :paramref:`.EnvironmentContext.configure.process_revision_directives` + allows end-user code to fully customize what autogenerate will do, + including not just full manipulation of the Python steps to take + but also what file or files will be written and where. It is also + possible to write a system that reads an autogenerate stream and + invokes it directly against a database without writing any files. + + .. seealso:: + + :ref:`alembic.autogenerate.toplevel` + + +.. changelog:: :version: 0.7.7 .. change:: diff --git a/docs/build/cookbook.rst b/docs/build/cookbook.rst index 8c1e0d7..541f595 100644 --- a/docs/build/cookbook.rst +++ b/docs/build/cookbook.rst @@ -193,7 +193,7 @@ Sharing a Connection with a Series of Migration Commands and Environments ========================================================================= It is often the case that an application will need to call upon a series -of commands within :mod:`alembic.command`, where it would be advantageous +of commands within :ref:`alembic.command.toplevel`, where it would be advantageous for all operations to proceed along a single transaction. The connectivity for a migration is typically solely determined within the ``env.py`` script of a migration environment, which is called within the scope of a command. diff --git a/docs/build/front.rst b/docs/build/front.rst index 3270f5c..6e28419 100644 --- a/docs/build/front.rst +++ b/docs/build/front.rst @@ -49,25 +49,19 @@ then proceed through the usage of this command. Dependencies ------------ -Alembic's install process will ensure that `SQLAlchemy <http://www.sqlalchemy.org>`_ +Alembic's install process will ensure that SQLAlchemy_ is installed, in addition to other dependencies. Alembic will work with -SQLAlchemy as of version **0.7.3**. The latest version of SQLAlchemy within -the **0.7**, **0.8**, or more recent series is strongly recommended. +SQLAlchemy as of version **0.7.3**, however more features are available with +newer versions such as the 0.9 or 1.0 series. Alembic supports Python versions 2.6 and above. -.. versionchanged:: 0.5.0 - Support for SQLAlchemy 0.6 has been dropped. - -.. versionchanged:: 0.6.0 - Now supporting Python 2.6 and above. - Community ========= Alembic is developed by `Mike Bayer <http://techspot.zzzeek.org>`_, and is -loosely associated with the `SQLAlchemy <http://www.sqlalchemy.org/>`_ and `Pylons <http://www.pylonsproject.org>`_ -projects. +loosely associated with the SQLAlchemy_, `Pylons <http://www.pylonsproject.org>`_, +and `Openstack <http://www.openstack.org>`_ projects. User issues, discussion of potential bugs and features should be posted to the Alembic Google Group at `sqlalchemy-alembic <https://groups.google.com/group/sqlalchemy-alembic>`_. @@ -78,3 +72,6 @@ Bugs ==== Bugs and feature enhancements to Alembic should be reported on the `Bitbucket issue tracker <https://bitbucket.org/zzzeek/alembic/issues?status=new&status=open>`_. + + +.. _SQLAlchemy: http://www.sqlalchemy.org
\ No newline at end of file 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 diff --git a/docs/build/ops.rst b/docs/build/ops.rst index 1df9d27..49aaef5 100644 --- a/docs/build/ops.rst +++ b/docs/build/ops.rst @@ -7,8 +7,8 @@ Operation Reference This file provides documentation on Alembic migration directives. The directives here are used within user-defined migration files, -within the ``upgrade()`` and ``downgrade()`` functions, as well as -any functions further invoked by those. +within the ``upgrade()`` and ``downgrade()`` functions, as well as +any functions further invoked by those. All directives exist as methods on a class called :class:`.Operations`. When migration scripts are run, this object is made available @@ -18,12 +18,15 @@ Currently, ``alembic.op`` is a real Python module, populated with individual proxies for each method on :class:`.Operations`, so symbols can be imported safely from the ``alembic.op`` namespace. -A key design philosophy to the :mod:`alembic.operations` methods is that -to the greatest degree possible, they internally generate the +The :class:`.Operations` system is also fully extensible. See +:ref:`operation_plugins` for details on this. + +A key design philosophy to the :ref:`alembic.operations.toplevel` methods is that +to the greatest degree possible, they internally generate the appropriate SQLAlchemy metadata, typically involving :class:`~sqlalchemy.schema.Table` and :class:`~sqlalchemy.schema.Constraint` -objects. This so that migration instructions can be -given in terms of just the string names and/or flags involved. +objects. This so that migration instructions can be +given in terms of just the string names and/or flags involved. The exceptions to this rule include the :meth:`~.Operations.add_column` and :meth:`~.Operations.create_table` directives, which require full :class:`~sqlalchemy.schema.Column` @@ -36,6 +39,5 @@ circumstances they are called from an actual migration script, which itself would be invoked by the :meth:`.EnvironmentContext.run_migrations` method. - .. automodule:: alembic.operations - :members: + :members: Operations, BatchOperations |