§ |<ˆj¶ã óV—dZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlmZddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddl m!Z!ddl m"Z"ddl#m$Z$ddl%m&Z&ddl'm(Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/ddl.m0Z0ddl1m2Z2erddl%m3Z3e j4dkrej5Z6ej7Z8ej7Z9ej7Z:nej;Z6ej<Z8ej=Z9ej>Z:e2d¦«Z?e j@jA›de$›�ZBdd!pd"zZCd#eBzeCzZDGd$„d%ejEjFejEjG¦«ZHd&eeId'e jJd(ejKd)dfd*„ZLd+dd(ejKd'e jJd,ed)eMf d-„ZNd.ed/e+d)ee jJejKffd0„ZOd1„fd2ed,ed3eePgdfd)eejKfd4„ZQ dqd5ejRd2eId6eePd/ee+d)df d7„ZSd8eTd)ePfd9„ZUd/ee+d)eeVfd:„ZWd8eTd)ePfd;„ZXd8eTd)eMfd<„ZYd=eePd>eMd)ePfd?„ZZd@eePdAeeMdBeePdCeeTd)ePf dD„Z[dEeVdFePdGePd)dfdH„Z\d)eMfdI„Z]ej^dJej_dKej`dLejadMiZbiejcdN“ejddO“ejedP“ejfdQ“ejgdR“ejhdS“ejidT“ejjdU“ejkdV“ejldW“ejmdX“ejndY“ejodZ“ejpd[“ejqd\“ejrd]“ejsd^“ejtd_ejud`ejvdaejwdbejxdcejyddi¥Zzdeej{d)eej{fdf„Z|ej}dg¬h¦«dieId)eeVePffdj„¦«Z~Gdk„dlej¦«Z€dmed)eMfdn„Z�doed)efdp„Z‚dS)rz5Rewrite assertion AST to produce nice error messages.éN)ÚPath)ÚPurePath)ÚCallable)ÚDict)ÚIO)ÚIterable)ÚIterator)ÚList)ÚOptional)ÚSequence)ÚSet)ÚTuple)Ú TYPE_CHECKING)ÚUnion)ÚDEFAULT_REPR_MAX_SIZE)Úsaferepr)Úversion)Úutil)Úformat_explanation)ÚConfig)ÚSession)Ú absolutepath)Ú fnmatch_ex)ÚStashKey)ÚAssertionState©éérz-pytest-ú.pyTÚcÚoú.c ó —eZdZdZdeddfd„Zdeeddfd„Ze j j j Z d ded eeeeefd eejdee j jfd „Z d e j jdeejfd „Zdejddfd„Zdedddefd„Zdededddefd„Zdedddefd„Zdeddfd„Zdeddfd„Zdeeefdefd„Zejdkr"ejdkrddl m!Z!nddl"m!Z!dede!fd„Z#dSdS)!ÚAssertionRewritingHookz1PEP302/PEP451 import hook which rewrites asserts.ÚconfigÚreturnNcóú—||_ | d¦«|_n#t$r ddg|_YnwxYwd|_i|_t ¦«|_d|_dh|_ i|_ d|_ dS)NÚ python_filesz test_*.pyz *_test.pyFÚconftest) r%ÚgetiniÚfnpatsÚ ValueErrorÚsessionÚ_rewritten_namesÚsetÚ _must_rewriteÚ _writing_pycÚ_basenames_to_check_rewriteÚ_marked_for_rewrite_cacheÚ_session_paths_checked)Úselfr%s úk/builddir/build/BUILD/cloudlinux-venv-1.0.12/venv/lib/python3.11/site-packages/_pytest/assertion/rewrite.pyÚ__init__zAssertionRewritingHook.__init__Fs“€ØˆŒ ð 5Ø Ÿ-š-¨Ñ7Ô7ˆDŒKˆKøÝð 5ð 5ð 5Ø&¨ Ð4ˆDŒKˆKˆKð 5øøøà*.ˆŒ Ø13ˆÔÝ'*¡u¤uˆÔð"ˆÔØ,6¨<ˆÔ(Ø:<ˆÔ&Ø&+ˆÔ#Ð#Ð#s ‰$¤:¹:r-có"—||_d|_dS)NF)r-r4)r5r-s r6Ú set_sessionz"AssertionRewritingHook.set_sessionVs€ØˆŒ Ø&+ˆÔ#Ð#Ð#óÚnameÚpathÚtargetcó—|jrdS|jjt}| ||¦«rdS| d|z¦«| ||¦«}|�O|j�Ht|j tj j ¦«r$tj |j¦«sdS|j}| |||¦«sdStj ||||j¬¦«S)Nzfind_module called for: %s)ÚloaderÚsubmodule_search_locations)r1r%ÚstashÚassertstate_keyÚ_early_rewrite_bailoutÚtraceÚ _find_specÚoriginÚ isinstancer?Ú importlibÚ machineryÚSourceFileLoaderÚosr<ÚexistsÚ_should_rewriterÚspec_from_file_locationr@)r5r;r<r=ÚstateÚspecÚfns r6Ú find_specz AssertionRewritingHook.find_spec]s €ð Ô ð Ø�4Ø” Ô!¥/Ô2ˆØ × &Ò & t¨UÑ 3Ô 3ð Ø�4Ø � Š Ð0°4Ñ7Ñ8Ô8Ð8ð�Š˜t TÑ*Ô*ˆð ˆLðŒ{Ð"å˜dœk­9Ô+>Ô+OÑPÔPð#õ”7—>’> $¤+Ñ.Ô.ð #ð �4à”ˆBà×#Ò# D¨"¨eÑ4Ô4ð Ø�4åŒ~×5Ò5Ø Ø ØØ'+Ô'Fð 6ñ ô ð r:rPcó—dS©N©)r5rPs r6Ú create_modulez$AssertionRewritingHook.create_module…s €ðˆtr:ÚmodulecóÈ—|j€J‚|jj€J‚t|jj¦«}|jjt }||j|j<tj }t|¦«}|r+t|¦«}|sd}|  d|›�¦«|j dd…tz}||z }t|||j ¦«} | €a|  d|›�¦«t!||j¦«\} } |r.d|_ t%|| | |¦«d|_n%#d|_wxYwn|  d|›�¦«t'| |j¦«dS)NFzread only directory: éýÿÿÿz rewriting Tzfound cached rewritten pyc for )Ú__spec__rFrr%rArBr.Ú__name__ÚsysÚdont_write_bytecodeÚ get_cache_dirÚ try_makedirsrDr;ÚPYC_TAILÚ _read_pycÚ _rewrite_testr1Ú _write_pycÚexecÚ__dict__) r5rWrQrOÚwriteÚ cache_dirÚokÚ cache_nameÚpycÚcoÚ source_stats r6Ú exec_modulez"AssertionRewritingHook.exec_moduleŠs”€ØŒÐ*Ð*Ð*ØŒÔ%Ð1Ð1Ð1Ý �&”/Ô(Ñ )Ô )ˆØ” Ô!¥/Ô2ˆà13ˆÔ˜fœoÑ.õÔ+Ð+ˆÝ! "Ñ%Ô%ˆ Ø ð AݘiÑ(Ô(ˆBØð AØ�Ø— ’ Ð?°IÐ?Ð?Ñ@Ô@Ð@à”W˜S˜b˜S”\¥HÑ,ˆ ؘ*Ñ$ˆõ�r˜3 ¤ Ñ ,Ô ,ˆØ ˆ:Ø �KŠKÐ+ RÐ+Ð+Ñ ,Ô ,Ð ,Ý+¨B°´ Ñ<Ô<‰OˆK˜Øð .Ø$(�Ô!ð.ݘu b¨+°sÑ;Ô;Ð;à(-�DÔ%Ð%ø¨�DÔ%Ð-Ð-Ð-Ð-ð  .ð �KŠKÐ>¸"Ð>Ð>Ñ ?Ô ?Ð ?Ý ˆR�”Ñ!Ô!Ð!Ð!Ð!s ÄD(Ä( D1rOrcóŽ—|j�Œ|js…d|_|jjD]q}t|¦« t j¦«}|j t j   |d¦«d¦«Œr| d¦«}|d|jvrdSt|Ž  d¦«}|j D]7}t j  |¦«rdSt||¦«rdSŒ8| ||¦«rdS| d|›�¦«dS) a'A fast way to get out of rewriting modules. Profiling has shown that the call to PathFinder.find_spec (inside of the find_spec from this class) is a major slowdown, so, this method tries to filter what we're sure won't be rewritten before getting to it. NTéÿÿÿÿrr"Frz early skip of rewriting module: )r-r4Ú _initialpathsÚstrÚsplitrKÚsepr2Úaddr<ÚsplitextrÚ with_suffixr+ÚdirnamerÚ_is_marked_for_rewriterD)r5r;rOÚ initial_pathÚpartsr<Úpats r6rCz-AssertionRewritingHook._early_rewrite_bailout´sT€ð Œ<Ð #¨DÔ,GÐ #Ø*.ˆDÔ 'Ø $¤ Ô :ð Uð U� õ˜LÑ)Ô)×/Ò/µ´Ñ7Ô7�àÔ0×4Ò4µR´W×5EÒ5EÀeÈBÄiÑ5PÔ5PÐQRÔ5SÑTÔTÐTÐTð— ’ ˜3‘”ˆØ �Œ9˜Ô8Ð 8Ð 8Ø�5õ˜Ð×+Ò+¨EÑ2Ô2ˆà”;ð ð ˆCõŒw�Š˜sÑ#Ô#ð Ø�u�uݘ#˜tÑ$Ô$ð Ø�u�uð ð × &Ò & t¨UÑ 3Ô 3ð Ø�5à � Š Ð=°tÐ=Ð=Ñ>Ô>Ð>؈tr:rQcóÀ—tj |¦«dkr| d|›�¦«dS|j�A|j t |¦«¦«r| d|›�¦«dSt|¦«}|jD]-}t||¦«r| d|›�¦«dSŒ.|  ||¦«S)Nz conftest.pyzrewriting conftest file: Tz.matched test file (was specified on cmdline): zmatched test file ) rKr<ÚbasenamerDr-Ú isinitpathrrr+rrx)r5r;rQrOÚfn_pathr{s r6rMz&AssertionRewritingHook._should_rewriteÛsô€å Œ7× Ò ˜BÑ Ô  =Ò 0Ð 0Ø �KŠKÐ:°BÐ:Ð:Ñ ;Ô ;Ð ;Ø�4à Œ<Ð #ØŒ|×&Ò&¥|°BÑ'7Ô'7Ñ8Ô8ð Ø— ’ ÐSÈRÐSÐSÑTÔTÐTØ�tõ˜2‘,”,ˆØ”;ð ð ˆCݘ#˜wÑ'Ô'ð Ø— ’ Ð7°Ð7Ð7Ñ8Ô8Ð8Ø�t�tð ð×*Ò*¨4°Ñ7Ô7Ð7r:c óø— |j|S#t$r`|jD]J}||ks| |dz¦«r*| d|›d|›d�¦«d|j|<YdSŒKd|j|<YdSwxYw)Nr"zmatched marked file z (from ú)TF)r3ÚKeyErrorr0Ú startswithrD)r5r;rOÚmarkeds r6rxz-AssertionRewritingHook._is_marked_for_rewriteðs¶€ð ØÔ1°$Ô7Ð 7øÝð ð ð ØÔ,ð ð �ؘ6’>�> T§_¢_°V¸c±\Ñ%BÔ%B�>Ø—K’KÐ Q°tÐ QÐ QÀfÐ QÐ QÐ QÑRÔRÐRØ;?�DÔ2°4Ñ8ؘ4˜4˜4ð"ð 49ˆDÔ *¨4Ñ 0Ø�5�5ð øøøs‚ �AA9Á* A9Á8A9ÚnamescóÒ—t|¦« tj¦« |j¦«}|D]l}tj|}t  |jpd¦«s7t|j t|¦«¦«s|  |¦«Œm|j  |¦«|j ¦«dS)zžMark import names as needing to be rewritten. The named module or package as well as any nested modules will be rewritten on import. ÚN)r/Ú intersectionr\ÚmodulesÚ differencer.ÚAssertionRewriterÚis_rewrite_disabledÚ__doc__rGÚ __loader__ÚtypeÚ_warn_already_importedr0Úupdater3Úclear)r5r…Úalready_importedr;Úmods r6Ú mark_rewritez#AssertionRewritingHook.mark_rewriteýsÕ€õ �‰JŒJ× #Ò #¥C¤KÑ 0Ô 0× ;Ò ;¸DÔráfs€Àd€r:rÜrDcó¼— t|d¦«}n#t$rYdSwxYw|5 tj|¦«}t |j¦«}|j}| d¦«}n4#t$r'}|d|›d|›�¦«Yd}~ddd¦«dSd}~wwxYwt|¦«dkr|d|z¦« ddd¦«dS|dd…tj j kr|d|z¦« ddd¦«dS|dd …d kr|d |z¦« ddd¦«dS|d d …} t  | d ¦«|dzkr|d|z¦« ddd¦«dS|d d…} t  | d ¦«|dzkr|d|z¦« ddd¦«dS tj|¦«} n4#t$r'}|d|›d|›�¦«Yd}~ddd¦«dSd}~wwxYwt!| t"j¦«s|d|z¦« ddd¦«dS| cddd¦«S#1swxYwYdS)zsPossibly read a pytest pyc containing rewritten code. Return rewritten code if successful or None if not. rŸNéz _read_pyc(z ): OSError z&_read_pyc(%s): invalid pyc (too short)éz-_read_pyc(%s): invalid pyc (bad magic number)rr½z._read_pyc(%s): invalid pyc (unsupported flags)r¦Úlittler¾z_read_pyc(%s): out of datez+_read_pyc(%s): invalid pyc (incorrect size)z): marshal.load error z _read_pyc(%s): not a code object)r rÎrKrÖrÀrÁrÂr¡ÚlenrHrr¿Ú from_bytesrÅÚloadÚ ExceptionrGr®ÚCodeType) rÜrjrDr»Ú stat_resultrÈrÉÚdatarÒÚ mtime_dataÚ size_datarks r6raraes€ðÝ �#�t‰_Œ_ˆˆøÝ ððð؈tˆtðøøøà ð#ð#ð Ýœ' &™/œ/ˆKݘ Ô,Ñ-Ô-ˆEØÔ&ˆDØ—7’7˜2‘;”;ˆDˆDøÝð ð ð Ø ˆEÐ5˜vÐ5Ð5°!Ð5Ð5Ñ 6Ô 6Ð 6Ø�4�4�4ð#ð#ð#ñ#ô#ð#ð#ð#øøøøð  øøøõ ˆt‰9Œ9˜Ò Ð Ø ˆEÐ:¸VÑCÑ DÔ DÐ DØð#ð#ð#ñ#ô#ð#ð#ð#ð ���Œ8•y”~Ô2Ò 2Ð 2Ø ˆEÐAÀFÑJÑ KÔ KÐ KØð#ð#ð#ñ#ô#ð#ð#ð#ð ��!�Œ9Ð+Ò +Ð +Ø ˆEÐBÀVÑKÑ LÔ LÐ LØð%#ð#ð#ñ#ô#ð#ð#ð#ð&˜!˜B˜$”Zˆ Ý �>Š>˜* hÑ /Ô /°5¸:Ñ3EÒ EÐ EØ ˆEÐ.°Ñ7Ñ 8Ô 8Ð 8Øð-#ð#ð#ñ#ô#ð#ð#ð#ð.˜˜B˜”Kˆ Ý �>Š>˜) XÑ .Ô .°$¸Ñ2CÒ CÐ CØ ˆEÐ?À&ÑHÑ IÔ IÐ IØð5#ð#ð#ñ#ô#ð#ð#ð#ð6 Ý”˜bÑ!Ô!ˆBˆBøÝð ð ð Ø ˆEÐ@˜vÐ@Ð@¸QÐ@Ð@Ñ AÔ AÐ AØ�4�4�4ð?#ð#ð#ñ#ô#ð#ð#ð#øøøøð: øøøõ˜"�eœnÑ-Ô-ð Ø ˆEÐ4°vÑ=Ñ >Ô >Ð >ØðE#ð#ð#ñ#ô#ð#ð#ð#ðFðG#ð#ð#ð#ñ#ô#ð#ð#ð#ð#ð#ð#øøøð#ð#ð#ð#ð#ð#s�‚“ ! !¦I¨AA-Á,IÁ- BÁ7BÂIÂBÂ%IÃ,IÄ IÄ3;IÅ;;IÇGÇIÇ H Ç#HÇ4IÈH È ,IÉIÉIÉIr”Ú module_pathcóN—t|||¦« |¦«dS)z%Rewrite the assert statements in mod.N)r‹Úrun)r”rÜrïr%s r6rÚrÚ–s*€õ�k 6¨6Ñ2Ô2×6Ò6°sÑ;Ô;Ð;Ð;Ð;r:Úobjcó~—ttj¦«}t||¬¦« dd¦«S)a§Get a safe repr of an object for assertion error messages. The assertion formatting (util.format_explanation()) requires newlines to be escaped since they are a special character for it. Normally assertion.util.format_explanation() does this but for a custom repr it is possible to contain one of the special escape sequences, especially '\n{' and '\n}' are likely to be present in JSON reprs. ©Úmaxsizeú ú\n)Ú_get_maxsize_for_safereprrÚ_configrrÐ)ròrõs r6Ú _safereprrú s6€õ(­¬ Ñ5Ô5€GÝ �C Ð )Ñ )Ô )× 1Ò 1°$¸Ñ >Ô >Ð>r:cór—|�| d¦«nd}|dkrdS|dkr tdzStS)zJGet `maxsize` configuration for saferepr based on the given config object.NÚverboseréér¥)Ú getoptionr)r%Ú verbositys r6rørø®sG€à/5Ð/A�× Ò  Ñ+Ô+Ð+Àq€IØ�A‚~€~؈tØ�A‚~€~Ý$ rÑ)Ð)Ý Ð r:có¼—ddg}t|t¦«s$t|¦«}| d¦«|D]\}}| ||¦«}Œ|S)zñFormat the custom assertion message given. For strings this simply replaces newlines with '\n~' so that util.format_explanation() will preserve them instead of escaping newlines. For other objects saferepr() is used first. )röú ~)ú%ú%%)r÷r)rGrqrÚappendrÐ)ròÚreplacesÚr1Úr2s r6Ú_format_assertmsgr ¸sj€ð˜{Ð+€HÝ �c�3Ñ Ô ð(Ý�s‰mŒmˆØ�Š˜Ñ'Ô'Ð'àð"ð"‰ˆˆBØ�kŠk˜"˜bÑ!Ô!ˆˆà €Jr:cój—t|¦«rdS t|d¦« S#t$rYdSwxYw)NFr[T)ÚcallableÚhasattrré)ròs r6Ú_should_repr_global_namer ÎsO€Ý��}„}ð؈uðݘ3  Ñ+Ô+Ð+Ð+øÝ ððð؈tˆtðøøøs “$¤ 2±2Ú explanationsÚis_orcól—d|rdpd |¦«zdz}| dd¦«S)Nú(z or z and r�rr)ÚjoinrÐ)rrÚ explanations r6Ú_format_booloprØs?€Ø˜Ð) 6Ð4¨W×:Ò:¸<ÑHÔHÑHÈ3ÑN€KØ × Ò ˜s DÑ )Ô )Ð)r:ÚopsÚresultsÚexplsÚeach_objcó—ttt|¦«¦«||¦«D]!\}}} | }n#t$rd}YnwxYw|rnŒ"tj�/t j||||||dz¦«}|�|S|S)NTrþ)ÚzipÚrangerærérÚ _reprcompare) rrrrÚiÚresÚexplÚdoneÚcustoms r6Ú_call_reprcomparer"Ýs²€õ �E¥# c¡(¤(™OœO¨W°eÑ<Ô<ðð‰ ˆˆ3�ð Ø�7ˆDˆDøÝð ð ð ØˆDˆDˆDð øøøà ð Ø ˆEð å ÔÐ$ÝÔ" 3 q¤6¨8°A¬;¸ÀÀQÁ¼ÑHÔHˆØ Р؈MØ €Ks³7· AÁAÚlinenoÚorigrcóN—tj�tj|||¦«dSdSrT©rÚ_assertion_pass)r#r$rs r6Ú_call_assertion_passr(ñs.€Ý ÔÐ'Ý Ô˜V T¨4Ñ0Ô0Ð0Ð0Ð0ð(Ð'r:có"—tjrdndS)zŠCheck if any plugins implement the pytest_assertion_pass hook in order not to generate explanation unnecessarily (might be expensive).TFr&rUr:r6Ú_check_if_assertion_pass_implr*ös€õÔ'Ð 2ˆ4ˆ4¨UÐ2r:znot %sz~%sz-%sz+%sú|ú^ú&z<>ú+ú-Ú*ú/z//rz==z!=úz>=ú**Úiszis notÚinznot inú@Únodec#ójK—|V—tj|¦«D]}t|¦«Ed{V—†ŒdS)zARecursively yield node and all its children in depth-first order.N)rØÚiter_child_nodesÚ traverse_node)r8Úchilds r6r;r;sVèè€à €J€J€JÝÔ% dÑ+Ô+ð(ð(ˆÝ  Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð(ð(r:rþrôÚsrccóÚ‡ ‡ ‡ ‡ ‡—iŠ dŠ gŠ dŠ t¦«Šd ˆ ˆ ˆ ˆ ˆfd„ }tjtj|¦«j¦«}|D�]–\}}\}}}}|tjkr |dkr|Š Œ%‰ ��n|tjkr |dvr‰ dz Š n|tjkr |dvr‰ dzŠ ‰ s3‰  ||d…¦«‰ |¦«Œ�‰ dkrª|tjkrš|d kr”|‰vrOt‰ ¦«dkr<|t‰ d ¦«zt|¦«z } ‰ d d| …‰ d <n5|‰vr‰ d d|…‰ d <n‰  |d|…¦«|¦«�Œ@|tj tj hvr |¦«�Œf‰ r.|‰vr*‰  |¦«‰ |¦«�Œ˜‰ S) z._write_and_reset*sYø€àÐ(Ð(Ð(ØŸWšW U™^œ^×2Ò2Ñ4Ô4×;Ò;¸DÑAÔAˆˆMÑØˆØˆØˆ Ý‘U”Uˆ ˆ ˆ r:Úassertz([{rþz)]}ú,ro©r&N) r/ÚtokenizeÚioÚBytesIOÚreadlineÚNAMEÚOPrrtræÚNEWLINEÚ ENDMARKER)r=rGÚtokensÚtprÜr#ÚoffsetÚ_ÚlineÚoffset_in_trimmedrBrCrDrErFs @@@@@r6Ú_get_assertion_exprsrY sSøøøøø€ð€Cà €EØ€EØ#'€MÝ™5œ5€JððððððððððõÔ �rœz¨#™œÔ7Ñ 8Ô 8€FØ17ð'ñ'Ñ-ˆˆFÑ$�V˜V a¨Ø •”Ò Ð  6¨XÒ#5Ð#5Ø"ˆMˆMØ Ñ &à•X”[Ò Ð  V¨u _ _ؘ‘ ��Ø•x”{Ò"Ð" v°  Ø˜‘ �àð 'Ø— ’ ˜T & ' 'œ]Ñ+Ô+Ð+Ø—’˜vÑ&Ô&Ð&Ð&à˜!’� ¥h¤kÒ 1Ð 1°fÀ²m°mà˜ZÐ'Ð'­C°©J¬J¸!ªO¨OØ(.µ°U¸2´Y±´Ñ(?Å#ÀdÁ)Ä)Ñ(KÐ%Ø % b¤ Ð*<Ð+<Ð*<Ô =�E˜"‘I�Ià˜zÐ)Ð)Ø % b¤ ¨'¨6¨'Ô 2�E˜"‘I�Ið—L’L  g v g¤Ñ/Ô/Ð/Ø Ð Ñ"Ô"Ð"Ñ"Ø�Ô(­(Ô*<Ð=Ð=Ð=Ø Ð Ñ"Ô"Ð"Ñ"Øð '˜6¨Ð3Ð3Ø— ’ ˜TÑ"Ô"Ð"Ø—’˜vÑ&Ô&Ð&ùà €Jr:c󆇗eZdZdZdeedeededdfˆfd„ Zde j ddfd „Z e d ede fd „¦«Zdefd „Zd e jde jfd„Zd e jde jfd„Zdede jde jfd„Zdede jfd„Zd e jdefd„Zd,d„Zde jde jfd„Zde jdee jeffd„Zde jdee jfd„Z de!dee!effd„Z"de jdee jeffd„Z#de j$dee jeffd„Z%d e j&dee jeffd!„Z'd"e j(dee jeffd#„Z)d$e j*dee jeffd%„Z+d&e j,dee j,effd'„Z-d(e jdee jeffd)„Z.d*e j/dee jeffd+„Z0ˆxZ1S)-r‹aŒ Assertion rewriting implementation. The main entrypoint is to call .run() with an ast.Module instance, this will then find all the assert statements and rewrite them to provide intermediate values and a detailed assertion error. See http://pybites.blogspot.be/2011/07/behind-scenes-of-pytests-new-assertion.html for an overview of how this works. The entry point here is .run() which will iterate over all the statements in an ast.Module and for each ast.Assert statement it finds call .visit() with it. Then .visit_Assert() takes over and is responsible for creating new ast statements to replace the original assert statement: it rewrites the test of an assertion to provide intermediate values and replace it with an if statement which raises an assertion error with a detailed explanation in case the expression is false and calls pytest_assertion_pass hook if expression is true. For this .visit_Assert() uses the visitor pattern to visit all the AST nodes of the ast.Assert.test field, each visit call returning an AST node and the corresponding explanation string. During this state is kept in several instance attributes: :statements: All the AST statements which will replace the assert statement. :variables: This is populated by .variable() with each variable used by the statements so that they can all be set to None at the end of the statements. :variable_counter: Counter to create new unique variables needed by statements. Variables are created using .variable() and have the form of "@py_assert0". :expl_stmts: The AST statements which will be executed to get data from the assertion. This is the code which will construct the detailed assertion message that is used in the AssertionError or for the pytest_assertion_pass hook. :explanation_specifiers: A dict filled by .explanation_param() with %-formatting placeholders and their corresponding expressions to use in the building of an assertion message. This is used by .pop_format_context() to build a message. :stack: A stack of the explanation_specifiers dicts maintained by .push_format_context() and .pop_format_context() which allows to build another %-formatted string while already building one. :variables_overwrite: A dict filled with references to variables that change value within an assert. This happens when a variable is reassigned with the walrus operator This state, except the variables_overwrite, is reset on every new assert statement visited and used by the other visitors. rïr%rÜr&NcóÈ•—t¦« ¦«||_||_|�| d¦«|_nd|_||_i|_dS)NÚenable_assertion_pass_hookF)Úsuperr7rïr%r*r\rÜÚvariables_overwrite)r5rïr%rÜÚ __class__s €r6r7zAssertionRewriter.__init__�skø€õ ‰Œ×ÒÑÔÐØ&ˆÔ؈Œ Ø Ð Ø.4¯mªmØ,ñ/ô/ˆDÔ +Ð +ð/4ˆDÔ +؈Œ Ø35ˆÔ Ð Ð r:r”có‡—|jsdSt|dd¦«}|du}|�| |¦«rdSd}d}|jD]´}|rxt|tj¦«r^t|jt¦«rDtj dkr |jj}n |jj }| |¦«rdSd}n3t|tj ¦«r|j dkr |j dkrnn|dz }Œµt|tj¦«r|jr|jdjŠn|jŠtj dkr1t jd d ‰d¬ ¦«t jd d ‰d¬ ¦«g}n*t jd d ¦«t jd d ¦«g}ˆfd„|D¦«}||j||…<|g}|�rC| ¦«} t j| ¦«D�]\} } t| t(¦«r°g} t+| ¦«D]Œ\} }t|tj¦«r)|  | |¦«¦«ŒH|  |¦«t|tj¦«r| |¦«Œ�t7| | | ¦«ŒËt| tj¦«r/t| tj¦«s| | ¦«�Œ|�°AdSdS)z5Find all assert statements in *mod* and rewrite them.NÚ docstringrrFÚ __future__rþr¤Úbuiltinsú @py_builtins©r#Ú col_offsetz_pytest.assertion.rewriteú @pytest_arcó@•—g|]}tj|g‰d¬¦«‘ŒS)rre)rØÚImport)Ú.0Úaliasr#s €r6ú z)AssertionRewriter.run..Ùs9ø€ð ð ð ØAF�CŒJ˜�w v¸!Ð <Ñ <Ô <ð ð ð r:)ÚbodyÚgetattrrŒrGrØÚExprÚvalueÚastStrr\r«ÚsÚ ImportFromÚlevelrWÚ FunctionDefÚdecorator_listr#rkÚpopÚ iter_fieldsÚlistÚ enumerateÚAssertÚextendÚvisitrÚASTÚsetattrÚexpr)r5r”ÚdocÚexpect_docstringÚposÚitemÚaliasesÚimportsÚnodesr8r;ÚfieldÚnewrr<r#s @r6rñzAssertionRewriter.runŸsXø€àŒxð à ˆFõ�c˜;¨Ñ-Ô-ˆØ $˜;ÐØ ˆ?˜t×7Ò7¸Ñ<Ô<ˆ?Ø ˆF؈؈ؔHð ð ˆDà ð å˜t¥S¤XÑ.Ô.ð õ˜tœz­6Ñ2Ô2ð õ Ô# vÒ-Ð-Øœ*Ô*�C�Càœ*œ,�CØ×+Ò+¨CÑ0Ô0ðØ�F�FØ#(Ð Ð å˜4¥¤Ñ0Ô0ð à”J !’O�OØ”K <Ò/Ð/àà�Ø �1‰HˆCˆCõ �d�CœOÑ ,Ô ,ð !°Ô1Dð !ØÔ(¨Ô+Ô2ˆFˆFà”[ˆFå Ô ˜wÒ &Ð &å” ˜* n¸VÐPQÐRÑRÔRÝ” Ø/Ø Ø!Ø ð ñôðˆGˆGõ” ˜* nÑ5Ô5Ý” Ð5°|ÑDÔDðˆGð ð ð ð ØJQð ñ ô ˆð$ˆŒ��S�Ñð!$˜uˆØñ (Ø—9’9‘;”;ˆDÝ"œ¨tÑ4Ô4ð (ñ (‘ ��eݘe¥TÑ*Ô*ð(Ø)+�CÝ$-¨eÑ$4Ô$4ð4ð4™˜˜5Ý% e­S¬ZÑ8Ô8ð4àŸJšJ t§z¢z°%Ñ'8Ô'8Ñ9Ô9Ð9Ð9àŸJšJ uÑ-Ô-Ð-Ý)¨%µ´Ñ9Ô9ð4Ø %§ ¢ ¨UÑ 3Ô 3Ð 3øÝ˜D $¨Ñ,Ô,Ð,Ð,å˜u¥c¤gÑ.Ô.ð(õ' u­c¬hÑ7Ô7ð (ð —L’L Ñ'Ô'Ð'ùð)ñ (ð (ð (ð (ð (r:racó —d|vS)NÚPYTEST_DONT_REWRITErU)ras r6rŒz%AssertionRewriter.is_rewrite_disabledös €à$¨ Ð1Ð1r:có‚—dtt|j¦«¦«z}|j |¦«|S)zGet a new variable.z @py_assert)rqÚnextÚvariable_counterÚ variablesr)r5r;s r6ÚvariablezAssertionRewriter.variableús<€ð�c¥$ tÔ'<Ñ"=Ô"=Ñ>Ô>Ñ>ˆØ Œ×Ò˜dÑ#Ô#Ð#؈ r:r€c ó—| ¦«}|j tjtj|tj¦«¦«g|¦«¦«tj|tj¦«¦«S)zGive *expr* a name.)r�Ú statementsrrØÚAssignÚNameÚStoreÚLoad)r5r€r;s r6ÚassignzAssertionRewriter.assigns^€à�}Š}‰ŒˆØ Œ×Ò�sœz­3¬8°D½#¼)¹+¼+Ñ+FÔ+FÐ*GÈÑNÔNÑOÔOÐOÝŒx˜�cœh™jœjÑ)Ô)Ð)r:có.—| d|¦«S)z Call saferepr on the expression.rú)Úhelper)r5r€s r6ÚdisplayzAssertionRewriter.displays€à�{Š{˜;¨Ñ-Ô-Ð-r:r;Úargscóâ—tjdtj¦«¦«}tj||tj¦«¦«}tj|t |¦«g¦«S)zCall a helper in this module.rg)rØr”r–Ú AttributeÚCallry)r5r;r›Úpy_nameÚattrs r6r™zAssertionRewriter.helper sL€å”(˜<­¬©¬Ñ4Ô4ˆÝŒ}˜W d­C¬H©J¬JÑ7Ô7ˆÝŒx˜�d 4™jœj¨"Ñ-Ô-Ð-r:cóœ—tjdtj¦«¦«}tj||tj¦«¦«S)z!Return the builtin called *name*.rd)rØr”r–r�)r5r;Ú builtin_names r6ÚbuiltinzAssertionRewriter.builtins3€å”x µ´± ´ Ñ;Ô;ˆ ÝŒ}˜\¨4µ´±´Ñ<Ô<Ѐð�3�t DÔ$9Ñ:Ô:Ñ;Ô;Ñ;ˆ Ø15ˆÔ# IÑ.Ø�iÑ $Ñ&Ð&r:cóR—i|_|j |j¦«dS)aŒCreate a new formatting context. The format context is used for when an explanation wants to have a variable value formatted in the assertion message. In this case the value required can be added using .explanation_param(). Finally .pop_format_context() is used to format a string of %-formatted values as added by .explanation_param(). N)r¦Ústackr)r5s r6Úpush_format_contextz%AssertionRewriter.push_format_context"s+€ð<>ˆÔ#Ø Œ ×Ò˜$Ô5Ñ6Ô6Ð6Ð6Ð6r:Ú expl_exprc óÒ—|j ¦«}|jr|jd|_d„| ¦«D¦«}t j|t | ¦«¦«¦«}t j|t j ¦«|¦«}dtt|j ¦«¦«z}|j r|j |¦«|j t jt j|t j¦«¦«g|¦«¦«t j|t j¦«¦«S)aZFormat the %-formatted string with current format context. The expl_expr should be an str ast.expr instance constructed from the %-placeholders created by .explanation_param(). This will add the required code to format said string to .expl_stmts and return the ast.Name instance of the formatted string. rocó,—g|]}t|¦«‘ŒSrU)rq)rjÚkeys r6rlz8AssertionRewriter.pop_format_context..:s€Ð6Ð6Ð6 •�s‘ ” Ð6Ð6Ð6r:z @py_format)rªrwr¦ÚkeysrØrryÚvaluesÚBinOpÚModrqr�rŽr\Úformat_variablesrÚ expl_stmtsr“r”r•r–)r5r¬Úcurrentr°Ú format_dictÚformr;s r6Úpop_format_contextz$AssertionRewriter.pop_format_context/s€ð”*—.’.Ñ"Ô"ˆØ Œ:ð 9Ø*.¬*°R¬.ˆDÔ 'Ø6Ð6 w§|¢|¡~¤~Ð6Ñ6Ô6ˆÝ”h˜t¥T¨'¯.ª.Ñ*:Ô*:Ñ%;Ô%;Ñ<Ô<ˆ ÝŒy˜¥C¤G¡I¤I¨{Ñ;Ô;ˆØ�c¥$ tÔ'<Ñ"=Ô"=Ñ>Ô>Ñ>ˆØ Ô *ð /Ø Ô !× (Ò (¨Ñ .Ô .Ð .Ø Œ×Ò�sœz­3¬8°D½#¼)¹+¼+Ñ+FÔ+FÐ*GÈÑNÔNÑOÔOÐOÝŒx˜�cœh™jœjÑ)Ô)Ð)r:r8có¸—t|tj¦«sJ‚| |¦«}|| | |¦«¦«fS)z1Handle expressions we don't have custom code for.)rGrØr€r—r¨rš)r5r8rs r6Ú generic_visitzAssertionRewriter.generic_visitCsP€å˜$¥¤Ñ)Ô)Ð)Ð)Ð)Ø�kŠk˜$ÑÔˆØ�D×*Ò*¨4¯<ª<¸Ñ+<Ô+<Ñ=Ô=Ð=Ð=r:Úassert_c óÊ —t|jtj¦«r\t |jj¦«dkr?ddlm}ddl}|j €J‚|  |d¦«d|j |j ¬¦«g|_ g|_ tj¦«|_|jrg|_g|_g|_| ¦«| |j¦«\}}tjtj¦«|¦«}|j�r…| t5|¦«¦«}|jr| d|j¦«}d} nt5d ¦«}d } tjt5| ¦«tj¦«|¦«} tj|tj¦«| ¦«} tjd tj ¦«¦«} | d | ¦«} tj!| | gg¦«}tj"|d¦«}g}| #|j¦«| $|¦«| d |¦«}tK|j&¦«|j }tj'| d tQ|j ¦«t5|¦«|¦«¦«}tj)| d¦«|j|gzg¦«}|g}tj)|||¦«}|j  $|¦«|jrMd„|jD¦«}tj*|tWd¦«¦«}|j  $|¦«�n7|j}|j  $tj)||g¦«¦«|jr!| d|j¦«}d|z}nt5d ¦«}d |z}tj|tj¦«t5|¦«¦«}| |¦«}| d |¦«} tjd tj ¦«¦«} tj!| | gg¦«}tj"|d¦«}| $|¦«|j rMd„|j D¦«}tj*|tWd¦«¦«}|j  $|¦«|j D])}tY|¦«D]}tj-||¦«ŒŒ*|j S)a.Return the AST statements to replace the ast.Assert instance. This rewrites the test of an assertion to provide intermediate values and replace it with an if statement which raises an assertion error with a detailed explanation in case the expression is false. rþrr—Nz5assertion is always true, perhaps remove parentheses?)ÚcategoryrÔr#r z >assert r‡zassert ÚAssertionErrorÚ_format_explanationr(r*cóZ—g|](}tj|tj¦«¦«‘Œ)SrU©rØr”r•©rjr;s r6rlz2AssertionRewriter.visit_Assert..šs7€ðððØ48•C”H˜T¥3¤9¡;¤;Ñ/Ô/ðððr:cóZ—g|](}tj|tj¦«¦«‘Œ)SrUrÂrÃs r6rlz2AssertionRewriter.visit_Assert..µs*€ÐPÐPÐP¸�œ $­¬ © ¬ Ñ4Ô4ÐPÐPÐPr:).rGÚtestrØrræÚeltsr›r˜ÚwarningsrïÚ warn_explicitr#r’r�Ú itertoolsÚcountrŽr\r´rªrµr«r}ÚUnaryOpÚNotr¹rqÚmsgr™r²ÚAddr”r–ržÚRaiser|rrYrÜroÚastNumÚIfr“ÚastNameConstantr;Ú copy_location)r5r¼r˜rÇÚ top_conditionrÚnegationrÍÚ assertmsgÚgluestrÚerr_explanationÚerr_msgÚerr_nameÚfmtÚexcÚraise_Ústatements_failÚfmt_passr$Úhook_call_passÚhook_impl_testÚstatements_passÚ main_testr�Ú clear_formatrmÚtemplater’Ústmtr8s r6Ú visit_AssertzAssertionRewriter.visit_AssertIs €õ �g”l¥C¤IÑ .Ô .ð µ3°w´|Ô7HÑ3IÔ3IÈQÒ3NÐ3NØ HÐ HÐ HÐ HÐ HÐ HØ ˆOˆOˆOðÔ#Ð/Ð/Ð/Ø × "Ò "Ø*Ð*ØKñôðØÔ)Ø”~ð #ñ ô ð ð+-ˆŒØ$&ˆŒÝ )¤Ñ 1Ô 1ˆÔà Ô *ð 2Ø/1ˆDÔ !à02ˆŒ Ø*,ˆŒØ × Ò Ñ"Ô"Ð"à%)§Z¢Z°´ Ñ%=Ô%=Ñ"ˆ �{å”;�sœw™yœy¨-Ñ8Ô8ˆà Ô *ñB Ø×)Ò)­&°Ñ*=Ô*=Ñ>Ô>ˆCðŒ{ð $Ø ŸKšKÐ(;¸W¼[ÑIÔI� Ø&��å" 2™JœJ� Ø#�Ý!œi­¨w©¬½¼¹¼ÀCÑHÔHˆOÝ”i  ­3¬7©9¬9°oÑFÔFˆGÝ”xÐ 0µ#´(±*´*Ñ=Ô=ˆHØ—+’+Ð3°WÑ=Ô=ˆCÝ”(˜8 c U¨BÑ/Ô/ˆCÝ”Y˜s DÑ)Ô)ˆFØ ˆOØ × "Ò " 4¤?Ñ 3Ô 3Ð 3Ø × "Ò " 6Ñ *Ô *Ð *ð—{’{Ð#8¸#Ñ>Ô>ˆHÝ'¨¬ Ñ4Ô4°W´^ÔDˆDÝ œXØ— ’ Ø*ݘ7œ>Ñ*Ô*ݘ4‘L”LØñ ôñôˆNõ!œVØ— ’ Ð;Ñ<Ô<Ø” >Ð"2Ñ2ØñôˆNð .Ð.ˆOõœ˜x¨¸/ÑJÔJˆIØ ŒO× "Ò " 9Ñ -Ô -Ð -ØÔ$ð 5ððØ<@ÔÔ >Ð >ØŒ{ð 6Ø ŸKšKÐ(;¸W¼[ÑIÔI� Ø*¨[Ñ8� � å" 2™JœJ� Ø'¨+Ñ5� Ý”y ­C¬G©I¬Iµv¸kÑ7JÔ7JÑKÔKˆHØ×)Ò)¨(Ñ3Ô3ˆCØ—+’+Ð3°SÑ9Ô9ˆCÝ”xÐ 0µ#´(±*´*Ñ=Ô=ˆHÝ”(˜8 c U¨BÑ/Ô/ˆCÝ”Y˜s DÑ)Ô)ˆFà �KŠK˜Ñ Ô Ð ð Œ>ð *ØPÐPÀÄÐPÑPÔPˆIÝ”J˜y­/¸$Ñ*?Ô*?Ñ@Ô@ˆEØ ŒO× "Ò " 5Ñ )Ô )Ð )à”Oð 1ð 1ˆDÝ% dÑ+Ô+ð 1ð 1�ÝÔ! $¨Ñ0Ô0Ð0Ð0ð 1àŒÐr:cóî—tj| d¦«gg¦«}|jj}tjt |¦«tj¦«g|g¦«}| d|¦«}tj tj ¦«||g¦«}tj ||  |¦«t |¦«¦«}||  |¦«fS©NÚlocalsr )rØržr£r=ÚidÚComparerqÚInr™ÚBoolOpÚOrÚIfExpršr¨)r5r;ÚlocsÚ target_idÚinlocsÚdoreprrÅr€s r6Úvisit_NamedExprz!AssertionRewriter.visit_NamedExpr¾sÁ€õŒx˜Ÿ š  XÑ.Ô.°°BÑ7Ô7ˆØ”K”Nˆ Ý”�V IÑ.Ô.µ´±´° ¸T¸FÑCÔCˆØ—’Ð7¸Ñ>Ô>ˆÝŒz�#œ&™(œ( V¨VÐ$4Ñ5Ô5ˆÝŒy˜˜tŸ|š|¨DÑ1Ô1µ6¸)Ñ3DÔ3DÑEÔEˆØ�T×+Ò+¨DÑ1Ô1Ð1Ð1r:cóê—tj| d¦«gg¦«}tjt |j¦«tj¦«g|g¦«}| d|¦«}tjtj ¦«||g¦«}tj ||  |¦«t |j¦«¦«}||  |¦«fSré) rØržr£rìrqrërír™rîrïrðršr¨)r5r;rñrórôrÅr€s r6Ú visit_NamezAssertionRewriter.visit_NameÊs¸€õŒx˜Ÿ š  XÑ.Ô.°°BÑ7Ô7ˆÝ”�V D¤G™_œ_­s¬v©x¬x¨j¸4¸&ÑAÔAˆØ—’Ð7¸Ñ>Ô>ˆÝŒz�#œ&™(œ( V¨VÐ$4Ñ5Ô5ˆÝŒy˜˜tŸ|š|¨DÑ1Ô1µ6¸$¼'±?´?ÑCÔCˆØ�T×+Ò+¨DÑ1Ô1Ð1Ð1r:Úboolopc ó6—| ¦«}| tjgtj¦«¦«¦«}tj|dtj¦«¦«}t t|jtj ¦«¦«}|j x}}|j }t|j ¦«dz } | ¦«t|j ¦«D�]'\} } | rØg} |j  tj| | g¦«¦«| |_ t| tj¦«r‡t| jt(¦«rm| jjjd„|j d| …D¦«vrC| ¦«}| j|j| jjj<|| jj_| ¦«| | ¦«\}}| tjtj|tj¦«¦«g|¦«¦«| t;|¦«¦«}tj||gg¦«}|j  tj|¦«¦«| | krc|} |r&tj tj!¦«| ¦«} g}|j  tj| |g¦«¦«|x|_ }�Œ)||_ ||_ | "d|tG|¦«¦«}| |¦«}tj|tj¦«¦«| $|¦«fS)Nrrþcó<—g|]}t|d¦«¯|j‘ŒS)rë)r rë)rjÚast_exprs r6rlz2AssertionRewriter.visit_BoolOp..és:€ðððà$Ý" 8¨TÑ2Ô2ðØ œ ðððr:r)%r�r—rØr r–r�rÀrGÚoprïr’rµrær±r«rzrrÑrìÚleftÚ namedExprr=rër^r}r“r”r•r¹rqržrorËrÌr™rÐr¨)r5røÚres_varÚ expl_listÚapprrmÚsaveÚ fail_saveÚlevelsrÚvÚ fail_innerÚcondÚ pytest_temprrÚ expl_formatÚcallÚinnerÚ expl_templates r6Ú visit_BoolOpzAssertionRewriter.visit_BoolOpÔs€Ø—-’-‘/”/ˆØ—K’K¥¤¨­S¬X©Z¬ZÑ 8Ô 8Ñ9Ô9ˆ ÝŒm˜I xµ´±´Ñ<Ô<ˆÝ•J˜vœy­#¬&Ñ1Ô1Ñ2Ô2ˆØ”oÐ%ˆˆtØ”Oˆ Ý�V”]Ñ#Ô# aÑ'ˆØ × Ò Ñ"Ô"Ð"å˜fœmÑ,Ô,ð" /ñ" /‰DˆAˆqØð 3Ø-/� à”×&Ò&¥s¤v¨d°JÀÑ'CÔ'CÑDÔDÐDØ",�”õ˜q¥#¤+Ñ.Ô.ð3å" 1¤6­9Ñ5Ô5ð3𜜠Ô(ððà(.¬ °b°q°bÔ(9ðñôððð#'§-¢-¡/¤/�KðœðÔ,Øœœ Ô(ñð(3�A”F”MÔ$Ø × $Ò $Ñ &Ô &Ð &ØŸ š  1™ œ ‰IˆC�Ø �KŠK�œ ¥C¤H¨Wµc´i±k´kÑ$BÔ$BÐ#CÀSÑIÔIÑ JÔ JÐ JØ×1Ò1µ&¸±,´,Ñ?Ô?ˆKÝ”8˜C + °Ñ3Ô3ˆDØ ŒO× "Ò "¥3¤8¨D¡>¤>Ñ 2Ô 2Ð 2Ø�6ŠzˆzØ!$�Øð8Ýœ;¥s¤w¡y¤y°$Ñ7Ô7�DØ(*�Ø”×&Ò&¥s¤v¨d°E¸2Ñ'>Ô'>Ñ?Ô?Ð?Ø).Ð.�” $ù؈ŒØ#ˆŒØŸ š Ð$4°iÅÈÁÄÑOÔOˆ Ø×&Ò& }Ñ5Ô5ˆÝŒx˜¥¤¡¤Ñ,Ô,¨d×.DÒ.DÀTÑ.JÔ.JÐJÐJr:ÚunarycóÔ—t|jj}| |j¦«\}}| t j|j|¦«¦«}|||fzfSrT)Ú UNARY_MAPrür_r}Úoperandr—rØrË)r5rÚpatternÚ operand_resÚ operand_explrs r6Ú visit_UnaryOpzAssertionRewriter.visit_UnaryOpsZ€Ý˜EœHÔ.Ô/ˆØ$(§J¢J¨u¬}Ñ$=Ô$=Ñ!ˆ �\Ø�kŠk�#œ+ e¤h° Ñ<Ô<Ñ=Ô=ˆØ�G˜|˜oÑ-Ð-Ð-r:Úbinopcó —t|jj}| |j¦«\}}| |j¦«\}}d|›d|›d|›d�}| tj||j|¦«¦«}||fS)Nrú r�) Ú BINOP_MAPrür_r}rýÚrightr—rØr²) r5rÚsymbolÚ left_exprÚ left_explÚ right_exprÚ right_explrrs r6Ú visit_BinOpzAssertionRewriter.visit_BinOp s�€Ý˜5œ8Ô-Ô.ˆØ#Ÿzšz¨%¬*Ñ5Ô5ш �9Ø!%§¢¨E¬KÑ!8Ô!8ш �JØ<˜)Ð<Ð< fÐ<Ð<¨zÐ<Ð<Ð<ˆ Ø�kŠk�#œ) I¨u¬x¸ÑDÔDÑEÔEˆØ�KÐÐr:r có.—| |j¦«\}}g}g}g}|jD]~}t|tj¦«r |j|jvr|j|j}| |¦«\}} | | ¦«| |¦«Œ|j D]Ú} t| j tj¦«r/| j j|jvr|j| j j| _ | | j ¦«\}} | t j | j |¦«¦«| j r!| | j dz| z¦«ŒÂ| d| z¦«ŒÛd  |d |¦«¦«} t j|||¦«} | | ¦«}| | |¦«¦«} | ›d| ›d| ›d�} || fS)Nú=r4z{}({})z, z {z = z })r}Úfuncr›rGrØr”rër^rÚkeywordsrpÚkeywordÚargÚformatrržr—r¨rš)r5r Únew_funcÚ func_explÚ arg_explsÚnew_argsÚ new_kwargsr&rrr%Únew_callÚres_explÚ outer_expls r6Ú visit_CallzAssertionRewriter.visit_Calls€Ø"Ÿjšj¨¬Ñ3Ô3ш�)؈ ؈؈ Ø”9ð !ð !ˆCݘ#�sœxÑ(Ô(ð 7¨S¬V°tÔ7OÐ-OÐ-OØÔ.¨s¬vÔ6�ØŸ š  3™œ‰IˆC�Ø × Ò ˜TÑ "Ô "Ð "Ø �OŠO˜CÑ Ô Ð Ð Ø”}ð .ð .ˆGå˜7œ=­#¬(Ñ3Ô3ð à”MÔ$¨Ô(@Ð@Ð@à $Ô 8Ø”MÔ$ô!�” 🠚  7¤=Ñ1Ô1‰IˆC�Ø × Ò �cœk¨'¬+°sÑ;Ô;Ñ <Ô <Ð <ØŒ{ð .Ø× Ò  ¤¨sÑ!2°TÑ!9Ñ:Ô:Ð:Ð:à× Ò  ¨¡Ñ-Ô-Ð-Ð-à�Š˜y¨$¯)ª)°IÑ*>Ô*>Ñ?Ô?ˆÝ”8˜H h° Ñ;Ô;ˆØ�kŠk˜(Ñ#Ô#ˆØ×)Ò)¨$¯,ª,°sÑ*;Ô*;Ñ<Ô<ˆØ Ð=Ð= hÐ=Ð=°4Ð=Ð=Ð=ˆ Ø�JˆÐr:Ústarredcó~—| |j¦«\}}tj||j¦«}|d|zfS)Nr0)r}rprØÚStarredÚctx)r5r1rrÚ new_starreds r6Ú visit_StarredzAssertionRewriter.visit_Starred6s;€à—J’J˜wœ}Ñ-Ô-‰ ˆˆTÝ”k # w¤{Ñ3Ô3ˆ ؘC $™JÐ&Ð&r:r cóš—t|jtj¦«s| |¦«S| |j¦«\}}| tj||j tj¦«¦«¦«}|  |  |¦«¦«}d}|||||j fz}||fS)Nz%s {%s = %s.%s }) rGr4rØr–r»r}rpr—r�r r¨rš)r5r rpÚ value_explrr.r{rs r6Úvisit_Attributez!AssertionRewriter.visit_Attribute<s®€Ý˜$œ(¥C¤HÑ-Ô-ð ,Ø×%Ò% dÑ+Ô+Ð +Ø ŸJšJ t¤zÑ2Ô2шˆzØ�kŠk�#œ-¨¨t¬y½#¼(¹*¼*ÑEÔEÑFÔFˆØ×)Ò)¨$¯,ª,°sÑ*;Ô*;Ñ<Ô<ˆØ"ˆØ�h ¨*°d´iÐ@Ñ@ˆØ�DˆyÐr:Úcompc ó‡—‰ ¦«t|jtj¦«r/|jj‰jvr‰j|jj|_t|jt¦«r|j‰j|jjj<‰  |j¦«\}}t|jtj tj f¦«rd|›d�}ˆfd„tt|j¦«¦«D¦«}d„|D¦«}d„|D¦«}ttt|j¦«¦«|j|j¦«}g}g} |g} |D�]�\} } } t| t¦«r\t|tj¦«rB| jj|jkr-‰ ¦«| j_| ‰j|j<‰  | ¦«\}}t| tj tj f¦«rd|›d�}|  |¦«t&| j}|  t+|¦«¦«|›d|›d|›�}| t+|¦«¦«tj || g|g¦«}‰j tj|| g|¦«¦«||}}�Œƒ‰ dtj| tj¦«¦«tj|tj¦«¦«tj|tj¦«¦«tj| tj¦«¦«¦«}t|j¦«dkr'tj tj¦«|¦«}n|d }|‰ ‰ |¦«¦«fS) Nrr�có8•—g|]}‰ ¦«‘ŒSrU)r�)rjrr5s €r6rlz3AssertionRewriter.visit_Compare..Ts!ø€ÐGÐGÐG¨Q˜Ÿš™œÐGÐGÐGr:cóZ—g|](}tj|tj¦«¦«‘Œ)SrU)rØr”r–©rjrs r6rlz3AssertionRewriter.visit_Compare..Us*€ÐEÐEÐE°!•c”h˜q¥#¤(¡*¤*Ñ-Ô-ÐEÐEÐEr:cóZ—g|](}tj|tj¦«¦«‘Œ)SrUrÂr>s r6rlz3AssertionRewriter.visit_Compare..Vs*€ÐGÐGÐG°A•s”x ¥3¤9¡;¤;Ñ/Ô/ÐGÐGÐGr:rr"rþr)r«rGrýrØr”rër^rþr=r}rìrîrrærrÚ comparatorsr�rrr_rqr’r“r™rr–ÚAndr¨r¹)r5r:Úleft_resrÚ res_variablesÚ load_namesÚ store_namesÚitrÚsymsrrrüÚ next_operandÚnext_resÚ next_explÚsymrÚres_exprÚ expl_callrs` r6Ú visit_ComparezAssertionRewriter.visit_CompareFsŽø€Ø × Ò Ñ"Ô"Ð"å �d”i¥¤Ñ *Ô *ð ¨t¬y¬|¸tÔ?WÐ/WÐ/WØÔ0Ø” ” ôˆDŒIõ �d”i¥Ñ +Ô +ð ð” ð Ô $Ø” Ô Ô#ñ ð#Ÿjšj¨¬Ñ3Ô3ш�)Ý �d”i¥#¤+­s¬zÐ!:Ñ ;Ô ;ð )Ø(˜IÐ(Ð(Ð(ˆIØGÐGÐGÐGµ%½¸D¼H¹ ¼ Ñ2FÔ2FÐGÑGÔGˆ ØEÐE°}ÐEÑEÔEˆ ØGÐG¸ÐGÑGÔGˆ Ý ••s˜4œ8‘}”}Ñ%Ô% t¤x°Ô1AÑ BÔ BˆØˆØˆØ�*ˆØ#%ð 6ñ 6Ñ ˆAˆr�<å˜<­Ñ3Ô3ð !å˜x­¬Ñ2Ô2ð !ð!Ô'Ô*¨h¬kÒ9Ð9à)-¯ª©¬� Ô#Ô&ð!ðÔ(Ø”Kñð#'§*¢*¨\Ñ":Ô":Ñ ˆH�iݘ,­¬µc´jÐ(AÑBÔBð -Ø,  Ð,Ð,Ð,� Ø �NŠN˜8Ñ $Ô $Ð $ݘBœLÔ)ˆCØ �KŠK�˜s™ œ Ñ $Ô $Ð $ØÐ3Ð3 #Ð3Ð3¨ Ð3Ð3ˆDØ �LŠL� ™œÑ &Ô &Ð &Ý”{ 8¨b¨T°H°:Ñ>Ô>ˆHØ ŒO× "Ò "¥3¤:¨{¸1¬~Ð.>ÀÑ#IÔ#IÑ JÔ JÐ JØ"*¨I�iˆH‰Hà—K’KØ Ý ŒI�d�CœH™JœJÑ 'Ô 'Ý ŒI�j¥#¤(¡*¤*Ñ -Ô -Ý ŒI�e�SœX™ZœZÑ (Ô (Ý ŒI�g�sœx™zœzÑ *Ô *ñ  ô ˆ õ ˆtŒx‰=Œ=˜1Ò Ð ÝœJ¥s¤w¡y¤y°*Ñ=Ô=ˆCˆCà˜Q”-ˆCà�D×*Ò*¨4×+BÒ+BÀ9Ñ+MÔ+MÑNÔNÐNÐNr:rJ)2r[r²r³r�r rqrrµr7rØÚModulerñÚ staticmethodr¸rŒr�r€r”r—ršr™r�r£r¨r«r¹r~rr»r{r rærçrþrõr÷rîr rËrr²r ržr0r3r6r9rìrNÚ __classcell__)r_s@r6r‹r‹Wsöø€€€€€ð6ð6ðp 6Ø# Cœ=ð 6Ø2:¸6Ô2Bð 6ØLQð 6à ð 6ð 6ð 6ð 6ð 6ð 6ðU(�s”zðU( dðU(ðU(ðU(ðU(ðnð2 sð2¨tð2ð2ð2ñ„\ð2ð˜#ððððð*˜3œ8ð*¨¬ð*ð*ð*ð*ð .˜CœHð.¨¬ð.ð.ð.ð.ð.˜3ð. s¤xð.°C´Hð.ð.ð.ð.ð =˜Cð= C¤Mð=ð=ð=ð=ð ' c¤hð '°3ð 'ð 'ð 'ð 'ð 7ð 7ð 7ð 7ð*¨C¬Hð*¸¼ð*ð*ð*ð*ð(> #¤'ð>¨e°C´H¸c°MÔ.Bð>ð>ð>ð>ð s C¤Jðs°4¸¼´>ðsðsðsðsðj 2 Ið 2°%¸ À3¸Ô2Gð 2ð 2ð 2ð 2ð2˜sœxð2¨E°#´(¸C°-Ô,@ð2ð2ð2ð2ð1K 3¤:ð1K°%¸¼À#¸ Ô2Fð1Kð1Kð1Kð1Kðf. 3¤;ð.°5¸¼À3¸Ô3Gð.ð.ð.ð.ð   ¤ð ¨u°S´X¸s°]Ô/Cð ð ð ð ð˜sœxð¨E°#´(¸C°-Ô,@ðððððB' S¤[ð'°U¸3¼;ÈÐ;KÔ5Lð'ð'ð'ð'ð  C¤Mð°e¸C¼HÀc¸MÔ6Jððððð7O #¤+ð7O°%¸¼À#¸ Ô2Fð7Oð7Oð7Oð7Oð7Oð7Oð7Oð7Or:r‹rgcóÜ— tj|d¬¦«nS#tttf$rYdSt $rYdSt $r!}|jtjkrYd}~dS‚d}~wwxYwdS)z~Attempt to create the given directory and sub-directories exist. Returns True if successful or if it already exists. T)Úexist_okFN) rKÚmakedirsÚFileNotFoundErrorÚNotADirectoryErrorÚFileExistsErrorÚPermissionErrorrÎrÏÚEROFS)rgrÒs r6r_r_€s €ð Ý Œ �I¨Ð-Ñ-Ô-Ð-Ð-øÝ Õ1µ?Ð CððððˆuˆuÝ ððð؈uˆuÝ ðððà Œ7•e”kÒ !Ð !Ø�5�5�5�5�5Ø øøøøð øøøð ˆ4s%‚™A)³ A)¿ A)ÁA$Á#A$Á$A)Ú file_pathcó®—tjdkrr’sNðØ;Ð;Ø € € € Ø € € € ØÐÐÐØÐÐÐØÐÐÐØÐÐÐØ € € € ØÐÐÐØ€€€Ø € € € Ø € € € Ø € € € Ø€€€Ø € € € ØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØ Ð Ð Ð Ð Ð ØÐÐÐÐÐà6Ð6Ð6Ð6Ð6Ð6Ø)Ð)Ð)Ð)Ð)Ð)Ø$Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"ððððððð"Ð!Ð!Ð!Ð!Ð!Ø Ð Ð Ð Ð Ð Ø(Ð(Ð(Ð(Ð(Ð(Ø&Ð&Ð&Ð&Ð&Ð&Ø"Ð"Ð"Ð"Ð"Ð"àð1Ø0Ð0Ð0Ð0Ð0Ð0àÔ�vÒÐØ” €IØ”l€OØ Œ\€FØ Œ\€F€Fà”€IØÔ&€OØ ŒW€FØ ŒW€Fð-�(Ð+Ô,Ñ.Ô.€ðÔ"Ô,Ð ?Ð ?°gÐ ?Ð ?€ Ø  Ð+¨Ñ ,€Ø �Ñ ˜gÑ %€ðiðiðiðiði˜Yœ]Ô9¸9¼=Ô;OñiôiðiðX Ø ˆ5Œ ð Ø "¤ð Ø49´Nð à ð ð ð ð ð$Ø ðà Œðð”ðð ð ð  ð ðððð2�dð Fð¨u°R´^ÀUÄ^Ð5SÔ/Tððððð=K¸Nð.ð.Ø ð.Øð.Ø$,¨c¨U°D¨[Ô$9ð.à ˆeŒnÔð.ð.ð.ð.ðh"&Ø#ð <ð<Ø Œð<à ð<ð˜#”ð<ð �VÔ ð <ð  ð <ð<ð<ð<ð ?�6ð ?˜cð ?ð ?ð ?ð ?ð! h¨vÔ&6ð!¸8ÀC¼=ð!ð!ð!ð!ð˜6ð cððððð, &ð¨Tððððð* ¨#¤ð*°tð*Àð*ð*ð*ð*ð Ø �#Œðà �dŒ^ðð �CŒ=ðð�vÔð ð  ð ðððð(1 ð1¨Cð1°sð1¸tð1ð1ð1ð1ð 3 tð3ð3ð3ð3ð ŒW�h ¤ ¨E°3´8¸UÀCÄHÈeÐ T€ ð Ø„Iˆsð à„J�ð ð„J�ð ð„J�ð  ð „J�ð  ð „GˆSð  ð„GˆSð ð„Hˆcð ð„GˆSð ð„L�$ð ð„GˆTð ð„FˆDð ð„Iˆtð ð„FˆCð ð„GˆTð ð „FˆCð! ð"„GˆTð# ð$„GˆTØ„FˆDØ„IˆxØ„FˆDØ„IˆxØ„K�ð/ ð € ð6(˜œð( H¨S¬WÔ$5ð(ð(ð(ð(ð€Ô˜QÐÑÔð3˜eð3¨¨S°#¨X¬ð3ð3ð3ñ Ôð3ðlfOðfOðfOðfOðfO˜œñfOôfOðfOðR˜Dð Tððððð, 0˜Tð 0 dð 0ð 0ð 0ð 0ð 0ð 0r: