ó
    Eñiµó  ã                  ó¤  • S r SSKJr  SSKrSSKJr  SSKJr  SSKJr  SSKJr  SSK	r	SSK
J
r
  SSKrSSKrSS	KJr  SSKrSSKrSS
KJr  SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSKJ!r!  SSK"J#r#  SSK$J%r%  SSK$J&r&  SSK'J(r(  SSK)J*r*  SSK+J,r,  SSK-J.r.  SSK-J/r/  SSK0J1r1  SSK0J2r2  SSK0J3r3  SSK0J4r4  SSK0J5r5  SS K0J6r6  SS!K7J8r8  SS"K9J:r:  SS#K;J<r<  SS$K;J=r=  SS%K>J?r?  SS&K@JArA  SS'KBJCrC  SS(KBJDrD  SS)KEJFrF  SS*KEJGrG  SS+KEJHrH  SS,KIJJrJ  SS-KIJKrK  SS.KLJMrM  SS/KLJNrN  SS0KOJPrP  SS1KQJRrR  \!(       a  SSKSrSS2/rTS3/rUSTS4 jrVSUS5 jrW " S6 S75      rX\<SVS9 j5       r' " S: S85      rYSWS; jrZ\ " S< S=5      5       r[\ " S> S?5      5       r\\<SXSA j5       r]\<" SBSC9SYSD j5       r^\<        SZSF j5       r_\<S[SG j5       r`\<S\SH j5       ra\RÄ                  " SI5      rc\RÄ                  " SJ5      rd\ " SK SL5      5       re " SM SN5      rf " SO SP5      rg\ " SQ SE5      5       rh " SR S@5      ri " SS SB5      rjg)]zZ(Disabled by default) support for testing pytest and pytest plugins.

