o znh(@sddlmZddlZddlZddlZddlmZddlmZddlm Z ddlm Z dd lm Z Gd d d e Z e Zd d Ze ddZe ddZe ddZe ddZd&ddZGddde Zd'ddZd'ddZd&ddZGd d!d!e ZGd"d#d#e Zeefd$d%ZdS)()absolute_importN)config)uses_deprecated) decorator)event)poolc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ e ddZe ddZddZdS)ConnectionKillercCs t|_t|_t|_dSN)weakrefWeakKeyDictionary proxy_refstesting_enginessetconnsselfrE/usr/local/lib/python3.10/dist-packages/sqlalchemy/testing/engines.py__init__s   zConnectionKiller.__init__cCsd|j|<dSNT)r)renginerrr add_enginezConnectionKiller.add_enginecC|j||fdSr )radd)r dbapi_conn con_recordrrrconnectzConnectionKiller.connectcCsd|j|<dSr)r)r dbapi_conr con_proxyrrrcheckout!rzConnectionKiller.checkoutcCrr )rdiscard)rr!r exceptionrrr invalidate$r zConnectionKiller.invalidatec CBz|WdSty }ztd|WYd}~dSd}~ww)Nz5testing_reaper couldn't rollback/close connection: %s Exceptionwarningswarnrfnerrr_safe' zConnectionKiller._safecC.t|jD]}|dur|jr||jqdSr )listris_validr/rollbackrrecrrr rollback_all/  zConnectionKiller.rollback_allcCr1r )r2rr3r/_closer5rrr close_all4r8zConnectionKiller.close_allcCs0t|jD]\}}|jdurq||jqdSr )r2r connectionr/r4rconnr6rrr_after_test_ctx9s  z ConnectionKiller._after_test_ctxcCs tjjr |dS|dSr )roptionslow_connections_stop_test_ctx_minimal_stop_test_ctx_aggressiverrrr_stop_test_ctxHs  zConnectionKiller._stop_test_ctxcCs6|t|_t|jD] }|tjur|q dSr )r:rrr2rrdbdisposer5rrrrANs z'ConnectionKiller._stop_test_ctx_minimalcCsR|t|jD] \}}||jd|_q t|_t|jD]}|q dSr ) r:r2rr/closer;rrrEr<rrrrBXs  z*ConnectionKiller._stop_test_ctx_aggressivecCs|jD]}|jr JqdSr )rr3r5rrrassert_all_closedcs z"ConnectionKiller.assert_all_closedN)__name__ __module__ __qualname__rrrr#r&r/r7r:r>rCrrArBrGrrrrr s    r cCs|tt|dr |tjjjs7ddlm }|j ddd| |WddS1s0wYdS| |dS)NrFr) assertionszCan't sort tablesF)assert_) testing_reaperr:hasattrrFrrDdialectsupports_alterrKexpect_warningsdrop_all)metadatabindrKrrrdrop_all_tablesls    "rVcOs(z||i|WtdStwr )rMrGr-argskwrrrassert_conns_closedzsrZcO(z||i|WtdStw)zBDecorator that rolls back all open connections after fn execution.N)rMr7rWrrrrollback_open_connectionssr\cOst||i|dS)z:Decorator that closes all connections before fn execution.NrMr:rWrrr close_firstsr^cOr[)z9Decorator that closes all connections after fn execution.Nr]rWrrrclose_open_connectionssr_ccsZddlm}|jD] }|r||vrq t||d}|s%ttd|j|}|Vq dS)Nrzsqlalchemy.databases.%s)sqlalchemy.databases databases__all__getattr __import__rO)excludednamemodrrr all_dialectss     ric@s>eZdZddZddZddZddZdd d Zd d ZdS)ReconnectFixturecCs||_g|_d|_dSNF)dbapi connections is_stopped)rrlrrrrs zReconnectFixture.__init__cC t|j|Sr )rcrlrkeyrrr __getattr__ zReconnectFixture.__getattr__cOsN|jj|i|}|jr||j|}|dJd|j||S)Nzselect 1Fz%simulated connect failure didn't work) rlrrnr/rFcursorexecutermappend)rrXkwargsr=cursrrrrs   zReconnectFixture.connectc Cr')Nz.ReconnectFixture couldn't close connection: %sr(r,rrrr/r0zReconnectFixture._safeFcCs,||_t|jD]}||jqg|_dSr )rnr2rmr/rF)rstopcrrrshutdowns zReconnectFixture.shutdowncCs d|_dSrk)rnrrrrrestarts zReconnectFixture.restartN)F) rHrIrJrrrrr/r{r|rrrrrjs  rjcsj|ptjj}tjjj}|si}t||d<t||jfdd}jjj_ jjj _ |_S)Nmodulecs jjdjj_dSrk)rOrlr{rnr_disposerrrrEs   z$reconnecting_engine..dispose) rrDurlrOrlrjtesting_enginerEr{ test_shutdownr| test_restart)rr?rlrErr~rreconnecting_engines      rcCsddlm}ddlm}|sd}n|dd}|ptjj}||}|dur9tjdus2|jtjjjkr6tj }ni}ntjdurP|jtjjjkrPtj }| |||fi|}d|_ t |jtjrjd|j_d|j_|rt|jdtjt|jdtjt|jd tjt||S) zBProduce an engine configured by --options with optional overrides.r create_engine)make_urlT use_reaperNrr#r&) sqlalchemyrsqlalchemy.engine.urlrpoprrDr drivernamedb_optscopyupdate _has_events isinstancer QueuePool_timeout _max_overflowrlistenrMrr#r&r)rr?rrr default_optrrrrrs2       rcsvddlm}|s tjj}gfdd}fdd}fdd}||d d |d td r0J_|_|_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. rrcs|dSr )rv)sqlarYbufferrrexecutor'rzmock_engine..executorcs"ddD}||ksJ|dS)NcSsg|] }tddt|qS)z[\n\t]rQ)resubstr.0srrr +sz3mock_engine..assert_sql..r)stmtsrecvrrr assert_sql*szmock_engine..assert_sqlcs jdfddjDS)N c3s |] }t|jdVqdS))rON)rcompilerrfrr 0sz1mock_engine..print_sql..)rOjoinmockr)rrr print_sql.szmock_engine..print_sqlz://r)strategyr) rrrrDrgrNrrr) dialect_namerrrrr)rrr mock_engines     rc@s2eZdZdZddZd ddZddZd d ZdS) DBAPIProxyCursorzuProxy a DBAPI cursor. Tests can provide subclasses of this to intercept DBAPI-level cursor operations. cOs"||_||_|j|i||_dSr )rr;rt)rrr=rXrwrrrrDszDBAPIProxyCursor.__init__NcKs.|r |jj||fi|S|jj|fi|Sr )rtru)rstmt parametersrYrrrruIszDBAPIProxyCursor.executecKs|jj||fi|Sr )rt executemany)rrparamsrYrrrrOszDBAPIProxyCursor.executemanycCror )rcrtrprrrrrRrszDBAPIProxyCursor.__getattr__r )rHrIrJ__doc__rrurrrrrrrr<s   rc@s0eZdZdZddZddZddZdd Zd S) DBAPIProxyConnectionz}Proxy a DBAPI connection. Tests can provide subclasses of this to intercept DBAPI-level connection operations. cCs"|j|_|_||_||_dSr )r _creatorr= _sqla_unwrapr cursor_cls)rrrrrrr^s zDBAPIProxyConnection.__init__cOs|j|j|jg|Ri|Sr )rrr=)rrXrwrrrrtcszDBAPIProxyConnection.cursorcCs|jdSr )r=rFrrrrrFfrzDBAPIProxyConnection.closecCror )rcr=rprrrrrirsz DBAPIProxyConnection.__getattr__N)rHrIrJrrrtrFrrrrrrrVs  rcsfdd}td|idS)zIProduce an engine that provides proxy hooks for common methods. cs tjSr )rrDrconn_clsrrr mock_connursz"proxying_engine..mock_conncreator)r?)r)rrrrrrproxying_enginemsrr )NN) __future__rrr*r rQrrutilrrr objectr rMrVrZr\r^r_rirjrrrrrrrrrrs:      T      .  &(