o
    voi.                     @  sJ  U d dl mZ d dlZd dlmZ 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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lmZ d dlmZ  d dlm!Z" d dl#m$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l0m1Z1 dd l2m3Z3 e4 Z5e56d!g G d"d# d#e"Z!da7G d$d% d%e!e Zd&e_8d@d(d)Z9i Z:d*e;d+< eedAd2d3Z<eedBd5d3Z<edCd7d3Z<edBd8d9Z=	:	;		;	dDd<d=Z>G d>d? d?Z?dS )E    )annotationsN)contextmanager)Any)Dict)	Generator)Literal)overload)Columncreate_mock_engine)inspect)MetaData)String)Table)testing)text)config)mock)eq_)FutureEngineMixin)
TablesTest)TestBase)drop_all_tables_from_metadata   )_get_dialect)_get_staging_directory   )EnvironmentContext)MigrationContext)
Operations)sqla_compat)sqla_2ztest.cfgc                   @  s   e Zd ZeZe dd ZedddZ	e dd Z
e d	d
 Zejdd Zejdd Zejdd Zejdd Ze dd ZdS )r   c                 c  sj    d V  t  }t|D ]&}tj||}tj|s!tj|r't| qtj|r2t	
| qd S N)r   oslistdirpathjoinisfileislinkunlinkisdirshutilrmtree)selflocationfilename	file_path r1   L/home/ubuntu/.local/lib/python3.10/site-packages/alembic/testing/fixtures.pyclear_staging_dir/   s   
zTestBase.clear_staging_dirreturnGenerator[None, None, None]c              	   c  s8    t  }zt | d V  W t | d S t | w r"   )r#   getcwdchdir)r-   dirnamecurrent_dirr1   r1   r2   pushd:   s   
zTestBase.pushdc                 c  s    d V  t jdd  d S )NALEMBIC_CONFIG)r#   environpopr-   r1   r1   r2   pop_alembic_config_envC   s   zTestBase.pop_alembic_config_envc                 c  s>    |j dd t|V  W d    d S 1 sw   Y  d S )NT)_per_migration)begin_transactionr   )r-   migration_contextr1   r1   r2   ops_contextH   s   "zTestBase.ops_contextc                 C  s   t j|tdddS )NT)transaction_per_migrationoptsr   	configuredictr-   
connectionr1   r1   r2   rB   M   s   
zTestBase.migration_contextc                 C  s   t j|tddddS )NT)rD   as_sqlrE   rG   rJ   r1   r1   r2   as_sql_migration_contextS   s   z!TestBase.as_sql_migration_contextc                 c  s@    t j }|a|V  d aW d    d S 1 sw   Y  d S r"   )r   dbconnect_connection_fixture_connection)r-   connr1   r1   r2   rK   Y   s   "zTestBase.connectionc                 #  sB    dd  fdd}|V   durdur j _dS dS dS )z'Restore runners for modified operationsNc                   s   | j j |  d S r"   )_to_impl	_registrycopy)_op_clsop_clssaved_implsr1   r2   _save_attrsj   s   z0TestBase.restore_operations.<locals>._save_attrs)rR   rS   )r-   rY   r1   rV   r2   restore_operationsc   s   zTestBase.restore_operationsc                 c  s    ddl m} | }||j_|V  |j`tr?t r?t }|  t	  t
|t W d   dS 1 s8w   Y  dS t
|tj dS )z>Provide bound MetaData for a single test, dropping afterwards.r   )schemaN)sqlalchemy.sqlr[   r   instancemetadatarP   in_transactionget_transactionrollbackbeginr   r   rN   )r-   requestr[   r^   transr1   r1   r2   r^   t   s$   
"zTestBase.metadataN)r4   r5   )__name__
__module____qualname__r!   is_sqlalchemy_futurer   fixturer3   r   r:   r?   rC   rB   rM   rK   rZ   r   r^   r1   r1   r1   r2   r   ,   s(    






	
r   c                   @  s   e Zd ZdS )r   N)re   rf   rg   r1   r1   r1   r2   r      s    r   Tpostgresql://c                   s$   g   fdd}t | | fS )Nc                   s     t| jjd d S N)dialect)appendstrcompilerl   )sqlmultiparamsparamsbufenginer1   r2   dump   s   zcapture_db.<locals>.dumpr
   )rl   rv   r1   rs   r2   