PYTEST_DONT_REWRITE
é    )ÚannotationsN)ÚCallable)Ú	Generator)ÚIterable)ÚSequence)Úfnmatch)ÚStringIO)ÚPath)ÚAny)ÚFinal)Úfinal)ÚIO)ÚLiteral)Úoverload)ÚTextIO)ÚTYPE_CHECKING)ÚWeakKeyDictionary)Ú	IniConfig)ÚSectionWrapper)Útiming)ÚSource)Ú_get_multicapture)ÚNOTSET)Ú
NotSetType)Ú_PluggyPlugin)ÚConfig)ÚExitCode)Úhookimpl)Úmain)ÚPytestPluginManager)ÚParser)Úcheck_ispytest)Úfixture)ÚFixtureRequest)ÚSession)ÚMonkeyPatch)Ú	Collector)ÚItem)Úfail)Úimportorskip)Úskip)Úbestrelpath)Úmake_numbered_dir)ÚCollectReport)Ú
TestReport)ÚTempPathFactory)ÚPytestFDWarningÚpytester_assertionsz/var/lib/sss/mc/passwdc                óp   • U R                  SSSSSS9  U R                  SSS	S
SS9  U R                  SSS9  g )Nz--lsofÚ
store_trueÚlsofFz"Run FD checks if lsof is available)ÚactionÚdestÚdefaultÚhelpú--runpytestÚ	inprocessÚ	runpytest)r;   Ú
subprocesszYRun pytest sub runs in tests using an 'inprocess' or 'subprocess' (python -m main) method)r8   r7   Úchoicesr9   Úpytester_example_dirz1Directory to take the pytester example files from)r9   )Ú	addoptionÚaddini)Úparsers    ÚM/home/mande/repo/quber/.venv/lib/python3.13/site-packages/_pytest/pytester.pyÚpytest_addoptionrD   S   sc   € Ø
×ÑØØØØØ1ð ñ ð ×ÑØØØØ+ð6ð ñ 	ð ‡M�MØÐ%Xð ò ó    c                óÈ   • U R                  S5      (       a:  [        5       nUR                  5       (       a  U R                  R	                  U5        U R                  SS5        g )Nr5   Úmarkerszlpytester_example_path(*path_segments): join the given path segments to `pytester_example_dir` for this test.)ÚgetvalueÚLsofFdLeakCheckerÚmatching_platformÚpluginmanagerÚregisterÚaddinivalue_line)ÚconfigÚcheckers     rC   Úpytest_configurerP   l   sR   € Ø‡��v×ÑÜ#Ó%ˆØ×$Ñ$×&Ñ&Ø× Ñ ×)Ñ)¨'Ô2à
×ÑØð	<õrE   c                  óF   • \ rS rSrS	S jrS
S jr\" SSS9SS j5       rSrg)rI   éy   c           	     óN  • [         R                  S:¼  a  [        R                  " 5       nO[        R                  " S5      n[
        R                  " SSS[        [        R                  " 5       5      4[
        R                  [
        R                  SSUS9R                  nSS jn/ nUR                  S	5       Hi  nU" U5      (       d  M  UR                  S
5      nUS   SS  nUS   SS  nU[        ;   a  M?  UR                  S5      (       d  MW  UR!                  Xx45        Mk     U$ )N)é   é   Fr5   z-Ffn0ú-pT)ÚstdoutÚstderrÚcheckÚtextÚencodingc                ó„   • U R                  S5      =(       a)    SU ;  =(       a    SU ;  =(       a    SU ;  =(       a    SU ;  $ )NÚfÚdeletedÚmemÚtxtÚcwd©Ú
startswith)Úlines    rC   ÚisopenÚ0LsofFdLeakChecker.get_open_files.<locals>.isopen‰   sI   € Ø—?‘? 3Ó'÷ Ø Ñ%÷ &Ø Ñ%÷&à Ñ%÷&ð  Ñ%ð	rE   Ú
Ú r   é   Ú/)rd   ÚstrÚreturnÚbool)ÚsysÚversion_infoÚlocaleÚgetencodingÚgetpreferredencodingr=   Úrunrk   ÚosÚgetpidÚPIPEÚDEVNULLrW   ÚsplitÚ
IGNORE_PAMrc   Úappend)	Úselfr[   Úoutre   Ú
open_filesrd   ÚfieldsÚfdÚfilenames	            rC   Úget_open_filesÚ LsofFdLeakChecker.get_open_filesz   sý   € Ü×Ñ˜wÓ&ä×)Ò)Ó+‰Hä×2Ò2°5Ó9ˆHÜ�nŠnØ�W˜d¤C¬¯	ª	«Ó$4Ð5Ü—?‘?Ü×%Ñ%ØØØñ
÷ ‰&ð 	ô	ð ˆ
à—I‘I˜d–OˆDÙ�d�|‹|ØŸ™ DÓ)�Ø˜A‘Y˜q˜r�]�Ø! !™9 Q R˜=�ØœzÓ)ÙØ×&Ñ& s×+Ó+Ø×%Ñ% r nÖ5ñ $ð ÐrE   c                óp   •  [         R                  " SSS9  g! [        [         R                  4 a     gf = f)N)r5   z-vT)rY   F)r=   rs   ÚOSErrorÚCalledProcessError©r{   s    rC   rJ   Ú#LsofFdLeakChecker.matching_platformŸ   s9   € ð	Ü�NŠN˜>°Ò6ð øô œ×6Ñ6Ð7ó 	Ùð	ús   ‚ ˜5´5T)ÚwrapperÚtryfirstc           	   #  ó¬  #   • U R                  5       n S v •[        [        S5      (       a  [        R                  " 5         U R                  5       nU Vs1 s H  oDS   iM	     snU Vs1 s H  oDS   iM	     sn-
  nU Vs/ s H  oDS   U;   d  M  UPM     nnU(       aƒ  S[        U5       S3/S U 5       QSPS U 5       QSPS	 U 5       QS[        U5       S3PS
R                  " UR                  6 PSPnUR                  [        SR                  U5      5      5        $ $ s  snf s  snf s  snf ! [        [        S5      (       a  [        R                  " 5         U R                  5       nU Vs1 s H  oDS   iM	     Os  snf snU Vs1 s H  oDS   iM	     Os  snf sn-
  nU Vs/ s H  oDS   U;   d  M  UPM     Os  snf nnU(       aƒ  S[        U5       S3/S U 5       QSPS U 5       QSPS	 U 5       QS[        U5       S3PS
R                  " UR                  6 PSPnUR                  [        SR                  U5      5      5        f f = f7f)NÚpypy_version_infor   z***** z FD leakage detectedc              3  ó8   #   • U  H  n[        U5      v •  M     g 7f©N©rk   ©Ú.0r]   s     rC   Ú	<genexpr>Ú<LsofFdLeakChecker.pytest_runtest_protocol.<locals>.<genexpr>¶   s   é € Ð3¢l ”c˜!—f�f¢lùó   ‚z*** Before:c              3  ó8   #   • U  H  n[        U5      v •  M     g 7fr�   rŽ   r�   s     rC   r‘   r’   ¸   ó   é € Ð-¢f ”c˜!—f�f¢fùr“   z
*** After:c              3  ó8   #   • U  H  n[        U5      v •  M     g 7fr�   rŽ   r�   s     rC   r‘   r’   º   r•   r“   z*** function {}:{}: {} zSee issue #2366rg   )r�   Úhasattrrn   ÚgcÚcollectÚlenÚformatÚlocationÚwarnr1   Újoin)r{   ÚitemÚlines1Úlines2ÚtÚnew_fdsÚleaked_filesÚerrors           rC   Úpytest_runtest_protocolÚ)LsofFdLeakChecker.pytest_runtest_protocol§   sz  é € à×$Ñ$Ó&ˆð	=Úä”sÐ/×0Ñ0Ü—
’
”Ø×(Ñ(Ó*ˆFá%+Ó,¢V ˜”t¡VÑ,¹fÓ/Eºf¸°!´¹fÑ/EÑEˆGÙ'-ÓA¢v !°1±¸±ŸA¡vˆLÐAÞàœS Ó.Ð/Ð/CÐDð
á3¡lÓ3ð
ð "ð
ñ .¡fÓ-ð	
ð
 !ð
ñ .¡fÓ-ð
ð œS Ó.Ð/Ð/CÐDð
ð .×4Ò4°d·m±mÐDð
ð &ð
�ð —	‘	œ/¨$¯)©)°EÓ*:Ó;Õ<ð ùò -ùÒ/EùÚAøô ”sÐ/×0Ñ0Ü—
’
”Ø×(Ñ(Ó*ˆFá%+Ó,¢V ˜”t¢VùÔ,¹fÓ/Eºf¸°!´ºfùÔ/EÑEˆGÙ'-ÓA¢v !°1±¸±ŸA¢vùÒAˆLÐAÞàœS Ó.Ð/Ð/CÐDð
á3¡lÓ3ð
ð "ð
ñ .¡fÓ-ð	
ð
 !ð
ñ .¡fÓ-ð
ð œS Ó.Ð/Ð/CÐDð
ð .×4Ò4°d·m±mÐDð
ð &ð
�ð —	‘	œ/¨$¯)©)°EÓ*:Ó;Õ<ð üsq   ‚I”D2 —>IÁD#Á#IÁ)D(Á7	IÂ D-ÂD-ÂBIÄ2?IÅ1F Å?IÆF
ÆIÆ(F?Æ8F?Æ>BIÉI© N)rl   zlist[tuple[str, str]])rl   rm   )rŸ   r(   rl   zGenerator[None, object, object])	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r�   rJ   r   r¦   Ú__static_attributes__r¨   rE   rC   rI   rI   y   s(   † ô#ôJñ �d TÑ*ó=ó +ó=rE   rI   Ú	PytestArgc                ó   • [        U 5      $ )z”Return a helper which offers a gethookrecorder(hook) method which
returns a HookRecorder instance which helps to make assertions about called
hooks.)r®   ©Úrequests    rC   Ú_pytestr²   Å   s   € ô
 �WÓÐrE   c                  ó(   • \ rS rSrSS jrSS jrSrg)r®   éÍ   c                ó   • Xl         g r�   ©Ú_request)r{   r±   s     rC   Ú__init__ÚPytestArg.__init__Î   s   € Ø�rE   c                óz   • [        UR                  5      nU R                  R                  UR                  5        U$ r�   )ÚHookRecorderÚ_pmr·   ÚaddfinalizerÚfinish_recording)r{   ÚhookÚhookrecorders      rC   ÚgethookrecorderÚPytestArg.gethookrecorderÑ   s.   € Ü# D§H¡HÓ-ˆØ�‰×"Ñ" <×#@Ñ#@ÔAØÐrE   r¶   N)r±   r$   rl   ÚNone)rl   r»   )r©   rª   r«   r¬   r¸   rÁ   r­   r¨   rE   rC   r®   r®   Í   s   † ô ÷rE   c                óF   • U  Vs/ s H  oS   S:w  d  M  UPM     sn$ s  snf )zDOnly return names from iterator values without a leading underscore.r   Ú_r¨   )ÚvaluesÚxs     rC   Úget_public_namesrÈ   ×   s"   € áÓ-’v�! 1¡¨¡�A‘vÑ-Ð-ùÒ-s   …•c                  óJ   • \ rS rSrSrSS jrS	S jr\(       a  S
S jrSr	gSr	g)ÚRecordedHookCalléÜ   a  A recorded call to a hook.

The arguments to the hook call are set as attributes.
For example:

.. code-block:: python

    calls = hook_recorder.getcalls("pytest_runtest_setup")
    # Suppose pytest_runtest_setup was called once with `item=an_item`.
    assert calls[0].item is an_item
c                óF   • U R                   R                  U5        Xl        g r�   )Ú__dict__ÚupdateÚ_name)r{   ÚnameÚkwargss      rC   r¸   ÚRecordedHookCall.__init__ê   s   € Ø�‰×Ñ˜VÔ$Ø�
rE   c                óf   • U R                   R                  5       nUS	 SU R                  < SU< S3$ )NrÏ   z<RecordedHookCall z(**z)>)rÍ   ÚcopyrÏ   )r{   Úds     rC   Ú__repr__ÚRecordedHookCall.__repr__î   s4   € Ø�M‰M×ÑÓ ˆØˆgˆJØ# D§J¡J¡>°°Q±E¸Ð<Ð<rE   c                ó   • g r�   r¨   )r{   Úkeys     rC   Ú__getattr__ÚRecordedHookCall.__getattr__õ   s   € ¨rE   )rÏ   N)rÐ   rk   rl   rÃ   ©rl   rk   )rÙ   rk   )
r©   rª   r«   r¬   Ú__doc__r¸   rÖ   r   rÚ   r­   r¨   rE   rC   rÊ   rÊ   Ü   s   † ñ
ôô=ö
 ç,ò rE   rÊ   c                  óž  • \ rS rSrSrSS.     SS jjrSS jrSS jrSS jrSS	 jr	SS
 jr
\    S S j5       r\    S!S j5       r\ S"   S#S jj5       r S"   S#S jjr   S$       S%S jjr\    S S j5       r\    S!S j5       r\ S"   S#S jj5       r S"   S#S jjrS&S jr  S'S jrS(S jrS)S*S jjrSS jrSrg)+r»   éø   zÎRecord all hooks called in a plugin manager.

Hook recorders are created by :class:`Pytester`.

This wraps all the hook calls in the plugin manager, recording each call
before propagating the normal calls.
F©Ú	_ispytestc               óŒ   ^ • [        U5        UT l        / T l        S T l        SU 4S jjnSS jnUR	                  X45      T l        g )Nc                óN   >• TR                   R                  [        X5      5        g r�   )Úcallsrz   rÊ   )Ú	hook_nameÚ
hook_implsrÑ   r{   s      €rC   ÚbeforeÚ%HookRecorder.__init__.<locals>.before  s   ø€ Ø�J‰J×ÑÔ.¨yÓAÕBrE   c                ó   • g r�   r¨   )Úoutcomerå   ræ   rÑ   s       rC   ÚafterÚ$HookRecorder.__init__.<locals>.after  s   € ØrE   )rå   rk   rl   rÃ   )r"   Ú_pluginmanagerrä   ÚretÚadd_hookcall_monitoringÚ_undo_wrapping)r{   rK   rá   rç   rë   s   `    rC   r¸   ÚHookRecorder.__init__  sC   ø€ ô 	�yÔ!à+ˆÔØ-/ˆŒ
Ø*.ˆŒ÷	Cô	ð ,×CÑCÀFÓRˆÕrE   c                ó$   • U R                  5         g r�   )rð   r†   s    rC   r¾   ÚHookRecorder.finish_recording  s   € Ø×ÑÕrE   c                ó²   • [        U[        5      (       a  UR                  5       nU R                   Vs/ s H  o"R                  U;   d  M  UPM     sn$ s  snf )z?Get all recorded calls to hooks with the given names (or name).)Ú
isinstancerk   rx   rä   rÏ   )r{   ÚnamesÚcalls      rC   ÚgetcallsÚHookRecorder.getcalls  s?   € ä�eœS×!Ñ!Ø—K‘K“MˆEØ!%§¢ÓC¢˜¯z©z¸UÑ/B—¡ÑCÐCùÒCs   ´AÁAc                ó"  • SnSn[        U5      n[        [        R                  " S5      R                  5      nU(       aÐ  UR                  S5      u  pV[        U R                  US  5       H„  u  pxUR                  U:X  aa  [        SXX5        [        XdUR                  5      (       a  [        S[        U5      SU5        O[        S[        U5      SU5        Mm  X7S-   -  n  O%[        S	US
U5        M†     [        SU< SU< 35        U(       a  MÏ  g g )NTr   ri   Ú	NAMEMATCHÚCHECKERMATCHz->ÚNOCHECKERMATCHÚ-ÚNONAMEMATCHÚwithzcould not find z check )ÚlistÚdictrn   Ú	_getframeÚf_localsÚpopÚ	enumeraterä   rÏ   ÚprintÚevalrÍ   Úreprr)   )	r{   ÚentriesÚ__tracebackhide__ÚiÚ
backlocalsrÐ   rY   Úindr÷   s	            rC   Úassert_containsÚHookRecorder.assert_contains  så   € Ø ÐØˆÜ�w“-ˆäœ#Ÿ-š-¨Ó*×3Ñ3Ó4ˆ
ÞØ!Ÿ+™+ a›.‰KˆDÜ& t§z¡z°!°" ~Ö6‘	�Ø—:‘: Ó%Ü˜+ tÔ2Ü˜E¨t¯}©}×=Ñ=Ü˜n¬d°5«k¸4ÀÕFäÐ.´°U³¸SÀ$ÔGÙ Ø˜q™‘L�AÙÜ�m T¨6°4Ö8ñ 7ô � t¡h¨g°e±YÐ?Ô@÷ ŠgrE   c                ó2  • Sn[        U R                  5       H&  u  p4UR                  U:X  d  M  U R                  U	 Us  $    SU< S3/nUR                  U R                   Vs/ s H  nSU 3PM
     sn5        [	        SR                  U5      5        g s  snf )NTzcould not find call z, in:z  rg   )r  rä   rÏ   Úextendr)   rž   )r{   rÐ   r  r  r÷   ÚlinesrÇ   s          rC   ÚpopcallÚHookRecorder.popcall2  s‡   € Ø ÐÜ  §¡Ö,‰GˆAØ�z‰z˜TÕ!Ø—J‘J˜q�MØ’ñ -ð (¨¡x¨uÐ5Ð6ˆØ�‰¨¯
ª
Ó3ª
 1˜˜1˜#“h©
Ñ3Ô4ÜˆT�Y‰Y�uÓÕùò 4s   Á#Bc                ó\   • U R                  U5      n[        U5      S:X  d   X45       eUS   $ )Nri   r   )rø   rš   )r{   rÐ   rÆ   s      rC   ÚgetcallÚHookRecorder.getcall<  s3   € Ø—‘˜tÓ$ˆÜ�6‹{˜aÓÐ/ $ Ó/ÐØ�a‰yÐrE   c                ó   • g r�   r¨   ©r{   rö   s     rC   Ú
getreportsÚHookRecorder.getreportsC  ó   € ð #&rE   c                ó   • g r�   r¨   r  s     rC   r  r  I  ó   € ð  #rE   c                ó   • g r�   r¨   r  s     rC   r  r  O  ó   € ð 03rE   c                ób   • U R                  U5       Vs/ s H  o"R                  PM     sn$ s  snf r�   )rø   Úreport)r{   rö   rÇ   s      rC   r  r  X  s)   € ð #'§-¡-°Ô"6Ó7Ò"6˜Q—”Ñ"6Ñ7Ð7ùÒ7s   ”,Nc                ó¢  • / nU R                  US9 H~  nU(       d#  UR                  S:w  a  UR                  (       a  M-  U(       a  UR                  U:w  a  MF  U(       a   XR                  R	                  S5      ;   d  Mm  UR                  U5        M€     U(       d  [        SU< S35      e[        U5      S:”  a  [        SU< SU 35      eUS	   $ )
z5Return a testreport whose dotted import path matches.)rö   r÷   ú::z$could not find test report matching z: no test reports at all!ri   z%found 2 or more testreports matching ú: r   )r  ÚwhenÚpassedÚnodeidrx   rz   Ú
ValueErrorrš   )r{   Ú	inamepartrö   r'  rÆ   Úreps         rC   ÚmatchreportÚHookRecorder.matchreporta  sÃ   € ð ˆØ—?‘?¨�?Ó/ˆCÞ˜CŸH™H¨Ó.°3·:·:áÞ˜Ÿ™ DÓ(ÙÞ 	¯Z©Z×-=Ñ-=¸dÓ-CÕ CØ—‘˜cÖ"ñ 0ö ÜØ6°y±mð D*ð *óð ô ˆv‹;˜‹?ÜØ7¸	±}ÀBÀvÀhÐOóð ð �a‰yÐrE   c                ó   • g r�   r¨   r  s     rC   ÚgetfailuresÚHookRecorder.getfailures  r  rE   c                ó   • g r�   r¨   r  s     rC   r0  r1  …  r  rE   c                ó   • g r�   r¨   r  s     rC   r0  r1  ‹  r!  rE   c                ót   • U R                  U5       Vs/ s H  o"R                  (       d  M  UPM     sn$ s  snf r�   )r  Úfailed)r{   rö   r,  s      rC   r0  r1  ”  s+   € ð  $Ÿ™¨uÔ5ÓDÒ5˜¿½—Ñ5ÑDÐDùÒDs   ”5¬5c                ó$   • U R                  S5      $ )NÚpytest_collectreport)r0  r†   s    rC   ÚgetfailedcollectionsÚ!HookRecorder.getfailedcollections�  s   € Ø×ÑÐ 6Ó7Ð7rE   c                ó‚  • / n/ n/ nU R                  S5       H¡  nUR                  (       a<  UR                  S:X  a*  [        U[        5      (       d   eUR                  U5        MN  MP  UR                  (       a  UR                  U5        Mt  UR                  (       d   SU< 35       eUR                  U5        M£     XU4$ )N©r7  Úpytest_runtest_logreportr÷   zUnexpected outcome: )r  r(  r'  rõ   r/   rz   Úskippedr5  )r{   r(  r=  r5  r,  s        rC   ÚlistoutcomesÚHookRecorder.listoutcomes   s©   € ð ˆØˆØˆØ—?‘?Ø@ö
ˆCð �z�zØ—8‘8˜vÓ%Ü% c¬:×6Ñ6Ð6Ð6Ø—M‘M #Ö&ñ &ð ——Ø—‘˜sÖ#à—z—zÐAÐ%9¸#¹Ð#AÓA�zØ—‘˜cÖ"ñ
ð  Ð&Ð&rE   c                ó`   • U R                  5        Vs/ s H  n[        U5      PM     sn$ s  snf r�   )r>  rš   )r{   rÇ   s     rC   ÚcountoutcomesÚHookRecorder.countoutcomes¸  s)   € Ø $× 1Ñ 1Ô 3Ó4Ò 3˜1”�A–Ñ 3Ñ4Ð4ùÒ4s   “+c                óF   • SnSSK Jn  U R                  5       nU" UUUUS9  g )NTr   )Úassertoutcome)r(  r=  r5  )Ú_pytest.pytester_assertionsrD  r>  )r{   r(  r=  r5  r  rD  Úoutcomess          rC   rD  ÚHookRecorder.assertoutcome»  s-   € Ø ÐÝ=à×$Ñ$Ó&ˆÙØØØØó		
rE   c                ó"   • / U R                   S S & g r�   )rä   r†   s    rC   ÚclearÚHookRecorder.clearÇ  s   € Øˆ�
‰
‘1‰rE   )rí   rð   rä   rî   )rK   r    rá   rm   rl   rÃ   ©rl   rÃ   )rö   ústr | Iterable[str]rl   zlist[RecordedHookCall])r
  zSequence[tuple[str, str]]rl   rÃ   )rÐ   rk   rl   rÊ   )rö   zLiteral['pytest_collectreport']rl   úSequence[CollectReport])rö   z#Literal['pytest_runtest_logreport']rl   zSequence[TestReport])r;  )rö   rL  rl   z$Sequence[CollectReport | TestReport])Ú )r<  r7  N)r+  rk   rö   rL  r'  ú
str | Nonerl   zCollectReport | TestReport)rl   rM  )rl   zgtuple[Sequence[TestReport], Sequence[CollectReport | TestReport], Sequence[CollectReport | TestReport]])rl   z	list[int])r   r   r   )r(  Úintr=  rP  r5  rP  rl   rÃ   )r©   rª   r«   r¬   rÝ   r¸   r¾   rø   r  r  r  r   r  r-  r0  r8  r>  rA  rD  rI  r­   r¨   rE   rC   r»   r»   ø   sÐ  † ñð HMñSØ0ðSØ@DðSà	õSô"ôDôAô,ôð ð&à.ð&ð 
!ó&ó ð&ð
 ð#à2ð#ð 
ó#ó ð#ð
 ð&
ð3à"ð3ð 
.ô3ó ð3ð&
ð8à"ð8ð 
.õ8ð ð&
ð  ðàðð #ðð ðð 
$õð< ð&à.ð&ð 
!ó&ó ð&ð
 ð#à2ð#ð 
ó#ó ð#ð
 ð&
ð3à"ð3ð 
.ô3ó ð3ð&
ðEà"ðEð 
.õEô8ð'ð
ô'ô05ö

÷rE   r»   ÚLineCompc                 ó   • [        5       $ )zaA :class: `LineComp` instance for checking that an input linearly
contains a sequence of strings.)rQ  r¨   rE   rC   ÚlinecomprS  Ë  s   € ô ‹:ÐrE   ÚLineMatcher©rÐ   c                ó   • [         $ )zÀA reference to the :class: `LineMatcher`.

This is instantiable with a list of lines (without their trailing newlines).
This is useful for testing large texts, such as the output of commands.
)rT  r°   s    rC   ÚLineMatcher_fixturerW  Ò  s
   € ô ÐrE   ÚPytesterc                ó   • [        XUSS9$ )að  
Facilities to write tests/configuration files, execute pytest in isolation, and match
against expected output, perfect for black-box testing of pytest plugins.

It attempts to isolate the test run from external factors as much as possible, modifying
the current working directory to ``path`` and environment variables during initialization.

It is particularly useful for testing plugins. It is similar to the :fixture:`tmp_path`
fixture but provides methods which aid in testing pytest itself.
Trà   )rX  )r±   Útmp_path_factoryÚmonkeypatchs      rC   Úpytesterr\  Ü  s   € ô �G¨{ÀdÑKÐKrE   c               #  ó|   #   • [        5       n [        5       nS v •  UR                  5         U R                  5         g 7fr�   )ÚSysPathsSnapshotÚSysModulesSnapshotÚrestore)Ú	snappathsÚsnapmodss     rC   Ú_sys_snapshotrc  í  s0   é € ä Ó"€IÜ!Ó#€HÛ	Ø×ÑÔØ×ÑÕùs   ‚:<c               #  óN   #   • SSK Jn   U " 5       nUv •  UR                  5         g 7f)Nr   )Ú
get_config)Ú_pytest.configre  Ú_ensure_unconfigure)re  rN   s     rC   Ú_config_for_testrh  ö  s    é € å)á‹\€FØ
‚LØ
×ÑÕ ùó   ‚#%z
\d+\.\d\dsz(\d+) (\w+)c                  óž   • \ rS rSrSr          S
S jrSS jrSS jr\SS j5       r	        S                 SS jjr
S	rg)Ú	RunResulti  z?The result of running a command from :class:`~pytest.Pytester`.c                óÀ   •  [        U5      U l         X l         X0l         [        U5      U l         [        U5      U l         X@l        g ! [         a	    Xl         NIf = fr�   )	r   rî   r*  ÚoutlinesÚerrlinesrT  rW   rX   Úduration)r{   rî   rm  rn  ro  s        rC   r¸   ÚRunResult.__init__	  sg   € ð	Ü'/°£}ˆDŒHØ#ð !ŒØ1Ø ŒØ1Ü! (Ó+ˆŒð	ô
 " (Ó+ˆŒØ5Ø ŒØ"øô ó 	ØŽHð	ús   ‚A
 Á
AÁAc           	     óÀ   • SU R                   < S[        U R                  R                  5       S[        U R                  R                  5       SU R
                  S S3	$ )Nz<RunResult ret=z len(stdout.lines)=z len(stderr.lines)=z
 duration=z.2fzs>)rî   rš   rW   r  rX   ro  r†   s    rC   rÖ   ÚRunResult.__repr__$  s^   € à˜dŸh™h™\ð *!Ü!$ T§[¡[×%6Ñ%6Ó!7Ð 8ð 9!Ü!$ T§[¡[×%6Ñ%6Ó!7Ð 8ð 9ØŸ™ cÐ*¨"ð.ð	
rE   c                ó8   • U R                  U R                  5      $ )a-  Return a dictionary of outcome noun -> count from parsing the terminal
output that the test process produced.

The returned nouns will always be in plural form::

    ======= 1 failed, 1 passed, 1 warning, 1 error in 0.13s ====

Will return ``{"failed": 1, "passed": 1, "warnings": 1, "errors": 1}``.
)Úparse_summary_nounsrm  r†   s    rC   ÚparseoutcomesÚRunResult.parseoutcomes,  s   € ð ×'Ñ'¨¯©Ó6Ð6rE   c           	     ój  • [        U5       HT  n[        R                  U5      (       d  M  [        R	                  U5      nU VVs0 s H  u  pEU[        U5      _M     nnn  O   [        S5      eSSS.nUR                  5        VV	s0 s H  u  p‰UR                  Xˆ5      U	_M     sn	n$ s  snnf s  sn	nf )z÷Extract the nouns from a pytest terminal summary line.

It always returns the plural noun for consistency::

    ======= 1 failed, 1 passed, 1 warning, 1 error in 0.13s ====

Will return ``{"failed": 1, "passed": 1, "warnings": 1, "errors": 1}``.
z(Pytest terminal summary report not foundÚwarningsÚerrors)Úwarningr¥   )	ÚreversedÚrex_session_durationÚsearchÚrex_outcomeÚfindallrP  r*  ÚitemsÚget)
Úclsr  rd   rF  ÚcountÚnounrî   Ú	to_pluralÚkÚvs
             rC   rt  ÚRunResult.parse_summary_nouns8  s«   € ô ˜U–OˆDÜ#×*Ñ*¨4×0Ó0Ü&×.Ñ.¨tÓ4�Ù=EÔFºX©M¨U�tœS ›ZÒ'¹X�ÑFÙñ	 $ô ÐGÓHÐHð "Øñ
ˆ	ð 47·9±9´;Ô?²;©4¨1�	—‘˜aÓ# QÒ&±;Ò?Ð?ùó Gùó @s   ÁB)ÂB/Nc	                óP   • Sn	SSK Jn
  U R                  5       nU
" UUUUUUUUUS9	  g)zÄ
Assert that the specified outcomes appear with the respective
numbers (0 means it didn't occur) in the text output from a test run.

``warnings`` and ``deselected`` are only checked if not None.
Tr   )Úassert_outcomes)r(  r=  r5  ry  ÚxpassedÚxfailedrx  Ú
deselectedN)rE  rŠ  ru  )r{   r(  r=  r5  ry  r‹  rŒ  rx  r�  r  rŠ  rF  s               rC   rŠ  ÚRunResult.assert_outcomesP  s>   € ð" !ÐÝ?à×%Ñ%Ó'ˆÙØØØØØØØØØ!ó
	
rE   )ro  rn  rm  rî   rX   rW   )
rî   zint | ExitCoderm  ú	list[str]rn  r�  ro  Úfloatrl   rÃ   rÜ   )rl   zdict[str, int])r   r   r   r   r   r   NN)r(  rP  r=  rP  r5  rP  ry  rP  r‹  rP  rŒ  rP  rx  ú
int | Noner�  r‘  rl   rÃ   )r©   rª   r«   r¬   rÝ   r¸   rÖ   ru  Úclassmethodrt  rŠ  r­   r¨   rE   rC   rk  rk    sÖ   † áIð#àð#ð ð#ð ð	#ð
 ð#ð 
ô#ô6
ô
7ð ó@ó ð@ð2 ØØØØØØ#Ø!%ð
àð
ð ð
ð ð	
ð
 ð
ð ð
ð ð
ð ð
ð ð
ð 
÷
ð 
rE   rk  c                  ó,   • \ rS rSrSSS jjrSS jrSrg)	r_  ir  Nc                óL   • Xl         [        [        R                  5      U l        g r�   )Ú_SysModulesSnapshot__preserver  rn   ÚmodulesÚ_SysModulesSnapshot__saved)r{   Úpreserves     rC   r¸   ÚSysModulesSnapshot.__init__s  s   € Ø"ŒÜœCŸK™KÓ(ˆ�rE   c                ó8  ^ • T R                   (       aA  T R                  R                  U 4S j[        R                  R                  5        5       5        [        R                  R                  5         [        R                  R                  T R                  5        g )Nc              3  ó^   >#   • U  H"  u  pTR                  U5      (       d  M  X4v •  M$     g 7fr�   )r•  )r�   r†  Úmr{   s      €rC   r‘   Ú-SysModulesSnapshot.restore.<locals>.<genexpr>y  s&   øé € ð  Ú#6™4˜1¸$¿/¹/È!×:L“�•Ò#6ùs   ƒ-£
-)r•  r—  rÎ   rn   r–  r€  rI  r†   s   `rC   r`  ÚSysModulesSnapshot.restorew  s^   ø€ Ø�?�?Ø�L‰L×Ñô  Ü#&§;¡;×#4Ñ#4Ô#6ó ô ô 	�‰×ÑÔÜ�‰×Ñ˜4Ÿ<™<Õ(rE   )Ú
__preserveÚ__savedr�   )r˜  zCallable[[str], bool] | Nonerl   rÃ   rK  ©r©   rª   r«   r¬   r¸   r`  r­   r¨   rE   rC   r_  r_  r  s   † ö)÷)rE   r_  c                  ó(   • \ rS rSrSS jrSS jrSrg)r^  i€  c                ór   • [        [        R                  5      [        [        R                  5      4U l        g r�   )r  rn   ÚpathÚ	meta_pathÚ_SysPathsSnapshot__savedr†   s    rC   r¸   ÚSysPathsSnapshot.__init__�  s   € ÜœCŸH™H“~¤t¬C¯M©MÓ':Ð:ˆ�rE   c                óf   • U R                   u  [        R                  S S & [        R                  S S & g r�   )r¦  rn   r¤  r¥  r†   s    rC   r`  ÚSysPathsSnapshot.restore„  s!   € Ø(,¯©Ñ%Œ�‰‘ˆ”S—]‘]¡1Ñ%rE   )r   NrK  r¡  r¨   rE   rC   r^  r^  €  s   † ô;÷5rE   r^  c                  ó  • \ rS rSr% SrSr\rS\S'    " S S\	5      r
SS.         S=S	 jjr\S>S
 j5       rS?S jrS@S jrSAS jrSBS jrS@S jr SC         SDS jjrSES jrSFS jrSFS jrSFS jrSGS jrSFS jrS>S jrS>S jrSHSIS jjrSJS jrSJS jrSHSKS jjrSLS jr SMS jr!SNS  jr"SOS! jr#SPS" jr$SQS# jr%S$SS%.     SRS& jjr&      SSS' jr'SSS( jr(    STS) jr)SUS* jr*SUS+ jr+ SV     SWS, jjr,SXS- jr- SYSS..   SZS/ jjjr.S[S0 jr/\0Rb                  \0Rb                  \4       S\S1 jjr2S\S2.       S]S3 jjr3S4 r4S^S5 jr5S_S6 jr6S`S7 jr7SS8.     SaS9 jjr8SbScS: jjr9SbSdS; jjr:S<r;g)erX  iˆ  aZ  
Facilities to write tests/configuration files, execute pytest in isolation, and match
against expected output, perfect for black-box testing of pytest plugins.

It attempts to isolate the test run from external factors as much as possible, modifying
the current working directory to :attr:`path` and environment variables during initialization.
Fr   ÚCLOSE_STDINc                  ó   • \ rS rSrSrg)ÚPytester.TimeoutExpiredi–  r¨   N©r©   rª   r«   r¬   r­   r¨   rE   rC   ÚTimeoutExpiredr­  –  s   † ÚrE   r¯  rà   c               ól  • [        U5        Xl        [        5       U l        UR                  (       a  UR                  R
                  nOUR                  R                  nXPl        UR                  USS9U l
        / U l        [        5       U l        U R                  5       U l        U R                  R!                  U R"                  5        U R                  R$                  R'                  S5      U l        UR                  SU 3SS9U l        U=U l        nU R/                  5         UR1                  S[3        U R*                  5      5        UR5                  SSS9  UR5                  S	SS9  [3        U R6                  5      nUR1                  S
U5        UR1                  SU5        UR1                  SS5        g )NT)Únumberedr:   ztmp-ÚPYTEST_DEBUG_TEMPROOTÚTOX_ENV_DIRF)ÚraisingÚPYTEST_ADDOPTSÚHOMEÚUSERPROFILEÚ	PY_COLORSÚ0)r"   r·   r   Ú_mod_collectionsÚfunctionr©   ÚnoderÐ   rÏ   ÚmktempÚ_pathÚpluginsr^  Ú_sys_path_snapshotÚ$_Pytester__take_sys_modules_snapshotÚ_sys_modules_snapshotr½   Ú	_finalizerN   Ú	getoptionÚ_methodÚ_test_tmprootÚ_monkeypatchÚchdirÚsetenvrk   Údelenvr¤  )r{   r±   rZ  r[  rá   rÐ   ÚmpÚtmphomes           rC   r¸   ÚPytester.__init__™  sc  € ô 	�yÔ!ØŒäÓð 	Ôð ××Ø×(Ñ(×1Ñ1‰Dà—<‘<×$Ñ$ˆDØŒ
Ø+×2Ñ2°4À$Ð2ÐGˆŒ
ð 35ˆŒÜ"2Ó"4ˆÔØ%)×%EÑ%EÓ%GˆÔ"Ø�‰×"Ñ" 4§>¡>Ô2Ø—}‘}×+Ñ+×5Ñ5°mÓDˆŒØ-×4Ñ4°t¸D¸6°]ÈTÐ4ÐRˆÔà!,Ð,ˆÔ˜BØ�
‰
ŒØ
�	‰	Ð)¬3¨t×/AÑ/AÓ+BÔCà
�	‰	�-¨ˆ	Ñ/à
�	‰	Ð"¨Eˆ	Ñ2ä�d—i‘i“.ˆØ
�	‰	�&˜'Ô"Ø
�	‰	�- Ô)à
�	‰	�+˜sÕ#rE   c                ó   • U R                   $ )zBTemporary directory path used to create files/run tests from, etc.)r¾  r†   s    rC   r¤  ÚPytester.pathÇ  s   € ð �z‰zÐrE   c                ó$   • SU R                   < S3$ )Nz
<Pytester Ú>)r¤  r†   s    rC   rÖ   ÚPytester.__repr__Ì  s   € Ø˜DŸI™I™=¨Ð*Ð*rE   c                ól   • U R                   R                  5         U R                  R                  5         g)zà
Clean up global state artifacts.

Some methods modify the global interpreter state and this tries to
clean this up. It does not remove the temporary directory however so
it can be looked at after the test run has finished.
N)rÂ  r`  rÀ  r†   s    rC   rÃ  ÚPytester._finalizeÏ  s(   € ð 	×"Ñ"×*Ñ*Ô,Ø×Ñ×'Ñ'Õ)rE   c                ó   • S n[        US9$ )Nc                ó$   • U R                  S5      $ )N)ÚzopeÚreadlinerb   rU  s    rC   Úpreserve_moduleÚ=Pytester.__take_sys_modules_snapshot.<locals>.preserve_moduleá  s   € Ø—?‘?Ð#7Ó8Ð8rE   )r˜  )r_  )r{   rÙ  s     rC   Ú__take_sys_modules_snapshotÚ$Pytester.__take_sys_modules_snapshotÚ  s   € ò	9ô "¨?Ñ;Ð;rE   c                ór   • [        USS9=Ul        nU R                  R                  UR                  5        U$ )zFCreate a new :class:`HookRecorder` for a :class:`PytestPluginManager`.Trà   )r»   Úreprecr·   r½   r¾   )r{   rK   rÞ  s      rC   Úmake_hook_recorderÚPytester.make_hook_recorderæ  s3   € ä(4°]ÈdÑ(SÐSˆÔ˜vØ�‰×"Ñ" 6×#:Ñ#:Ô;ØˆrE   c                óN   • U R                   R                  U R                  5        g)zQCd into the temporary directory.

This is done automatically upon instantiation.
N)rÇ  rÈ  r¤  r†   s    rC   rÈ  ÚPytester.chdirì  s   € ð
 	×Ñ×Ñ §	¡	Õ*rE   c                óœ  ^^• [        UR                  5       5      nUc  [        S5      eU(       a'  UR                  S5      (       d  [	        SU SU 35      eSU4S jjmU(       a:  SR                  U4S jU 5       5      nU R                  nUR                  SXv45        S nU Hž  u  pyU R                  R                  U5      R                  U5      n
U
R                  R                  S	S	S
9  [        U	5      nSR                  U4S jUR                   5       5      nU
R                  UR!                  5       TS9  Ub  Mœ  U
nM      Uc   eU$ )Nzext must not be NoneÚ.z1pytester.makefile expects a file extension, try .z instead of c                óf   >• [        U [        5      (       a  U R                  T5      $ [        U 5      $ r�   )rõ   ÚbytesÚdecoderk   )Úsr[   s    €rC   Úto_textÚ#Pytester._makefile.<locals>.to_text  s'   ø€ Ü)3°A´u×)=Ñ)=�1—8‘8˜HÓ%ÐIÄ3ÀqÃ6ÐIrE   rg   c              3  ó4   >#   • U  H  nT" U5      v •  M     g 7fr�   r¨   )r�   rÇ   ré  s     €rC   r‘   Ú%Pytester._makefile.<locals>.<genexpr>  s   øé € Ð9²5¨a™w qŸz˜z²5ùó   ƒr   T)ÚparentsÚexist_okc              3  ó4   >#   • U  H  nT" U5      v •  M     g 7fr�   r¨   )r�   rd   ré  s     €rC   r‘   rì    s   øé € ÐGº°™w tŸ}˜}ºùrí  ©r[   )rè  zAny | bytesrl   rk   )r  r€  Ú	TypeErrorrc   r*  rž   rÏ   Úinsertr¤  ÚjoinpathÚwith_suffixÚparentÚmkdirr   r  Ú
write_textÚstrip)r{   Úextr  Úfilesr[   r€  ÚsourceÚbasenamerî   ÚvalueÚpÚsource_ré  s       `       @rC   Ú	_makefileÚPytester._makefileó  s%  ù€ ô �U—[‘[“]Ó#ˆà‰;ÜÐ2Ó3Ð3æ�s—~‘~ c×*Ñ*ÜØCÀCÀ5ÈÐUXÐTYÐZóð ÷	Jö Ø—Y‘YÔ9±5Ó9Ó9ˆFØ—z‘zˆHØ�L‰L˜˜XÐ.Ô/àˆÛ$‰OˆHØ—	‘	×"Ñ" 8Ó,×8Ñ8¸Ó=ˆAØ�H‰H�N‰N 4°$ˆNÑ7Ü˜U“mˆGØ—Y‘YÔG¸¿ºÓGÓGˆFØ�L‰L˜Ÿ™›°(ˆLÑ;Ø‹{Ø’ñ  %ð ‰ÐˆØˆ
rE   c                ó&   • U R                  XU5      $ )a=  Create new text file(s) in the test directory.

:param ext:
    The extension the file(s) should use, including the dot, e.g. `.py`.
:param args:
    All args are treated as strings and joined using newlines.
    The result is written as contents to the file.  The name of the
    file is based on the test function requesting this fixture.
:param kwargs:
    Each keyword is the name of a file, while the value of it will
    be written as contents of the file.
:returns:
    The first created file.

Examples:

.. code-block:: python

    pytester.makefile(".txt", "line1", "line2")

    pytester.makefile(".ini", pytest="[pytest]\naddopts=-rs\n")

To create binary files, use :meth:`pathlib.Path.write_bytes` directly:

.. code-block:: python

    filename = pytester.path.joinpath("foo.bin")
    filename.write_bytes(b"...")
©r  )r{   rú  ÚargsrÑ   s       rC   ÚmakefileÚPytester.makefile  s   € ð< �~‰~˜c¨Ó0Ð0rE   c                ó    • U R                  US9$ )zXWrite a conftest.py file.

:param source: The contents.
:returns: The conftest.py file.
)Úconftest)Ú
makepyfile©r{   rü  s     rC   ÚmakeconftestÚPytester.makeconftest8  s   € ð �‰¨ˆÐ/Ð/rE   c                ó"   • U R                  SUS9$ )zPWrite a tox.ini file.

:param source: The contents.
:returns: The tox.ini file.
z.ini)Útox©r  r  s     rC   ÚmakeiniÚPytester.makeini@  s   € ð �}‰}˜V¨ˆ}Ð0Ð0rE   c                ó"   • U R                  SUS9$ )zoWrite a pytest.toml file.

