ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ 4]c@@s~dZddlmZddlZddlZejd-kZerRddlZn ddlZda da da da dadadZdadadadadaeaeadadZdZdZdZd Zd Zd Z da!d Z"d Z#dZ$dZ%dZ&dZ'dZ(gZ)gZ*dZ+dZ,e+dZ-e+dZ.e+dZ/e,dZ0e,dZ1e,dZ2dZ3e,dZ4e,dZ5e,dZ6e,dZ7d Z8d!Z9d"Z:d#Z;d$Z<d%Z=d&Z>d'Z?d(Z@d)ZAdeBd*ZCd+ZDd,ZEdS(.sTesting extensions. this module is designed to work as a testing-framework-agnostic library, created so that multiple test frameworks can be supported at once (mostly so that we can migrate to new ones). The current target is py.test. i(tabsolute_importNic C@s8|ddddddtdd|ddddddtdd |d dd ddd d dd|ddddtdd|ddd ddd ddd|dddd ddd|dddd ddd|dddd ddd|ddddd |d!ddd d"dd#|d$ddd d%dd&|d'ddd d(d)tdd*|d+dddddtdd,|d-ddd d.d)tdd/|d0dddtdddd1|d2dddtdddd3|d4ddd d5d)tdd6|d7ddd d8d)tdd9dS(:Ns --log-infotactiontcallbackttypetstringthelps,turn on info logging for (multiple OK)s --log-debugs-turn on debug logging for (multiple OK)s--dbtappendtdesttdbsBUse prefab database uri. Multiple OK, first one is run by default.s--dbstzeroarg_callbacksList available prefab dbss--dburitdburis8Database uri. Multiple OK, first one is run by default.s --dropfirstt store_truet dropfirsts,Drop all tables in the target database firsts--backend-onlyt backend_onlys<Run only tests marked with __backend__ or __sparse_backend__s --nomemorytnomemorys Don't run memory profiling testss--postgresql-templatedbs^name of template database to use for PostgreSQL CREATE DATABASE (defaults to current database)s--low-connectionstlow_connectionss>Use a low number of distinct connections - i.e. for Oracle TNSs--write-identst write_identssCwrite out generated follower idents to , when -n is useds --reversetopt reversetoptdefaultsTUse a random-ordering set implementation in the ORM (helps reveal dependency issues)s--requirementss3requirements class for testing, overrides setup.cfgs--with-cdecimaltcdecimalsDMonkeypatch the cdecimal library into Python 'decimal' for all testss --include-tagsInclude tests with tag s --exclude-tagsExclude tests with tag s--write-profilestwrite_profiless$Write/update failing profiling data.s--force-write-profilestforce_write_profiless,Unconditionally write/update profiling data.(t_logt _list_dbstFalset_requirements_optt _include_tagt _exclude_tag(t make_option((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt setup_options2scC@sddlm}||_dS(sConfigure required state for a follower. This invokes in the parent process and typically includes database creation. i(t provisionN(tsqlalchemy.testingRtFOLLOWER_IDENT(tfollower_identR((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pytconfigure_followerscC@sitd6td6|dR?R@RARBt setup_filters(R2((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt post_begins cC@sytsddlatjn|jdrJtj|jtjn+|jdrutj|jtjndS(Nis-infos-debug(tloggingt basicConfigtendswitht getLoggertsetLeveltINFOtDEBUG(topt_strR5tparser((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyRs  cG@sQdGHx8ttjdD]!}d|tjd|fGHqWtjddS(Ns0Available --db options (use --dburi to override)Rs%20s %si(tsortedR,R/tgettsystexit(targstmacro((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyRscC@st|dS(N(t_setup_requirements(RNR5RO((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyRscC@stj|jdddS(Nt-t_(R$taddtreplace(RNR5RO((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyRscC@stj|jdddS(NRWRX(R#RYRZ(RNR5RO((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR scC@stj||S(N(R0R(R2((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pytpre(s cC@stj||S(N(RCR(R2((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pytpost-s cC@s |adS(N(R/(R1R,((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt_setup_options2scC@s|jrtjdndS(Ntmemory_intensive(RR$RY(R1R,((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt _set_nomemory8s cC@s)|jr%ddl}|tjds  cC@sddlm}t|_dS(Ni(RA(RRAR7(R/R,RA((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt_init_skiptestFsc C@sddlm}ddlm}ddlm}|jrKt|j}ng}|jrxr|jD]d}x[tj d|D]G}||j dkrt d|q}|j |j d|q}WqdWn|s|j |j ddnd|_x|D]}|jrS|jrSt|jd #} | j|jd |d WdQXn|j||||j} |js| j| |qqWdS( Ni(RA(R:(Rs[,\s]+Rs:Unknown URI specifier '%s'. Specify --dbs for known uris.Rtat s (RRARDR:RR tlistRtretsplitR/t RuntimeErrorRRQtNonet_currentRR topentwritet setup_configtset_as_current( R/R,RAR:Rtdb_urlstdb_tokenRtdb_urltfile_tcfg((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt _engine_uriMs2   $  % cC@s |jdd}t|dS(Nt sqla_testingtrequirement_cls(RQRV(R/R,Rw((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt _requirementsuscC@sddlm}ddlm}|jdk r3dS|jd\}}t|}x*|jddD]}t||}qhWt||}||_|_ dS(Ni(RA(R:t:t.i( RRARDR:t requirementsRjRht __import__tgetattrtrequires(targumentRAR:tmodnametclsnametmodt componenttreq_cls((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyRV|s c C@sddlm}m}ddlm}ddlm}m}|jrx|j j D]}|j }||} y| j } Wnt k rn:Xx6| D].} |j|j|j| |jqW|jjj|rNy| j dd} Wnt k r qNXx?| D]4} |j|j|j| |jddqWn|j|| |jjj|r|j|| d|jn||drUddlm} xJ| jd D]6} |j| j| jd | d d| dqWqUqUWndS( Ni(RARB(tagainst(tschematinspectRt test_schemat postgresql(Rt*tname(RRARBtsqlalchemy.testing.exclusionsRRDRRR tConfigt all_configsRtget_view_namestNotImplementedErrortexecutet _DropViewtTabletMetaDataR{tschemastenabled_for_configtdrop_all_tablesRtsqlalchemy.dialectsRt get_enumst DropEnumTypetENUM(R/R,RARBRRRRttet inspectort view_namestvnameRtenum((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt_prep_testing_databasesJ          cC@s'|jr#ddlm}|ndS(Ni(trandomize_unitofwork(Rtsqlalchemy.orm.utilR(R/R,R((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt_reverse_topologicals cC@s&ddlm}t|_||_dS(Ni(RA(RRAR/R,(R1R,RA((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt_post_setup_optionss cC@s2ddlm}|j|jdd|_dS(Ni(R@Rvt profile_file(RR@tProfileStatsFileRQt_profile_stats(R/R,R@((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt_setup_profilingscC@sjt|tjstS|jjdr,tStjjrbt |dt rbt |dt rbtSt SdS(NRXt __backend__t__sparse_backend__( t issubclassR;tTestBaseRt__name__t startswithRAR/R R}tTrue(tcls((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt want_classs cC@s|jjdstS|jdkr)tStr~t|dr\tj|j j tt p}t|do}|j j tt St rt|drtj|j j tt St rt|dr|j j tt St SdS(Nttest_t__tags__t_sa_exclusion_extend(RRRt __module__RjR#thasattrR=ttagsRt include_testR$RR(RR2((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt want_methods"    cc@st|dts$t|dtrt|dt}xt|d|D]}|j}tjdd|j}tjdd|}d|j|f}t||fi|d 6|d 6}t||||VqIWn|VdS( NRRtsparses [_\[\]\.]+RXs_+$ts%s_%st_sa_orig_cls_namet__only_on_config__( R}Rt_possible_configs_for_clsRRgtsubRRtsetattr(RtmoduleRRtt orig_namet alpha_nameRtsubcls((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pytgenerate_sub_tests s  cC@st|t|dS(N(t _do_skipst _setup_engine(R((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pytstart_test_class%s cC@s6tjjztjs&tjnWdtXdS(N(R<ttesting_reapert_stop_test_ctxR/RR>tglobal_cleanup_assertionst_restore_engine(R((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pytstop_test_class*s   cC@stjjtdS(N(RARktresetR:(((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR5scC@s"tjjtjtdS(N(R<Rt_stop_test_ctx_aggressiveR>RR(((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pytfinal_process_cleanup9s  cC@sAt|ddr=tjd|j}tjj|tndS(Nt__engine_options__R/( R}RjR<ttesting_engineRRARkt push_engineR:(Rteng((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR?scC@s5t|d|j}d|||f}|t_dS(NRs%s.%s.%s(R}RR@t _current_test(ttestttest_module_namet test_classt test_nameRtid_((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt before_testEscC@stjjdS(N(R<Rt_after_test_ctx(R((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt after_testQscC@sttjj}|jrftj|j}x3t|D]"}||r=|j|q=q=Wnt |ddrtjt j |j }x3t|D]"}||s|j|qqWnt |ddr|j|jgnt|drtj}x|t|D]k}xb|jD]W}t ||}|j|} | r&|j||dk ry|j| nPq&q&WqWnt|dr$t} tj}xVt|D]H}x?|jD]4}t ||}|j|s| j|qqWqW|j| r$|j| q$n|ri} xHtt|ddD]+} | jj} | | krL| | | s (tsetRARRt__unsupported_on__R=tdb_specRftremoveR}RjRBtto_listRtintersection_updateRRR{Rtmatching_config_reasonstextendRRRYt differencetdifference_updatetreversedRPRRtvalues(RtreasonsRRtspect config_objR{t requirementtcheckt skip_reasonst non_preferredt per_dialectRtR((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyRUsZ           cC@sig}t||}t|dtrmxCt|dD]/}|r7tjd|j|jfq7q7Wn|sd|jdjdtjjDdj|f}tj|nt |dr@t }t j t j|j}x*|D]"}||s|j|qqW|j|r@|j|q@ntj|kret|j|ndS(Nt __skip_if__s'%s' skipped by %ss.'%s' unsupported on any DB implementation %s%ss, cs@sM|]C}d|jjdjdtj|jD|jjfVqdS(s '%s(%s)+%s'Rzcs@s|]}t|VqdS(N(tstr(t.0tdig((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pys sN(RRtjoinR=t_server_versiontdriver(RR((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pys s t__prefer_backends__(RR}RRAt skip_testRRRRRRR=RRBRRRYRRRkt _setup_configtpop(RRRtctmsgRRR((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyRs2 !    cC@stjj|tdS(N(RARktpushR:(Rtctx((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyRs(ii(Ft__doc__t __future__RRgRRt version_infotpy3kR*R+RjR;R<R=R?R@R>R{RAR:RBR,RGRR#R$R/RR"R'R)R.R3R6R7R9RFRRRRRR0RCR[R\R]R_RbRcRuRxRVRRRRRRRRRRRRRRRRRR(((sX/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyts                  ( 9        A *