
    {<iK5                    D   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	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*                  rddlmZ ddlmZ ddlmZ  G d d      Z e       Zed        Zed        Zed        Z ed        Z!d'dZ" G d d      Z#d(dZ$ejJ                  	 	 d)	 	 	 	 	 	 	 d*d       Z&ejJ                  	 	 d)	 	 	 	 	 	 	 d+d       Z&	 	 d(dd 	 	 	 	 	 	 	 d,d!Z&d'd"Z' G d# d$      Z( G d% d&      Z)y)-    )annotationsN)Any)Dict)Optional)Union   )config)	decorator)
gc_collect   )event)pool)
await_only)Literal)Engine)URL)AsyncEnginec                  x    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)ConnectionKillerc                    t        j                         | _        t        j                  t
              | _        t               | _        y N)weakrefWeakKeyDictionary
proxy_refscollectionsdefaultdictsettesting_enginesdbapi_connectionsselfs    _/home/www/utuvibe.miabetepe.com/venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py__init__zConnectionKiller.__init__&   s/    !335*66s;!$    c                   t        j                  |d| j                         t        j                  |d| j                         t        j                  |d| j                         t        j                  |d| j                         y )Ncheckoutcheckincloseclose_detached)r   listen	_add_conn_remove_conn)r!   r   s     r"   add_poolzConnectionKiller.add_pool+   sY    T:t~~6T9d&7&78T7D$5$56T+T->->?r$   c                X    | j                   j                  |       d| j                  |<   y )NT)r   addr   )r!   	dbapi_con
con_record	con_proxys       r"   r+   zConnectionKiller._add_conn3   s$    ""9-%)	"r$   c                :    | j                   j                  |       y r   )r   discard)r!   
dbapi_connargs      r"   r,   zConnectionKiller._remove_conn7   s    &&z2r$   c                    | j                  |j                         |dv sJ | j                  |   j                  |       y )N)classglobalfunctionfixture)r-   r   r   r/   )r!   enginescopes      r"   
add_enginezConnectionKiller.add_engine:   s:    fkk"BBBBU#''/r$   c                p    	  |        y # t         $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nz5testing_reaper couldn't rollback/close connection: %s	Exceptionwarningswarnr!   fnes      r"   _safezConnectionKiller._safe@   s5    	D 	MMG!K 	   
 	505c                    t        | j                        D ]-  }||j                  s| j                  |j                         / y r   )listr   is_validrG   rollbackr!   recs     r"   rollback_allzConnectionKiller.rollback_allH   s5    ( 	)C3<<

3<<(	)r$   c                d   t        | j                        D ]R  }||j                  s| j                  j	                  |j
                         | j                  |j                         T | j                  D ]  }| j                  |j                          | j                  j                          y r   )
rJ   r   rK   r   r4   dbapi_connectionrG   _checkinrL   clear)r!   rN   cons      r"   checkin_allzConnectionKiller.checkin_allM   s     ( 	)C3<<&&..s/C/CD

3<<(	) )) 	%CJJs||$	%$$&r$   c                $    | j                          y r   )rU   r    s    r"   	close_allzConnectionKiller.close_all\   s    r$   c                ~    t         j                  sy ddlm} |j	                  |j
                  j                  |       y Nr   	provision)r	   bootstrapped_as_sqlalchemy r[   prepare_for_drop_tablesr<   url)r!   
connectionr[   s      r"   r^   z(ConnectionKiller.prepare_for_drop_tables_   s-    00))**;*;*?*?Lr$   c                   | j                   |   }t        |      D ]  }t        | j                        D ]S  }||j                  s|j                   |j                  |j
                  u s9| j                  |j                         U t        |d      rt        |j                                |j                           |j                          y Nsync_engine)r   rJ   r   rK   _poolr   rG   rR   hasattrr   disposerS   )r!   r=   engrN   	proxy_refs        r"   _drop_testing_enginesz&ConnectionKiller._drop_testing_enginesh   s    ""5)9 	C!$//2 7	(Y-?-?!3%OOsxx7