:param source: The contents.
:returns: The pytest.toml file.

.. versionadded:: 9.0
ú.toml)Úpytestr  r  s     rC   ÚmaketomlÚPytester.maketomlH  s   € ð �}‰}˜W¨Vˆ}Ð4Ð4rE   c                óR   • U R                  U5      n[        [        U5      5      S   $ )z7Return the pytest section from the tox.ini config file.r  )r  r   rk   )r{   rü  rÿ  s      rC   Ú	getinicfgÚPytester.getinicfgR  s$   € à�L‰L˜Ó ˆÜœ˜Q›Ó  Ñ*Ð*rE   c                ó"   • U R                  SUS9$ )ztWrite a pyproject.toml file.

:param source: The contents.
:returns: The pyproject.ini file.

.. versionadded:: 6.0
r  )Ú	pyprojectr  r  s     rC   ÚmakepyprojecttomlÚPytester.makepyprojecttomlW  s   € ð �}‰}˜W°ˆ}Ð7Ð7rE   c                ó&   • U R                  SX5      $ )aû  Shortcut for .makefile() with a .py extension.

Defaults to the test name with a '.py' extension, e.g test_foobar.py, overwriting
existing files.

Examples:

.. code-block:: python

    def test_something(pytester):
        # Initial file is created test_something.py.
        pytester.makepyfile("foobar")
        # To create multiple files, pass kwargs accordingly.
        pytester.makepyfile(custom="foobar")
        # At this point, both 'test_something.py' & 'custom.py' exist in the test directory.

ú.pyr  ©r{   r  rÑ   s      rC   r
  ÚPytester.makepyfilea  s   € ð$ �~‰~˜e TÓ2Ð2rE   c                ó&   • U R                  SX5      $ )a  Shortcut for .makefile() with a .txt extension.

Defaults to the test name with a '.txt' extension, e.g test_foobar.txt, overwriting
existing files.

Examples:

.. code-block:: python

    def test_something(pytester):
        # Initial file is created test_something.txt.
        pytester.maketxtfile("foobar")
        # To create multiple files, pass kwargs accordingly.
        pytester.maketxtfile(custom="foobar")
        # At this point, both 'test_something.txt' & 'custom.txt' exist in the test directory.

z.txtr  r!  s      rC   ÚmaketxtfileÚPytester.maketxtfileu  s   € ð$ �~‰~˜f dÓ3Ð3rE   Nc                ój   • Uc  U R                   nU R                  R                  [        U5      5        g)z¤Prepend a directory to sys.path, defaults to :attr:`path`.

This is undone automatically when this object dies at the end of each
test.

:param path:
    The path.
N)r¤  rÇ  Úsyspath_prependrk   )r{   r¤  s     rC   ÚsyspathinsertÚPytester.syspathinsert‰  s*   € ð ‰<Ø—9‘9ˆDà×Ñ×)Ñ)¬#¨d«)Õ4rE   c                óD   • U R                   U-  nUR                  5         U$ )z£Create a new (sub)directory.

:param name:
    The name of the directory, relative to the pytester path.
:returns:
    The created directory.
:rtype: pathlib.Path
)r¤  r÷  ©r{   rÐ   rÿ  s      rC   r÷  ÚPytester.mkdir—  s    € ð �I‰I˜ÑˆØ	�‰Œ	ØˆrE   c                ó‚   • U R                   U-  nUR                  5         UR                  S5      R                  5         U$ )zŠCreate a new python package.

This creates a (sub)directory with an empty ``__init__.py`` file so it
gets recognised as a Python package.
ú__init__.py)r¤  r÷  rô  Útouchr+  s      rC   ÚmkpydirÚPytester.mkpydir¤  s5   € ð �I‰I˜ÑˆØ	�‰Œ	Ø	�
‰
�=Ó!×'Ñ'Ô)ØˆrE   c                óÀ  • U R                   R                  R                  S5      nUc  [        S5      eU R                   R                  R                  U-  nU R                   R
                  R                  S5       H/  nUR                  (       d   eUR                  " UR                  6 nM1     UcW  U R                  nX5-  nX5S-   -  nUR                  5       (       a  UnO9UR                  5       (       a  UnO![        U SU 35      eUR                  U5      nUR                  5       (       aP  UR                  S5      R                  5       (       d,  [        R                  " X€R                  SSS9  U R                  $ UR                  5       (       a=  U R                  R                  UR                   5      n	[        R"                  " X‰5        U	$ [        S	U S
35      e)z¼Copy file from project's directory into the testdir.

:param name:
    The name of the file to copy.
:return:
    Path to the copied directory (inside ``self.path``).
:rtype: pathlib.Path
r?   z2pytester_example_dir is unset, can't copy examplesÚpytester_example_pathr   z( can't be found as module or package in r.  T)ÚsymlinksÚdirs_exist_okz	example "z%" is not found as a file or directory)r·   rN   Úgetinir*  Úrootpathr¼  Úiter_markersr  rô  rÏ   Úis_dirÚis_fileÚLookupErrorÚshutilÚcopytreer¤  rÐ   rÔ   )
r{   rÐ   Úexample_dir_Úexample_dirÚextra_elementÚ	func_nameÚ	maybe_dirÚ
maybe_fileÚexample_pathÚresults
             rC   Úcopy_exampleÚPytester.copy_example¯  s§  € ð —}‘}×+Ñ+×2Ñ2Ð3IÓJˆØÑÜÐQÓRÐRØ ŸM™M×0Ñ0×9Ñ9¸LÑHˆà!Ÿ]™]×/Ñ/×<Ñ<Ð=TÖUˆMØ ×%×%Ð%Ð%Ø%×.Ò.°×0BÑ0BÐCŠKñ Vð ‰<ØŸ
