o
    Šågf4  ã                   @  s°  d dl m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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 ejrkd
dlmZ d
dlmZ d
dlmZ G dd„ dƒZeƒ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZ d:dd„Z!G dd„ dƒZ"d;d d!„Z#ej$			"	"d<d=d-d.„ƒZ%ej$			/	"d>d?d2d.„ƒZ%			"	"	"	"d@d3d.„Z%d:d4d5„Z&G d6d7„ d7ƒZ'G d8d9„ d9ƒZ(dS )Aé    )ÚannotationsN)ÚAny)ÚDict)ÚOptionalé   )Úconfig)Ú	decorator)Ú
gc_collecté   )Úevent)Úpool)Ú
await_only)ÚLiteral)ÚEngine)ÚURL)ÚAsyncEnginec                   @  s”   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#S )$ÚConnectionKillerc                 C  s"   t  ¡ | _t t¡| _tƒ | _d S ©N)ÚweakrefÚWeakKeyDictionaryÚ
proxy_refsÚcollectionsÚdefaultdictÚsetÚtesting_enginesÚdbapi_connections©Úself© r   úV/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/testing/engines.pyÚ__init__%   s   
zConnectionKiller.__init__c                 C  sD   t  |d| j¡ t  |d| j¡ t  |d| j¡ t  |d| j¡ d S )NÚcheckoutÚcheckinÚcloseÚclose_detached)r   ÚlistenÚ	_add_connÚ_remove_conn)r   r   r   r   r   Úadd_pool*   s   zConnectionKiller.add_poolc                 C  s   | j  |¡ d| j|< d S )NT)r   Úaddr   )r   Ú	dbapi_conÚ
con_recordÚ	con_proxyr   r   r   r&   2   s   zConnectionKiller._add_connc                 G  s   | j  |¡ d S r   )r   Údiscard)r   Ú
dbapi_connÚargr   r   r   r'   6   s   zConnectionKiller._remove_connc                 C  s,   |   |j¡ |dv sJ ‚| j|  |¡ d S )N)ÚclassÚglobalÚfunctionÚfixture)r(   r   r   r)   )r   ÚengineÚscoper   r   r   Ú
add_engine9   s   zConnectionKiller.add_enginec              
   C  óB   z|ƒ  W d S  t y  } zt d| ¡ W Y d }~d S d }~ww )Nz5testing_reaper couldn't rollback/close connection: %s©Ú	ExceptionÚwarningsÚwarn©r   ÚfnÚer   r   r   Ú_safe?   s   ÿ€ÿzConnectionKiller._safec                 C  s.   t | jƒD ]}|d ur|jr|  |j¡ qd S r   )Úlistr   Úis_validr?   Úrollback©r   Úrecr   r   r   Úrollback_allG   s
   €þzConnectionKiller.rollback_allc                 C  s^   t | jƒD ]}|d ur|jr| j |j¡ |  |j¡ q| jD ]}|  |j¡ q| j 	¡  d S r   )
r@   r   rA   r   r-   Údbapi_connectionr?   Ú_checkinrB   Úclear)r   rD   Úconr   r   r   Úcheckin_allL   s   €
zConnectionKiller.checkin_allc                 C  s   |   ¡  d S r   )rJ   r   r   r   r   Ú	close_all[   ó   zConnectionKiller.close_allc                 C  s*   t jsd S ddlm} | |jj|¡ d S ©Nr   )Ú	provision)r   Úbootstrapped_as_sqlalchemyÚ rN   Úprepare_for_drop_tablesr4   Úurl)r   Ú
connectionrN   r   r   r   rQ   ^   s   z(ConnectionKiller.prepare_for_drop_tablesc                 C  s„   | j | }t|ƒD ]2}t| jƒD ]}|d ur*|jr*|jd ur*|j|ju r*|  |j¡ qt|dƒr7t	| 
¡ ƒ q	| 
¡  q	| ¡  d S )NÚsync_engine)r   r@   r   rA   Ú_poolr   r?   rG   Úhasattrr   ÚdisposerH   )r   r5   ÚengrD   Ú	proxy_refr   r   r   Ú_drop_testing_enginesg   s   

€

