
    ؄_(                     t   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m
Z
 dd	lmZ  G d
 de          Z e            Zd Ze	d             Ze	d             Ze	d             Ze	d             ZddZ G d de          ZddZddZddZ G d de          Z G d de          ZeefdZdS )    )absolute_importN   )config)uses_deprecated)	decorator   )event)poolc                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z e            d             Z e            d             Zd ZdS )ConnectionKillerc                     t          j                    | _        t          j                    | _        t	                      | _        d S N)weakrefWeakKeyDictionary
proxy_refstesting_enginessetconnsselfs    _/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/testing/engines.py__init__zConnectionKiller.__init__   s2    !355&8::UU


    c                     d| j         |<   d S NT)r   )r   engines     r   
add_enginezConnectionKiller.add_engine   s    '+V$$$r   c                 >    | j                             ||f           d S r   )r   add)r   
dbapi_conn
con_records      r   connectzConnectionKiller.connect   s!    

J/00000r   c                     d| j         |<   d S r   )r   )r   	dbapi_conr!   	con_proxys       r   checkoutzConnectionKiller.checkout!   s    %)	"""r   c                 >    | j                             ||f           d S r   )r   discard)r   r$   r!   	exceptions       r   
invalidatezConnectionKiller.invalidate$   s#    
Iz233333r   c                 z    	  |             d S # t           $ r"}t          j        d|z             Y d }~d S d }~ww xY w)Nz5testing_reaper couldn't rollback/close connection: %s	Exceptionwarningswarnr   fnes      r   _safezConnectionKiller._safe'   so    	BDDDDD 	 	 	MJQN        	   
 
:5:c                 z    t          | j                  D ]%}|!|j        r|                     |j                   &d S r   )listr   is_validr3   rollbackr   recs     r   rollback_allzConnectionKiller.rollback_all/   sE    (( 	) 	)C3<

3<(((	) 	)r   c                 z    t          | j                  D ]%}|!|j        r|                     |j                   &d S r   )r6   r   r7   r3   _closer9   s     r   	close_allzConnectionKiller.close_all4   sE    (( 	' 	'C3<

3:&&&	' 	'r   c                 ~    t          | j                  D ]'\  }}|j        |                     |j                   (d S r   )r6   r   
connectionr3   r8   r   connr:   s      r   _after_test_ctxz ConnectionKiller._after_test_ctx9   sO     dj)) 	& 	&ID#~%
 JJt}%%%%	& 	&r   c                 |    t           j        j        r|                                  d S |                                  d S r   )r   optionslow_connections_stop_test_ctx_minimal_stop_test_ctx_aggressiver   s    r   _stop_test_ctxzConnectionKiller._stop_test_ctxH   s?    >) 	-'')))))**,,,,,r   c                     |                                   t                      | _        t          | j                  D ]$}|t
          j        ur|                                 %d S r   )r>   r   r   r6   r   r   dbdisposer9   s     r   rG   z'ConnectionKiller._stop_test_ctx_minimalN   s\    UU
,-- 	 	C&)##	 	r   c                     |                                   t          | j                  D ]&\  }}|                     |j                   d |_        't                      | _        t          | j                  D ]}|                                 d S r   )	r>   r6   r   r3   closer@   r   r   rL   rA   s      r   rH   z*ConnectionKiller._stop_test_ctx_aggressiveX   s    dj)) 	" 	"ID#JJtz"""!CNNUU
,-- 	 	CKKMMMM	 	r   c                 ,    | j         D ]}|j        rJ d S r   )r   r7   r9   s     r   assert_all_closedz"ConnectionKiller.assert_all_closedc   s1    ? 	 	C| 	 	r   N)__name__
__module____qualname__r   r   r"   r&   r*   r3   r;   r>   rC   rI   r   rG   rH   rP    r   r   r   r      s         
, , ,1 1 1* * *4 4 4  ) ) )
' ' '
& & &- - - _   _      r   r   c                 p   t                                            t          |d          r|                                 t          j        j        j        sMddlm	} |
                    dd          5  |                     |           d d d            d S # 1 swxY w Y   d S |                     |           d S )NrN   r   )
assertionszCan't sort tablesF)assert_)testing_reaperr>   hasattrrN   r   rK   dialectsupports_alter rV   expect_warningsdrop_all)metadatabindrV   s      r   drop_all_tablesra   l   s   tW 