™
ˆIØ#Ñ/ˆIØ$°EÑ(9Ñ:ˆJà×Ñ×!Ñ!Ø(‘Ø×#Ñ#×%Ñ%Ø)‘ä!Ø �kÐ!IÈ+ÈÐWóð ð '×/Ñ/°Ó5ˆLà×Ñ× Ñ ¨×)>Ñ)>¸}Ó)M×)UÑ)U×)WÑ)WÜ�OŠO˜L¯)©)¸dÐRVÒWØ—9‘9ÐØ×!Ñ!×#Ñ#Ø—Y‘Y×'Ñ'¨×(9Ñ(9Ó:ˆFÜ�KŠK˜Ô-ØˆMäØ˜L˜>Ð)NÐOóð rE   c                ó`  • [         R                  " U5      nS[        U5      ;  d   e[        [        R
                  R                  U5      5      nUR                  R                  US9  UR                  [        U5      /SS9S   nUR                  R                  U[        R                  S9  U$ )zÎGet the collection node of a file.

:param config:
   A pytest config.
   See :py:meth:`parseconfig` and :py:meth:`parseconfigure` for creating it.
:param arg:
    Path to the file.
:returns:
    The node.
r%  ©ÚsessionF©Úgenitemsr   ©rJ  Ú
exitstatus)r%   Úfrom_configrk   r
   rt   r¤  Úabspathr¿   Úpytest_sessionstartÚperform_collectÚpytest_sessionfinishr   ÚOK)r{   rN   ÚargrJ  rÿ  Úress         rC   ÚgetnodeÚPytester.getnodeÝ  s’   € ô ×%Ò% fÓ-ˆØœ3˜s›8Ó#Ð#Ð#Ü”—‘—‘ Ó%Ó&ˆØ�‰×'Ñ'°Ð'Ñ8Ø×%Ñ%¤s¨1£v h¸Ð%Ð?ÀÑBˆØ�‰×(Ñ(°ÄXÇ[Á[Ð(ÑQØˆ
rE   c                ó@  • [        U5      nU R                  U5      n[        R                  " U5      n[	        UR
                  U5      nUR                  R                  US9  UR                  U/SS9S   nUR                  R                  U[        R                  S9  U$ )zÙReturn the collection node of a file.

This is like :py:meth:`getnode` but uses :py:meth:`parseconfigure` to
create the (configured) pytest Config instance.

:param path:
    Path to the file.
:returns:
    The node.
rI  FrK  r   rM  )r
   Úparseconfigurer%   rO  r,   r¤  r¿   rQ  rR  rS  r   rT  )r{   r¤  rN   rJ  rÇ   rV  s         rC   ÚgetpathnodeÚPytester.getpathnodeð  sŽ   € ô �D‹zˆØ×$Ñ$ TÓ*ˆÜ×%Ò% fÓ-ˆÜ˜Ÿ™ dÓ+ˆØ�‰×'Ñ'°Ð'Ñ8Ø×%Ñ% q c°EÐ%Ð:¸1Ñ=ˆØ�‰×(Ñ(°ÄXÇ[Á[Ð(ÑQØˆ
rE   c                óz   • US   R                   n/ nU H#  nUR                  UR                  U5      5        M%     U$ )zâGenerate all test items from a collection node.

This recurses into the collection node and returns a list of all the
test items contained within.

:param colitems:
    The collection nodes.
:returns:
    The collected items.
r   )rJ  r  rL  )r{   ÚcolitemsrJ  rE  Úcolitems        rC   rL  ÚPytester.genitems  s>   € ð ˜1‘+×%Ñ%ˆØˆÛˆGØ�M‰M˜'×*Ñ*¨7Ó3Ö4ñ  àˆrE   c                ó€   • U R                  U5      nU R                  R                  nUR                  5       nU" U5      $ )zøRun the "test_func" Item.

The calling test instance (class containing the test method) must
provide a ``.getrunner()`` method which should return a runner which
can run the test protocol for a single item, e.g.
``_pytest.runner.runtestprotocol``.
)Úgetitemr·   ÚinstanceÚ	getrunner)r{   rü  rŸ   ÚtestclassinstanceÚrunners        rC   ÚrunitemÚPytester.runitem  s:   € ð �|‰|˜FÓ#ˆà ŸM™M×2Ñ2ÐØ"×,Ñ,Ó.ˆÙ�d‹|ÐrE   c                ó`   • U R                  U5      n/ [        U5      QUPnU R                  " U6 $ )a7  Run a test module in process using ``pytest.main()``.

This run writes "source" into a temporary file and runs
``pytest.main()`` on it, returning a :py:class:`HookRecorder` instance
for the result.

:param source: The source code of the test module.
:param cmdlineargs: Any extra command line arguments to use.
)r
  r  Ú
