B
    üÏf*  ã               @   s  d dl Zd dlZd dlZd dlZd dlmZ d dlmZ ddlm	Z
 ddlmZ ddlmZ ddlm	Z	 dd	lmZ dd
lmZ dd„ Zd2dd„Zdd„ Zdd„ Zdd„ Zd3dd„Zd4dd„Zd5dd„Zd6d!d"„Zd#d$„ Zd%d&„ Zd7d(d)„Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ ZdS )8é    N)Úconfig)Ú	provisioné   )Úutilé   )Úcommand)Úscript)ÚScript)ÚScriptDirectoryc               C   s   t jrdt j S dS d S )Nz
scratch_%sZscratch)r   ZFOLLOWER_IDENT© r   r   úUC:\Users\Lenovo\AppData\Local\Temp\pip-unpacked-wheel-q6xnih48\alembic\testing\env.pyÚ_get_staging_directory   s    
r   TÚgenericFc             C   s¬   t ƒ }| rœtj tƒ d¡}tj |¡r2td| ƒ‚tj|||d |rœyt	 
|d¡ W n tk
rj   Y nX |dks|t|ƒ‚ttj |d¡d|kr–dndƒ tj |¡}|S )NÚscriptsz2staging directory %s already exists; poor cleanup?)Útemplatezenv.py)Zpep3147_envonlyÚsimpleÚpep3147_everythingÚpep3147r   )Ú_testing_configÚosÚpathÚjoinr   ÚexistsÚAssertionErrorr   Úinitr   Zload_python_fileÚAttributeErrorÚmake_sourcelessr   r
   Úfrom_config)Úcreater   Ú
sourcelessÚcfgr   Zscr   r   r   Ústaging_env   s&    
r!   c              C   s(   ddl m}  | j ¡  t tƒ d¡ d S )Nr   )ÚenginesT)Úsqlalchemy.testingr"   Ztesting_reaperZ	close_allÚshutilÚrmtreer   )r"   r   r   r   Úclear_staging_env:   s    
r&   c          	   C   sB   t j tƒ d¡}t j |d¡}t|dƒ}| | ¡ W d Q R X d S )Nr   zscript.py.makoÚw)r   r   r   r   ÚopenÚwrite)ÚtxtÚdir_r   Úfr   r   r   Úscript_file_fixtureA   s    r-   c          	   C   sb   t j tƒ d¡}d|  } t j |d¡}t |¡}|r>t  |¡ t|dƒ}| | ¡ W d Q R X d S )Nr   z6
from alembic import context

config = context.config
zenv.pyr'   )	r   r   r   r   r   Úpyc_file_from_pathÚunlinkr(   r)   )r*   r+   r   Úpyc_pathr,   r   r   r   Úenv_file_fixtureH   s    

r1   úfoo.dbc             K   s>   t j tƒ d¡}d|| f }|r.tjr.||d< tj|||dS )Nr   zsqlite:///%s/%sÚscope)ÚurlÚfutureÚoptions)r   r   r   r   r   Zsqla_14Útesting_utilZtesting_engine)Útempnamer5   r3   r6   r+   r4   r   r   r   Ú_sqlite_file_db\   s
    
r9   c             C   sN   t j tƒ d¡}d| }|p(dtjjjk}td||| r:dnd|rDdndf ƒS )	Nr   zsqlite:///%s/foo.dbr5   aë  
[alembic]
script_location = %s
sqlalchemy.url = %s
sourceless = %s
%s

[loggers]
keys = root,sqlalchemy

[handlers]
keys = console

[logger_root]
level = WARN
handlers = console
qualname =

[logger_sqlalchemy]
level = DEBUG
handlers =
qualname = sqlalchemy.engine

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatters]
keys = generic

[formatter_generic]
format = %%(levelname)-5.5s [%%(name)s] %%(message)s
datefmt = %%H:%%M:%%S
    ÚtrueÚfalsezsqlalchemy.future = trueÚ )	r   r   r   r   r   ÚdbÚ	__class__Ú
__module__Ú_write_config_file)r   r5   r+   r4   Úsqlalchemy_futurer   r   r   Ú_sqlite_testing_configd   s    $
rB   r<   c             C   sL   t j tƒ d¡}dtjjjk}d| }td|||r6dnd| r@dnd|f ƒS )Nr   r5   zsqlite:///%s/foo.dbaö  
[alembic]
script_location = %s
sqlalchemy.url = %s
sqlalchemy.future = %s
sourceless = %s
version_locations = %%(here)s/model1/ %%(here)s/model2/ %%(here)s/model3/ %s

[loggers]
keys = root

[handlers]
keys = console

[logger_root]
level = WARN
handlers = console
qualname =

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatters]
keys = generic

[formatter_generic]
format = %%(levelname)-5.5s [%%(name)s] %%(message)s
datefmt = %%H:%%M:%%S
    r:   r;   )	r   r   r   r   r   r=   r>   r?   r@   )r   Zextra_version_locationr+   rA   r4   r   r   r   Ú_multi_dir_testing_config˜   s     

rC   Ú
postgresqlc             C   s"   t j tƒ d¡}td|| |f ƒS )zLuse a postgresql url with no host so that
    connections guaranteed to failr   a…  
[alembic]
script_location = %s
sqlalchemy.url = %s://
%s

[loggers]
keys = root

[handlers]
keys = console

[logger_root]
level = WARN
handlers = console
qualname =

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatters]
keys = generic

