gh0UdZddlmZddlZddlZddlZddlZddlmZddl m Z ddl m Z ddl mZddlmZmZmZmZmZmZmZmZmZdd lmZddlZd d lmZmZd d l m!Z!d d l"m#Z#d dl$m%Z%m&Z&d dl'm(Z(er ddl)m*Z*ddl+m,Z,ej-dej.Z/de0d<e j1Z2de0d<e2dz Z3de0d<d/dZ4Gdde5Z6Gdde6Z7Gdde6Z8d0d#Z9d1d%Z:d&Z;d'd(d2d.Zd0Zd?dd1d@d2Zd3ZdS)A BaseRouterzAbstract base class for router.NdatabaseUnion[pw.Database, pw.Proxy]ignoreOptional[Iterable[str]]schema Optional[str]rrmigrator_classType[Migrator]c,||_||_||_||_||_||_t |jtjtj fstd|zt|jtstd|zdS)Initialize the router.zInvalid database: %szInvalid migrator_class: %sN) r+ migrate_tabler/r-rr1 isinstancepwDatabaseProxy TypeError issubclassr)selfr+r5r-r/rr1s r&__init__zBaseRouter.__init__)s! *   ,$-"+rx)@AA ?2X=>> >$-x88 E88CDD D E Er(returnType[MigrateHistory]ctj}|j|_|j|_|j|_tjdtS)z,Initialize and cache MigrationHistory model.T)safe)r_metar+r5 table_namer/ create_table)r<metas r&modelzBaseRouter.model>sB#  ,k #....r( Iterable[str]ct)zGet migrations to run.NotImplementedErrorr<s r&todozBaseRouter.todoHs "!r( List[str]cd|j|jjDS)zScan migrations in database.cg|] }|j Sr"name).0mms r& z#BaseRouter.done..PsNNNBNNNr()rFselectorder_byidrKs r&donezBaseRouter.doneMs9ON$*"3"3"5"5">">tz}"M"MNNNNr(cRt|jfd|jDS)z'Calculate difference between fs and db.cg|]}|v| Sr"r")rRrQrXs r&rTz#BaseRouter.diff..Vs#???d$.>.>.>.>.>r()setrXrL)r<rXs @r&diffzBaseRouter.diffRs.49~~????????r(rcz||j}|jD]}||||S)z2Create migrator and setup it with fake migrations.)r1r+rXrun_one)r<migratorrQs r&r_zBaseRouter.migratorXsF&&t}55I ) )D LLx ( ( ( (r(autoF)r`rQstrr cXdx}}|rTtjtt |t r|n|g}t d|Dsv |}t |tr%dtj tgD}d|D}n,#t$rj d|YdSwxYwj rfd|D}jD]}|jd  t#j|}|sj d dSt#j|d }j d ||||}j d ||S)zYCreate a migration. :param auto: Python module path to scan for models. c34K|]}t|VdSr!) _check_model)rRr#s r& z$BaseRouter.create..js(771|A777777r(cg|] \}}}|| Sr"r")rR_r#ispkgs r&rTz%BaseRouter.create..ns4###"-!QX]####r(c6g|]}t|D]}|Sr") load_models)rRmoduler#s r&rTz%BaseRouter.create..qs-SSSF{6?R?RSS!aSSSSr(zCan't import models module: %sNc:g|]}|jjjv|Sr")rBrQr-)rRr#r<s r&rTz%BaseRouter.create..xs)OOOqw|4;/N/N!/N/N/Nr(Tr%zNo changes found.reversezCreating migration "%s"z"Migration has been created as "%s")syspathappendrr6listallboolpkgutil iter_modules ImportErrorr exceptionr-r\r^r_compile_migrationswarninginfocompile)r<rQr`migraterollbackmodelsmodules migrations` r&createzBaseRouter.create`s  (  O HOOM * * *'d33?TT$F7777777   $G!$--##181E&{m1T1T###TSgSSSFF"   K))*JDQQQ44 { POOOOVOOO!Y B B  Y D AAAA(??G  ##$7888t)$-NNNH 2D999||D'844 =tDDD s"AB++%CCinitialct|j}t|t|jj}|s|jdS||j d|t|jg}| |||d}t|j}| ||dd|j d|dS)zMerge migrations into one.zCan't merge migrationszMerge migrations into "%s"rTr%forcez$Migrations has been merged into "%s"N) rr+r{rtr_ormrerrorclearr}r~r^)r<rQr_rrs r&mergezBaseRouter.mergesDM**$XtDM4E/F/FGG ?;$$%=>> >  5t<<<%dmR88||D'8Q77DM** T8$d ;;; ?FFFtr(c\|jdS)zClear migrations.N)rFdeleteexecuterKs r&rzBaseRouter.clears( ##%%%%%r(rcrrnum Optional[int]ct)Create a migration.rI)r<rQrrrs r&r~zBaseRouter.compiles "!r(ct)Read migration from file.rI)r<rQs r&readzBaseRouter.reads!!r(T)r% downgraderr_r%rvrrc ||\}}|rtj}d|j_tjd5tjd|5|||j|dddn #1swxYwYdddn #1swxYwY|r6|j||j d|g|_ |S|j 5|sT|j d||||j|||j|n|j d ||||j|||j |jj|k|j d||cdddS#1swxYwYdS#t"$r=|j|sd nd } |j d | |wxYw) z(Run/emulate a migration with given name.Nzpeewee.Model.selectzpeewee.Database.execute_sql) return_valuernrPzDone %sz Migrate "%s"zRolling back %s MigrationRollbackz %s failed: %s)rrMock fetch_onerpatchr+rFrrr}__ops__ transactionrwhererQr Exceptionrrz) r<rQr_r%rrrr mocked_cursor operations r&r^zBaseRouter.run_onesX$  $ $ GX  $ 7; '4Z 566@@ 1 999@@GHdm$????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6J%%4%000K$$Y555#%  **,,   QK$$^T:::GHdm$????HJJJJ%%4%0000K$$%6===HXt}4@@@@HJJJJ%%''--djo.EFFNNPPP   D111                      M " " $ $ $+4D *I K ! !/9d C C C   sA HB&B: BB B B B HB!!H$B!%AH)HC7H9 HH  H H HAIrnc  |jdg}|j}|s|jd|S|j}|D]8}|||||||r||krn9|S)zRun migrations.zStarting migrationszThere is nothing to migrater)rr}r\r_rsr^)r<rQr%rXr\r_mnames r&runzBaseRouter.runs .///y  K  : ; ; ;K=  E KK UH4t LL M M M   r(c|j}|sd}t||d}|j}|||dd|jd|dS)zRollback the latest migration.zThere is nothing to rollbackFT)r%rzDowngraded migration: %sN)rX RuntimeErrorr_r^rr|)r<rXmsgrQr_s r&rzBaseRouter.rollbacksmy $0Cs## #Bx= T8%4 @@@ 6=====r() r+r,r-r.r/r0rrr1r2)r>r?)r>rG)r>rM)r>r)rQrar`r r>r0)r)rQrarcrcN) rQrarrarrarrr>ra) rQrar_rr%rvrrvrrvr>rar!)rQr0r%rvr>rM)__name__ __module__ __qualname____doc__rrrr=rrFpropertyrLrXr\r_rrrr~rr^rrr"r(r&r*r*&s)) $*. $)1EEEEE*_"""X"OOOXO@@@X@ _'''''''R$&&& VZ""""" """"......`e$ > > > > >r(r*cxeZdZdZejdZ ddfd ZedZ ddd Zd Z fd Z xZ S)RouterzFile system router.z[\d]{3}_[^\.]+\.py$N migrate_dirOptional[Union[str, Path]]c tt|j|fi||t}n$t |t rt |}||_dSr4N)superrr=rr6rarr)r<r+rkwargs __class__s r&r=zRouter.__init__sd %fd$X88888  -KK  S ) ) ,{++K&r(cjs;jdjjdt fdt jjDS)zScan migrations in file system.z'Migration directory: %s does not exist.T)parentsc3`K|](}j||ddV)dS)N)filemaskmatch)rRfr<s r&rfzRouter.todo..sA]]dmFYFYZ[F\F\]af]]]]]]r()rexistsrr|mkdirsortedoslistdirrKs`r&rLz Router.todo s&&(( 1 K   I4K[ \ \ \   " "4 " 0 0 0]]]]bj1A&B&B]]]]]]r(rcr>rac4|t|j}d|dz|z}|dz}|j|z }|d5}|t j|||dddn #1swxYwY|S)rNz{:03}_r.pyw)rrrQ)lenrLformatropenwriter)r<rQrrrfilenamerrrs r&r~zRouter.compiles ;di..CsQw''$.%<(* YYs^^ Xq GGHOGhXVVV W W W X X X X X X X X X X X X X X X s+B  BBcZ|j|dzz }|d5}|}i}t|ddd}t ||d|dt |d t fcdddS#1swxYwYdS) rrrzexecT) dont_inheritNrr)rrrr~rgetr')r<rQrrrcodescopes r&rz Router.read s4%<0 YYs^^ Kq6688DE4V$GGGD ud # # #99Y--uyyT/J/JJ  K K K K K K K K K K K K K K K K K KsA0B  B$'B$ctt||jD]#}|j|dzz }|$dS)zRemove migrations from fs.rN)rrrrLrunlink)r<rQrrrs r&rz Router.clear*sZ fd!!###I  D#te|4D KKMMMM  r(r!)rrr)r>ra) rrrrrer~rr=rrLrr __classcell__rs@r&rrsrz011H 37 ' ' ' ' ' ' '^^X^     KKKr(rc*eZdZdZdfd ZdZxZS) ModuleRouterzModule based router.rc tt|j|fi|t|trt |}||_dSr)rrr=r6rarmigrate_module)r<r+rrrs r&r=zModuleRouter.__init__5sU*lD!!*8>>v>>> nc * * ;*>::N,r(ct|j|}t|dtt|dtfS)zRead migrations from a module.rr)getattrrr')r<rQmods r&rzModuleRouter.read>s7d)400sIt,,gc:t.L.LLLr()r)rrrrr=rrrs@r&rr2sY------MMMMMMMr(rrlUnion[str, ModuleType]r>Set[Type[pw.Model]]cht|tr|gnt|}d|DS)zLoad models from given module.c vh|]5ttfdtDD]}|6S)c38K|]}t|VdSr!)r)rRrQrls r&rfz(load_models...Ks-&U&Uwvt'<'<&U&U&U&U&U&Ur()filterredir)rRr#rls @r& zload_models..Hse     &U&U&U&UV&U&U&UVV        r()r6r_import_submodules)rlrs r&rkrkDsI%VZ88Xvhh>PQW>X>XG     r(.c|durt}t|trt|}t |ds|hSg}t|j|zr|S|t|jz}t j|j|jdzD]i\}}}| |d}||j &|j |}| ||r|t|z }j|S)N.__path__.)r[r6rarhasattrrrw walk_packagesr find_specloader load_modulersr)packagepassedrrrQis_pkgspecrls r&rrOs! }}'3)(( 7J ' 'yG 7 v% c'"###F ' 5g6FHX[^H^ _ _22fd++ <4;. ((..v  2 )&11 1G Nr(ct|to)t|tjot |dS)z/Check object if it's a peewee model and unique.rB)r6typer;r7Modelr)objs r&rereks3 c4 XZRX%>%> X73PWCXCXXr(Fror_rrList[TModelType]ract|j}|r||}}t||||}|sdSttjd|dz}t d|S)z$Compile migrations for given models.rorcz  )rtrrrjoinsplitrsub)r_rrpsourcerrs r&r{r{ps (,  F(668WEEEJ r W\&++j"9"9"?"?"E"EFF FD <<d # ##r(r!)rlrr>r).)r_rrrr>ra)=r __future__rrrwrrq functoolsr importlibrpathlibrtypesrtypingrr r r r r rrrunittestrpeeweer7r`rrlogsrr_rrrrtemplaterloggingrpeewee_migrate.typesrr~Mr__annotations__cwdrrr'objectr*rrrkrrer{r"r(r&rs""""""  %%%%%%######XXXXXXXXXXXXXXXXXXXXXX$$$$$$$$111111110//////"*Wbd++++++ #l22222O>O>O>O>O>O>O>O>d77777Z777tMMMMM:MMM$8YYY QV $ $ $ $ $ $ $ $r(