z&ConnectionKiller._drop_testing_enginesc                 C  ó   |   d¡ d S )Nr2   )rZ   r   r   r   r   Ú
after_testx   ó   zConnectionKiller.after_testc                 C  sj   t jsd S |jjrd S |  ¡  ddlm} t j ¡ �}| 	|j
j|¡ W d   ƒ d S 1 s.w   Y  d S rM   )r   rO   Ú	__class__Ú"__leave_connections_for_teardown__rJ   rP   rN   ÚdbÚconnectrQ   r4   rR   )r   ÚtestrN   Úconnr   r   r   Úafter_test_outside_fixtures{   s   "ÿz,ConnectionKiller.after_test_outside_fixturesc                 C  s    |   ¡  |  d¡ |  d¡ d S )Nr2   r0   )rJ   rZ   r   r   r   r   Ústop_test_class_inside_fixtures�   s   
z0ConnectionKiller.stop_test_class_inside_fixturesc                 C  sD   t jjrtƒ  t jjr tt jjƒ}t jj ¡  	J d| ƒ‚d S d S )NFz/%d connection recs not cleared after test suite)r   ÚbaseÚ_strong_ref_connection_recordsr	   ÚlenrH   )r   Úlnr   r   r   Ú stop_test_class_outside_fixtures’   s   ÿþúz1ConnectionKiller.stop_test_class_outside_fixturesc                 C  s"   |   ¡  | jD ]}|  |¡ qd S r   )rJ   r   rZ   )r   r5   r   r   r   Úfinal_cleanupŸ   s   
ÿzConnectionKiller.final_cleanupc                 C  s   | j D ]}|jr
J ‚qd S r   )r   rA   rC   r   r   r   Úassert_all_closed¤   s
   
ÿÿz"ConnectionKiller.assert_all_closedN)Ú__name__Ú
__module__Ú__qualname__r    r(   r&   r'   r6   r?   rE   rJ   rK   rQ   rZ   r\   rd   re   rj   rk   rl   r   r   r   r   r   $   s$    	r   c                 O  s(   z| |i |¤Ž W t  ¡  d S t  ¡  w r   )Útesting_reaperrl   ©r=   ÚargsÚkwr   r   r   Úassert_conns_closed­   s   rt   c                 O  ó(   z| |i |¤Ž W t  ¡  dS t  ¡  w )zBDecorator that rolls back all open connections after fn execution.N)rp   rE   rq   r   r   r   Úrollback_open_connectionsµ   s   rv   c                 O  s   t  ¡  | |i |¤Ž dS )z:Decorator that closes all connections before fn execution.N©rp   rJ   rq   r   r   r   Úclose_first¿   s   rx   c                 O  ru   )z9Decorator that closes all connections after fn execution.Nrw   rq   r   r   r   Úclose_open_connectionsÇ   s   ry   c                 c  sZ   � dd l m} |jD ] }| r|| v rq
t||d ƒ}|s%ttd| ƒj|ƒ}| ¡ V  q
d S )Nr   zsqlalchemy.dialects.%s)Úsqlalchemy.dialectsÚdialectsÚ__all__ÚgetattrÚ
__import__Údialect)ÚexcludeÚdÚnameÚmodr   r   r   Úall_dialectsÐ   s   €
ÿ÷r„   c                   @  s>   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zdd„ ZdS )ÚReconnectFixturec                 C  s   || _ g | _d| _d S ©NF)ÚdbapiÚconnectionsÚ
is_stopped)r   r‡   r   r   r   r    à   ó   
zReconnectFixture.__init__c                 C  ó   t | j|ƒS r   )r}   r‡   ©r   Úkeyr   r   r   Ú__getattr__å   rL   zReconnectFixture.__getattr__c                 O  sN   | j j|i |¤Ž}| jr|  |j¡ | ¡ }| d¡ J dƒ‚| j |¡ |S )Nzselect 1Fz%simulated connect failure didn't work)	r‡   ra   r‰   r?   r#   ÚcursorÚexecuterˆ   Úappend)r   rr   Úkwargsrc   Úcursr   r   r   ra   è   s   
zReconnectFixture.connectc              
   C  r7   )Nz.ReconnectFixture couldn't close connection: %sr8   r<   r   r   r   r?   õ   s   €ÿzReconnectFixture._safeFc                 C  s,   || _ t| jƒD ]}|  |j¡ qg | _d S r   )r‰   r@   rˆ   r?   r#   )r   ÚstopÚcr   r   r   Úshutdownû   s   