inline_run)r{   rü  Úcmdlineargsrÿ  rÆ   s        rC   Úinline_runsourceÚPytester.inline_runsource$  s5   € ð �O‰O˜FÓ#ˆØ(”4˜Ó$Ð( aÐ(ˆØ�Š Ð'Ð'rE   c                óŒ   • U R                   " S/UQ76 nUR                  S5       Vs/ s H  o3R                  PM     nnXB4$ s  snf )a  Run ``pytest.main(['--collect-only'])`` in-process.

Runs the :py:func:`pytest.main` function to run all of pytest inside
the test process itself like :py:meth:`inline_run`, but returns a
tuple of the collected items and a :py:class:`HookRecorder` instance.
z--collect-onlyÚpytest_itemcollected)rj  rø   rŸ   )r{   r  ÚrecrÇ   r€  s        rC   Úinline_genitemsÚPytester.inline_genitems2  sH   € ð �oŠoÐ.Ð6°Ò6ˆØ!$§¡Ð.DÔ!EÓFÒ!E˜A—”Ñ!EˆÐFØˆzÐùò Gs   §Ar¨   )r¿  Úno_reraise_ctrlcc               óü  ^ ^^• SSK Jm  [        R                  " 5         [	        U5      n/ n UR                  T R                  5       R                  5        UR                  [        5       R                  5        / m " UUU 4S jS5      nUR                  U" 5       5        [        U Vs/ s H  n[        U5      PM     snUS9n[        T5      S:X  a  TR                  5       nO
 " S S5      nXxl        U[        R                  :X  aJ  U(       dC  UR!                  S	5      n	U	(       a+  U	S
   R"                  R$                  [&        :X  a
  ['        5       eUU H
  n
U
" 5         M     $ s  snf ! U H
  n
U
" 5         M     f = f)a…  Run ``pytest.main()`` in-process, returning a HookRecorder.

Runs the :py:func:`pytest.main` function to run all of pytest inside
the test process itself.  This means it can return a
:py:class:`HookRecorder` instance which gives more detailed results
from that run than can be done by matching stdout/stderr from
:py:meth:`runpytest`.

:param args:
    Command line arguments to pass to :py:func:`pytest.main`.
:param plugins:
    Extra plugin instances the ``pytest.main()`` instance should use.
:param no_reraise_ctrlc:
    Typically we reraise keyboard interrupts from the child run. If
    True, the KeyboardInterrupt exception is captured.
r   )Úgc_collect_iterations_keyc                  ó4   >• \ rS rSr\SU UU4S jj5       rSrg)Ú1Pytester.inline_run.<locals>.PytesterHelperPluginil  c                óx   >• TR                  TR                  U R                  5      5        SU R                  T'   g )Nr   )rz   rß  rK   Ústash)rN   ru  rp  r{   s    €€€rC   rP   ÚBPytester.inline_run.<locals>.PytesterHelperPlugin.pytest_configurem  s2   ø€ à—J‘J˜t×6Ñ6°v×7KÑ7KÓLÔMð ?@�F—L‘LÐ!:Ò;rE   r¨   N©rN   r   rl   rÃ   )r©   rª   r«   r¬   ÚstaticmethodrP   r­   )ru  rp  r{   s   €€€rC   ÚPytesterHelperPluginrw  l  s   ø† Ø÷@ð @ó ó@rE   r}  )r¿  ri   c                  ó   • \ rS rSrSrg)Ú#Pytester.inline_run.<locals>.repreci{  r¨   Nr®  r¨   rE   rC   rÞ  r  {  s   † ÚrE   rÞ  Úpytest_keyboard_interruptéÿÿÿÿ)Ú_pytest.unraisableexceptionru  Ú	importlibÚinvalidate_cachesr  rz   rÁ  r`  r^  r   rk   rš   r  rî   r   ÚINTERRUPTEDrø   ÚexcinfoÚtypeÚKeyboardInterrupt)r{   r¿  rs  r  Ú
finalizersr}  rÇ   rî   rÞ  rä   Ú	finalizerru  rp  s   `          @@rC   rj  ÚPytester.inline_run=  s<  ú€ õ, 	Jô
 	×#Ò#Ô%ä�w“-ˆØˆ
ð-	ð
 ×Ñ˜d×>Ñ>Ó@×HÑHÔIØ×ÑÔ.Ó0×8Ñ8Ô9ð ˆC÷@ö @ð �N‰NÑ/Ó1Ô2Ü©Ó-ª 1œ˜Až©Ñ-°wÑ?ˆCÜ�3‹x˜1‹}ØŸ™›‘÷ñ ð ŒJð ”h×*Ñ*Ó*Ö3CØŸ™Ð(CÓD�Þ˜U 2™Y×.Ñ.×3Ñ3Ô7HÓHÜ+Ó-Ð-Øã'�	Ù–ò (ùò% .øó$ (�	Ù–ò (ús   ­A<E) Â)E$Â>BE) Å$E) Å)E;c                ó8  • UR                  SS5      nU(       a  U R                  5         [        R                  " 5       n[	        S5      nUR                  5           U R                  " U0 UD6nUR                  5       u  pšUR                  5         [         R"                  R%                  U	5        [         R&                  R%                  U
5        UR(                  c   e[+        UR(                  U	R-                  5       U
R-                  5       UR/                  5       R0                  5      nXkl        U$ ! [         aN  nUR                  S   n [        UR                  S   5      nO! [         a     Of = f " S S5      n SnAGNSnAf[         a#    [        R                  " 5          " S S5      n GNEf = f! UR                  5       u  pšUR                  5         [         R"                  R%                  U	5        [         R&                  R%                  U
5        f = f)	zlReturn result of running pytest in-process, providing a similar
interface to what self.runpytest() provides.r(  Frn   r   c                  ó   • \ rS rSr\rSrg)Ú,Pytester.runpytest_inprocess.<locals>.repreci¡  r¨   N)r©   rª   r«   r¬   rî   r­   r¨   rE   rC   rÞ  rŽ  ¡  s   † Ø“CrE   rÞ  Nc                  ó$   • \ rS rSr\" S5      rSrg)rŽ  i§  rT   r¨   N)r©   rª   r«   r¬   r   rî   r­   r¨   rE   rC   rÞ  rŽ  §  s   † Ù" 1›+“CrE   )r  r(  r   ÚInstantr   Ústart_capturingrj  Ú
SystemExitr  r   r*  Ú	ExceptionÚ	tracebackÚ	print_excÚ
readouterrÚstop_capturingrn   rW   ÚwriterX   rî   rk  Ú
splitlinesÚelapsedÚsecondsrÞ  )r{   r  rÑ   r(  ÚinstantÚcapturerÞ  Úerî   r|   ÚerrrV  s               rC   Úrunpytest_inprocessÚPytester.runpytest_inprocess‹  s§  € ð
 Ÿ
™
 ?°EÓ:ˆæØ×ÑÔ Ü—.’.Ó"ˆÜ# EÓ*ˆØ×ÑÔ!ð	"ð&ØŸš¨$Ð9°&Ñ9�ð$ ×)Ñ)Ó+‰HˆCØ×"Ñ"Ô$Ü�J‰J×Ñ˜SÔ!Ü�J‰J×Ñ˜SÔ!à�z‰zÑ%Ð%Ð%ÜØ�J‰J˜Ÿ™Ó(¨#¯.©.Ó*:¸G¿O¹OÓ<M×<UÑ<Uó
ˆð Œ
Øˆ
øô7 ó Ø—f‘f˜Q‘i�ðÜ" 1§6¡6¨!¡9Ó-‘CøÜ!ó Ùðú÷÷ ûô ó &Ü×#Ò#Ô%÷&ô &ð&ûð ×)Ñ)Ó+‰HˆCØ×"Ñ"Ô$Ü�J‰J×Ñ˜SÔ!Ü�J‰J×Ñ˜SÕ!ús[   ÁD1 Ä1
F4Ä;FÅE$Å#FÅ$
E1Å.FÅ0E1Å1FÅ>F7 Æ,F4Æ0F7 Æ3F4Æ4F7 Æ7A"Hc                óÜ   • U R                  U5      nU R                  S:X  a  U R                  " U0 UD6$ U R                  S:X  a  U R                  " U0 UD6$ [	        SU R                   35      e)z„Run pytest inline or in a subprocess, depending on the command line
option "--runpytest" and return a :py:class:`~pytest.RunResult`.r;   r=   zUnrecognized runpytest option: )Ú_ensure_basetemprÅ  r   Úrunpytest_subprocessÚRuntimeError)r{   r  rÑ   Únew_argss       rC   r<   ÚPytester.runpytest·  so   € ð ×(Ñ(¨Ó.ˆØ�<‰<˜;Ó&Ø×+Ò+¨XÐ@¸Ñ@Ð@Ø�\‰\˜\Ó)Ø×,Ò,¨hÐA¸&ÑAÐAÜÐ<¸T¿\¹\¸NÐKÓLÐLrE   c                óø   • [        U5      nU H%  n[        U5      R                  S5      (       d  M$    U$    UR                  SR	                  U R
                  R                  R                  S5      5      5        U$ )Nz
--basetempz--basetemp={}Úbasetemp)r  rk   rc   rz   r›   r¤  rö  rô  )r{   r  r¦  rÇ   s       rC   r£  ÚPytester._ensure_basetempÁ  sn   € ô ˜“:ˆÛˆAÜ�1‹v× Ñ  ×.Ó.Øð
 ˆñ ð �O‰OØ×&Ñ& t§y¡y×'7Ñ'7×'@Ñ'@ÀÓ'LÓMôð ˆrE   c                ó   • SSK nU R                  U5       Vs/ s H  n[        U5      PM     nnUR                  R	                  X@R
                  5      nU R                  R                  UR                  5        U$ s  snf )a•  Return a new pytest :class:`pytest.Config` instance from given
commandline args.

This invokes the pytest bootstrapping code in _pytest.config to create a
new :py:class:`pytest.PytestPluginManager` and call the
:hook:`pytest_cmdline_parse` hook to create a new :class:`pytest.Config`
instance.

If :attr:`plugins` has been populated they should be plugin modules
to be registered with the plugin manager.
r   N)	rf  r£  rk   rN   Ú_prepareconfigr¿  r·   r½   rg  )r{   r  r²   rÇ   r¦  rN   s         rC   ÚparseconfigÚPytester.parseconfigÎ  si   € ó 	à$(×$9Ñ$9¸$Ô$?Ó@Ò$?˜q”C˜–FÑ$?ˆÐ@à—‘×.Ñ.¨x¿¹ÓFˆð 	�‰×"Ñ" 6×#=Ñ#=Ô>Øˆùò As   ˜A;c                óD   • U R                   " U6 nUR                  5         U$ )z±Return a new pytest configured Config instance.

Returns a new :py:class:`pytest.Config` instance like
:py:meth:`parseconfig`, but also calls the :hook:`pytest_configure`
hook.
)r­  Ú_do_configure)r{   r  rN   s      rC   rZ  ÚPytester.parseconfigureå  s%   € ð ×!Ò! 4Ð(ˆØ×ÑÔØˆrE   c                ó~   • U R                  U5      nU H  nUR                  U:X  d  M  Us  $     U< SU SU 35       e)aU  Return the test item for a test function.

Writes the source to a python file and runs pytest's collection on
the resulting module, returning the test item for the requested
function name.

:param source:
    The module source.
:param funcname:
    The name of the test function for which to return a test item.
:returns:
    The test item.
z item not found in module:
z
items: )ÚgetitemsrÐ   )r{   rü  Úfuncnamer€  rŸ   s        rC   rb  ÚPytester.getitemð  sL   € ð  —‘˜fÓ%ˆÛˆDØ�y‰y˜HÕ$Ø’ñ ð 	V�X‘LÐ <¸V¸HÀIÈeÈWÐUÓUˆqrE   c                óH   • U R                  U5      nU R                  U/5      $ )z¶Return all test items collected from the module.

Writes the source to a Python file and runs pytest's collection on
the resulting module, returning all test items contained within.
)ÚgetmodulecolrL  )r{   rü  Úmodcols      rC   r³  ÚPytester.getitems  s%   € ð ×"Ñ" 6Ó*ˆØ�}‰}˜f˜XÓ&Ð&rE   )Úwithinitc               óh  • [        U[        R                  5      (       a*  U R                  R	                  U5      nU(       a   S5       eO)U R
                  [        U5      0nU R                  " S0 UD6nU(       a  U R                  SS9  U R                  " U/UQ76 =U l	        nU R                  Xd5      $ )aÒ  Return the module collection node for ``source``.

Writes ``source`` to a file using :py:meth:`makepyfile` and then
runs the pytest collection on it, returning the collection node for the
test module.

:param source:
    The source code of the module to collect.

:param configargs:
    Any extra arguments to pass to :py:meth:`parseconfigure`.

:param withinit:
    Whether to also write an ``__init__.py`` file to the same
    directory to ensure it is a package.
znot supported for pathsÚ#)r¸   r¨   )rõ   rt   ÚPathLiker¤  rô  rÏ   rk   r
  rZ  rN   rW  )r{   rü  Ú
configargsrº  r¤  ÚkwrN   s          rC   r·  ÚPytester.getmodulecol  s˜   € ô. �fœbŸk™k×*Ñ*Ø—9‘9×%Ñ% fÓ-ˆDÞÐ:Ð!:Ó:�<�xà—*‘*œc &›kÐ*ˆBØ—?’?Ñ( RÑ(ˆDÞØ�O‰O SˆOÑ)Ø#×2Ò2°4ÐE¸*ÒEÐEˆŒ�fØ�|‰|˜FÓ)Ð)rE   c                óÂ   • XR                   ;  a&  [        UR                  5       5      U R                   U'   U R                   U    H  nUR                  U:X  d  M  Us  $    g)a  Return the collection node for name from the module collection.

Searches a module collection node for a collection node matching the
given name.

:param modcol: A module collection node; see :py:meth:`getmodulecol`.
:param name: The name of the node to return.
N)rº  r  r™   rÐ   )r{   r¸  rÐ   r_  s       rC   Úcollect_by_nameÚPytester.collect_by_name1  sW   € ð ×.Ñ.Ó.Ü,0°·±Ó1AÓ,BˆD×!Ñ! &Ñ)Ø×,Ñ,¨VÔ4ˆGØ�|‰|˜tÕ#Ø’ñ 5ð rE   c           
     ó¬  • [         R                  R                  5       n[         R                  R	                  [        S[         R                  " 5       UR                  SS5      /5      5      US'   XeS'   X@R                  L a  [        R                  US'   O-[        U[        5      (       a  [        R                  US'   OXES'   [        R                  " U4X#S.UD6nX@R                  L a+  UR                  c   eUR                  R                  5         U$ [        U[        5      (       a*  UR                  c   eUR                  R!                  U5        U$ )z»Invoke :py:class:`subprocess.Popen`.

Calls :py:class:`subprocess.Popen` making sure the current working
directory is in ``PYTHONPATH``.

You probably want to use :py:meth:`run` instead.
NÚ
PYTHONPATHrN  ÚenvÚstdin)rW   rX   )rt   ÚenvironrÔ   Úpathseprž   ÚfilterÚgetcwdr�  r«  r=   rv   rõ   ræ  ÚPopenrÇ  Úcloser˜  )r{   ÚcmdargsrW   rX   rÇ  r¿  rÆ  Úpopens           rC   rÏ  ÚPytester.popenA  s  € ô �j‰j�o‰oÓˆÜŸJ™JŸO™OÜ�4œ"Ÿ)š)›+ s§w¡w¨|¸RÓ'@ÐAÓBó
ˆˆLÑð ˆ5‰	à×$Ñ$Ò$Ü$Ÿ/™/ˆBˆwŠKÜ˜œu×%Ñ%Ü$Ÿ/™/ˆBˆwŠKàˆw‰Kä× Ò  ÐM°ÑMÈ"ÑMˆØ×$Ñ$Ò$Ø—;‘;Ñ*Ð*Ð*Ø�K‰K×ÑÔð
 ˆô	 ˜œu×%Ñ%Ø—;‘;Ñ*Ð*Ð*Ø�K‰K×Ñ˜eÔ$àˆrE   )ÚtimeoutrÇ  c          	     ó‚  ^ ^^^• Sn[        S T 5       5      mT R                  R                  S5      nT R                  R                  S5      n[        S/TQ76   [        S[        R
                  " 5       5        UR                  SSS	9 ovR                  SSS	9 n[        R                  " 5       n	T R                  TUUUS
9mTR                  b  TR                  R                  5         SUUU U4S jjn
Tc  TR                  5       nO TR                  T5      nUR                  5         UR                  5         SSS5        SSS5        UR                  SS	9 ovR                  SS	9 nUR!                  5       R#                  5       nUR!                  5       R#                  5       nSSS5        SSS5        T R%                  W[&        R(                  5        T R%                  W[&        R*                  5        [,        R.                  " [0        5         [3        W5      nSSS5        [5        WXÍW	R7                  5       R8                  5      $ ! [        R                   a    U
" 5          GNLf = f! , (       d  f       GN7= f! , (       d  f       GNA= f! , (       d  f       Nï= f! , (       d  f       Nø= f! , (       d  f       N›= f)a'  Run a command with arguments.

Run a process using :py:class:`subprocess.Popen` saving the stdout and
stderr.

:param cmdargs:
    The sequence of arguments to pass to :py:class:`subprocess.Popen`,
    with path-like objects being converted to :py:class:`str`
    automatically.
:param timeout:
    The period in seconds after which to timeout and raise
    :py:class:`Pytester.TimeoutExpired`.
:param stdin:
    Optional standard input.

    - If it is ``CLOSE_STDIN`` (Default), then this method calls
      :py:class:`subprocess.Popen` with ``stdin=subprocess.PIPE``, and
      the standard input is closed immediately after the new command is
      started.

    - If it is of type :py:class:`bytes`, these bytes are sent to the
      standard input of the command.

    - Otherwise, it is passed through to :py:class:`subprocess.Popen`.
      For further information in this case, consult the document of the
      ``stdin`` parameter in :py:class:`subprocess.Popen`.
:type stdin: _pytest.compat.NotSetType | bytes | IO[Any] | int
:returns:
    The result.

Tc              3  óN   #   • U  H  n[         R                  " U5      v •  M     g 7fr�   )rt   Úfspath)r�   rU  s     rC   r‘   ÚPytester.run.<locals>.<genexpr>Ž  s   é € Ð:²'¨3œŸ	š	 #Ÿ˜²'ùri  rW   rX   zrunning:z     in:ÚwÚutf8rñ  )rÇ  rW   rX   Nc                 óx   >• Sn T ST 3nTR                  5         TR                  5         TR                  U5      e)NTz! second timeout expired running: )ÚkillÚwaitr¯  )r  Útimeout_messagerÎ  rÏ  r{   rÑ  s     €€€€rC   Úhandle_timeoutÚ$Pytester.run.<locals>.handle_timeoutŸ  s=   ø€ Ø$(Ð!à%, IÐ-NÈwÈiÐ"X�à—
‘
”Ø—
‘
”Ø×)Ñ)¨/Ó:Ð:rE   rK  )Útupler¤  rô  r  r
   ra   Úopenr   r�  rÏ  rÇ  rÍ  rÚ  r=   r¯  ÚflushÚreadr™  Ú_dump_linesrn   rW   rX   Ú
contextlibÚsuppressr*  r   rk  rš  r›  )r{   rÑ  rÇ  rÎ  r  Úp1Úp2Úf1Úf2rœ  rÜ  rî   r|   rŸ  rÏ  s   `` `          @rC   rs   ÚPytester.rung  s  û€ ðJ !ÐäÑ:±'Ó:Ó:ˆØ�Y‰Y×Ñ Ó)ˆØ�Y‰Y×Ñ Ó)ˆÜˆjÐ#˜7Ó#Üˆjœ$Ÿ(š(›*Ô%à�W‰W�S 6ˆWÑ*¨b·'±'¸#È°'Ñ2OÐSUÜ—n’nÓ&ˆGØ—J‘JØØØØð	 ð ˆEð �{‰{Ñ&Ø—‘×!Ñ!Ô#÷;ò ;ð ‰Ø—j‘j“l‘ð%ØŸ*™* WÓ-�Cð �H‰HŒJØ�H‰HŒJ÷9 3P×*ð< �W‰W˜fˆWÑ%¨¯W©W¸f¨WÑ-EÈØ—'‘'“)×&Ñ&Ó(ˆCØ—'‘'“)×&Ñ&Ó(ˆC÷ .F×%ð 	×Ñ˜œcŸj™jÔ)Ø×Ñ˜œcŸj™jÔ)ä× Ò ¤Õ,Ü˜3“-ˆC÷ -ä˜˜c¨¯©Ó(9×(AÑ(AÓBÐBøô "×0Ñ0ó %Ù"×$ð%ú÷3 3PÖ2Oú×*Ö*ú÷< .FÕ-Eú×%Õ%ú÷ -Õ,úsy   Â
I<ÂA.I*Ä	IÄ I*Ä:I<ÅJÅ(=JÆ%JÈJ0ÉI'É#I*É&I'É'I*É*
I9	É4I<É<
JÊ
J	ÊJÊ
J-Ê0
J>c                óh   •  U H  n[        X2S9  M     g ! [         a    [        SU S35         g f = f)N)Úfilezcouldn't print to z because of encoding)r  ÚUnicodeEncodeError)r{   r  Úfprd   s       rC   râ  ÚPytester._dump_lines½  s>   € ð	AÛ�Ü�dÔ$ò øä!ó 	AÜÐ& r dÐ*>Ð?Ö@ð	Aús   ‚ •1°1c                ó&   • [         R                  S4$ )Nz-mpytest)rn   Ú
executabler†   s    rC   Ú_getpytestargsÚPytester._getpytestargsÄ  s   € Ü�~‰~˜zÐ)Ð)rE   c                óB   • U R                  [        R                  U5      $ )z8Run a python script using sys.executable as interpreter.©rs   rn   rð  )r{   Úscripts     rC   Ú	runpythonÚPytester.runpythonÇ  s   € à�x‰xœŸ™¨Ó/Ð/rE   c                óD   • U R                  [        R                  SU5      $ )zRun ``python -c "command"``.z-crô  )r{   Úcommands     rC   Úrunpython_cÚPytester.runpython_cË  s   € à�x‰xœŸ™¨¨gÓ6Ð6rE   )rÑ  c               ó  • Sn[        U R                  SSS9nSU 3/UQ7nU R                   H-  n[        U[        5      (       d  [        SU 35      eSU/UQ7nM/     U R                  5       U-   nU R                  " USU06$ )	aT  Run pytest as a subprocess with given arguments.

Any plugins added to the :py:attr:`plugins` list will be added using the
``-p`` command line option.  Additionally ``--basetemp`` is used to put
any temporary files and directories in a numbered directory prefixed
with "runpytest-" to not conflict with the normal numbered pytest
location for temporary files and directories.

:param args:
    The sequence of arguments to pass to the pytest subprocess.
:param timeout:
    The period in seconds after which to timeout and raise
    :py:class:`Pytester.TimeoutExpired`.
:returns:
    The result.
Tz
runpytest-éÀ  )ÚrootÚprefixÚmodez--basetemp=zeSpecifying plugins as objects is not supported in pytester subprocess mode; specify by name instead: rV   rÑ  )r-   r¤  r¿  rõ   rk   r*  rñ  rs   )r{   rÑ  r  r  rÿ  Úplugins         rC   r¤  ÚPytester.runpytest_subprocessÏ  s¡   € ð& !ÐÜ 4§9¡9°\ÈÑNˆØ˜a˜SÐ!Ð) DÑ)ˆØ—l”lˆFÜ˜f¤c×*Ñ*Ü ð0Ø06¨xð9óð ð ˜&Ð( 4Ñ(ŠDñ #ð ×"Ñ"Ó$ tÑ+ˆØ�xŠx˜Ð/ wÑ/Ð/rE   c                óÊ   • U R                   S-  nUR                  SS9  SR                  [        [        U R                  5       5      5      nU SU SU 3nU R                  XRS9$ )z’Run pytest using pexpect.

This makes sure to use the right pytest and sets up the temporary
directory locations.

The pexpect child is returned.
ztemp-pexpectrý  )r   Ú z --basetemp=)Úexpect_timeout)r¤  r÷  rž   Úmaprk   rñ  Úspawn)r{   Ústringr  r©  ÚinvokeÚcmds         rC   Úspawn_pytestÚPytester.spawn_pytestï  se   € ð —9‘9˜~Ñ-ˆØ�‰˜EˆÑ"Ø—‘œ#œc 4×#6Ñ#6Ó#8Ó9Ó:ˆØ�˜ X J¨a°¨xÐ8ˆØ�z‰z˜#ˆzÐ=Ð=rE   c                óˆ  • [        SS5      n[        [        S5      (       a$  S[        R                  " 5       ;   a  [        S5        [        US5      (       d  [        S5        U R                  R                  S5      R                  S	5      nUR                  " XUS
9nU R                  R                  UR                  5        U$ )z=Run a command using pexpect.

The pexpect child is returned.
Úpexpectz3.0r‹   Ú64zpypy-64 bit not supportedr  zpexpect.spawn not availablez	spawn.outÚwb)ÚlogfilerÑ  )r*   r—   rn   ÚplatformÚmachiner+   r¤  rô  rß  r  r·   r½   rÍ  )r{   r
  r  r  r  Úchilds         rC   r  ÚPytester.spawný  s—   € ô
 ˜y¨%Ó0ˆÜ”3Ð+×,Ñ,°¼×9IÒ9IÓ9KÓ1KÜÐ,Ô-Ü�w ×(Ñ(ÜÐ.Ô/Ø—)‘)×$Ñ$ [Ó1×6Ñ6°tÓ<ˆà—’˜c¸NÑKˆØ�‰×"Ñ" 7§=¡=Ô1ØˆrE   )rÅ  rº  rÇ  rÏ   r¾  r·   rÂ  rÀ  rÆ  rN   r¿  )
r±   r$   rZ  r0   r[  r&   rá   rm   rl   rÃ   )rl   r
   rÜ   rK  )rl   r_  )rK   r    rl   r»   )zutf-8)