9#5#567 sM*3;;=)	 			r$   c                    | j                   |   }t        |      D ]8  }t        |d      rt        |j	                                )|j	                          : y rb   )r   rJ   re   r   rf   )r!   r=   rg   rN   s       r"   _dispose_testing_enginesz)ConnectionKiller._dispose_testing_enginesz   sF    ""5)9 	CsM*3;;=)		r$   c                &    | j                  d       y )Nr:   )ri   r    s    r"   
after_testzConnectionKiller.after_test   s    "":.r$   c                2   t         j                  sy |j                  j                  ry | j	                          ddlm} t         j                  j                         5 }|j                  |j                  j                  |       d d d        y # 1 sw Y   y xY wrY   )r	   r\   	__class__"__leave_connections_for_teardown__rU   r]   r[   dbconnectr^   r<   r_   )r!   testr[   conns       r"   after_test_outside_fixturesz,ConnectionKiller.after_test_outside_fixtures   sr    00>><<
 	 YY  	ED--dkkootD	E 	E 	Es   'BBc                h    | j                          | j                  d       | j                  d       y )Nr:   r8   )rU   ri   r    s    r"   stop_test_class_inside_fixturesz0ConnectionKiller.stop_test_class_inside_fixtures   s*    "":.""7+r$   c                   t         j                  j                  rzt                t         j                  j                  rVt	        t         j                  j                        }t         j                  j                  j                          	 J d|z         t        j                  r-t        j                  j                  r| j                  d       y y y )Nz/%d connection recs not cleared after test suiter9   )
r   base_strong_ref_connection_recordsr   lenrS   r	   optionslow_connectionsrk   )r!   lns     r"    stop_test_class_outside_fixturesz1ConnectionKiller.stop_test_class_outside_fixtures   s     9933Lyy77AAB		88>>@LDKL>>fnn<< ))(3 =>r$   c                h    | j                          | j                  D ]  }| j                  |        y r   )rU   r   ri   )r!   r=   s     r"   final_cleanupzConnectionKiller.final_cleanup   s1    )) 	.E&&u-	.r$   c                B    | j                   D ]  }|j                  sJ  y r   )r   rK   rM   s     r"   assert_all_closedz"ConnectionKiller.assert_all_closed   s!    ?? 	C||u	r$   N)__name__
__module____qualname__r#   r-   r+   r,   r>   rG   rO   rU   rW   r^   ri   rk   rm   ru   rw   r   r   r    r$   r"   r   r   %   s_    '
@*30)
'M$/E$,
4".
r$   r   c                p    	  | |i | t         j                          y # t         j                          w xY wr   )testing_reaperr   rE   argskws      r"   assert_conns_closedr      s+    +
DB((*((*    5c                p    	  | |i | t         j                          y# t         j                          w xY w)zBDecorator that rolls back all open connections after fn execution.N)r   rO   r   s      r"   rollback_open_connectionsr      s+    &
DB##%##%r   c                <    t         j                           | |i | y)z:Decorator that closes all connections before fn execution.Nr   rU   r   s      r"   close_firstr      s      OOr$   c                p    	  | |i | t         j                          y# t         j                          w xY w)z9Decorator that closes all connections after fn execution.Nr   r   s      r"   close_open_connectionsr      s+    %
DB""$""$r   c              #     K   dd l m} |j                  D ]L  }| r|| v r
t        ||d       }|s"t        t	        d|z        j                  |      }|j                          N y w)Nr   zsqlalchemy.dialects.%s)sqlalchemy.dialectsdialects__all__getattr
__import__dialect)excludednamemods       r"   all_dialectsr      sg     #		 	twat$3d:;DDdC kkm	s   A#A%c                  2    e Zd Zd Zd Zd Zd ZddZd Zy)	ReconnectFixturec                .    || _         g | _        d| _        y NF)dbapiconnections
is_stopped)r!   r   s     r"   r#   zReconnectFixture.__init__   s    
r$   c                .    t        | j                  |      S r   )r   r   r!   keys     r"   __getattr__zReconnectFixture.__getattr__   s    tzz3''r$   c                    | j                   j                  |i |}| j                  rC| j                  |j                         |j                         }|j                  d       J d       | j                  j                  |       |S )Nzselect 1z%simulated connect failure didn't work)	r   rr   r   rG   r(   cursorexecuter   append)r!   r   kwargsrt   curss        r"   rr   zReconnectFixture.connect   sq    !tzz!!4262??JJtzz";;=D LL$AAA5##D)Kr$   c                p    	  |        y # t         $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nz.ReconnectFixture couldn't close connection: %sr@   rD   s      r"   rG   zReconnectFixture._safe  s4    	PD 	PMMJQNOO	PrH   c                    || _         t        | j                        D ]  }| j                  |j                          g | _        y r   )r   rJ   r   rG   r(   )r!   stopcs      r"   shutdownzReconnectFixture.shutdown	  s=     d&&' 	 AJJqww	 r$   c                    d| _         y r   )r   r    s    r"   restartzReconnectFixture.restart  s	    r$   N)F)	r   r   r   r#   r   rr   rG   r   r   r   r$   r"   r   r      s!     
(P	 r$   r   c                   | xs t         j                  j                  } t         j                  j                  j                  }|si }t        |      |d<   t        | |      j                  fd}j                  j                  j                  _	        j                  j                  j                  _        |_        S )Nmodulec                     j                   j                  j                          dj                   j                  _                  y r   )r   r   r   r   )_disposer<   s   r"   rf   z$reconnecting_engine.<locals>.dispose!  s0    %%'*/'
r$   )r	   rq   r_   r   r   r   testing_enginerf   r   test_shutdownr   test_restart)r_   r|   r   rf   r   r<   s       @@r"   reconnecting_enginer     s    