capture_db   s   
rw   zDict[Any, Any]_engsbytes_ioLiteral[True]kwr   r4   !Generator[io.BytesIO, None, None]c                 K     d S r"   r1   )ry   r{   r1   r1   r2   capture_context_buffer      r~   "Generator[io.StringIO, None, None]c                  K  r}   r"   r1   )r{   r1   r1   r2   r~      r   /Generator[io.StringIO | io.BytesIO, None, None]c                  +  s     ddrt }nt }d|d tj  fdd}tj	td| |V  W d    d S 1 s9w   Y  d S )Nry   Fsqlite)dialect_nameoutput_bufferc                       |j di   | i |S Nr1   updateargoptconfr{   r1   r2   rH         z)capture_context_buffer.<locals>.configurerH   )
r=   ioBytesIOStringIOr   r   rH   r   patchobject)r{   rt   rH   r1   r   r2   r~      s   
"c                  +  s    ddl m} ddlm} t  | }| }||d fdd}d|i t	j
fd	d
}tjt	d|  V  W d    d S 1 sLw   Y  d S )Nr   )_sqlite_file_dbr   )eventbefore_cursor_executec                   s     |d  d S )N
)write)rQ   cursor	statement
parameterscontextexecutemanyrt   r1   r2   bce   s   z*capture_engine_context_buffer.<locals>.bcerK   c                    r   r   r   r   r   r1   r2   rH      r   z0capture_engine_context_buffer.<locals>.configurerH   )envr   
sqlalchemyr   r   r   rO   listens_forr   r   rH   r   r   r   )r{   r   r   engrQ   r   rH   r1   )rt   r   r{   r2   capture_engine_context_buffer   s   
"r   defaultFc                   s   i }|rt |d|d< G  fddd}| G fdddt} r' |d< |r-||d< t| |d ur;|_d	_ sLfd
d}tj|d}	n|d< d }	||	|}
t|
tj	_
|
S )N)naming_conventiontarget_metadatac                      s(   e Zd Zdd Z fddZdd ZdS )zop_fixture.<locals>.buffer_c                 S  s
   g | _ d S r"   linesr>   r1   r1   r2   __init__   s   
z$op_fixture.<locals>.buffer_.__init__c                   sF   |  }tdd|} rtdd|}tdd|}| j| d S )N[\n\t] z    z\;\n*$)stripresubr   rm   )r-   msgrL   r1   r2   r      s   z!op_fixture.<locals>.buffer_.writec                 S  r}   r"   r1   r>   r1   r1   r2   flush      z!op_fixture.<locals>.buffer_.flushN)re   rf   rg   r   r   r   r1   r   r1   r2   buffer_   s    r   c                      s<   e Zd Z fddZ fddZ fddZ fddZd	S )
zop_fixture.<locals>.ctxc                   s    S r"   r1   r>   r   r1   r2   get_buf  r   zop_fixture.<locals>.ctx.get_bufc                   s   g  j d d < d S r"   r   r>   r   r1   r2   clear_assertions  s   z(op_fixture.<locals>.ctx.clear_assertionsc                   s   t  jdd |D  d S )Nc                 S  s   g | ]	}t d d|qS )r   r   )r   r   ).0sr1   r1   r2   
<listcomp>  s    z3op_fixture.<locals>.ctx.assert_.<locals>.<listcomp>)r   r   )r-   rp   r   r1   r2   assert_  s   zop_fixture.<locals>.ctx.assert_c                   s6    j D ]}tdd||v r d S qJ d| j f )Nr   r   Fz"Could not locate fragment %r in %r)r   r   r   )r-   rp   stmtr   r1   r2   assert_contains  s   
z'op_fixture.<locals>.ctx.assert_containsN)re   rf   rg   r   r   r   r   r1   r   r1   r2   ctx  s
    r   rL   literal_bindsTc                   s:   t | tr	t| } | jsJ t| jd} | d S rk   )