rú  rk   r  zSequence[Any | bytes]rû  zdict[str, str]r[   rk   rl   r
   )rú  rk   r  rk   rÑ   rk   rl   r
   )rü  rk   rl   r
   )rü  rk   rl   r   r�   )r¤  zstr | os.PathLike[str] | Nonerl   rÃ   )rÐ   ústr | os.PathLike[str]rl   r
   )rÐ   rO  rl   r
   )rN   r   rU  r  rl   úCollector | Item)r¤  r  rl   r  )r^  zSequence[Item | Collector]rl   ú
list[Item])rü  rk   rl   r   )rü  rk   rl   r»   )rl   ztuple[list[Item], HookRecorder])r  r  rs  rm   rl   r»   )r  r  rÑ   r   rl   rk  )r  ú Sequence[str | os.PathLike[str]]rl   zlist[str | os.PathLike[str]])r  r  rl   r   )Ú	test_func)rü  r  r´  rk   rl   r(   )rü  r  rl   r  )r¨   )rü  r  rº  rm   )r¸  r'   rÐ   rk   rl   zItem | Collector | None)rÎ  r  rW   úint | TextIOrX   r  rÇ  ú"NotSetType | bytes | IO[Any] | int)rÎ  r  rÑ  úfloat | NonerÇ  r  rl   rk  )rl   ztuple[str, ...])rõ  zos.PathLike[str]rl   rk  )rù  rk   rl   rk  )r  r  rÑ  r  rl   rk  )g      $@)r  rk   r  r�  rl   úpexpect.spawn)r
  rk   r  r�  rl   r  )<r©   rª   r«   r¬   rÝ   Ú__test__r   r«  Ú__annotations__r“  r¯  r¸   Úpropertyr¤  rÖ   rÃ  rÁ  rß  rÈ  r  r  r  r  r  r  r  r
  r$  r(  r÷  r0  rF  rW  r[  rL  rg  rl  rq  rj  r   r<   r£  r­  rZ  rb  r³  r·  rÂ  r=   rv   rÏ  rs   râ  rñ  rö  rú  r¤  r  r  r­   r¨   rE   rC   rX  rX  ˆ  s²  ‡ ñð €Hà€K�Óô˜ô ð  ñ,$àð,$ð *ð,$ð !ð	,$ð ð,$ð 
õ,$ð\ óó ðô+ô	*ô
<ôô+ð  ð#àð#ð %ð#ð ð	#ð
 ð#ð 
õ#ôJ1ô@0ô1ô5ô+ô
8ô3ô(4ö(5ôô	ö,ô\ô&ô(ô"ô(ô	ð Ø!&ñ	Là%ðLð ð	Lð
 
õLð\*Ø+ð*Ø7:ð*à	ô*ôXMðØ4ðà	%ôôô.	ð ?JðVØ,ðVØ8;ðVà	õVô,'ð ð *ð
 ñ *à&ð *ð
 ö *ôDð&  *Ÿ™Ø)Ÿ™Ø4?ð$à1ð$ð ð$ð ð	$ð
 2õ$ðR !%Ø4?ñ	TCà(ðTCð ðTCð 2ð	TCð
 
õTCòlAô*ô0ô7ð
 FJñ0Ø+ð0Ø6Bð0à	õ0ö@>÷ñ rE   c                  ó(   • \ rS rSrSS jrSS jrSrg)rQ  i  c                ó"   • [        5       U l        g r�   )r	   Ústringior†   s    rC   r¸   ÚLineComp.__init__  s   € Ü ›
ˆŒØDrE   c                óþ   • SnU R                   R                  5       nU R                   R                  S5        U R                   R                  S5        UR	                  S5      n[        U5      R                  U5        g)z¬Assert that ``lines2`` are contained (linearly) in :attr:`stringio`'s value.

Lines are matched using :func:`LineMatcher.fnmatch_lines <pytest.LineMatcher.fnmatch_lines>`.
Tr   rg   N)r$  rH   ÚtruncateÚseekrx   rT  Úfnmatch_lines)r{   r¡   r  Úvalr    s        rC   Úassert_contains_linesÚLineComp.assert_contains_lines  s`   € ð
 !ÐØ�m‰m×$Ñ$Ó&ˆØ�‰×Ñ˜qÔ!Ø�‰×Ñ˜1ÔØ—‘˜4“ˆÜ�FÓ×)Ñ)¨&Õ1rE   )r$  NrK  ©r¡   úSequence[str]rl   rÃ   )r©   rª   r«   r¬   r¸   r+  r­   r¨   rE   rC   rQ  rQ    s   † ôE÷
2rE   c                  ó&  • \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	      SS jr
SS	 jrSS
 jr\SS j5       rSS.     SS jjrSS.     SS jjrSS.         S S jjrS!S jrS!S jr        S"S jrS#S jrSS jrSrg)$rT  i   zÍFlexible matching of text.

This is a convenience class to test large texts like the output of
commands.

The constructor takes a list of lines without their trailing newlines, i.e.
``text.splitlines()``.
c                ó   • Xl         / U l        g r�   )r  Ú_log_output)r{   r  s     rC   r¸   ÚLineMatcher.__init__*  s   € ØŒ
Ø&(ˆÕrE   c                ó8   • SR                  U R                  5      $ )zgReturn the entire original text.

.. versionadded:: 6.2
    You can use :meth:`str` in older versions.
rg   )rž   r  r†   s    rC   Ú__str__ÚLineMatcher.__str__.  s   € ð �y‰y˜Ÿ™Ó$Ð$rE   c                ó¤   • [        U[        5      (       a  [        U5      n[        U[        5      (       a  UR                  5       R                  nU$ r�   )rõ   rk   r   rù  r  )r{   r¡   s     rC   Ú	_getlinesÚLineMatcher._getlines6  s;   € Ü�fœc×"Ñ"Ü˜F“^ˆFÜ�fœf×%Ñ%Ø—\‘\“^×)Ñ)ˆFØˆrE   c                ó4   • SnU R                  U[        5        g)zTCheck lines exist in the output in any order (using :func:`python:fnmatch.fnmatch`).TN)Ú_match_lines_randomr   ©r{   r¡   r  s      rC   Úfnmatch_lines_randomÚ LineMatcher.fnmatch_lines_random=  s   € à ÐØ× Ñ  ¬Õ1rE   c                ó.   • SnU R                  US 5        g)zMCheck lines exist in the output in any order (using :func:`python:re.match`).Tc                ó@   • [        [        R                  " X5      5      $ r�   ©rm   ÚreÚmatch©rÐ   Úpats     rC   Ú<lambda>Ú3LineMatcher.re_match_lines_random.<locals>.<lambda>E  s   € ¼4ÄÇÂÈÓ@SÔ;TrE   N)r:  r;  s      rC   Úre_match_lines_randomÚ!LineMatcher.re_match_lines_randomB  s   € à ÐØ× Ñ  Ñ)TÕUrE   c                ó  • SnU R                  U5      nU Ho  nU R                   H3  nXE:X  d  U" XT5      (       d  M  U R                  S[        U5      5          MD     SU< S3nU R                  U5        U R	                  U5        Mq     g )NTz	matched: úline ú not found in output)r7  r  Ú_logr	  Ú_fail)r{   r¡   Ú
match_funcr  rd   rÇ   Úmsgs          rC   r:  ÚLineMatcher._match_lines_randomG  s{   € ð !ÐØ—‘ Ó'ˆÛˆDØ—Z”Z�Ø“9¡
¨1× 3Ó 3Ø—I‘I˜k¬4°«:Ô6Úñ  ð
 ˜d™XÐ%9Ð:�Ø—	‘	˜#”Ø—
‘
˜3–ò rE   c                ó°   • [        U R                  5       H.  u  p#X:X  d  [        X15      (       d  M  U R                  US-   S s  $    [        SU< S35      e)zcReturn all lines following the given line in the text.

The given line can contain glob wildcards.
ri   NrJ  rK  )r  r  r   r*  )r{   Úfnliner  rd   s       rC   Úget_lines_afterÚLineMatcher.get_lines_afterV  sT   € ô
 ! §¡Ö,‰GˆAØ‹~¤¨×!6Ó!6Ø—z‘z ! a¡% 'Ð*Ò*ñ -ô ˜5 ¡
Ð*>Ð?Ó@Ð@rE   c                óf   • U R                   R                  SR                  S U 5       5      5        g )Nr  c              3  ó8   #   • U  H  n[        U5      v •  M     g 7fr�   rŽ   )r�   rÇ   s     rC   r‘   Ú#LineMatcher._log.<locals>.<genexpr>a  s   é € Ð(>º°A¬¨Q¯¨ºùr“   )r1  rz   rž   )r{   r  s     rC   rL  ÚLineMatcher._log`  s%   € Ø×Ñ×Ñ §¡Ñ(>¹Ó(>Ó >Õ?rE   c                ó8   • SR                  U R                  5      $ )Nrg   )rž   r1  r†   s    rC   Ú	_log_textÚLineMatcher._log_textc  s   € à�y‰y˜×)Ñ)Ó*Ð*rE   F©Úconsecutivec               ó4   • SnU R                  U[        SUS9  g)am  Check lines exist in the output (using :func:`python:fnmatch.fnmatch`).

The argument is a list of lines which have to match and can use glob
wildcards.  If they do not match a pytest.fail() is called.  The
matches and non-matches are also shown as part of the error message.

:param lines2: String patterns to match.
:param consecutive: Match lines consecutively?
Tr   r\  N)Ú_match_linesr   ©r{   r¡   r]  r  s       rC   r)  ÚLineMatcher.fnmatch_linesg  s!   € ð !ÐØ×Ñ˜&¤'¨9À+ÐÒNrE   c               ó.   • SnU R                  US SUS9  g)a]  Check lines exist in the output (using :func:`python:re.match`).