CII##E(/GHC)F~~H
 ">>//88F ....66FFNMr$   c                    y r   r   r_   r|   asyncios      r"   r   r   ,  s     r$   c                    y r   r   r   s      r"   r   r   5  s     r$   F)r   c          
        |rddl m} nddlm} ddlm}  || r| nt        j                  j                        } |si }i }t        j                  |fD ]M  }|s|j                  |j                         D ci c]  \  }}|dvr|j                  d      s|| c}}       O  || fi |}	t        j                  r/t        j                  j                  rt        j!                  d       |j#                  dd	      }
|
dk(  r|rd
|	j$                  _        nd
|	_        ddlm} |j-                  |	j                  |	||
       |j#                  dd
      }|rt        j/                  |	|
       t1        |	j2                  t2        j4                        r.d|vr*d|vr&d|vr"d|	j2                  _        d|	j2                  _        |	S c c}}w )Nr   )create_async_engine)create_engine)make_url)r=   
use_reapersqlite_r9   r=   r:   Tr   rZ   r   r   pool_timeoutmax_overflow)sqlalchemy.ext.asyncior   
sqlalchemyr   sqlalchemy.engine.urlr   r	   rq   r_   db_optsupdateitems
startswithr|   r}   r   rk   getrc   _has_eventsr]   r[   post_configure_testing_enginer>   
isinstancer   	QueuePool_timeout_max_overflow)r_   r|   r   r   r   use_optionsopt_dictoptvaluer<   r=   r[   r   s                r"   r   r   >  s    	
 	-.
#3699==
1CK^^W- 

 #+.."2C55y1 U
	


 3.+.F~~&..88 	//9KK,E-1F*   ++FJJO
 \40J!!&%0 	6;;/'!')') $%!MYs   6"F>c                    ddl m} | st        j                  j                  } g fd}fd}fd} || dz   |      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                (    j                  |        y r   )r   )sqlar   buffers      r"   executorzmock_engine.<locals>.executor  s    cr$   c           
         D cg c]"  }t        j                  ddt        |            $ }}|| k(  sJ |       y c c}w )Nz[\n\t]r]   )resubstr)stmtssrecvr   s      r"   
