U p_ @sddlZddlZddlmZddlmZddlZddlZddl m Z ddl m Z m Z ddl mZmZddlmZmZddlmZed ejZejed Zd d Zeejejeje d Z!e!"Z#W5QRXGddde$Z%Gddde%Z&Gddde%Z'dS)N) import_module) ModuleType)cached_property)LOGGERMigrateHistory) diff_manyNEWLINE) string_typesexec_in)Migratorz\s+$ migrationscCsdSN)mdrr /router.pyrz template.txtc@seZdZdZdefddZeddZeddZ d d d Z d!ddZ ddZ eddZ eddZeddZd"ddZd#ddZddZdS)$ BaseRouterzAbstract base class for router.ZmigratehistorycCs6||_||_||_t|jtjtjfs2td|dS)NzInvalid database: %s)database migrate_tablelogger isinstancepwZDatabaseZProxy RuntimeError)selfrrrrrr__init__s zBaseRouter.__init__cCs"|jtj_|jtj_tdtS)z+Ensure that migrations has prepared to run.T)rrZ_metarZdb_tableZ create_tablerrrrmodel"s   zBaseRouter.modelcCstdSr NotImplementedErrorrrrrtodo+szBaseRouter.todoautoFc sPd}}r"ttrHz tWn"tk rF|jdYSXttrvttddfddt D|j D]}| ||j q|}t|j j }t|||j d}|s|jdSttd |d }td |}t|||j d d }ttd |d }td |}|jd |||||}|jd||S)Create a migration.zCan't import models module: %scSst|tot|tjSr )rtype issubclassrZModel)rrrrr;rz#BaseRouter.create..c3s|]}t|VqdSr )getattr).0rr"rr <sz$BaseRouter.create..)migratorzNo changes found.z  T)r+reversezCreating migration "%s"zMigration created %s)rr r ImportErrorrerrorrlistfilterdirdiffrun_oner+ZormvaluesrwarnrjoinsplitCLEAN_REsubinfo_create) rnamer"migraterollbackZ migrationZmodels1Zmodels2pathrr)rcreate/s8       zBaseRouter.creater$cCstdSr r)rr=r>r?rrrr<TszBaseRouter._createcCstdSr r)rr=rrrreadWszBaseRouter.readcCsdd|jDS)zScan migrations in database.cSsg|] }|jqSrr=)r(Zmmrrr ]sz#BaseRouter.done..)rZselectrrrrdoneZszBaseRouter.donecst|jfdd|jDS)z'Calculate difference between fs and db.csg|]}|kr|qSrr)r(r=rErrrDcsz#BaseRouter.diff..)setrEr!rrrFrr3_s zBaseRouter.diffcCs&t|j}|jD]}|||q|S)z2Create migrator and setup it with fake migrations.)r rrEr4)rr+r=rrrr+es  zBaseRouter.migratorTc Cstz.||\}}|rtd,td|||j|dW5QRXW5QRX|rr|jj|d|jd|||WS|jd||j |s|||j|d| |jj|d|jd|nP|jd||||j|d| |j |jj |k|jd|W5QRXWn>tk rn}z|j|jd |W5d }~XYnXd S) zRun a migration.zpeewee.Model.selectzpeewee.Query._execute)fakerCzDone %sz Running "%s"zRolling back %szRolled back %szMigration failed: %sN)rBmockZpatchrrrArr;ZcleanZ transactionrundeletewherer=Zexecute Exceptionr?Z exception) rr=r+rHZ downgradeforcer>r?excrrrr4ms6  $  zBaseRouter.run_oneNcCsj|jdg}|j}|s*|jd|S|j}|D]0}|j||||d|||r4||kr4qfq4|S)zRun migrations.zStarting migrationszThere is nothing to migrate)rHrN)rr;r3r+r4append)rr=rHrEr3r+ZmnamerrrrJs    zBaseRouter.runcCsV|}|j}|std||dkr.td|j}|||dd|jd|dS)NzNo migrations are found.z$Only last migration can be canceled.FTzDowngraded migration: %s)striprErr+r4rr6)rr=rEr+rrrr?s zBaseRouter.rollback)r"F)r$r$)TFF)NF)__name__ __module__ __qualname____doc__rrrrpropertyr!rAr<rBrEr3r+r4rJr?rrrrrs$   %     $ rcsHeZdZedZeffdd ZeddZ d ddZ d d Z Z S) Routerz[\d]{3}_[^\.]+\.py$c stt|j|f|||_dSr )superrXr migrate_dir)rrrZkwargs __class__rrrszRouter.__init__csHtjjs*jdjtjtfddtjDS)zScan migrations in file system.z'Migration directory: %s does not exist.c3s,|]$}j|rd|ddVqdS)r$N)filemaskmatchr7)r(frrrr*s zRouter.todo..) osr@existsrZrr6makedirssortedlistdirrrrrr!s    z Router.todor$c Csbt|j}d|d}||d}tj|j|}t|d}|t j||dW5QRX|S)r#z{:03}_.pyw)r>r?) lenr!formatrbr@r7rZopenwriteMIGRATE_TEMPLATE)rr=r>r?Znumprefixr@rarrrr<s   zRouter._createc Cs^ttj|j|d<}|}i}t|||dt|dtfW5QRSQRXdS)zRead migration from file.rhr>r?N) rlrbr@r7rZrBr getVOID)rr=racodeZscoperrrrBs  z Router.read)r$r$) rSrTrUrecompiler_ MIGRATE_DIRrrWr!r<rB __classcell__rrr\rrXs    rXcs&eZdZdfdd ZddZZS) ModuleRouterr c s0tt|j|f|t|tr&t|}||_dSr )rYrwrrr rmigrate_module)rrrxr[r\rrrs zModuleRouter.__init__cCs$t|j|}t|dtt|dtfS)Nr>r?)r'rxrq)rr=modrrrrBs zModuleRouter.read)r )rSrTrUrrBrvrrr\rrwsrw)(rbrs importlibrtypesrrIZpeeweerrZpeewee_migraterrZpeewee_migrate.autorrZpeewee_migrate.compatr r Zpeewee_migrate.migratorr rtMr9r@r7getcwdrurqrlabspathdirname__file__trBrnobjectrrXrwrrrrs&    $%