U a+3@sddlmZddlZddlZddlZddlZddlmZddlm Z ddlm Z ddlm Z dd lm Z Gd d d e ZeZe d d Ze ddZe ddZe ddZd%ddZGddde Zd&ddZd'ddZd(ddZGdd d e ZGd!d"d"e Zeefd#d$ZdS)))absolute_importN)config) decorator) gc_collect)event)poolc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#S)$ConnectionKillercCs"t|_tt|_t|_dSN)weakrefWeakKeyDictionary proxy_refs collections defaultdictsettesting_enginesdbapi_connectionsselfr[C:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\testing\engines.py__init__s  zConnectionKiller.__init__cCsDt|d|jt|d|jt|d|jt|d|jdS)NcheckoutZcheckincloseZclose_detached)rlisten _add_conn _remove_conn)rr rrradd_poolszConnectionKiller.add_poolcCs|j|d|j|<dS)NT)raddr)rZ dbapi_conZ con_recordZ con_proxyrrrr$s zConnectionKiller._add_conncGs|j|dSr )rdiscard)r dbapi_connargrrrr(szConnectionKiller._remove_conncCs,||j|dkst|j||dS)N)classglobalfunctionZfixture)rr AssertionErrorrr)renginescoperrr add_engine+s  zConnectionKiller.add_enginec Cs@z |Wn0tk r:}ztd|W5d}~XYnXdS)Nz5testing_reaper couldn't rollback/close connection: %s Exceptionwarningswarnrfnerrr_safe1s  zConnectionKiller._safecCs.t|jD]}|dk r |jr ||jq dSr )listris_validr1rollbackrrecrrr rollback_all9szConnectionKiller.rollback_allcCs^t|jD],}|dk r |jr |j|j||jq |jD]}||jq>|j dSr ) r2rr3rr connectionr1_checkinr4clear)rr6conrrr checkin_all>s zConnectionKiller.checkin_allcCs |dSr )r<rrrr close_allMszConnectionKiller.close_allcCs*tjs dSddlm}||jj|dSNr) provision)rbootstrapped_as_sqlalchemyr?prepare_for_drop_tablesr'url)rr8r?rrrrBPs z(ConnectionKiller.prepare_for_drop_tablescCsl|j|}t|D]L}t|jD]4}|dk r |jr |jdk r |j|jkr ||jq |q| dSr ) rr2rr3_poolr r1r9disposer:)rr(Zengr6Z proxy_refrrr_drop_testing_enginesYs    z&ConnectionKiller._drop_testing_enginescCs|ddS)Nr%)rFrrrr after_testfszConnectionKiller.after_testc CsTtjs dS|jjrdS|ddlm}tj}| |j j |W5QRXdSr>) rr@ __class__Z"__leave_connections_for_teardown__r<rAr?dbconnectrBr'rC)rtestr?connrrrafter_test_outside_fixturesis  z,ConnectionKiller.after_test_outside_fixturescCs ||d|ddS)Nr%r#)r<rFrrrrstop_test_class_inside_fixtures{s z0ConnectionKiller.stop_test_class_inside_fixturescCsBtjjr>ttjjr>ttjj}tjjds>td|dS)NFz/%d connection recs not cleared after test suite)r baseZ_strong_ref_connection_recordsrlenr:r&)rlnrrr stop_test_class_outside_fixturess  z1ConnectionKiller.stop_test_class_outside_fixturescCs"||jD]}||qdSr )r<rrF)rr(rrr final_cleanups zConnectionKiller.final_cleanupcCs|jD]}|jrdstqdSNF)rr3r&r5rrrassert_all_closeds z"ConnectionKiller.assert_all_closedN)__name__ __module__ __qualname__rrrrr)r1r7r<r=rBrFrGrMrNrRrSrUrrrrr s"   r cOsz|||W5tXdSr )testing_reaperrUr/argskwrrrassert_conns_closedsr]cOsz|||W5tXdS)zBDecorator that rolls back all open connections after fn execution.N)rYr7rZrrrrollback_open_connectionssr^cOst|||dS)z:Decorator that closes all connections before fn execution.NrYr<rZrrr close_firstsr`cOsz|||W5tXdS)z9Decorator that closes all connections after fn execution.Nr_rZrrrclose_open_connectionssraccsXddlm}|jD]@}|r$||kr$qt||d}|sHttd|j|}|VqdS)Nrzsqlalchemy.dialects.%s)Zsqlalchemy.dialectsZdialects__all__getattr __import__dialect)excludednamemodrrr all_dialectss     rjc@s>eZdZddZddZddZddZdd d Zd d ZdS)ReconnectFixturecCs||_g|_d|_dSrT)dbapi connections is_stopped)rrlrrrrszReconnectFixture.__init__cCs t|j|Sr )rcrlrkeyrrr __getattr__szReconnectFixture.__getattr__cOsT|jj||}|jr@||j|}|ddsPtdn|j ||SdS)Nzselect 1Fz%simulated connect failure didn't work) rlrJrnr1rcursorexecuter&rmappend)rr[kwargsrLZcursrrrrJs   zReconnectFixture.connectc Cs@z |Wn0tk r:}ztd|W5d}~XYnXdS)Nz.ReconnectFixture couldn't close connection: %sr*r.rrrr1s zReconnectFixture._safeFcCs,||_t|jD]}||jqg|_dSr )rnr2rmr1r)rstopcrrrshutdownszReconnectFixture.shutdowncCs d|_dSrT)rnrrrrrestartszReconnectFixture.restartN)F) rVrWrXrrqrJr1rxryrrrrrks  rkcsj|p tjj}tjjj}|si}t||d<t||jfdd}jjj_ jjj _ |_S)Nmodulecs jjdjj_dSrT)rerlrxrnrZ_disposer'rrrEs  z$reconnecting_engine..dispose) rrIrCrerlrktesting_enginerErxZ test_shutdownryZ test_restart)rCoptionsrlrErr{rreconnecting_engines      r~Fc Cs|rddlm}n4|s,tjr:tjjr:|dk r:ddlm}n ddlm}ddlm }|s`d}d}n| dd}| d d}|ptjj }||}|d krtjd ks|j tjj j krtj }qi}n.tjd k r|j tjj j krtj } | |||f|} |r4dd lm} tjd k r4ttjj| r4| jtjj|d krT|rNd| j_nd| _t| jtjrtd| j_d| j_|rt| || S) zBProduce an engine configured by --options with optional overrides.r)create_async_engineF) create_engine)make_urlTr% use_reaperr(N) StaticPoolr$)Zsqlalchemy.ext.asynciorrrIZ _is_futureZsqlalchemy.futurer sqlalchemyZsqlalchemy.engine.urlrpoprCZ drivernameZdb_optscopyupdateZsqlalchemy.poolr isinstancer Z_transfer_fromZ sync_engineZ _has_eventsZ QueuePool_timeoutZ _max_overflowrYr)) rCr}futureZasyncioZtransfer_staticpoolrrrr(Z default_optr'rrrrr| sT             r|csrddlm}|stjj}gfdd}fdd}fdd}||d |td r\t_|_|_ 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_enginecs|dSr )rt)Zsqlar\bufferrrexecutor_szmock_engine..executorcs"ddD}||kst|dS)NcSsg|]}tddt|qS)z[\n\t]rA)resubstr.0srrr csz3mock_engine..assert_sql..)r&)Zstmtsrecvrrr assert_sqlbszmock_engine..assert_sqlcs jdfddjDS)N c3s|]}t|jdVqdS))reN)rcompilerrgrr hsz1mock_engine..print_sql..)rejoinmockr)r'rr print_sqlfszmock_engine..print_sqlz://r) rrrrIrhhasattrr&rrr)Z dialect_namerrrrr)rr'r mock_engineLs    rc@s:eZdZdZddZd ddZddZd d Zd d ZdS)DBAPIProxyCursorzuProxy a DBAPI cursor. Tests can provide subclasses of this to intercept DBAPI-level cursor operations. cOs||_||_|j|||_dSr )r'r8rr)rr'rLr[rurrrrzszDBAPIProxyCursor.__init__NcKs*|r|jj||f|S|jj|f|SdSr )rrrs)rstmt parametersr\rrrrsszDBAPIProxyCursor.executecKs|jj||f|Sr )rr executemany)rrparamsr\rrrrszDBAPIProxyCursor.executemanycCs t|jSr )iterrrrrrr__iter__szDBAPIProxyCursor.__iter__cCs t|j|Sr )rcrrrorrrrqszDBAPIProxyCursor.__getattr__)N) rVrWrX__doc__rrsrrrqrrrrrrs  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 Z_creatorrLr' cursor_cls)rr'rrrrrs zDBAPIProxyConnection.__init__cOs|j|j|jf||Sr )rr'rL)rr[rurrrrrszDBAPIProxyConnection.cursorcCs|jdSr )rLrrrrrrszDBAPIProxyConnection.closecCs t|j|Sr )rcrLrorrrrqsz DBAPIProxyConnection.__getattr__N)rVrWrXrrrrrrqrrrrrs rcs&fdd}dd}t||ddS)zIProduce an engine that provides proxy hooks for common methods. cs tjSr )rrIrconn_clsrrr mock_connsz"proxying_engine..mock_conncsfdd}|S)Ncs |jSr )rL)r! do_on_connectrrgosz8proxying_engine.._wrap_do_on_connect..gor)rrrrr_wrap_do_on_connects z,proxying_engine.._wrap_do_on_connect)Zcreatorr)r})r|)rrrrrrrproxying_enginesr)N)NN)NNNFF)N) __future__rrrr,r rArutilrrrr objectr rYr]r^r`rarjrkr~r|rrrrrrrrsF           ,  ? &