isinstancern   r   supports_executionro   r   )r   
multiparamparamrp   )rt   ctx_dialectr1   r2   execute$  s
   

zop_fixture.<locals>.execute)rl   r   r   )r   r   r   supports_native_boolean#non_native_boolean_check_constraintr   Mockr   alembicop_proxy)rl   rL   r   r   native_booleanrF   r   r   r   rK   r   r1   )rL   rt   r   r2   
op_fixture   s,   r   c                   @  s:   e Zd ZdZdd Zdd Zdd Zdd	 ZdddZd
S )AlterColRoundTripFixture)alter_columnc                 C  s2   t j | _t| j| _t| j| _t	 | _
d S r"   )r   rN   rO   rQ   r   rH   r   r   r   r   r^   r>   r1   r1   r2   setUp=  s   zAlterColRoundTripFixture.setUpc                 C  s8   t d|}t d|}| jj||rJ d||f d S )Nqz3Type objects %r and %r didn't compare as equivalent)r	   r   implcompare_type)r-   t1t2c1c2r1   r1   r2   _compare_typeC  s   


z&AlterColRoundTripFixture._compare_typec                 C  sD   t d||d}t d||d}| jj||||r J d||f d S )Nr   )server_defaultz6server defaults %r and %r didn't compare as equivalent)r	   r   r   compare_server_default)r-   r   s1r   s2r   r   r1   r1   r2   _compare_server_defaultJ  s   
z0AlterColRoundTripFixture._compare_server_defaultc                 C  sR   t | j | j  | j| j W d    n1 sw   Y  | j  d S r"   )r    %_safe_rollback_connection_transactionrQ   rb   r^   drop_allcloser>   r1   r1   r2   tearDownQ  s
   z!AlterColRoundTripFixture.tearDownNc           	      C  s  t |dd|dtd|dd|dd d}td	| j|}t| jH || j t	| j}|
d	d
 }| jjd	|j|j|jd urJ|jnd|jrPdnd|dd |dd|dd |dd d	 W d    n1 srw   Y  t	| j}|
d	d
 }|d u r|}t|d d|v r|d n|j | |d |d|d  t|d |d|j | |d |dd |d|d d|v r|d j d S |jd ur|jjj d S d  d S )Nnamecolnametype
   nullableTr   )r   r   xr   F)existing_typeexisting_server_defaultexisting_nullabler   r   new_column_nametype_r   )r	   getr   r   r^   r    _ensure_scope_for_ddlrQ   creater   get_columnsr   r   r   r   r   r   r   r   r   r   r   )	r-   from_to_comparecolumntinspold_colnew_colr1   r1   r2   _run_alter_colW  sb   











	
z'AlterColRoundTripFixture._run_alter_colr"   )	re   rf   rg   __requires__r   r   r   r   r   r1   r1   r1   r2   r   6  s    r   )rj   )ry   rz   r{   r   r4   r|   )r{   r   r4   r   )r{   r   r4   r   )r   FNFN)@
__future__r   configparser
contextlibr   r   r#   r   r+   typingr   r   r   r   r   r   r	   r   r   r   r   r   r   r   sqlalchemy.testingr   r   sqlalchemy.testing.assertionsr   sqlalchemy.testing.fixturesr   r   SQLAlchemyTablesTestr   SQLAlchemyTestBasesqlalchemy.testing.utilr   r   
assertionsr   r   r   environmentr   	migrationr   
operationsr   utilr    util.sqla_compatr!   ConfigParsertesting_configreadrP   rh   rw   rx   __annotations__r~   r   r   r   r1   r1   r1   r2   <module>   sx    a


T