9+        ''(;U'KK 	$ 	$d###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   1BBBc                     	  | |i | t                                            d S # t                                            w xY wr   )rX   rP   r1   argskws      r   assert_conns_closedrf   z   sH    +
DB((*****((****	   % A c                     	  | |i | t                                            dS # t                                            w xY w)zBDecorator that rolls back all open connections after fn execution.N)rX   r;   rc   s      r   rollback_open_connectionsri      sH    &
DB##%%%%%##%%%%rg   c                 H    t                                             | |i | dS )z:Decorator that closes all connections before fn execution.NrX   r>   rc   s      r   close_firstrl      s+     BOOOOOOr   c                     	  | |i | t                                            dS # t                                            w xY w)z9Decorator that closes all connections after fn execution.Nrk   rc   s      r   close_open_connectionsrn      sH    #
DB  """""  """"rg   c              #      K   dd l m} |j        D ]W}| r|| v r	t          ||d           }|s%t          t	          d|z            j        |          }|                                V  Xd S )Nr   zsqlalchemy.databases.%s)sqlalchemy.databases	databases__all__getattr
__import__rZ   )excludednamemods       r   all_dialectsry      s      $$$$$$	 	 	 	twat$$ 	4t;<<F C kkmm	 	r   c                   4    e Zd Zd Zd Zd Zd Zd	dZd ZdS )
ReconnectFixturec                 0    || _         g | _        d| _        d S NF)dbapiconnections
is_stopped)r   r~   s     r   r   zReconnectFixture.__init__   s    
r   c                 ,    t          | j        |          S r   )rs   r~   r   keys     r   __getattr__zReconnectFixture.__getattr__   s    tz3'''r   c                     | j         j        |i |}| j        rM|                     |j                   |                                }|                    d           J d            | j                            |           |S )Nzselect 1Fz%simulated connect failure didn't work)	r~   r"   r   r3   rN   cursorexecuter   append)r   rd   kwargsrB   curss        r   r"   zReconnectFixture.connect   s    !tz!42622? 		JJtz""";;==D LL$$$AAAAA##D)))Kr   c                 z    	  |             d S # t           $ r"}t          j        d|z             Y d }~d S d }~ww xY w)Nz.ReconnectFixture couldn't close connection: %sr,   r0   s      r   r3   zReconnectFixture._safe   so    	BDDDDD 	 	 	MCaG        	r4   Fc                     || _         t          | j                  D ]}|                     |j                   g | _        d S r   )r   r6   r   r3   rN   )r   stopcs      r   shutdownzReconnectFixture.shutdown   sJ     d&'' 	  	 AJJqwr   c                     d| _         d S r}   )r   r   s    r   restartzReconnectFixture.restart   s    r   N)F)	rQ   rR   rS   r   r   r"   r3   r   r   rT   r   r   r{   r{      ss             
( ( (    	 	 	 	         r   r{   c                 (   | pt           j        j        } t           j        j        j        }|si }t          |          |d<   t          | |          j        fd}j        j        j        _	        j        j        j
        _        |_        S )Nmodulec                  z    j         j                                         dj         j        _                       d S r}   )rZ   r~   r   r   )_disposer   s   r   rL   z$reconnecting_engine.<locals>.dispose   s6    %%'''*/'




r   )r   rK   urlrZ   r~   r{   testing_enginerL   r   test_shutdownr   test_restart)r   rE   r~   rL   r   r   s       @@r   reconnecting_enginer      s    