assert_sqlzmock_engine.<locals>.assert_sql  s=    7=>!y"c!f->>u}"d"} ?s   '<c                 f     j                    dj                   fdj                  D              S )N
c              3  T   K   | ]  }t        |j                                ! yw))r   N)r   compile).0r   r   s     r"   	<genexpr>z1mock_engine.<locals>.print_sql.<locals>.<genexpr>  s!     HqQYYqY12Hs   %()r   joinmock)r   r<   s   @r"   	print_sqlzmock_engine.<locals>.print_sql  s%    NNyyHFKKHHHr$   z://r   )	r   r   r	   rq   r   re   r   r   r   )dialect_namer   r   r   r   r   r<   s        @@r"   mock_enginer     sl     .yy~~F#I  u 4h?Fvv&&&FK"F FMr$   c                  0    e Zd ZdZd ZddZd Zd Zd Zy)	DBAPIProxyCursorzuProxy a DBAPI cursor.

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

    c                N    || _         || _         |j                  |i || _        y r   )r<   r`   r   )r!   r<   rt   r   r   s        r"   r#   zDBAPIProxyCursor.__init__  s'    !dkk4262r$   Nc                |    |r | j                   j                  ||fi |S  | j                   j                  |fi |S r   )r   r   )r!   stmt
parametersr   s       r"   r   zDBAPIProxyCursor.execute  s?    &4;;&&tZ>2>>&4;;&&t2r22r$   c                >     | j                   j                  ||fi |S r   )r   executemany)r!   r   paramsr   s       r"   r  zDBAPIProxyCursor.executemany  s     &t{{&&tV:r::r$   c                ,    t        | j                        S r   )iterr   r    s    r"   __iter__zDBAPIProxyCursor.__iter__  s    DKK  r$   c                .    t        | j                  |      S r   )r   r   r   s     r"   r   zDBAPIProxyCursor.__getattr__  s    t{{C((r$   r   )	r   r   r   __doc__r#   r   r  r  r   r   r$   r"   r   r     s     3
3;!)r$   r   c                  (    e Zd ZdZd Zd Zd Zd Zy)DBAPIProxyConnectionz}Proxy a DBAPI connection.

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

    c                .    || _         || _        || _        y r   )rt   r<   
cursor_cls)r!   r<   rt   r  s       r"   r#   zDBAPIProxyConnection.__init__  s    	$r$   c                X     | j                   | j                  | j                  g|i |S r   )r  r<   rt   )r!   r   r   s      r"   r   zDBAPIProxyConnection.cursor  s'    tt{{DIIGGGGr$   c                8    | j                   j                          y r   )rt   r(   r    s    r"   r(   zDBAPIProxyConnection.close  s    		r$   c                .    t        | j                  |      S r   )r   rt   r   s     r"   r   z DBAPIProxyConnection.__getattr__  s    tyy#&&r$   N)r   r   r   r  r#   r   r(   r   r   r$   r"   r	  r	    s    %
H'r$   r	  r   )NN)..)r_   Optional[URL]r|   Optional[Dict[str, Any]]r   zLiteral[False]returnr   )r_   r  r|   r  r   zLiteral[True]r  r   )r_   r  r|   r  r   boolr  zUnion[Engine, AsyncEngine])*
__future__r   r   r   typingr   r   r   r   rB   r   r]   r	   utilr
   r   r   r   r   util.typingr   TYPE_CHECKINGr<   r   
engine.urlr   ext.asyncior   r   r   r   r   r   r   r   r   r   overloadr   r   r   r	  r   r$   r"   <module>r     s   #  	              ! 
 )P Pf "# + + & &   % %(  ( V( (+	% 	
   (+	% 	
   (,F 	F	F%F 	F
  FR#L) ):' 'r$   