§ }<ˆjBÁãóø—ddlmZddlmZddlmZddlZddlZddlmZddlm Z ddlm Z ddlm Z dd lm Z dd lm Z dd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZ ddl!m"Z"ddl#m$Z$ddl#m%Z%ddl%m&Z&dd l'm(Z(erNdd!lm)Z)dd"lm*Z*dd#l+m,Z,dd$l+m-Z-dd%l.m/Z/dd&l0m1Z1d'd(l2m3Z3dd)l4m5Z5dd*l6m7Z7dd+l6m8Z8dd,l9m:Z:dd-l9m;Z;dd.l9m¦«Z?Gd/„d0¦«Z@Gd1„d2¦«ZAGd3„d4¦«ZBGd5„d6¦«ZCGd7„d8¦«ZDGd9„d:eD¦«ZEGd;„d©r8Úts r9rBz_ProxyTransaction.rollback@s1€Ø Ô %ˆØˆ}ˆ}ˆ}Ø � Š ‰ Œ ˆ Ø.2ˆÔÔ+Ð+Ð+r;có\—|j}|€J‚| ¦«d|j_dSr7)r@Úcommitr2r>rCs r9rFz_ProxyTransaction.commitFs1€Ø Ô %ˆØˆ}ˆ}ˆ}Ø �Љ Œ ˆ Ø.2ˆÔÔ+Ð+Ð+r;có—|Sr7©r?s r9Ú __enter__z_ProxyTransaction.__enter__Ls€Øˆ r;Útype_rÚvalueÚ tracebackcóh—|j�*|j |||¦«d|j_dSdSr7)r@Ú__exit__r2r>)r8rJrKrLs r9rNz_ProxyTransaction.__exit__Os?€Ø Ô $Ð 0Ø Ô %× .Ò .¨u°e¸YÑ GÔ GÐ GØ26ˆDÔ "Ô /Ð /Ð /ð 1Ð 0r;N)r2r3r4r5)r4r<)r4r5)r4r1)rJrrKrrLrr4r5) Ú__name__Ú __module__Ú __qualname__r:Úpropertyr@rBrFrIrNrHr;r9r1r18s˜€€€€€ð3ð3ð3ð3ðð3ð3ð3ñ„Xð3ð3ð3ð3ð3ð 3ð3ð3ð3ð ðððð7ð7ð7ð7ð7ð7r;r1cóø—eZdZdZ d?d@d „Ze dAdBd„¦«ZedCd„¦«Z dDdEd„Z dFd„Z dGd „Z dDdHd"„Z dId#„Z dJd(„ZdKd+„ZdId,„Z d?dLd1„ZdMd3„ZedNd4„¦«ZedOd6„¦«ZdPd;„ZdQd>„ZdS)Rr3a‚Represent the database state made available to a migration script. :class:`.MigrationContext` is the front end to an actual database connection, or alternatively a string output stream given a particular database dialect, from an Alembic perspective. When inside the ``env.py`` script, the :class:`.MigrationContext` is available via the :meth:`.EnvironmentContext.get_context` method, which is available at ``alembic.context``:: # from within env.py script from alembic import context migration_context = context.get_context() For usage outside of an ``env.py`` script, such as for utility routines that want to check the current version in the database, the :meth:`.MigrationContext.configure` method to create new :class:`.MigrationContext` objects. For example, to get at the current revision in the database using :meth:`.MigrationContext.get_current_revision`:: # in any application, outside of an env.py script from alembic.migration import MigrationContext from sqlalchemy import create_engine engine = create_engine("postgresql://mydatabase") conn = engine.connect() context = MigrationContext.configure(conn) current_rev = context.get_current_revision() The above context can also be used to produce Alembic migration operations with an :class:`.Operations` instance:: # in any application, outside of the normal Alembic environment from alembic.operations import Operations op = Operations(context) op.alter_column("mytable", "somecolumn", nullable=True) NÚdialectr"Ú connectionúOptional[Connection]ÚoptsúDict[str, Any]Úenvironment_contextúOptional[EnvironmentContext]r4r5c ó—||_||_||_| d¦«|_| dd¦«}| d¦«}| dd¦«|_| dd¦«|_d|_|rDttd|  |¦«¦«|_ |j €J‚d|_ n ||_ tj|¦«|_ | d ¦«|_||_| d d¦«|_d |vr;t%| d ¦«p t&j|d ¦«|_n%| d t&j¦«|_| d d¦«|_| dd¦«|_| dd¦«x|_}| dd¦«x|_}t5|t7¦«t9dt;d¦«d¬¦«|¬¦«|_| dd¦«r,|j tAdd|z¬¦«¦«| d¦«|_!tEj# $|¦«||j |j||j|¦«|_%tL 'd|j%j(j)¦«|jrtL 'd¦«tL 'd|j%j*rdnd¦«dS) NÚscriptÚas_sqlFÚtransactional_ddlÚtransaction_per_migrationÚon_version_applyrHr$ÚfnÚpurgeÚoutput_encodingÚ output_bufferÚ compare_typeÚcompare_server_defaultÚ version_tableÚalembic_versionÚversion_table_schemaÚ version_numé )Únullable)ÚschemaÚversion_table_pkTz%s_pkc)ÚnameÚ starting_revzContext impl %s.zGenerating static SQLzWill assume %s DDL.Ú transactionalznon-transactional)+rYrWrTÚgetr\Ú_transaction_per_migrationÚon_version_apply_callbacksr>rrÚ_stdout_connectionrUÚ_in_external_transactionr Ú_get_connection_in_transactionÚ_migrations_fnr]rbr!ÚsysÚstdoutrdÚ_user_compare_typeÚ_user_compare_server_defaultrgrirrrrÚ_versionÚappend_constraintrÚ_start_from_revrÚ DefaultImplÚget_by_dialectÚimplÚlogÚinfoÚ __class__rOr^) r8rTrUrWrYr]r^rgris r9r:zMigrationContext.__init__†sT€ð$7ˆÔ ؈Œ ؈Œ Ø15·²¸(Ñ1CÔ1CˆŒ Ø—x’x ¨%Ñ0Ô0ˆØ ŸHšHÐ%8Ñ9Ô9ÐØ*.¯(ª(Ø '¨ñ+ ô+ ˆÔ'ð+/¯(ª(Ð3EÀrÑ*JÔ*JˆÔ'Ø37ˆÔà ð Ý"ݘÔ&¨×(?Ò(?À Ñ(KÔ(KñôˆDŒOð”?Ð.Ð.Ð.Ø,1ˆDÔ )Ð )à(ˆDŒOåÔ:¸:ÑFÔFð Ô )ð �HŠH�T‰NŒNð ÔðˆŒ à—X’X˜g uÑ-Ô-ˆŒ à  Ð $Ð $Ý!*Ø—’˜Ñ)Ô)ðÝ”:ØÐ&Ô'ñ"ô"ˆDÔ Ð ð "&§¢¨/½3¼:Ñ!FÔ!FˆDÔ à"&§(¢(¨>¸5Ñ"AÔ"AˆÔØ,0¯HªHØ $ eñ- ô- ˆÔ)ð.2¯XªXØ Ð.ñ. ô. ð ˆÔ˜]ð<@¿8º8Ø " Dñ< ô< ð ˆÔ!Ð$8õØ Ý ‰JŒJÝ �=¥&¨¡*¤*°uÐ =Ñ =Ô =Ø'ð  ñ ô ˆŒ ð �8Š8Ð&¨Ñ -Ô -ð Ø ŒM× +Ò +Ý$Ø!¨°=Ñ(@ðñôñ ô ð ð /3¯hªh°~Ñ.FÔ.FˆÔÝ”O×2Ò2°7Ñ;Ô;Ø Ø ŒOØ ŒKØ Ø Ô Ø ñ  ô ˆŒ õ �ŠÐ# T¤YÔ%8Ô%AÑBÔBÐBØ Œ;ð .Ý �HŠHÐ,Ñ -Ô -Ð -Ý �ŠØ !àŒyÔ*ð %ˆOˆOà$ñ  ô ð ð ð r;rúOptional[Union[str, URL]]Ú dialect_nameú Optional[str]úOptional[Dialect]Ú dialect_optsúOptional[Dict[str, str]]ú Optional[Any]có–—|€i}|€i}|r4t|t¦«rtjd|z¦«‚|j}nv|r/t j|¦«}| ¦«di|¤Ž}nE|r2t jd|z¦«}| ¦«di|¤Ž}n|std¦«‚|€J‚t||||¦«S)a¥Create a new :class:`.MigrationContext`. This is a factory method usually called by :meth:`.EnvironmentContext.configure`. :param connection: a :class:`~sqlalchemy.engine.Connection` to use for SQL execution in "online" mode. When present, is also used to determine the type of dialect in use. :param url: a string database url, or a :class:`sqlalchemy.engine.url.URL` object. The type of dialect to be used will be derived from this if ``connection`` is not passed. :param dialect_name: string name of a dialect, such as "postgresql", "mssql", etc. The type of dialect to be used will be derived from this if ``connection`` and ``url`` are not passed. :param opts: dictionary of options. Most other options accepted by :meth:`.EnvironmentContext.configure` are passed via this dictionary. Nzf'connection' argument to configure() is expected to be a sqlalchemy.engine.Connection instance, got %rz%s://z-Connection, url, or dialect_name is required.rH) Ú isinstancerrÚ CommandErrorrTÚsqla_urlÚmake_urlÚ get_dialectÚ Exceptionr3) ÚclsrUrr‡rTrYrŠrWÚurl_objs r9Ú configurezMigrationContext.configureßs€ð> ˆ<؈DØ Ð ØˆLà ð Mݘ*¥fÑ-Ô-ð ÝÔ'ðà)ñ*ñôðð !Ô(ˆGˆGØ ð MÝÔ'¨Ñ,Ô,ˆGØ+�g×)Ò)Ñ+Ô+Ð;Ð;¨lÐ;Ð;ˆGˆGØ ð MÝÔ'¨°,Ñ(>Ñ?Ô?ˆGØ+�g×)Ò)Ñ+Ô+Ð;Ð;¨lÐ;Ð;ˆGˆGØð MÝÐKÑLÔLÐ LØÐ"Ð"Ð"Ý ¨°TÐ;NÑOÔOÐOr;úIterator[None]c#óŠK—| ¦«}|jjr!|jr|j ¦«n+|r)|j€J‚|j ¦«d|_|jsj|j€J‚|j ¦«}|j}|  d¬¦«x|_|j_|j  ¦«}nd} dV—|jsM|j€J‚|�| ¦«|j  |¬¦«|x|_|j_|jjr"|jr|j  ¦«dS|r)|j€J‚|j  ¦«|_dSdS#|jsM|j€J‚|�| ¦«|j  |¬¦«|x|_|j_|jjr!|jr|j  ¦«n)|r'|j€J‚|j  ¦«|_wxYw)amEnter an "autocommit" block, for databases that support AUTOCOMMIT isolation levels. This special directive is intended to support the occasional database DDL or system operation that specifically has to be run outside of any kind of transaction block. The PostgreSQL database platform is the most common target for this style of operation, as many of its DDL operations must be run outside of transaction blocks, even though the database overall supports transactional DDL. The method is used as a context manager within a migration script, by calling on :meth:`.Operations.get_context` to retrieve the :class:`.MigrationContext`, then invoking :meth:`.MigrationContext.autocommit_block` using the ``with:`` statement:: def upgrade(): with op.get_context().autocommit_block(): op.execute("ALTER TYPE mood ADD VALUE 'soso'") Above, a PostgreSQL "ALTER TYPE..ADD VALUE" directive is emitted, which must be run outside of a transaction block at the database level. The :meth:`.MigrationContext.autocommit_block` method makes use of the SQLAlchemy ``AUTOCOMMIT`` isolation level setting, which against the psycogp2 DBAPI corresponds to the ``connection.autocommit`` setting, to ensure that the database driver is not inside of a DBAPI level transaction block. .. warning:: As is necessary, **the database transaction preceding the block is unconditionally committed**. This means that the run of migrations preceding the operation will be committed, before the overall migration operation is complete. It is recommended that when an application includes migrations with "autocommit" blocks, that :paramref:`.EnvironmentContext.transaction_per_migration` be used so that the calling environment is tuned to expect short per-file migrations whether or not one of them has an autocommit block. .. versionadded:: 1.2.0 NÚ AUTOCOMMIT)Úisolation_level) Ú_in_connection_transactionr‚r^r]Ú emit_commitr>rFrUÚget_isolation_levelÚexecution_optionsÚbeginÚ emit_begin)r8r›Ú current_levelÚbase_connectionÚ fake_transs r9Úautocommit_blockz!MigrationContext.autocommit_blocks¢èè€ð^&*×%DÒ%DÑ%FÔ%FÐ"à Œ9Ô &ð %¨4¬;ð %Ø ŒI× !Ò !Ñ #Ô #Ð #Ð #à 'ð %ØÔ$Ð0Ð0Ð0à Ô × $Ò $Ñ &Ô &Ð &Ø $ˆDÔ àŒ{ð Ø”?Ð.Ð.Ð.Ø œO×?Ò?ÑAÔAˆMØ"œoˆOð ×1Ò1À,Ð1ÑOÔOð PˆDŒOØ” Ô$ð 15´×0EÒ0EÑ0GÔ0GˆJˆJàˆJð <Ø ˆEˆEˆEà”;ð IØ”Ð2Ð2Ð2ØÐ)Ø×%Ò%Ñ'Ô'Ð'Ø”×1Ò1Ø$1ð2ñôðð:IÐH�” $¤)Ô"6àŒyÔ*ð <¨t¬{ð <Ø” ×$Ò$Ñ&Ô&Ð&Ð&Ð&à+ð <Ø”Ð2Ð2Ð2Ø$(¤O×$9Ò$9Ñ$;Ô$;�Ô!Ð!Ð!ð <ð <øð”;ð IØ”Ð2Ð2Ð2ØÐ)Ø×%Ò%Ñ'Ô'Ð'Ø”×1Ò1Ø$1ð2ñôðð:IÐH�” $¤)Ô"6àŒyÔ*ð <¨t¬{ð <Ø” ×$Ò$Ñ&Ô&Ð&Ð&à+ð <Ø”Ð2Ð2Ð2Ø$(¤O×$9Ò$9Ñ$;Ô$;�Ô!Ð;Ð;Ð;Ð;s Ã#FÆB,IFÚ_per_migrationÚboolú.Union[_ProxyTransaction, ContextManager[None]]có ‡—‰jrt¦«S‰jjr |‰jk}n|du}|st¦«S‰jjsh|sJ‚‰jrt¦«S‰jdu}|rt¦«S‰j€J‚tj ‰j¦«‰_t‰¦«S‰jrtˆfd„¦«}|¦«S‰j€J‚tj ‰j¦«‰_t‰¦«S)aûBegin a logical transaction for migration operations. This method is used within an ``env.py`` script to demarcate where the outer "transaction" for a series of migrations begins. Example:: def run_migrations_online(): connectable = create_engine(...) with connectable.connect() as connection: context.configure( connection=connection, target_metadata=target_metadata ) with context.begin_transaction(): context.run_migrations() Above, :meth:`.MigrationContext.begin_transaction` is used to demarcate where the outer logical transaction occurs around the :meth:`.MigrationContext.run_migrations` operation. A "Logical" transaction means that the operation may or may not correspond to a real database transaction. If the target database supports transactional DDL (or :paramref:`.EnvironmentContext.configure.transactional_ddl` is true), the :paramref:`.EnvironmentContext.configure.transaction_per_migration` flag is not set, and the migration is against a real database connection (as opposed to using "offline" ``--sql`` mode), a real transaction will be started. If ``--sql`` mode is in effect, the operation would instead correspond to a string such as "BEGIN" being emitted to the string output. The returned object is a Python context manager that should only be used in the context of a ``with:`` statement as indicated above. The object has no other guaranteed API features present. .. seealso:: :meth:`.MigrationContext.autocommit_block` TNc3óx•K—‰j ¦«dV—‰j ¦«dSr7)r‚r rœr?s€r9Ú begin_commitz8MigrationContext.begin_transaction..begin_commitÍs>øèè€à” ×$Ò$Ñ&Ô&Ð&Ø���Ø” ×%Ò%Ñ'Ô'Ð'Ð'Ð'r;) rvrr‚r^rsr]r>rUr Ú"_safe_begin_connection_transactionr1r)r8r¥Útransaction_nowÚin_transactionrªs` r9Úbegin_transactionz"MigrationContext.begin_transactionwsNø€ðX Ô (ð !Ý‘=”=Ð à Œ9Ô &ð 5Ø,°Ô0OÒOˆOˆOà,°Ð4ˆOàð. +Ý‘=”=Ð à”Ô,ð+ +Ø!Ð !Ð !�>àŒ{ð 3Ý"‘}”}Ð$ð"&Ô!2¸$Ð!>�à!ð 3Ý&™=œ=Ð(àœ?Ð6Ð6Ð6å#ÔFØ œOñôðÔ%õ -¨TÑ2Ô2Ð2Ø Œ[ð +å ð (ð (ð (ð (ñŒ^ð (ð  �<‘>”>Ð !à”?Ð.Ð.Ð.Ý +Ô NØ”ñ!ô!ˆDÔ õ% TÑ*Ô*Ð *r;có—| ¦«}t|¦«dkrdSt|¦«dkrtjd|jz¦«‚|dS)a¾Return the current revision, usually that which is present in the ``alembic_version`` table in the database. This method intends to be used only for a migration stream that does not contain unmerged branches in the target database; if there are multiple branches present, an exception is raised. The :meth:`.MigrationContext.get_current_heads` should be preferred over this method going forward in order to be compatible with branch migration support. If this :class:`.MigrationContext` was configured in "offline" mode, that is with ``as_sql=True``, the ``starting_rev`` parameter is returned instead, if any. rNr(zQVersion table '%s' has more than one head present; please use get_current_heads())Úget_current_headsÚlenrr�rg©r8Úheadss r9Úget_current_revisionz%MigrationContext.get_current_revisionÛsi€ð ×&Ò&Ñ(Ô(ˆÝ ˆu‰:Œ:˜Š?ˆ?Ø�4Ý �‰ZŒZ˜!Š^ˆ^ÝÔ#ð1Ø37Ô3EñFñôð 𠘔8ˆOr;úTuple[str, ...]có´‡—‰jrO‰j}|dkrd}n)|�'‰jr ˆfd„tj|¦«D¦«}tj|d¬¦«S‰jrtjd¦«‚‰ ¦«sdS‰j€J‚td„‰j  ‰j   ¦«¦«D¦«¦«S)a×Return a tuple of the current 'head versions' that are represented in the target database. For a migration stream without branches, this will be a single value, synonymous with that of :meth:`.MigrationContext.get_current_revision`. However when multiple unmerged branches exist within the target database, the returned tuple will contain a value for each head. If this :class:`.MigrationContext` was configured in "offline" mode, that is with ``as_sql=True``, the ``starting_rev`` parameter is returned in a one-length tuple. If no version table is present, or if there are no revisions present, an empty tuple is returned. ÚbaseNcór•—g|]3}|dv¯td‰j |¦«¦«j‘Œ4S))Nr·r+)rr\Ú get_revisionÚrevision)Ú.0Úsfrr8s €r9ú z6MigrationContext.get_current_heads..sKø€ð"ð"ð"àØ .Ð0Ð0õ˜ 4¤;×#;Ò#;¸CÑ#@Ô#@ÑAÔAÔJà0Ð0Ð0r;rH©ÚdefaultzECan't specify current_rev to context when using a database connectionc3ó&K—|] }|dV—Œ dS)rNrH)r»Úrows r9ú z5MigrationContext.get_current_heads..s7èè€ð ð ØˆC�ŒFð ð ð ð ð ð r;) r]rr\rÚto_listÚto_tupler�Ú_has_version_tablerUÚtupleÚexecuter}Úselect)r8Ústart_from_revs` r9r°z"MigrationContext.get_current_headsösø€ð$ Œ;ð Ø"&Ô"6ˆNØ Ò'Ð'Ø!%��ØÐ+°´ Ð+ð"ð"ð"ð"å#œ|¨NÑ;Ô;ð"ñ"ô"�õ ”= ¸Ð<Ñ<Ô<Ð <àÔ#ð ÝÔ'ð7ñôðð×*Ò*Ñ,Ô,ð Ø�rØŒÐ*Ð*Ð*Ýð ð Ø"œo×5Ò5°d´m×6JÒ6JÑ6LÔ6LÑMÔMð ñ ô ñ ô ð r;rbcó6—tj|j¦«5|j€J‚|j |jd¬¦«|r:|j€J‚|j |j ¦«¦«ddd¦«dS#1swxYwYdS)NT)Ú checkfirst)r Ú_ensure_scope_for_ddlrUr}ÚcreaterÇÚdelete)r8rbs r9Ú_ensure_version_tablez&MigrationContext._ensure_version_table!só€Ý Ô .¨t¬Ñ ?Ô ?ð @ð @Ø”?Ð.Ð.Ð.Ø ŒM× Ò  ¤¸TÐ Ñ BÔ BÐ BØð @Ø”Ð2Ð2Ð2Ø”×'Ò'¨¬ ×(<Ò(<Ñ(>Ô(>Ñ?Ô?Ð?ð  @ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @ð @ð @sšA'BÂBÂBcó^—|j€J‚tj|j|j|j¦«Sr7)rUr Ú_connectable_has_tablergrir?s r9rÅz#MigrationContext._has_version_table)s4€ØŒÐ*Ð*Ð*ÝÔ1Ø ŒO˜TÔ/°Ô1Jñ ô ð r;Úscript_directoryr,rºÚstrcóä—| ¦«}|js|s| ¦«t||¦«}| ||¦«D]}| |¦«ŒdS)a\Stamp the version table with a specific revision. This method calculates those branches to which the given revision can apply, and updates those branches as though they were migrated towards that revision (either up or down). If no current branches include the revision, it is added as a new branch head. N)r°r]rÏÚHeadMaintainerÚ _stamp_revsÚupdate_to_step)r8rÒrºr³Úhead_maintainerÚsteps r9ÚstampzMigrationContext.stamp/s‡€ð×&Ò&Ñ(Ô(ˆØŒ{ð ) 5ð )Ø × &Ò &Ñ (Ô (Ð (Ý(¨¨uÑ5Ô5ˆØ$×0Ò0°¸5ÑAÔAð 1ð 1ˆDØ × *Ò *¨4Ñ 0Ô 0Ð 0Ð 0ð 1ð 1r;Úkwrc ó—|j ¦«|jr4|jrt jd¦«‚| d¬¦«d}nN| ¦«}|j  dd¦«}|js|s|s| ¦«t||¦«}|j €J‚|  ||¦«D]ý}|  d¬¦«5|jr/|j s(|j€J‚|j |j¦«t" d |¦«|jr"|j d |j›�¦«|jdi|¤Ž| |¦«|jD](}|||jt1|j ¦«|¬ ¦«Œ) ddd¦«n #1swxYwYŒþ|jr1|j s,|j€J‚|j |j¦«dSdSdS) a-Run the migration scripts established for this :class:`.MigrationContext`, if any. The commands in :mod:`alembic.command` will set up a function that is ultimately passed to the :class:`.MigrationContext` as the ``fn`` argument. This function represents the "work" that will be done when :meth:`.MigrationContext.run_migrations` is called, typically from within the ``env.py`` script of the migration environment. The "work function" then provides an iterable of version callables and other version information which in the case of the ``upgrade`` or ``downgrade`` commands are the list of version scripts to invoke. Other commands yield nothing, in the case that a command wants to run some other operation against the database such as the ``current`` or ``stamp`` commands. :param \**kw: keyword arguments here will be passed to each migration callable, that is the ``upgrade()`` or ``downgrade()`` method within revision scripts. z!Can't use --purge with --sql modeT)rbrHÚ dont_mutateFN)r¥z Running %sz -- Running )ÚctxrÙr³Úrun_args)r‚Ústart_migrationsrbr]rr�rÏr°rWrrrÕrxr®r³rUr}rÍrƒr„Ú static_outputÚ short_logÚ migration_fnr×rtÚsetÚdrop)r8rÛr³rÝrØrÙÚcallbacks r9Úrun_migrationszMigrationContext.run_migrations?s¯€ð* Œ ×"Ò"Ñ$Ô$Ð$ð Œ:ð -ØŒ{ð MÝÔ'Ð(KÑLÔLÐLØ × &Ò &¨TÐ &Ñ 2Ô 2Ð 2؈EˆEà×*Ò*Ñ,Ô,ˆEàœ)Ÿ-š-¨ °uÑ=Ô=ˆKà”;ð - uð -°[ð -Ø×*Ò*Ñ,Ô,Ð,å(¨¨uÑ5Ô5ˆàÔ"Ð.Ð.Ð.Ø×'Ò'¨¨tÑ4Ô4ð ð ˆDØ×'Ò'°tÐ'Ñ<Ô<ð ð à”;ð: Ô'<ð:ð œ?Ð6Ð6Ð6Ø”M×(Ò(¨¬Ñ9Ô9Ð9Ý—’˜ tÑ,Ô,Ð,Ø”;ðØ”I×+Ò+Ð+Ø+/¬>¨>Ð;ñôðð"�Ô!Ð'Ð' BÐ'Ð'Ð'ð ×.Ò.¨tÑ4Ô4Ð4Ø $Ô ?ðð�HØ�HØ Ø!œYÝ! /Ô"7Ñ8Ô8Ø!#ð ñôðððð) ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øð8 Œ;ð 0˜Ô4ð 0Ø”?Ð.Ð.Ð.Ø ŒM× Ò ˜tœÑ /Ô /Ð /Ð /Ð /ð 0ð 0ð 0ð 0sÃ*C GÇG Ç G cóR— |jj}|¦«S#t$rYdSwxYw©NF)rUr­ÚAttributeError)r8Úmeths r9r›z+MigrationContext._in_connection_transactionˆsB€ð Ø”?Ô1ˆDð�4‘6”6ˆMøõð ð ð Ø�5�5ð øøøs ‚ ˜ &¥&ÚsqlúUnion[ClauseElement, str]ržúOptional[dict]có<—|j ||¦«dS)aExecute a SQL construct or string statement. The underlying execution mechanics are used, that is if this is "offline mode" the SQL is written to the output buffer, otherwise the SQL is emitted on the current SQLAlchemy connection. N©r‚Ú_exec)r8rìržs r9rÇzMigrationContext.execute�s!€ð Œ �Š˜Ð.Ñ/Ô/Ð/Ð/Ð/r;r&cóB‡—ˆfd„}tj‰j|¦«S)Ncó<•—‰j |¦«dSr7rð)Ú constructÚ multiparamsÚparamsr8s €r9Údumpz1MigrationContext._stdout_connection..dump¢sø€Ø ŒI�OŠO˜IÑ &Ô &Ð &Ð &Ð &r;)rr&rT)r8rUr÷s` r9ruz#MigrationContext._stdout_connectionŸs3ø€ð 'ð 'ð 'ð 'ð 'õ"Ô0°´¸tÑDÔDÐDr;có—|jS)a¾Return the current "bind". In online mode, this is an instance of :class:`sqlalchemy.engine.Connection`, and is suitable for ad-hoc execution of any kind of usage described in SQLAlchemy Core documentation as well as for usage with the :meth:`sqlalchemy.schema.Table.create` and :meth:`sqlalchemy.schema.MetaData.create_all` methods of :class:`~sqlalchemy.schema.Table`, :class:`~sqlalchemy.schema.MetaData`. Note that when "standard output" mode is enabled, this bind will be a "mock" connection handler that cannot return results and is only appropriate for a very limited subset of commands. )rUr?s r9ÚbindzMigrationContext.bind§s €ð&ŒÐr;úOptional[Config]có,—|jr |jjSdS)zLReturn the :class:`.Config` used by the current environment, if any.N)rYÚconfigr?s r9rüzMigrationContext.config¼s €ð Ô #ð ØÔ+Ô2Ð 2à�4r;Úinspector_columnú Column[Any]Úmetadata_columnrcóÄ—|jdurdSt|j¦«r'| ||||j|j¦«}|�|S|j ||¦«Sré)r{ÚcallableÚtyper‚re)r8rýrÿÚ user_values r9Ú _compare_typezMigrationContext._compare_typeÆs{€ð Ô " eÐ +Ð +Ø�5å �DÔ+Ñ ,Ô ,ð "Ø×0Ò0ØØ ØØ Ô%ØÔ$ñ ôˆJðÐ%Ø!Ð!àŒy×%Ò%Ð&6¸ÑHÔHÐHr;Úrendered_metadata_defaultÚrendered_column_defaultcóÀ—|jdurdSt|j¦«r#| |||||j|¦«}|�|S|j ||||¦«Sré)r|rÚserver_defaultr‚rf)r8rýrÿrrrs r9Ú_compare_server_defaultz(MigrationContext._compare_server_defaultÙsˆ€ð Ô ,°Ð 5Ð 5Ø�5å �DÔ5Ñ 6Ô 6ð "Ø×:Ò:ØØ ØØ'ØÔ.Ø)ñ ôˆJðÐ%Ø!Ð!àŒy×/Ò/Ø Ø Ø %Ø #ñ  ô ð r;r7) rTr"rUrVrWrXrYrZr4r5)NNNNNNN)rUrVrr†r‡rˆrTr‰rYrZrŠr‹rWrŒr4r3)r4r—)F)r¥r¦r4r§)r4rˆ©r4rµ)rbr¦r4r5©r4r¦)rÒr,rºrÓr4r5©rÛrr4r5)rìríržrîr4r5)rUrVr4r&)r4rV)r4rú)rýrþrÿrr4r¦) rýrþrÿrþrrˆrrˆr4r¦)rOrPrQÚ__doc__r:Ú classmethodr–rr¤r®r´r°rÏrÅrÚrçr›rÇrurRrùrürr rHr;r9r3r3Us €€€€€ð-ð-ðh=Að W ðW ðW ðW ðW ðrð,0Ø)-Ø&*Ø%)Ø<@Ø15Ø"ð5Pð5Pð5Pð5Pñ„[ð5Pðnð]<ð]<ð]<ñ„^ð]<ð@&+ðb+ðb+ðb+ðb+ðb+ðHðððð6) ð) ð) ð) ðV@ð@ð@ð@ð@ð ð ð ð ð 1ð1ð1ð1ð G0ðG0ðG0ðG0ðRðððð-1ð 0ð 0ð 0ð 0ð 0ðEðEðEðEððððñ„Xðð(ðððñ„XððIðIðIðIð& ð ð ð ð ð r;r3có6—eZdZdd„Zdd „Zdd „Zdd„Zdd„ZdS)rÕÚcontextr3r³rr4r5có<—||_t|¦«|_dSr7)rrär³)r8rr³s r9r:zHeadMaintainer.__init__ùs€ØˆŒ ݘ‘Z”ZˆŒ ˆ ˆ r;ÚversionrÓcó—||jvsJ‚|j |¦«|jj |jj ¦« td|z¦«¬¦«¦«dS)Nú'%s'©rj) r³Úaddrr‚rñr}ÚinsertÚvaluesr)r8rs r9Ú_insert_versionzHeadMaintainer._insert_versionýs‰€Ø˜dœjÐ(Ð(Ð(Ð(Ø Œ �Š�wÑÔÐà Œ Ô×ÒØ ŒLÔ !× (Ò (Ñ *Ô *× 1Ò 1Ý*¨6°GÑ+;Ñ<Ô<ð 2ñ ô ñ ô ð ð ð r;c óØ—|j |¦«|jj |jj ¦« |jjjj td|z¦«k¦«¦«}|jj sG|jj j r8|�8|jdkr/tjd||jj|jfz¦«‚dSdSdSdS)Nrr(zOOnline migration expected to match one row when deleting '%s' in '%s'; %d found)r³Úremoverr‚rñr}rÎÚwhereÚcrjrr]rTÚsupports_sane_rowcountÚrowcountrr�rg)r8rÚrets r9Ú_delete_versionzHeadMaintainer._delete_versions€Ø Œ ×Ò˜'Ñ"Ô"Ð"àŒlÔ×%Ò%Ø ŒLÔ !× (Ò (Ñ *Ô *× 0Ò 0Ø” Ô%Ô'Ô3Ý! &¨7Ñ"2Ñ3Ô3ò4ñ ô ñ ô ˆð” Ô#ð à” Ô$Ô;ð ð�Ø”  Ò!Ð!åÔ#ðð˜DœLÔ6¸¼ ÐEñFñôð ð ð ð ð ð �Ø!Ð!r;Úfrom_Úto_c ól—||jvsJ‚|j |¦«|j |¦«|jj |jj ¦« td|z¦«¬¦«  |jjj j td|z¦«k¦«¦«}|jj sH|jjjr9|�9|jdkr0t#jd|||jj|jfz¦«‚dSdSdSdS)Nrrr(zWOnline migration expected to match one row when updating '%s' to '%s' in '%s'; %d found)r³rrrr‚rñr}Úupdaterrrrrjr]rTrrrr�rg)r8r"r#r s r9Ú_update_versionzHeadMaintainer._update_versionsB€Ø˜$œ*Ð$Ð$Ð$Ð$Ø Œ ×Ò˜%Ñ Ô Ð Ø Œ �Š�sÑÔÐàŒlÔ×%Ò%Ø ŒLÔ !× (Ò (Ñ *Ô *ß ŠV¥¨v¸©|Ñ <Ô <ˆVÑ =Ô =ß ŠUØ” Ô%Ô'Ô3Ý! &¨5¡.Ñ1Ô1ò2ñôñ ô ˆð” Ô#ð à” Ô$Ô;ð ð�Ø”  Ò!Ð!åÔ#ðð˜#˜tœ|Ô9¸3¼<ÐHñIñôð ð ð ð ð ð �Ø!Ð!r;rÙúUnion[RevisionStep, StampStep]có —| |j¦«r9|j}t d|¦«| |¦«dS| |j¦«r9|j}t d|¦«| |¦«dS|  |j¦«rm|  |j¦«\}}}t d|||¦«|D]}| |¦«Œ|  ||¦«dS|  |j¦«rm|  |j¦«\}}}t d|||¦«|D]}| |¦«Œ|  ||¦«dS| |j¦«\} } t d| | ¦«|  | | ¦«dS)Nzbranch delete %sznew branch insert %sz!merge, delete %s, update %s to %sz#unmerge, insert %s, update %s to %szupdate %s to %s)Úshould_delete_branchr³Údelete_version_numrƒÚdebugr!Úshould_create_branchÚinsert_version_numrÚshould_merge_branchesÚmerge_branch_identsr&Úshould_unmerge_branchesÚunmerge_branch_identsÚupdate_version_num) r8rÙÚversÚ delete_revsÚupdate_from_revÚ update_to_revÚdelrevÚ insert_revsÚinsrevr"r#s r9r×zHeadMaintainer.update_to_step9s.€Ø × $Ò $ T¤ZÑ 0Ô 0ð* -ØÔ*ˆDÝ �IŠIÐ(¨$Ñ /Ô /Ð /Ø × Ò  Ñ &Ô &Ð &Ð &Ð &Ø × &Ò & t¤zÑ 2Ô 2ð& -ØÔ*ˆDÝ �IŠIÐ,¨dÑ 3Ô 3Ð 3Ø × Ò  Ñ &Ô &Ð &Ð &Ð &Ø × 'Ò '¨¬ Ñ 3Ô 3ð" -ð ×(Ò(¨¬Ñ4Ô4ñ  ØØØå �IŠIØ3ØØØñ  ô ð ð &ð -ð -�Ø×$Ò$ VÑ,Ô,Ð,Ð,Ø × Ò  °-Ñ @Ô @Ð @Ð @Ð @Ø × )Ò )¨$¬*Ñ 5Ô 5ð -ð ×*Ò*¨4¬:Ñ6Ô6ñ  ØØØå �IŠIØ5ØØØñ  ô ð ð &ð -ð -�Ø×$Ò$ VÑ,Ô,Ð,Ð,Ø × Ò  °-Ñ @Ô @Ð @Ð @Ð @à×0Ò0°´Ñ<Ô<‰JˆE�3Ý �IŠIÐ'¨°Ñ 4Ô 4Ð 4Ø × Ò  ¨Ñ ,Ô ,Ð ,Ð ,Ð ,r;N)rr3r³rr4r5)rrÓr4r5)r"rÓr#rÓr4r5)rÙr'r4r5)rOrPrQr:rr!r&r×rHr;r9rÕrÕøsx€€€€€ð ð ð ð ð ð ð ð ððððð.ðððð6+-ð+-ð+-ð+-ð+-ð+-r;rÕcó$—eZdZUdZded< ded< ded< ded< ded < d ed < dd„Zedd„¦«Zedd„¦«Zedd„¦«Z ed d„¦«Z ed!d„¦«Z ed!d„¦«Z ed!d„¦«Z ed!d„¦«ZdS)"Ú MigrationInfozèExposes information about a migration step to a callback listener. The :class:`.MigrationInfo` object is available exclusively for the benefit of the :paramref:`.EnvironmentContext.on_version_apply` callback hook. r¦Ú is_upgradeÚis_stamprˆÚup_revision_idrµÚup_revision_idsÚdown_revision_idsr/Ú revision_mapÚ up_revisionsúUnion[str, Tuple[str, ...]]Údown_revisionsr4r5cóÞ—||_||_||_tj|d¬¦«|_|jr|jd|_nd|_tj|d¬¦«|_dS)NrHr¾r)rAr<r=rrÄr?r>r@)r8rAr<r=rBrDs r9r:zMigrationInfo.__init__œsv€ð)ˆÔØ$ˆŒØ ˆŒ Ý#œ}¨\À2ÐFÑFÔFˆÔØ Ô ð 'Ø"&Ô"6°qÔ"9ˆDÔ Ð ð #'ˆDÔ Ý!%¤¨~ÀrÐ!JÑ!JÔ!JˆÔÐÐr;có—|j S)aTrue/False: indicates whether this operation is a migration. At present this is true if and only the migration is not a stamp. If other operation types are added in the future, both this attribute and :attr:`~.MigrationInfo.is_stamp` will be false. )r=r?s r9Ú is_migrationzMigrationInfo.is_migration±s€ð”=Ð Ð r;có,—|jr|jn|jS)z7Active revisions before this migration step is applied.)r<r@r?r?s r9Úsource_revision_idsz!MigrationInfo.source_revision_ids»s€ð'+¤oÐ OˆDÔ "Ð "¸4Ô;Oð r;có,—|jr|jn|jS)z6Active revisions after this migration step is applied.)r<r?r@r?s r9Údestination_revision_idsz&MigrationInfo.destination_revision_idsÂs€ð%)¤OÐ OˆDÔ Ð ¸Ô9Oð r;úOptional[Revision]có@—|j |j¦«S)zUGet :attr:`~.MigrationInfo.up_revision_id` as a :class:`.Revision`. )rAr¹r>r?s r9Ú up_revisionzMigrationInfo.up_revisionÉs€ð Ô ×-Ò-¨dÔ.AÑBÔBÐBr;ú%Tuple[Optional[_RevisionOrBase], ...]có@—|j |j¦«S)zLGet :attr:`~.MigrationInfo.up_revision_ids` as a :class:`.Revision`.)rAÚ get_revisionsr?r?s r9rBzMigrationInfo.up_revisionsÑs€ðÔ ×.Ò.¨tÔ/CÑDÔDÐDr;có@—|j |j¦«S)zcGet :attr:`~.MigrationInfo.down_revision_ids` as a tuple of :class:`Revisions <.Revision>`.)rArQr@r?s r9rDzMigrationInfo.down_revisions×s€ðÔ ×.Ò.¨tÔ/EÑFÔFÐFr;có@—|j |j¦«S)zdGet :attr:`~MigrationInfo.source_revision_ids` as a tuple of :class:`Revisions <.Revision>`.)rArQrIr?s r9Úsource_revisionszMigrationInfo.source_revisionsÝs€ðÔ ×.Ò.¨tÔ/GÑHÔHÐHr;có@—|j |j¦«S)ziGet :attr:`~MigrationInfo.destination_revision_ids` as a tuple of :class:`Revisions <.Revision>`.)rArQrKr?s r9Údestination_revisionsz#MigrationInfo.destination_revisionsãs€ðÔ ×.Ò.¨tÔ/LÑMÔMÐMr;N) rAr/r<r¦r=r¦rBrCrDrCr4r5r r )r4rL)r4rO)rOrPrQr Ú__annotations__r:rRrGrIrKrNrBrDrTrVrHr;r9r;r;gs»€€€€€€ðððÐÐÑðð€N€N�Nð6ð"Ð!Ð!Ñ!ð ð%Ð$Ð$Ñ$ðð'Ð&Ð&Ñ&ððÐÐÑØAðKðKðKðKð*ð!ð!ð!ñ„Xð!ðð ð ð ñ„Xð ð ð ð ð ñ„Xð ð ðCðCðCñ„XðCððEðEðEñ„XðEð ðGðGðGñ„XðGð ðIðIðIñ„XðIð ðNðNðNñ„XðNðNðNr;r;có¶—eZdZUded<ded<ded<ded<edd „¦«Zedd„¦«Zedd„¦«Zedd„¦«Z edd„¦«Z d„Z dS)Ú MigrationSteprµÚfrom_revisions_no_depsÚto_revisions_no_depsr¦r<rrãr4rÓcó—|jjSr7)rãrOr?s r9rozMigrationStep.nameñs€àÔ Ô)Ð)r;rAr/r\r+Ú RevisionStepcó$—t||d¦«S)NT©r]©r”rAr\s r9Úupgrade_from_scriptz!MigrationStep.upgrade_from_scriptõs€õ˜L¨&°$Ñ7Ô7Ð7r;có$—t||d¦«Srér_r`s r9Údowngrade_from_scriptz#MigrationStep.downgrade_from_scriptûs€õ˜L¨&°%Ñ8Ô8Ð8r;có—|j Sr7)r<r?s r9Ú is_downgradezMigrationStep.is_downgrades €à”?Ð"Ð"r;có|—|j›dtj|j¦«›dtj|j¦«›�S)Nú ú -> )rorÚformat_as_commarZr[r?s r9râzMigrationStep.short_logsB€ð ŒIˆIˆIÝ Ô  Ô!<Ñ =Ô =Ð =Ð =Ý Ô  Ô!:Ñ ;Ô ;Ð ;ð ð r;có¨—|jrE|j›dtj|j¦«›dtj|j¦«›d|j›�S|jS)Nrgrhz, )ÚdocrorrirZr[râr?s r9Ú__str__zMigrationStep.__str__ s^€Ø Œ8ð "à” � � ÝÔ$ TÔ%@ÑAÔAÐAÐAÝÔ$ TÔ%>Ñ?Ô?Ð?Ð?Ø”�ð ð ð”>Ð !r;N©r4rÓ)rAr/r\r+r4r]r ) rOrPrQrWrRrorrarcrerârlrHr;r9rYrYêsó€€€€€€à+Ð+Ð+Ñ+Ø)Ð)Ð)Ñ)ØÐÐÑØÐÐÑà ð*ð*ð*ñ„Xð*ðð8ð8ð8ñ„[ð8ð ð9ð9ð9ñ„[ð9ð ð#ð#ð#ñ„Xð#ðð ð ð ñ„Xð ð "ð "ð "ð "ð "r;rYcó<—eZdZd)d „Zd „Zd*d „Zed+d„¦«Zed,d„¦«Zed,d„¦«Z ed,d„¦«Z ed,d„¦«Z ed-d„¦«Z d.d„Z d/d„Zd0d„Zd1d„Zd.d„Zd.d „Zd.d!„Zd2d#„Zed+d$„¦«Zed+d%„¦«Zed3d'„¦«Zd(S)4r]rAr/rºr+r<r¦r4r5có|—||_||_||_|r|jj|_dS|jj|_dSr7)rArºr<ÚmoduleÚupgraderãÚ downgrade)r8rArºr<s r9r:zRevisionStep.__init__sP€ð)ˆÔØ ˆŒ Ø$ˆŒØ ð à”Ô'ð Ô Ð Ð ð ”Ô)ð Ô Ð Ð r;có2—d|jj›d|j›d�S)Nz RevisionStep(z , is_upgrade=ú))rºr<r?s r9Ú__repr__zRevisionStep.__repr__)s%€€à ŒMÔ "Ð "Ð "Ø ŒOˆOˆOð ð r;ÚotherÚobjectcól—t|t¦«o|j|jko|j|jkSr7)rŽr]rºr<©r8rvs r9Ú__eq__zRevisionStep.__eq__/s7€å �u�lÑ +Ô +ð 4Ø” $¤-Ò/ð 4à” 5Ô#3Ò3ð r;rÓcó—|jjSr7)rºrkr?s r9rkzRevisionStep.doc6s €àŒ}Ô Ð r;rµcóB—|jr |jjS|jjfSr7©r<rºÚ_normalized_down_revisionsr?s r9Úfrom_revisionszRevisionStep.from_revisions:s%€à Œ?ð -Ø”=Ô;Ð ;à”MÔ*Ð,Ð ,r;cóB—|jr |jjS|jjfSr7©r<rºÚ_versioned_down_revisionsr?s r9rZz#RevisionStep.from_revisions_no_depsAs'€ð Œ?ð -Ø”=Ô:Ð :à”MÔ*Ð,Ð ,r;cóB—|jr |jjfS|jjSr7r}r?s r9Ú to_revisionszRevisionStep.to_revisionsJs%€à Œ?ð <Ø”MÔ*Ð,Ð ,à”=Ô;Ð ;r;cóB—|jr |jjfS|jjSr7r�r?s r9r[z!RevisionStep.to_revisions_no_depsQs'€ð Œ?ð ;Ø”MÔ*Ð,Ð ,à”=Ô:Ð :r;có<—t|jj¦«dkS©Nr()r±rºr~r?s r9Ú_has_scalar_down_revisionz&RevisionStep._has_scalar_down_revisionZs€å�4”=Ô;Ñ<Ô<ÀÒAÐAr;r³úSet[str]có„—|jsdS|jj|vrdS|jj}|sdS| |¦«}| S)zÈA delete is when we are a. in a downgrade and b. we are going to the "base" or we are going to a version that is implied as a dependency on another version that is remaining. FT)rerºr~Ú_unmerge_to_revisions)r8r³Údownrevsr„s r9r)z!RevisionStep.should_delete_branch^s^€ð Ô ð Ø�5à Œ=Ô !¨Ð .Ð .Ø�5à”=Ô;ˆàð $à�4ð ×5Ò5°eÑ<Ô<ˆLØ#Ð#Ð #r;úTuple[List[str], str, str]có¸—t|¦« |j¦«}|rsd„|j |j |¦«d¬¦«D¦«}t t|j¦« |¦«¦«}nt |j¦«}t |dd…¦«|d|jdfS)Ncó—h|] }|j’Œ SrH©rº©r»Úrs r9ú z3RevisionStep.merge_branch_idents..{ó*€ðððàð” ðððr;F©Úcheckréÿÿÿÿ)räÚ differencerrAÚ_get_ancestor_nodesrQÚlistr„)r8r³Ú other_headsÚ ancestorsrs r9r/z RevisionStep.merge_branch_identsusè€õ˜%‘j”j×+Ò+¨DÔ,?Ñ@Ô@ˆ à ð 7ððàÔ*×>Ò>ØÔ%×3Ò3°KÑ@Ô@Èð?ñôðñôˆIõ "Ý�DÔ'Ñ(Ô(×3Ò3°IÑ>Ô>ñôˆNˆNõ" $Ô"5Ñ6Ô6ˆNõ �  " Ô%Ñ &Ô &Ø ˜2Ô Ø Ô ˜aÔ ð  ð r;úCollection[str]cóR—t|¦« |jjg¦«}|rrd„|j |j |¦«d¬¦«D¦«}t t|j¦« |¦«¦«S|jS)Ncó—h|] }|j’Œ SrHr�r‘s r9r“z5RevisionStep._unmerge_to_revisions..‘r”r;Fr•)rär˜rºrAr™rQrÆr„)r8r³r›rœs r9r‹z"RevisionStep._unmerge_to_revisionsŽs©€Ý˜%‘j”j×+Ò+¨T¬]Ô-CÐ,DÑEÔEˆ Ø ð %ððàÔ*×>Ò>ØÔ%×3Ò3°KÑ@Ô@Èð?ñôðñôˆIõ �˜TÔ.Ñ/Ô/×:Ò:¸9ÑEÔEÑFÔFÐ FàÔ$Ð $r;ú Tuple[str, str, Tuple[str, ...]]cóh—| |¦«}|jd|d|dd…fS©Nrr—)r‹r)r8r³r„s r9r1z"RevisionStep.unmerge_branch_idents›sB€ð×1Ò1°%Ñ8Ô8ˆ ð Ô  Ô "Ø ˜Ô Ø ˜˜2˜Ô ð  ð r;cóf—|jsdS|jj}|sdS| |¦«sdSdS)NFT)r<rºr~Ú intersection©r8r³rŒs r9r,z!RevisionStep.should_create_branch§sJ€ØŒð Ø�5à”=Ô;ˆàð à�4ð ×%Ò% hÑ/Ô/ð Ø�tà�ur;có¦—|jsdS|jj}t|¦«dkr(t| |¦«¦«dkrdSdS©NFr(T)r<rºr~r±r¤r¥s r9r.z"RevisionStep.should_merge_branchesºsV€ØŒð Ø�5à”=Ô;ˆå ˆx‰=Œ=˜1Ò Ð ¥ U×%7Ò%7¸Ñ%AÔ%AÑ!BÔ!BÀQÒ!FÐ!FØ�4àˆur;cóv—|jsdS|jj}|jj|vrt|¦«dkrdSdSr§)rerºr~r±r¥s r9r0z$RevisionStep.should_unmerge_branchesÅsF€ØÔ ð Ø�5à”=Ô;ˆà Œ=Ô ! UÐ *Ð *­s°8©}¬}¸qÒ/@Ð/@Ø�4àˆur;úTuple[str, str]có—|jsR| |jj¦«}t |¦«dks Jd¦«‚t |¦«d}n|jjd}|jr||jjfS|jj|fS)Nr(z4Can't do an UPDATE because downrevision is ambiguousr)rˆr¤rºr~r±ršr<)r8r³ÚdownrevÚ down_revisions r9r2zRevisionStep.update_version_numÐsš€ØÔ-ð HØ×(Ò(Ø” Ô8ñôˆGõ�G‘ ”  Ò!Ð!Ð!ØEñ"Ô!Ð!å  ™MœM¨!Ô,ˆMˆMà œMÔDÀQÔGˆMà Œ?ð 9Ø  $¤-Ô"8Ð8Ð 8à”=Ô)¨=Ð8Ð 8r;có—|jjSr7r�r?s r9r*zRevisionStep.delete_version_numáó €àŒ}Ô%Ð%r;có—|jjSr7r�r?s r9r-zRevisionStep.insert_version_numår®r;r;cóf—t|j|jj|jj|jd¬¦«S)NF©rArBrDr<r=)r;rArºr~r<r?s r9r„zRevisionStep.infoés7€åØÔ*ØœÔ/Øœ=ÔCØ”Øð  ñ ô ð r;N)rAr/rºr+r<r¦r4r5)rvrwr4r¦rmr r ©r³r‰r4r¦)r³r‰r4r�)r³r�r4rµ)r³r�r4r ©r³r‰r4r©©r4r;)rOrPrQr:rurzrRrkrrZr„r[rˆr)r/r‹r1r,r.r0r2r*r-r„rHr;r9r]r]s€€€€€ð ð ð ð ð ð ð ð  ð ð ð ðð!ð!ð!ñ„Xð!ðð-ð-ð-ñ„Xð-ð ð-ð-ð-ñ„Xð-ðð<ð<ð<ñ„Xð<ð ð;ð;ð;ñ„Xð;ððBðBðBñ„XðBð$ð$ð$ð$ð. ð ð ð ð2 %ð %ð %ð %ð  ð  ð  ð  ððððð& ð ð ð ð ð ð ð ð9ð9ð9ð9ð"ð&ð&ð&ñ„Xð&ðð&ð&ð&ñ„Xð&ðð ð ð ñ„Xð ð ð r;r]có—eZdZU d+d,d „ZdZd ed<d-d„Zd„Zed„¦«Z ed.d„¦«Z ed.d„¦«Z ed.d„¦«Z ed/d„¦«Z ed/d„¦«Zd0d„Zd1d!„Zd2d#„Zd3d$„Zd4d&„Zd3d'„Zd3d(„Zed5d*„¦«ZdS)6Ú StampStepNr"ú%Optional[Union[str, Collection[str]]]r#r<r¦Ú branch_moverAúOptional[RevisionMap]r4r5có´—tj|d¬¦«|_tj|d¬¦«|_||_||_|j|_||_dS)NrHr¾) rrÄr"r#r<r¸Ústamp_revisionrãrA)r8r"r#r<r¸rAs r9r:zStampStep.__init__õsX€õ'+¤m°EÀ2Ð&FÑ&FÔ&FˆŒ Ý$(¤M°#¸rÐ$BÑ$BÔ$BˆŒØ$ˆŒØ&ˆÔØ Ô/ˆÔØ(ˆÔÐÐr;rˆrkrÛrc ó—dSr7rH)r8rÛs r9r»zStampStep.stamp_revisions€Øˆtr;có¬—t|t¦«o?|j|jko/|j|jko|j|jko|j|jkSr7)rŽr¶rÚ revisionsr„r¸r<rys r9rzzStampStep.__eq__ sb€å �u�iÑ (Ô (ð 4ØÔ$¨¬Ò6ð 4àÔ" dÔ&7Ò7ð 4ðÔ! TÔ%5Ò5ð 4ð” 5Ô#3Ò3ð  r;có—|jSr7©r"r?s r9rzStampStep.from_revisionss €àŒzÐr;rµcó—|jSr7©r#r?s r9r„zStampStep.to_revisionss €àŒxˆr;có—|jSr7rÀr?s r9rZz StampStep.from_revisions_no_depss €ðŒzÐr;có—|jSr7rÂr?s r9r[zStampStep.to_revisions_no_deps s €ðŒxˆr;rÓcóP—t|j¦«dksJ‚|jdS©Nr(r©r±r"r?s r9r*zStampStep.delete_version_num&s'€å�4”:‰Œ !Ò#Ð#Ð#Ð#ØŒz˜!Œ}Ðr;cóP—t|j¦«dksJ‚|jdSrÆ©r±r#r?s r9r-zStampStep.insert_version_num+s'€å�4”8‰}Œ} Ò!Ð!Ð!Ð!ØŒx˜Œ{Ðr;r³r‰r©cóž—t|j¦«dksJ‚t|j¦«dksJ‚|jd|jdfSrÆ)r±r"r#r²s r9r2zStampStep.update_version_num0sK€Ý�4”:‰Œ !Ò#Ð#Ð#Ð#Ý�4”8‰}Œ} Ò!Ð!Ð!Ð!ØŒz˜!Œ}˜dœh qœkÐ)Ð)r;úUnion[Set[str], List[str]]ú=Union[Tuple[List[Any], str, str], Tuple[List[str], str, str]]cól—t|jdd…¦«|jd|jdfSr¢)ršr"r#r²s r9r/zStampStep.merge_branch_idents5s6€õ �”˜A˜b˜DÔ!Ñ "Ô "Ø ŒJ�rŒNØ ŒH�QŒKð  ð r;úTuple[str, str, List[str]]cól—|jd|jdt|jdd…¦«fSr¢)r"r#ršr²s r9r1zStampStep.unmerge_branch_idents?s5€ð ŒJ�qŒMØ ŒH�RŒLÝ �”˜!˜B˜$”Ñ Ô ð  ð r;có—|jo|jSr7)rer¸r²s r9r)zStampStep.should_delete_branchIs€ðÔ Ð5 TÔ%5Ð5r;úUnion[Set[str], bool]cóº—|joT|jp&t|j¦« |¦«o&t|j¦« |¦«Sr7)r<r¸rär"r˜r#r²s r9r,zStampStep.should_create_branchOsP€à ŒOð 0ØÔ!ÐF¥S¨¬¡_¤_×%?Ò%?ÀÑ%FÔ%Fð 0å�D”H‘ ” ×(Ò(¨Ñ/Ô/ð r;có2—t|j¦«dkSr‡rÇr²s r9r.zStampStep.should_merge_branchesVs€Ý�4”:‰Œ Ò"Ð"r;có2—t|j¦«dkSr‡rÉr²s r9r0z!StampStep.should_unmerge_branchesYs€Ý�4”8‰}Œ}˜qÒ Ð r;r;cóœ—|jr|j|jfn |j|jf\}}|j€J‚t |j|||jd¬¦«S)NTr±)r<r#r"rAr;)r8ÚupÚdowns r9r„zStampStep.info\sm€ðŒð (ˆTŒX�t”zÐ "Ð "à”*˜dœhÐ'ñ ˆˆDð Ô Ð,Ð,Ð,ÝØÔ*ØØØ”Øð  ñ ô ð r;r7) r"r·r#r·r<r¦r¸r¦rAr¹r4r5r r rmr³)r³rËr4rÌ)r³r‰r4rÎr²)r³r‰r4rÑr´)rOrPrQr:rkrWr»rzrRrr„rZr[r*r-r2r/r1r)r,r.r0r„rHr;r9r¶r¶ôsÑ€€€€€€ð/3ð )ð )ð )ð )ð )ð€CÐÐÐÑððððð ð ð ðððñ„Xðððððñ„Xðððððñ„Xðð ðððñ„Xðð ðððñ„Xðððððñ„Xðð*ð*ð*ð*ð  ð ð ð ð ð ð ð ð6ð6ð6ð6ð  ð ð ð ð#ð#ð#ð#ð!ð!ð!ð!ðð  ð  ð  ñ„Xð  ð  ð  r;r¶)GÚ __future__rÚ contextlibrrÚloggingryÚtypingrrrr r r r r rrrrrrÚ sqlalchemyrrrrrrÚsqlalchemy.enginerrr�Úsqlalchemy.engine.strategiesrÚrrr Ú util.compatr!r"r#Úsqlalchemy.engine.baser$r%Úsqlalchemy.engine.mockr&Úsqlalchemy.sql.elementsr'Ú environmentr)rür*Ú script.baser+r,Úscript.revisionr-r.r/Ú getLoggerrOrƒr1r3rÕr;rYr]r¶rHr;r9úrès”ðØ"Ð"Ð"Ð"Ð"Ð"à%Ð%Ð%Ð%Ð%Ð%Ø"Ð"Ð"Ð"Ð"Ð"Ø€€€Ø € € € ØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØ!Ð!Ð!Ð!Ð!Ð!ØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØ Ð Ð Ð Ð Ð ØÐÐÐÐÐàÐÐÐÐÐØ%Ð%Ð%Ð%Ð%Ð%ØÐÐÐÐÐØ+Ð+Ð+Ð+Ð+Ð+ØÐÐÐÐÐØÐÐÐÐÐØ$Ð$Ð$Ð$Ð$Ð$Ø-Ð-Ð-Ð-Ð-Ð-Ø;Ð;Ð;Ð;Ð;Ð;àÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØ#Ð#Ð#Ð#Ð#Ð#àð.Ø)Ð)Ð)Ð)Ð)Ð)Ø%Ð%Ð%Ð%Ð%Ð%Ø1Ð1Ð1Ð1Ð1Ð1Ø2Ð2Ð2Ð2Ð2Ð2Ø5Ð5Ð5Ð5Ð5Ð5Ø5Ð5Ð5Ð5Ð5Ð5à/Ð/Ð/Ð/Ð/Ð/ØÐÐÐÐÐØ$Ð$Ð$Ð$Ð$Ð$Ø-Ð-Ð-Ð-Ð-Ð-Ø1Ð1Ð1Ð1Ð1Ð1Ø*Ð*Ð*Ð*Ð*Ð*Ø-Ð-Ð-Ð-Ð-Ð-à€gÔ˜Ñ!Ô!€ð7ð7ð7ð7ð7ñ7ô7ð7ð:`  ð`  ð`  ð`  ð`  ñ`  ô`  ð`  ðFl-ðl-ðl-ðl-ðl-ñl-ôl-ðl-ð^@Nð@Nð@Nð@Nð@Nñ@Nô@Nð@NðF,"ð,"ð,"ð,"ð,"ñ,"ô,"ð,"ð^X ðX ðX ðX ðX �=ñX ôX ðX ðvv ðv ðv ðv ðv � ñv ôv ðv ðv ðv r;