ÿØÿà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@sdZddlZddlZddlZddlZddlZddlmZddlm Z ddlm Z ddlm Z dd lm Z dd lm Z yddlZWnek rdZnXdZdZd efd YZd dZejd dZdS(sProfiling support for unit and performance tests. These are special purpose profiling methods which operate in a more fine-grained way than nose's profiling plugin. iNi(tconfig(t gc_collecti(tjython(tpypy(tupdate_wrapper(twin32tProfileStatsFilecBs\eZdZdZedZdZdZdZdZ dZ dZ RS( s"Store per-platform/fn profiling results in a file. We're still targeting Py2.5, 2.4 on 0.7 with no dependencies, so no json lib :( need to roll something silly cCstjdk otjj|_|jp?tjdk o?tjj|_tjj ||_ tjj |j d|_ t jd|_|j|jr|jndS(NicSs tjtS(N(t collectionst defaultdicttdict(((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pyt:t(RtoptionstNonetforce_write_profilest force_writetwrite_profilestwritetostpathtabspathtfnametsplitt short_fnameRRtdatat_readt_write(tselftfilename((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pyt__init__0s   cCstjjdtjj}djgtjdd!D]}t|^q1}|g}|j|t rx|jdnt r|jdnt r|jdn|jtjj j rdnd tjj}|j|rd pd dj|S( Nt_t.iiRRtwint nativeunicodet dbapiunicodet cextensionst nocextensions(Rtdbtnametdrivertjointsyst version_infotstrtappendRRRtdialecttconvert_unicodet requirementst_has_cextensions(Rt dbapi_keytvt py_versiontplatform_tokenst _has_cext((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pyt platform_keyBs 2  cCs)t}||jko(|j|j|kS(N(t _current_testRR6(Rttest_key((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pyt has_stats[sc Cst}|j|}||j}d|kr=g|d<}n |d}d|krdd|d<}n |d}t||k}|s|j||jr|jnd}n|d||f}|dcd7<|S(Ntcountst current_countitlinenoi(R7RR6tlenR,RRR ( Rt callcountR8tper_fnt per_platformR:R;t has_counttresult((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pyRBas$          cCs{t}|j|}||j}|d}|d}|t|krW|||dR8R?R@R:R;((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pytreplace|s      cCs d|jS(Ns # %s # This file is written out on a per-environment basis. # For each test in aaa_profiling, the corresponding function and # environment is located within this file. If it doesn't exist, # the test is skipped. # If a callcount does exist, it is compared to what we received. # assertions are raised if the counts do not match. # # To add a new callcount test, apply the function_call_count # decorator and re-run the tests using the --write-profiles # option - this file will be rewritten including the new count. # (R(R((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pyt_headersc Csyt|j}Wntk r'dSXxt|D]\}}|j}| s5|jdriq5n|j\}}}|j|}||}g|jdD]} t| ^q} | |d<|d|dsR:s %s %s %s (RRGRRDtsortedRR(RM(RRNR8R?R6R@RQ((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pyRs   "( t__name__t __module__t__doc__RtpropertyR6R9RBRCRDRR(((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pyR(s     g?csfd}|S(sAssert a target for a test case's function call count. The main purpose of this assertion is to detect changes in callcounts for various functions - the actual number is not as important. Callcounts are stored in a file keyed to Python version and OS platform information. This file is generated automatically for new tests, and versioned so that unexpected changes in callcounts will be detected. csfd}t|S(Ncs'td||SWdQXdS(Ntvariance(tcount_functions(targstkw(tfnRY(sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pytwraps(R(R]R^(RY(R]sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pytdecorates((RYR_((RYsO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pytfunction_call_counts c csptdkrtjdntj rLtj rLtjdtjnt tj }|j dV|j t j|dtj}|j}tj|}|dkrd}n |\}}d||fGH|jd|j|rlt||}t|||k}|s*tjrltjrCtj|qitd||d|tjfqlndS(NscProfile is not installedsNo profiling stats available on this platform for this function. Run tests with --write-profiles to add statistics to %s for this platform.tstreamsPstats calls: %d Expected %st cumulativesAdjusted function call count %s not within %s%% of expected %s, platform %s. Rerun with --write-profiles to regenerate this callcount.id(tcProfileR Rt_skip_test_exceptiont_profile_statsR9Rt skip_testRRtProfiletenabletdisabletpstatstStatsR)tstdoutt total_callsRBt sort_statst print_statsRLtabsRRCtAssertionErrorR6( RYtprtstatsR>texpectedtexpected_counttline_notdeviancetfailed((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pyRZs@           (RWRt contextlibRRjR)R RtutilRRRRRRct ImportErrorR R7RetobjectRR`tcontextmanagerRZ(((sO/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/testing/profiling.pyt s*