CI#E (//GHC))F~H     
 ">/8F ..6FFNMr   c                 j   ddl m} ddlm} |sd}n|                    dd          }| pt
          j        j        }  ||           } |;t
          j        | j        t
          j        j        j        k    rt
          j	        }nai }n^t
          j        R| j        t
          j        j        j        k    r3t
          j	        
                                }|                    |            || fi |}d|_        t          |j        t          j                  rd|j        _        d|j        _        |rt%          j        |j        dt(          j                   t%          j        |j        dt(          j                   t%          j        |j        d	t(          j                   t(                              |           |S )
zBProduce an engine configured by --options with optional overrides.r   create_engine)make_urlT
use_reaperNr"   r&   r*   )
sqlalchemyr   sqlalchemy.engine.urlr   popr   rK   r   
drivernamedb_optscopyupdate_has_events
isinstancer
   	QueuePool_timeout_max_overflowr	   listenrX   r"   r&   r*   r   )r   rE   r   r   r   default_optr   s          r   r   r      s    )(((((...... 5

[[t44


C
(3--C9&)-2J J JnGGGG		3>VY]5M#M#Mn))++7###]3**'**FF&+t~.. & $%! *V[)^-CDDDV[*n.EFFFV[,0IJJJ!!&)))Mr   c                     ddl m} | st          j        j        } g fd}fd}fd} || dz   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   r   c                 2                         |            d S r   )r   )sqlare   buffers      r   executorzmock_engine.<locals>.executor'  s    cr   c                 @    d D             }|| k    s
J |            d S )Nc           	      T    g | ]%}t          j        d dt          |                    &S )z[\n\t]r\   )resubstr).0ss     r   
<listcomp>z3mock_engine.<locals>.assert_sql.<locals>.<listcomp>+  s,    >>>!y"c!ff-->>>r   rT   )stmtsrecvr   s     r   
assert_sqlzmock_engine.<locals>.assert_sql*  s-    >>v>>>u}}}d}}}}}r   c                  `     j          d                     fdj        D                       S )N
c              3   ^   K   | ]'}t          |                                         V  (dS ))rZ   N)r   compile)r   r   rv   s     r   	<genexpr>z1mock_engine.<locals>.print_sql.<locals>.<genexpr>0  s9      HHqQYYqY1122HHHHHHr   )rZ   joinmock)rv   r   s   @r   	print_sqlzmock_engine.<locals>.print_sql.  s4    NyyHHHHFKHHHHHHr   z://r   )strategyr   )	r   r   r   rK   rw   rY   r   r   r   )dialect_namer   r   r   r   r   r   s        @@r   mock_enginer     s     )((((( &y~F    # # # # #I I I I I ]uv  F vv&&&&&FK"F FMr   c                   ,    e Zd ZdZd ZddZd Zd ZdS )DBAPIProxyCursorzuProxy a DBAPI cursor.

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

    c                 F    || _         || _         |j        |i || _        d S r   )r   r@   r   )r   r   rB   rd   r   s        r   r   zDBAPIProxyCursor.__init__D  s,    !dk42622r   Nc                 T    |r | j         j        ||fi |S  | j         j        |fi |S r   )r   r   )r   stmt
parametersre   s       r   r   zDBAPIProxyCursor.executeI  sF     	3&4;&tZ>>2>>>&4;&t22r222r   c                 *     | j         j        ||fi |S r   )r   executemany)r   r   paramsre   s       r   r   zDBAPIProxyCursor.executemanyO  s!    &t{&tV::r:::r   c                 ,    t          | j        |          S r   )rs   r   r   s     r   r   zDBAPIProxyCursor.__getattr__R  s    t{C(((r   r   )rQ   rR   rS   __doc__r   r   r   r   rT   r   r   r   r   <  s_         3 3 3
3 3 3 3; ; ;) ) ) ) )r   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )DBAPIProxyConnectionz}Proxy a DBAPI connection.

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

    c                 l    |j                                         x| _        | _        || _        || _        d S r   )r
   _creatorrB   _sqla_unwrapr   
cursor_cls)r   r   r   s      r   r   zDBAPIProxyConnection.__init__^  s1    (.(<(<(>(>>	D%$r   c                 :     | j         | j        | j        g|R i |S r   )r   r   rB   )r   rd   r   s      r   r   zDBAPIProxyConnection.cursorc  s*    tt{DIGGGGGGGr   c                 8    | j                                          d S r   )rB   rN   r   s    r   rN   zDBAPIProxyConnection.closef  s    	r   c                 ,    t          | j        |          S r   )rs   rB   r   s     r   r   z DBAPIProxyConnection.__getattr__i  s    ty#&&&r   N)rQ   rR   rS   r   r   r   rN   r   rT   r   r   r   r   V  s]         % % %
H H H  ' ' ' ' 'r   r   c                 6      fd}t          d|i          S )zIProduce an engine that provides proxy hooks for
    common methods.

    c                  0      t           j                  S r   )r   rK   )conn_clsr   s   r   	mock_connz"proxying_engine.<locals>.mock_connu  s    x	:...r   creator)rE   )r   )r   r   r   s   `` r   proxying_enginer   m  s:    / / / / / / 9i"89999r   r   )NN)
__future__r   r   r.   r   r\   r   r   utilr   r	   r
   objectr   rX   ra   rf   ri   rl   rn   ry   r{   r   r   r   r   r   r   rT   r   r   <module>r      sC   ' & & & & & 				                                Q Q Q Q Qv Q Q Qh "!##      + + + & & &    # # #   +  +  +  +  + v +  +  + \   (# # # #L% % % %P) ) ) ) )v ) ) )4' ' ' ' '6 ' ' '0 ".>: : : : : :r   