zReconnectFixture.shutdownc                 C  s
   d| _ d S r†   )r‰   r   r   r   r   Úrestart  ó   
zReconnectFixture.restartN)F)	rm   rn   ro   r    rŽ   ra   r?   r–   r—   r   r   r   r   r…   ß   s    
r…   c                   sj   | pt jj} t jjj}|si }t|ƒ|d< t| |ƒ‰ˆj‰ ‡ ‡fdd„}ˆjjjˆ_	ˆjjj
ˆ_|ˆ_ˆS )NÚmodulec                     s    ˆj j ¡  dˆj j_ˆ ƒ  d S r†   )r   r‡   r–   r‰   r   ©Ú_disposer4   r   r   rW     s   

z$reconnecting_engine.<locals>.dispose)r   r`   rR   r   r‡   r…   Útesting_enginerW   r–   Útest_shutdownr—   Útest_restart)rR   Úoptionsr‡   rW   r   rš   r   Úreconnecting_engine
  s   

r    FrR   úOptional[URL]rŸ   úOptional[Dict[str, Any]]ÚasyncioúLiteral[False]Útransfer_staticpoolÚboolÚreturnr   c                 C  ó   d S r   r   ©rR   rŸ   r£   r¥   r   r   r   rœ     ó   rœ   TúLiteral[True]r   c                 C  r¨   r   r   r©   r   r   r   rœ   '  rª   c                 C  s¶  |r|rJ ‚ddl m} nddlm} ddlm} |s"d}d}	d}
n| dd¡}| d	d¡}	| d
d¡}
| p9tjj	} || ƒ} tjd u sK| j
tjj	j
krTtjrTtj ¡ }ni }|d ur_| |¡ || fi |¤Ž}|
r‚|jdkr‚t |d¡dd„ ƒ}t |d¡dd„ ƒ}|r¡ddlm} tjd ur ttjj|ƒr d}|j tjj¡ n|r¨tjj|_|	dkr¶|r³d|j_nd|_t|jtjƒrÑd|vrÑd|vrÑd|vrÑd|j_d|j_|rÙt ||	¡ |S )Nr   )Úcreate_async_engine)Úcreate_engine)Úmake_urlTr2   FÚ
use_reaperr5   Úsqlite_savepointÚsqlitera   c                 S  s
   d | _ d S r   )Úisolation_level)rF   Úconnection_recordr   r   r   Ú
do_connect\  s   
z"testing_engine.<locals>.do_connectÚbeginc                 S  r[   )NÚBEGIN)Úexec_driver_sql)rc   r   r   r   Údo_begin`  s   z testing_engine.<locals>.do_begin)Ú
StaticPoolr1   r   Úpool_timeoutÚmax_overflow)Úsqlalchemy.ext.asyncior¬   Ú
sqlalchemyr­   Úsqlalchemy.engine.urlr®   Úpopr   r`   rR   Ú
drivernameÚdb_optsÚcopyÚupdater‚   r   Úlistens_forÚsqlalchemy.poolr¹   Ú
isinstancer   Ú_transfer_fromrT   Ú_has_eventsÚ	QueuePoolÚ_timeoutÚ_max_overflowrp   r6   )rR   rŸ   r£   r¥   Ú
share_poolÚ_sqlite_savepointr­   r®   r¯   r5   r°   Úuse_optionsr4   r´   r¸   r¹   r   r   r   rœ   0  sd   ÿ




€

ÿÿc                   sr   ddl m} | stjj} g ‰ ‡ fdd„}‡ fdd„}‡fdd„}|| d	 |ƒ‰tˆd
ƒr.J ‚ˆ ˆ_|ˆ_|ˆ_ˆS )a'  Provides a mocking engine based on the current testing.db.

    This is normally used to test DDL generation flow as emitted
    by an Engine.

    It should not be used in other cases, as assert_compile() and
    assert_sql_execution() are much better choices with fewer
    moving parts.

    r   )Úcreate_mock_enginec                   s   ˆ   | ¡ d S r   )r‘   )ÚsqlÚars   ©Úbufferr   r   Úexecutor–  r]   zmock_engine.<locals>.executorc                   s"   dd„ ˆ D ƒ}|| ksJ |ƒ‚d S )Nc                 S  s   g | ]}t  d dt|ƒ¡‘qS )z[\n\t]rP   )ÚreÚsubÚstr©Ú.0Úsr   r   r   Ú
<listcomp>š  s    z3mock_engine.<locals>.assert_sql.<locals>.<listcomp>r   )ÚstmtsÚrecvrÒ   r   r   Ú
assert_sql™  s   zmock_engine.<locals>.assert_sqlc                     s    ˆj ‰ d ‡ fdd„ˆjD ƒ¡S )NÚ
c                 3  s    � | ]}t |jˆ d �ƒV  qdS ))r   N)r×   ÚcompilerØ   ©r�   r   r   Ú	<genexpr>Ÿ  s   € z1mock_engine.<locals>.print_sql.<locals>.<genexpr>)r   ÚjoinÚmockr   )r4   rá   r   Ú	print_sql�  s   zmock_engine.<locals>.print_sqlz://rä   )	r½   rÏ   r   r`   r‚   rV   rä   rÞ   rå   )Údialect_namerÏ   rÔ   rÞ   rå   r   )rÓ   r4   r   Úmock_engineƒ  s   rç   c                   @  s:   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ ZdS )ÚDBAPIProxyCursorzuProxy a DBAPI cursor.

    Tests can provide subclasses of this to intercept
    DBAPI-level cursor operations.

    c                 O  s"   || _ || _|j|i |¤Ž| _d S r   )r4   rS   r�   )r   r4   rc   rr   r’   r   r   r   r    ±  s   zDBAPIProxyCursor.__init__Nc                 K  s.   |r| j j||fi |¤ŽS | j j|fi |¤ŽS r   )r�   r�   )r   ÚstmtÚ
