gVddlmZddlZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd l m Z dd lmZerdd lmZdd lmZddlmZddl mZddZ d d!dZ d" d#dZd$dZ d% d&dZ d' d(dZ d' d(dZd)dZ d* d+dZ d, d-dZ d.d/dZ!d.d/dZ" d0 d1dZ#d)dZ$d.d2dZ%y)3) annotationsN)List)Optional) TYPE_CHECKING)Union) autogenerate)util)EnvironmentContext)ScriptDirectory)Config)Script) _RevIdType)ProcessRevisionDirectiveFnc|jdtj|jD]o}t tj j |j|d5}t|j}ddd|jd|q|jd|jdy#1swYAxYw)zNList available templates. :param config: a :class:`.Config` object. zAvailable templates: READMENz%s - %sz1 Templates are used via the 'init' command, e.g.:z, alembic init --template generic ./scripts) print_stdoutoslistdirget_template_directoryopenpathjoinnextrstrip)configtempnamereadmesynopsiss >/opt/hc_python/lib/python3.12/site-packages/alembic/command.pylist_templatesr!s 01JJv<<>?  GGLL668(H M F|**,H  Ix: @ LM GH  s 0C  C ctj|tjr-tj|rt j d|ztj j|j|}tj|tjst j d|ztj|tjs^t jdtj j|fi|j5tj|dddtj j|d}t jdtj j|fi|j5tj|dddt|}d}tj|D]}tj j||} |dk(r|jJtj j|j}tj|tjr%t jd|dfi|j|j!| || tj j#| stj j||} |j%| | |rtj jtj j|d tj jtj j|d fD]D} t jd | fi|j5t'| d 5 ddddddF|Jt jd |dfi|jy#1swYxYw#1swY8xYw#1swYVxYw#1swYxYw)akInitialize a new scripts directory. :param config: a :class:`.Config` object. :param directory: string path of the target directory. :param template: string name of the migration environment template to use. :param package: when True, write ``__init__.py`` files into the environment location as well as the versions/ location. z,Directory %s already exists and is not emptyzNo such template %rzCreating directory Nversionszalembic.ini.makozFile z already exists, skipping)script_locationz __init__.pyzAdding wz9Please edit configuration/connection/logging settings in z before proceeding.)raccessF_OKrr CommandErrorrrrstatusabspathmessaging_optsmakedirsr config_file_namemsg_generate_templateisfile _copy_filer) r directorytemplatepackage template_dirr#script config_filefile_ file_path output_filers r initr;*s( yyBGG$I)> :Y F  77<< = = ?JL 99\277 + 5 @AA 99Y ( [[!"''//)".retrieve_migrationss  - -c7 ;Ic,j||gSrI)run_no_autogeneraterLs r rPz%revision..retrieve_migrationss  0 0g >IrQziUsing --sql with the revision command when revision_environment is not configured does not make any sensefnas_sql template_argsrONrr)r from_configdictautogenRevisionContextr asboolget_main_optionr(r rWrun_envgenerate_scriptslen)rr>r r?r@rArBrCrDrErFscript_directory command_args environmentrPr6scriptsrOs @r revisionre{sIt'226:!  !! L..$? ++f445KLMK ##I      M     "*88-    $ $ & %5$E$E$GH$G&v$GGH 7|qqz'  IsD0 DDc tj|}tddddddddd }tj|||fd}t |||dj 5|jdddjd}g}|jD]!}|j|j#|rtjd || |jd y#1swYyxYw) zCheck if revision command with autogenerate has pending upgrade ops. :param config: a :class:`.Config` object. .. versionadded:: 1.9.0 NTFr@r=c,j||gSrIrJrLs r rPz"check..retrieve_migrationss))#w7 rQrTz!New upgrade operations detected: )rOdiffsz#No new upgrade operations detected.)r rXrYrZr[r rWr^generated_revisionsupgrade_ops_listextendas_diffsr AutogenerateDiffsDetectedr)rrarbrPmigration_scriptri upgrade_opsrOs @r checkrqs'226:   L..   &44)     " (;;B? E'88  [))+,9 ,,/w 7-  AB1  s "C++C4cLtj|}d|i}tj|j d}|r,d}t |||d|5|j ddd|j|xstj|fd||d|S#1swY7xYw) aMerge two revisions together. Creates a new migration file. :param config: a :class:`.Config` instance :param revisions: The revisions to merge. :param message: string message to apply to the revision. :param branch_label: string label name to apply to the new revision. :param rev_id: hardcoded revision identifier instead of generating a new one. .. seealso:: :ref:`branches` rrGcgSrIrMrNs r nothingzmerge..nothingYsIrQF)rUrVrWNT)refreshr@ branch_labels) r rXr r\r]r r^generate_revisionrD) r revisionsr>rBrDr6rWrcrvs r merger{5s4 ( ( 0F&M ++f445KLMK   '   NN   $6 # #$++-  "       s BB#c tj|d}dvr,|stjdj dd\}fd}t |||||5j dddy#1swYyxYw)aUpgrade to a later version. :param config: a :class:`.Config` instance. :param revision: string revision target or range for --sql mode. May be ``"heads"`` to target the most recent revision(s). :param sql: if True, use ``--sql`` mode. :param tag: an arbitrary "tag" that can be intercepted by custom ``env.py`` scripts via the :meth:`.EnvironmentContext.get_tag_argument` method. N:Range revision not allowedc(j|SrI) _upgrade_revsrMrNrer6s r upgradezupgrade..upgrades##Hc22rQrUrV starting_revdestination_revtagr rXr r(splitr r^)rrer?rrrr6s ` @r rros* ( ( 0FL h##$@A A!)Q!7 h3  !      s "A<<Bc @tj|d}dvr-|stjdj dd\}n|rtjdfd}t |||||5j dddy#1swYyxYw)aRevert to a previous version. :param config: a :class:`.Config` instance. :param revision: string revision target or range for --sql mode. May be ``"base"`` to target the first revision. :param sql: if True, use ``--sql`` mode. :param tag: an arbitrary "tag" that can be intercepted by custom ``env.py`` scripts via the :meth:`.EnvironmentContext.get_tag_argument` method. Nr}r~rz/downgrade with --sql requires :c(j|SrI)_downgrade_revsrs r downgradezdowngrade..downgrades%%h44rQrr)rrer?rrrr6s ` @r rrs* ( ( 0FL h##$@A A!)Q!7 h  =  5  !      s :BBctj|dk(r.fd}t|5jdddyj |D]}j |j y#1swYyxYw)zShow the revision(s) denoted by the given symbol. :param config: a :class:`.Config` instance. :param rev: string revision target. May be ``"current"`` to show the revision(s) currently applied in the database. currentcjj|D]}j|jgSrI) get_revisionsr log_entry)rMrNscrr6s r show_currentzshow..show_currents/**3/##BLL10IrQrUN)r rXr r^rrr)rrMrrr6s` @r showrsv ( ( 0F i   < @ NN A @&&s+B    -,A @s A==Bcf tj|}|._display_historysk''dog( B +-;;(+B(    #%) $$(    rQcfd}t|5jdddy#1swYyxYw)Ncldk(r||gSdk(r||gS|gS)Nrrt)rMrNrrrr@r6s r _display_current_historyzMhistory.._display_history_w_current.._display_current_historysZy  sC@ I " dC@I!tSAIrQr)r r^)rr6rr@rrs```` r _display_history_w_currentz+history.._display_history_w_currents3   3K L NN M L Ls 7Ar)rt)r rXr r(striprr\r]) r rev_rangerrr6rr@rcrrs `` @r historyrs& ( ( 0F i ##N __&,,S1 dt F**+ABC     yDI-"664>t4rQctj|}|r|jd}n|j|j}|D]%}|j |j |dd'y)zShow current available heads in the script directory. :param config: a :class:`.Config` instance. :param verbose: output in verbose mode. :param resolve_dependencies: treat dependency version as down revisions. rTF)rtree_indicatorsN)r rXr get_headsrr)rrresolve_dependenciesr6rrMs r rr)sp ( ( 0F$$W-$$V%5%5%78 NN$   rQc tj|jD]_js|j dj ddj fdfdjDDay)zShow current branch points. :param config: a :class:`.Config` instance. :param verbose: output in verbose mode. z%s %s T)r c3K|]<}dttjzd|jdd>yw) z -> FT)rrN)r`strrer).0rev_objrrs r zbranches..RsO $ c#bkk"233**!Dg+$sAAc3@K|]}j|ywrI) get_revision)rrMr6s r rzbranches..Zs $JJ$   &rQctjfd}t|d5jdddy#1swYyxYw)zDisplay the current revision for a database. :param config: a :class:`.Config` instance. :param verbose: output in verbose mode. crCjdtj|jjj j |D]"}j|j$gS)NzCurrent revision(s) for %s:)rr obfuscate_url_pw connectionengineurlget_all_currentr)rMrNrr6rs r display_versionz current..display_versionlsl    -%%g&8&8&?&?&C&CD ))#.C   w 7 8/ rQT)rU dont_mutateNr rXr r^)rrrr6s`` @r rrasI ( ( 0F  ?     s A  Ac  tj| |rhg d}tj|D]K}d|vr4|j dd\}}||k7r||}ntj d j |Mntj| fd}t| |||rndtj ||5 jdddy#1swYyxYw)a'stamp' the revision table with the given revision; don't run any migrations. :param config: a :class:`.Config` instance. :param revision: target revision or list of revisions. May be a list to indicate stamping of multiple branch heads; may be ``"base"`` to remove all revisions from the table or ``"heads"`` to stamp the most recent revision(s). .. note:: this parameter is called "revisions" in the command line interface. :param sql: use ``--sql`` mode :param tag: an arbitrary "tag" that can be intercepted by custom ``env.py`` scripts via the :class:`.EnvironmentContext.get_tag_argument` method. :param purge: delete all entries in the version table before stamping. Nr}rzMStamp operation with --sql only supports a single starting revision at a timecNjtj|SrI) _stamp_revsr to_tuple)rMrNdestination_revsr6s r do_stampzstamp..do_stamps !!$--0@"A3GGrQ)rUrVrrrpurge) r rXr to_listrr(appendr rr^) rrer?rrr _revisionsrevrrr6s @@r stampr}s< ( ( 0F  h/Ii"+//#q"9i4'#+'+ "//A  # #I .0 <<1H  %(\d &67      s C!!C*cVtj||dk(r-fd}t||5jdddyj |}|st j d|z|D]%}|sJt j|j'y#1swYyxYw)zEdit revision script(s) using $EDITOR. :param config: a :class:`.Config` instance. :param rev: target revision. rc|stjdj|D]!}tj|j#gS)NzNo current revisions)r r(ropen_in_editorr)rMrNrr6s r edit_currentzedit..edit_currentsD''(>??**3/##BGG,0IrQrNz*No revision files indicated by symbol '%s') r rXr r^rr r(rr)rrMrrevsrr6s @r editrs ( ( 0F i  < @ NN A @##C(##.do_ensure_versions%%' rQ)rUrVNr)rr?r6rs r ensure_versionrsK ( ( 0F         s AA )rr returnNone)genericF) rr r2rr3rr4boolrr) NFFr@FNNNNN)rr r> Optional[str]r rr?rr@rrArrBOptional[_RevIdType]rCrrDrrErrFz$Optional[ProcessRevisionDirectiveFn]rz/Union[Optional[Script], List[Optional[Script]]])rz'Config'rr)NNN) rr rzrr>rrBrrDrrzOptional[Script])FN) rr rerr?rrrrr)rr rMrrr)NFF) rr rrrrrrrr)FF)rr rrrrrr)F)rr rrrr)FNF) rr rerr?rrrrrrr)rr r?rrr)& __future__rrtypingrrrrr rZr runtime.environmentr r6r alembic.configr alembic.script.baseralembic.script.revisionrrr!r;rerqr{rrrrrrrrrrrtrQr rs#  %3#%*2?I, N NNN N  Nf")-"& $HL| | ||  |  |  |'| | ||"F|5|~8C|")- 7 777' 7  7  7z ) )) )  )  )^ , ,, ,  ,  ,^.8 $" B5 B5B5B5 B5  B5LIN  ! AE   6:> @ @@ @  @  @  @F)BrQ