§ w<ˆj%"ãóÒ—dZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z  ddl Z n #e $rdZ YnwxYwdZdZGd„d e¦«Zd d „Zejdd „¦«ZdS)z§Profiling 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. éNé)Úconfig)Ú gc_collecté©Úupdate_wrappercóR—eZdZdZd„Zed„¦«Zd„Zd„Zd„Z d„Z d„Z d „Z d S) ÚProfileStatsFilez¯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 cóà—tjduotjj|_|jptjduotjj|_t j |¦«|_ t j  |j ¦«d|_ tj d„¦«|_| ¦«|jr| ¦«dSdS)Néÿÿÿÿcó4—tjt¦«S©N)Ú collectionsÚ defaultdictÚdict©óúp/builddir/build/BUILD/cloudlinux-venv-1.0.12/venv/lib64/python3.11/site-packages/sqlalchemy/testing/profiling.pyúz+ProfileStatsFile.__init__..8s€•KÔ+­DÑ1Ô1€r)rÚoptionsÚforce_write_profilesÚ force_writeÚwrite_profilesÚwriteÚosÚpathÚabspathÚfnameÚsplitÚ short_fnamerrÚdataÚ_readÚ_write)ÚselfÚfilenames rÚ__init__zProfileStatsFile.__init__.sÊ€å ŒN $Ð &Ð N­6¬>Ô+Nð ÔðÔ%ð Ý ŒN $Ð &Ð H­6¬>Ô+Hð Œ õ”W—_’_ XÑ.Ô.ˆŒ Ýœ7Ÿ=š=¨¬Ñ4Ô4°RÔ8ˆÔÝÔ+Ø 1Ð 1ñ ô ˆŒ ð � Š ‰ Œ ˆ Ø Œ:ð ð �KŠK‰MŒMˆMˆMˆMð ð rcóø—tjjdztjjz}tjjdkr8tjj tjj¦«r|dz }d d„tj dd…D¦«¦«}tj ¦«tj ¦«  ¦«tj¦«  ¦«||g}| tjjjrdnd ¦«tj ¦«}| |rd pd ¦«d |¦«S) NÚ_ÚsqliteÚ_fileú.có,—g|]}t|¦«‘ŒSr©Ústr)Ú.0Úvs rú z1ProfileStatsFile.platform_key..Ks€ÐEÐEÐE¨!�s 1™vœvÐEÐEÐErrrÚ nativeunicodeÚ dbapiunicodeÚ cextensionsÚ nocextensions)rÚdbÚnameÚdriverÚdialectÚ_is_url_file_dbÚurlÚjoinÚsysÚ version_infoÚplatformÚmachineÚsystemÚlowerÚpython_implementationÚappendÚconvert_unicodeÚ requirementsÚ_has_cextensions)r$Ú dbapi_keyÚ py_versionÚplatform_tokensÚ _has_cexts rÚ platform_keyzProfileStatsFile.platform_key@sG€õ”I”N SÑ(­6¬9Ô+;Ñ;ˆ å Œ9Œ>˜XÒ %Ð %­&¬)Ô*;×*KÒ*KÝ ŒIŒMñ+ ô+ Ð %ð ˜Ñ ˆIð—X’XÐEÐE­sÔ/?ÀÀ!ÀÔ/DÐEÑEÔEÑFÔFˆ õ Ô Ñ Ô Ý ŒOÑ Ô × #Ò #Ñ %Ô %Ý Ô *Ñ ,Ô ,× 2Ò 2Ñ 4Ô 4Ø Ø ð  ˆð ×ÒåŒyÔ Ô0ð ˆOˆOàñ ô ð õ Ô'×8Ò8Ñ:Ô:ˆ Ø×Ò˜yÐ:¨]ÐM¸oÑNÔNÐNØ�xŠx˜Ñ(Ô(Ð(rcóJ—t}||jvo|j|j|vSr)Ú _current_testr!rL)r$Útest_keys rÚ has_statszProfileStatsFile.has_stats^s*€Ý ˆà ˜œ Ð !Ð N dÔ&7¸4¼9ÀXÔ;NÐ&Nð rcóh—t}|j|}||j}d|vrgx|d<}n|d}d|vrdx|d<}n|d}t|¦«|k}|s3| |¦«|jr| ¦«d}n|d||f}|dxxdz cc<|S)NÚcountsÚ current_countrÚlinenor)rNr!rLÚlenrDrr#) r$Ú callcountrOÚper_fnÚ per_platformrRrSÚ has_countÚresults rrZzProfileStatsFile.resultdsê€Ý ˆØ”˜8Ô$ˆØ˜dÔ/Ô0ˆ à ˜<Ð 'Ð 'Ø.0Ð 0ˆL˜Ñ " V Và! (Ô+ˆFà  ,Ð .Ð .Ø<=Ð =ˆL˜Ñ )¨M¨Mà(¨Ô9ˆM嘑K”K -Ò/ˆ àð CØ �MŠM˜)Ñ $Ô $Ð $ØŒzð Ø— ’ ‘ ” � ؈FˆFà! (Ô+¨V°MÔ-BÐBˆFØ�_Ð%Ð%Ô%¨Ñ*Ð%Ð%Ñ%؈ rcóä—t}|j|}||j}|d}|d}|t|¦«kr |||dz <n||d<|jr| ¦«dSdS)NrRrSrr )rNr!rLrUrr#)r$rVrOrWrXrRrSs rÚreplacezProfileStatsFile.replaces…€Ý ˆØ”˜8Ô$ˆØ˜dÔ/Ô0ˆ ؘhÔ'ˆØ$ _Ô5ˆ Ø �3˜v™;œ;Ò &Ð &Ø(1ˆF�= 1Ñ$Ñ %Ð %à"ˆF�2‰JØ Œ:ð Ø �KŠK‰MŒMˆMˆMˆMð ð rcó—d|jzS)Na # %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$s rÚ_headerzProfileStatsFile._headerŒs€ð ðŒZñ!ð rcóº— t|j¦«}n#t$rYdSwxYwt|¦«D]�\}}| ¦«}|r| d¦«rŒ1| ¦«\}}}|j|}||}d„| d¦«D¦«} | |d<|dz|d<d|d<Œ�| ¦«dS) Nú#có,—g|]}t|¦«‘ŒSr)Úint©r/Úcounts rr1z*ProfileStatsFile._read..¬s€Ð;Ð;Ð; •�U‘”Ð;Ð;Ð;rú,rRrrTrrS) ÚopenrÚIOErrorÚ enumerateÚstripÚ startswithrr!Úclose) r$Ú profile_frTÚlinerOrLrRrWrXÚcs rr"zProfileStatsFile._readŸs€ð ݘTœZÑ(Ô(ˆIˆIøÝð ð ð Ø ˆFˆFð øøøå% iÑ0Ô0ð .ð .‰LˆF�DØ—:’:‘<”<ˆDØð ˜4Ÿ?š?¨3Ñ/Ô/ð Øà-1¯ZªZ©\¬\Ñ *ˆH�l FØ”Y˜xÔ(ˆFØ! ,Ô/ˆLØ;Ð;¨¯ª°cÑ):Ô):Ð;Ñ;Ô;ˆAØ%&ˆL˜Ñ "Ø%+¨a¡ZˆL˜Ñ "Ø,-ˆL˜Ñ )Ð )Ø�ŠÑÔÐÐÐs ‚— %¤%c ó—td|jz¦«t|jd¦«}| | ¦«¦«t |j¦«D]„}|j|}| d|z¦«t |¦«D]M}||}d d„|dD¦«¦«}| |›d|›d|›d�¦«ŒNŒ…| ¦«dS) NzWriting profile file %sÚwz # TEST: %s rec3ó4K—|]}t|¦«V—ŒdSrr-rcs rú z*ProfileStatsFile._write..¼s(èè€ÐLÐL¨E�S ™ZœZÐLÐLÐLÐLÐLÐLrrRú ú ) Úprintrrfrr^Úsortedr!r<rk)r$rlrOrWrLrXrns rr#zProfileStatsFile._write²s€Ý Ð(¨4¬:Ñ5Ñ7Ô7Ð7ݘœ SÑ)Ô)ˆ Ø�Š˜Ÿ š ™œÑ'Ô'Ð'ݘtœyÑ)Ô)ð Lð LˆHà”Y˜xÔ(ˆFØ �OŠOÐ.°Ñ9Ñ :Ô :Ð :Ý & v¡¤ð Lð L� Ø% lÔ3� Ø—H’HÐLÐL°\À(Ô5KÐLÑLÔLÑLÔL�Ø—’°°°¸,¸,¸,ÈÈÈÐ JÑKÔKÐKÐKð Lð �ŠÑÔÐÐÐrN) Ú__name__Ú __module__Ú __qualname__Ú__doc__r&ÚpropertyrLrPrZr\r^r"r#rrrr r &s¢€€€€€ðððððð$ð)ð)ñ„Xð)ð: ð ð ð ððð6 ð ð ðððð&ððð& ð ð ð ð rr çš™™™™™©?c󇇇—ˆˆˆfd„}|S)a©Assert 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. có6•‡—ˆˆˆˆfd„}t|‰¦«S)NcóÈ•—t‰ ¦«D] }‰|i|¤ŽŒ t‰¦«}t‰¬¦«5|D] }‰|i|¤Ž}Œ |cddd¦«S#1swxYwYdS)N)Úvariance)ÚrangeÚcount_functions) ÚargsÚkwÚwarmÚ timerangeÚtimeÚrvÚfnÚtimesr€Úwarmups €€€€rÚwrapz3function_call_count..decorate..wrapÍsÐø€Ý˜f™ œ ð ð �Ø��D�˜B����ݘe™ œ ˆIÝ ¨(Ð3Ñ3Ô3ð ð Ø%ð)ð)�Dؘ˜T˜ R˜˜�B�BØð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s»AÁAÁAr)r‰rŒrŠr€r‹s` €€€rÚdecoratez%function_call_count..decorateÌs>øø€ð ð ð ð ð ð ð ð õ˜d BÑ'Ô'Ð'rr)r€rŠr‹r�s``` rÚfunction_call_countrŽÁs/øøø€ð (ð (ð (ð (ð (ð (ð (ð €Orc #óŒK—t€tjd¦«‚t ¦«s-tjs!tjdtjz¦«t¦«tj ¦«}|  ¦«dV—|  ¦«tj |tj¬¦«}|j}t |¦«}|€d}n|\}}t%d||fz¦«| d¦«| ¦«|r‡t+||z¦«}t-||z ¦«|k}|s tjrStjrt |¦«dSt3d|›d|dz›d |›d tj›d � ¦«‚dSdS) NzcProfile is not installedzŒNo profiling stats available on this platform for this function. Run tests with --write-profiles to add statistics to %s for this platform.)ÚstreamzPstats calls: %d Expected %sÚ cumulativezAdjusted function call count z not within édz% of expected z , platform z;. Rerun with --write-profiles to regenerate this callcount.)ÚcProfilerÚ_skip_test_exceptionÚ_profile_statsrPrÚ skip_testr rÚProfileÚenableÚdisableÚpstatsÚStatsr=ÚstdoutÚ total_callsrZruÚ sort_statsÚ print_statsrbÚabsrr\ÚAssertionErrorrL) r€ÚprÚstatsrVÚexpectedÚexpected_countÚline_noÚdevianceÚfaileds rr‚r‚Ûsæèè€åÐÝÔ)Ð*EÑFÔFÐFå × #Ò #Ñ %Ô %ð ­nÔ.Bð ÝÔð õ .Ô9ñ :ñ ô ð õ�L„L€Lå Ô Ñ Ô €B؇I‚I�K„K€Kà €E€E€Eà‡J‚J�L„L€Lõ ŒL˜¥C¤JÐ /Ñ /Ô /€EðÔ!€Iå×$Ò$ YÑ/Ô/€HàÐØˆˆà"*ш�å Ð )¨Y¸Ð,GÑ GÑIÔIÐIØ ×Ò�\Ñ"Ô"Ð"Ø ×ÒÑÔÐàðÝ�y 8Ñ+Ñ,Ô,ˆÝ�Y Ñ/Ñ0Ô0°8Ò;ˆà ð •^Ô/ð ÝÔ#ð Ý×&Ò& yÑ1Ô1Ð1Ð1Ð1å$�nð "˜ ˜ Ø! C™˜˜Ø&˜˜Ý&Ô3Ð3Ð3ð ñ ô ð ððð ð r)r|rr)r|)rzrÚ contextlibrr?ršr=ÚrÚutilrrr“Ú ImportErrorrNr•Úobjectr rŽÚcontextmanagerr‚rrrúr¯s:ððððÐÐÐØÐÐÐØ € € € Ø€€€Ø € € € Ø € € € àÐÐÐÐÐØÐÐÐÐÐØ!Ð!Ð!Ð!Ð!Ð!ðØ€O€O€O€OøØðððØ€H€H€Hðøøøð€ ð€ðXðXðXðXðX�vñXôXðXðvðððð4 Ôð9ð9ð9ñÔð9ð9ð9s ®3³=¼=