The argument is a list of lines which have to match using ``re.match``.
If they do not match a pytest.fail() is called.

The matches and non-matches are also shown as part of the error message.

:param lines2: string patterns to match.
:param consecutive: match lines consecutively?
Tc                ó@   • [        [        R                  " X5      5      $ r�   r@  rC  s     rC   rE  Ú,LineMatcher.re_match_lines.<locals>.<lambda>†  s   € œd¤2§8¢8¨CÓ#6Ô7rE   úre.matchr\  N)r_  r`  s       rC   Úre_match_linesÚLineMatcher.re_match_linesv  s)   € ð !ÐØ×ÑØÙ7ØØ#ð	 	ò 	
rE   c               óL  • [        U[        R                  R                  5      (       d!  [	        S[        U5      R                   35      eU R                  U5      nU R                  SS n/ nSn[        U5      S-   nSn	U GH˜  n
SnU(       Gab  UR                  S5      nX¬:X  a  U R                  S[        U
5      5        Sn	MC  U" XÊ5      (       aK  U R                  U S3[        U
5      5        U R                  S	R                  S
US9[        U5      5        Sn	M›  U(       aX  U	(       aQ  SU
< 3nU R                  U5        U R                  S	R                  S
US9[        U5      5        U R                  U5        U(       d+  U R                  S	R                  SUS9[        U
5      5        SnU R                  S	R                  SUS9[        U5      5        UR                  U5        U(       a  GMb  SU
< 3nU R                  U5        U R                  U5        GM›     / U l        g)a	  Underlying implementation of ``fnmatch_lines`` and ``re_match_lines``.

:param Sequence[str] lines2:
    List of string patterns to match. The actual format depends on
    ``match_func``.
:param match_func:
    A callable ``match_func(line, pattern)`` where line is the
    captured line from stdout/stderr and pattern is the matching
    pattern.
:param str match_nickname:
    The nickname for the match function that will be logged to stdout
    when a match occurs.
:param consecutive:
    Match lines consecutively?
zinvalid type for lines2: NTri   Fr   zexact match:Ú:ú{:>{width}}úwith:©Úwidthzno consecutive match: únomatch:úand:zremains unmatched: )rõ   ÚcollectionsÚabcr   rò  r‡  r©   r7  r  rš   r  rL  r	  r›   rM  rz   r1  )r{   r¡   rN  Úmatch_nicknamer]  r    Ú
extralinesr  ÚwnickÚstartedrd   ÚnomatchprintedÚnextlinerO  s                 rC   r_  ÚLineMatcher._match_lines‹  së  € ô. ˜&¤+§/¡/×":Ñ":×;Ñ;ÜÐ7¼¸V»×8MÑ8MÐ7NÐOÓPÐPØ—‘ Ó'ˆØ—‘™A�ˆØˆ
Ø ÐÜ�NÓ# aÑ'ˆØˆÜˆDØ"ˆNßØ!Ÿ:™: a›=�ØÓ#Ø—I‘I˜n¬d°4«jÔ9Ø"�GÙÙ ×/Ñ/Ø—I‘I Ð 0°Ð2´D¸³JÔ?Ø—I‘IØ%×,Ñ,¨W¸EÐ,ÐBÄDÈÃNôð #�GÙæ"¦wØ 6°t±hÐ?˜ØŸ	™	 #œØŸ	™	Ø)×0Ñ0°ÀÐ0ÐFÌÈXËôð Ÿ
™
 3œÞ)ØŸ	™	Ø)×0Ñ0°À5Ð0ÐIÌ4ÐPTË:ôð *.˜Ø—I‘I˜m×2Ñ2°6ÀÐ2ÐGÌÈhËÔXØ×!Ñ! (Ô+÷7 ‘&ð: ,¨D©8Ð4�Ø—	‘	˜#”Ø—
‘
˜3—ñC ðD ˆÕrE   c                ó6   • SnU R                  U[        S5        g)z~Ensure captured lines do not match the given pattern, using ``fnmatch.fnmatch``.

:param str pat: The pattern to match lines.
Tr   N)Ú_no_match_liner   ©r{   rD  r  s      rC   Úno_fnmatch_lineÚLineMatcher.no_fnmatch_lineÎ  s   € ð
 !ÐØ×Ñ˜C¤¨)Õ4rE   c                ó0   • SnU R                  US S5        g)z‚Ensure captured lines do not match the given pattern, using ``re.match``.

:param str pat: The regular expression to match lines.
Tc                ó@   • [        [        R                  " X5      5      $ r�   r@  rC  s     rC   rE  Ú.LineMatcher.no_re_match_line.<locals>.<lambda>Ý  s   € ¤4¬¯ª°Ó(;Ô#<rE   re  N)rz  r{  s      rC   Úno_re_match_lineÚLineMatcher.no_re_match_lineÖ  s    € ð
 !ÐØ×ÑØÑ<¸jõ	
rE   c                óÖ  • SnSn[        U5      S-   nU R                   HÀ  nU" Xq5      (       aU  U SU< 3nU R                  U5        U R                  SR                  SUS9[	        U5      5        U R                  U5        Me  U(       d+  U R                  SR                  SUS9[	        U5      5        SnU R                  SR                  S	US9[	        U5      5        MÂ     / U l        g
)z�Ensure captured lines does not have a the given pattern, using ``fnmatch.fnmatch``.

:param str pat: The pattern to match lines.
TFri   r&  rj  rk  rl  rn  ro  N)rš   r  rL  r›   r	  rM  r1  )	r{   rD  rN  rr  r  Únomatch_printedrt  rd   rO  s	            rC   rz  ÚLineMatcher._no_match_lineà  s×   € ð !ÐØˆÜ�NÓ# aÑ'ˆØ—J”JˆDÙ˜$×$Ñ$Ø'Ð(¨¨3©'Ð2�Ø—	‘	˜#”Ø—	‘	˜-×.Ñ.¨w¸eÐ.ÐDÄdÈ4ÃjÔQØ—
‘
˜3–æ&Ø—I‘I˜m×2Ñ2°:ÀUÐ2ÐKÌTÐRUËYÔWØ&*�OØ—	‘	˜-×.Ñ.¨v¸UÐ.ÐCÄTÈ$ÃZÖPñ ð ˆÕrE   c                óD   • SnU R                   n/ U l        [        U5        g )NT)rZ  r1  r)   )r{   rO  r  Úlog_texts       rC   rM  ÚLineMatcher._fail÷  s    € Ø ÐØ—>‘>ˆØˆÔÜˆX�rE   c                ó   • [        U 5      $ )z Return the entire original text.rŽ   r†   s    rC   rk   ÚLineMatcher.strý  s   € ä�4‹yÐrE   )r1  r  N)r  r�  rl   rÃ   rÜ   )r¡   zstr | Sequence[str] | Sourcerl   r.  r-  )r¡   r.  rN  úCallable[[str, str], bool]rl   rÃ   )rR  rk   rl   r.  rK  )r¡   r.  r]  rm   rl   rÃ   )
r¡   r.  rN  r‹  rr  rk   r]  rm   rl   rÃ   )rD  rk   rl   rÃ   )rD  rk   rN  r‹  rr  rk   rl   rÃ   )rO  rk   rl   rÃ   )r©   rª   r«   r¬   rÝ   r¸   r4  r7  r<  rG  r:  rS  rL  r!  rZ  r)  rf  r_  r|  r�  rz  rM  rk   r­   r¨   rE   rC   rT  rT     s"  † ñô)ô%ôô2ô
Vð
 Ø#ð Ø1Kð à	ô ôAô@ð ó+ó ð+ð =BñOØ#ðOØ59ðOà	õOð  =Bñ
Ø#ð
Ø59ð
à	õ
ð6 "ñAàðAð /ðAð ð	Að ðAð 
õAôF5ô
ðØðØ$>ðØPSðà	ôô.÷rE   )rB   r!   rl   rÃ   r{  )r±   r$   rl   r®   )rÆ   zIterable[str]rl   r�  )rl   rQ  )r±   r$   rl   ztype[LineMatcher])r±   r$   rZ  r0   r[  r&   rl   rX  )rl   zGenerator[None])rl   zGenerator[Config])krÝ   Ú
__future__r   Úcollections.abcrp  r   r   r   r   rã  r   r˜   rƒ  Úior	   rp   rt   Úpathlibr
   r  rA  r<  r=   rn   r”  Útypingr   r   r   r   r   r   r   r   Úweakrefr   Ú	iniconfigr   r   r²   r   Ú_pytest._coder   Ú_pytest.capturer   Ú_pytest.compatr   r   rf  r   r   r   r   r   r    Ú_pytest.config.argparsingr!   Ú_pytest.deprecatedr"   Ú_pytest.fixturesr#   r$   Ú_pytest.mainr%   Ú_pytest.monkeypatchr&   Ú_pytest.nodesr'   r(   Ú_pytest.outcomesr)   r*   r+   Ú_pytest.pathlibr,   r-   Ú_pytest.reportsr.   r/   Ú_pytest.tmpdirr0   Ú_pytest.warning_typesr1   r  Úpytest_pluginsry   rD   rP   rI   r®   rÈ   rÊ   r»   rS  rW  r\  rc  rh  Úcompiler|  r~  rk  r_  r^  rX  rQ  rT  r¨   rE   rC   Ú<module>r£     s]  ðñõ
 #ã Ý $Ý %Ý $Ý $Û Ý Û 	Û Ý Û Û 	Ý Û Û 	Û Û Û 
Û Ý Ý Ý Ý Ý Ý Ý Ý  Ý %å Ý $å Ý  Ý -Ý !Ý %Ý (Ý !Ý #Ý #Ý Ý .Ý ,Ý -Ý $Ý +Ý  Ý +Ý #Ý Ý !Ý )Ý !Ý 'Ý -Ý )Ý &Ý *Ý 1ö Ûð (Ð(€ð ð€
ô
ô2
÷F=ñ F=ðX 	óó 	ð÷ñ ô.ð
 ÷-ð -ó ð-ð6 ÷Oð Oó ðOðd 	óó 	ðñ 	ˆmÑóó ðð 	ðLØðLØ/>ðLØMXðLàóLó 	ðLð  	óó 	ðð 	ó!ó 	ð!ð —z’z -Ó0Ð à�jŠj˜Ó(€ð ÷i
ð i
ó ði
÷X)ñ )÷5ñ 5ð ÷Bð Bó ðB÷J2ñ 2÷$_ò _rE   