[formatter_generic]
format = %%(levelname)-5.5s [%%(name)s] %%(message)s
datefmt = %%H:%%M:%%S

)r   r   r   r   r@   )ÚdialectZ
directivesr+   r   r   r   Ú_no_sql_testing_configÉ   s    rF   c          	   C   s,   t ƒ }t|jdƒ}| | ¡ W d Q R X |S )Nr'   )r   r(   Zconfig_file_namer)   )Útextr    r,   r   r   r   r@   ñ   s    r@   c              C   s<   ddl m}  t tƒ tj¡s(t tƒ ¡ | tj tƒ d¡ƒS )Nr   )ÚConfigztest_alembic.ini)	Zalembic.configrH   r   Úaccessr   ÚF_OKÚmkdirr   r   )rH   r   r   r   r   ø   s    r   Úasciic       
   	   C   s¾   | j  |¡}|j}t |¡}|r*| |¡}t|dƒ}| |¡ W d Q R X t 	|¡}|rbt
 |¡ t | |¡}	| j  |	j¡}|j|	jkrtdƒ‚| j j|	dd |rºt||dkr´dndƒ d S )NÚwbz2Can't change down_revision on a refresh operation.T)Ú_replacer   r   r   )Zrevision_mapÚget_revisionr   ÚtextwrapÚdedentÚencoder(   r)   r   r.   r   r/   r	   Z
_from_pathÚrevisionZdown_revisionÚ	ExceptionZadd_revisionr   )
Z	scriptdirÚrev_idÚcontentÚencodingr   Úoldr   Úfpr0   r   r   r   r   Úwrite_script   s&    



rZ   c             C   s   dd l }| | ¡ |dkrZt | ¡}tjjd }tj 	| ¡\}}|| }t
 ||¡ |}n|dksft‚t | ¡}t |tj¡s‚t‚t | ¡ d S )Nr   r   )r   r   )Ú
py_compileÚcompiler   r.   Ú	importlibÚ	machineryÚBYTECODE_SUFFIXESr   r   Úsplitextr$   Úmover   rI   rJ   r/   )r   Ústyler[   r0   ÚsuffixÚfilepathÚextZsimple_pyc_pathr   r   r   r     s    


r   c             C   s¤   t  ¡ }t  ¡ }t  ¡ }t | ¡}|j|dddd t||d| ƒ |j|dd|d t||d|› d|› d	d
d |j|dd|d t||d||f ƒ |||fS )Nz
revision aTÚbase)ÚrefreshÚheadz¨"Rev A"
revision = '%s'
down_revision = None

from alembic import op


def upgrade():
    op.execute("CREATE STEP 1")


def downgrade():
    op.execute("DROP STEP 1")

z
revision bu/   # coding: utf-8
"Rev B, mÃ©il, %3"
revision = 'z'
down_revision = 'z}'

from alembic import op


def upgrade():
    op.execute("CREATE STEP 2")


def downgrade():
    op.execute("DROP STEP 2")

zutf-8)rW   z
revision cz¨"Rev C"
revision = '%s'
down_revision = '%s'

from alembic import op


def upgrade():
    op.execute("CREATE STEP 3")


def downgrade():
    op.execute("DROP STEP 3")

)r   rU   r
   r   Úgenerate_revisionrZ   )r    ÚaÚbÚcr   r   r   r   Úthree_rev_fixture1  s.    
rm   c             C   s¤   t  ¡ }t  ¡ }t  ¡ }t | ¡}|j|d|ddd t||d||f ƒ |j|d|ddd t||d||f ƒ |j|d|ddd t||d||f ƒ |||fS )	z:Create a multiple head fixture from the three-revs fixturezrevision d from bT)rh   Zsplicerg   z¨"Rev D"
revision = '%s'
down_revision = '%s'

from alembic import op


def upgrade():
    op.execute("CREATE STEP 4")


def downgrade():
    op.execute("DROP STEP 4")

zrevision e from dz¨"Rev E"
revision = '%s'
down_revision = '%s'

from alembic import op


def upgrade():
    op.execute("CREATE STEP 5")


def downgrade():
    op.execute("DROP STEP 5")

zrevision f from bz¨"Rev F"
revision = '%s'
down_revision = '%s'

from alembic import op


def upgrade():
    op.execute("CREATE STEP 6")


def downgrade():
    op.execute("DROP STEP 6")

)r   rU   r
   r   ri   rZ   )r    rj   rk   rl   ÚdÚer,   r   r   r   r   Úmulti_heads_fixture~  s4    
rp   c             C   s`   t j tƒ d¡}dtjjjk}d |  ¡ ¡}d dd„ |  	¡ D ƒ¡} t
d||rRdnd	|| f ƒS )
z?alembic.ini fixture to work exactly with the 'multidb' templater   r5   z, z

c             s   s    | ]\}}d ||j f V  qdS )z[%s]
sqlalchemy.url = %sN)r4   )Ú.0ÚkeyÚvaluer   r   r   ú	<genexpr>à  s   z*_multidb_testing_config.<locals>.<genexpr>aª  
[alembic]
script_location = %s
sourceless = false
sqlalchemy.future = %s
databases = %s

%s
[loggers]
keys = root

[handlers]
keys = console

[logger_root]
level = WARN
handlers = console
qualname =

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatters]
keys = generic

[formatter_generic]
format = %%(levelname)-5.5s [%%(name)s] %%(message)s
datefmt = %%H:%%M:%%S
    r:   r;   )r   r   r   r   r   r=   r>   r?   ÚkeysÚitemsr@   )r"   r+   rA   Z	databasesr   r   r   Ú_multidb_testing_config×  s     rw   )Tr   F)r2   FN)FF)Fr<   )rD   r<   )rL   F)Úimportlib.machineryr]   r   r$   rP   r#   r   r   r<   r   r7   r   r   r	   r
   r   r!   r&   r-   r1   r9   rB   rC   rF   r@   r   rZ   r   rm   rp   rw   r   r   r   r   Ú<module>   s6   
"

4
1
(	
MY