parametersrs   r   r   r   r�   ¶  s   zDBAPIProxyCursor.executec                 K  s   | j j||fi |¤ŽS r   )r�   Úexecutemany)r   ré   Úparamsrs   r   r   r   rë   ¼  s   zDBAPIProxyCursor.executemanyc                 C  s
   t | jƒS r   )Úiterr�   r   r   r   r   Ú__iter__¿  r˜   zDBAPIProxyCursor.__iter__c                 C  r‹   r   )r}   r�   rŒ   r   r   r   rŽ   Â  rL   zDBAPIProxyCursor.__getattr__r   )	rm   rn   ro   Ú__doc__r    r�   rë   rî   rŽ   r   r   r   r   rè   ©  s    
rè   c                   @  s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚDBAPIProxyConnectionz}Proxy a DBAPI connection.

    Tests can provide subclasses of this to intercept
    DBAPI-level connection operations.

    c                 C  s   || _ || _|| _d S r   )rc   r4   Ú
cursor_cls)r   r4   rc   rñ   r   r   r   r    Î  rŠ   zDBAPIProxyConnection.__init__c                 O  s   | j | j| jg|¢R i |¤ŽS r   )rñ   r4   rc   )r   rr   r’   r   r   r   r�   Ó  s   zDBAPIProxyConnection.cursorc                 C  s   | j  ¡  d S r   )rc   r#   r   r   r   r   r#   Ö  r]   zDBAPIProxyConnection.closec                 C  r‹   r   )r}   rc   rŒ   r   r   r   rŽ   Ù  rL   z DBAPIProxyConnection.__getattr__N)rm   rn   ro   rï   r    r�   r#   rŽ   r   r   r   r   rð   Æ  s    rð   r   )NN)NNFF)
rR   r¡   rŸ   r¢   r£   r¤   r¥   r¦   r§   r   )NNTF)
rR   r¡   rŸ   r¢   r£   r«   r¥   r¦   r§   r   )NNFFFF))Ú
__future__r   r   rÕ   Útypingr   r   r   r:   r   rP   r   Úutilr   r	   r   r   r   Úutil.typingr   ÚTYPE_CHECKINGr4   r   Ú
engine.urlr   Úext.asyncior   r   rp   rt   rv   rx   ry   r„   r…   r    Úoverloadrœ   rç   rè   rð   r   r   r   r   Ú<module>   sp   	 

	



+üü	
ú
S&