+
    êhP%  ã                  ó<  € ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t^ RIt^ RIHt ]P                  R8  d   ^ RIHt M^ RIt]P$                  R R l4       t]P$                  RR R ll4       tR	 R
 ltR t]! ]]4      t]P$                  R 4       tR t]P$                  ]P4                  3R l4       t]P$                  RR]3R l4       tR t ! R R4      t ! R R]P>                  ]P@                  4      t ! R R]P@                  4      t!R# )é    )ÚannotationsN)ÚIterator)Útarfilec               ó    € V ^8„  d   QhRRRR/# )é   Údirzstr | os.PathLikeÚreturnúIterator[str | os.PathLike]© )Úformats   "ÚC/usr/lib/python3/dist-packages/setuptools/_vendor/jaraco/context.pyÚ__annotate__r      s   € ÷ ñ Ð ð Ð%@ñ ó    c              #  óÐ   "  € \         P                  ! 4       p\         P                  ! V 4        V x € \         P                  ! V4       R#   \         P                  ! T4       i ; i5i)z¡
>>> tmp_path = getfixture('tmp_path')
>>> with pushd(tmp_path):
...     assert os.getcwd() == os.fspath(tmp_path)
>>> assert os.getcwd() != os.fspath(tmp_path)
N)ÚosÚgetcwdÚchdir)r   Úorigs   & r   Úpushdr      s=   é € ô �9Š9‹;€DÜ‡H‚HˆS„MðØŠ	ä
�Š�ŽøŒ�Š��üs   ‚,A&¯A ³A&ÁA#Á#A&c               ó    € V ^8„  d   QhRRRR/# )r   Ú
target_dirzstr | os.PathLike | Noner	   r
   r   )r   s   "r   r   r   (   s   € ÷ "ñ "Ø-ð"à ñ"r   c              #  ó  "  € Vf@   \         P                  P                  V 4      P                  RR4      P                  RR4      p\         P                  ! V4        \
        P                  P                  V 4      p\        P                  ! VRR7      ;_uu_ 4       pVP                  V\        R7       RRR4       Vx € \        P                  ! V4       R#   + '       g   i     L,; i  \        P                  ! T4       i ; i5i)av  
Get a tarball, extract it, yield, then clean up.

>>> import urllib.request
>>> url = getfixture('tarfile_served')
>>> target = getfixture('tmp_path') / 'out'
>>> tb = tarball(url, target_dir=target)
>>> import pathlib
>>> with tb as extracted:
...     contents = pathlib.Path(extracted, 'contents.txt').read_text(encoding='utf-8')
>>> assert not os.path.exists(extracted)
Nz.tar.gzÚ z.tgzzr|*)ÚfileobjÚmode)ÚpathÚfilter)r   r   ÚbasenameÚreplaceÚmkdirÚurllibÚrequestÚurlopenr   ÚopenÚ
extractallÚstrip_first_componentÚshutilÚrmtree)Úurlr   ÚreqÚtfs   &&  r   Útarballr,   '   sµ   é € ð  ÒÜ—W‘W×%Ñ% cÓ*×2Ñ2°9¸bÓA×IÑIÈ&ÐRTÓUˆ
ô
 ‡H‚HˆZÔð"Ü�n‰n×$Ñ$ SÓ)ˆÜ�\Š\ #¨E×2Õ2°bØ�M‰M˜zÔ2GˆMÔH÷ 3àÒä�Š�jÖ!÷	 3×2ûô 	�Š�jÕ!üs6   ‚ADÁ?C+ ÂCÂ4C+ Ã DÃC(	Ã#C+ Ã+DÄDc               ó    € V ^8„  d   QhRRRR/# )r   Úmemberztarfile.TarInfor	   r   )r   s   "r   r   r   G   s   € ÷ ñ Øðð ñr   c                óL   € V P                   P                  R ^4      w  q n         V # )Ú/)ÚnameÚsplit)r.   r   Ú_s   && r   r&   r&   G   s#   € ð —[‘[×&Ñ& s¨AÓ.�N€A„{Ø€Mr   c                 óH   € R p\         P                  ! V\        V 4      4      # )aQ  
Compose any number of dependent context managers into a single one.

The last, innermost context manager may take arbitrary arguments, but
each successive context manager should accept the result from the
previous as a single parameter.

Like :func:`jaraco.functools.compose`, behavior works from right to
left, so the context manager should be indicated from outermost to
innermost.

Example, to create a context manager to change to a temporary
directory:

>>> temp_dir_as_cwd = _compose(pushd, temp_dir)
>>> with temp_dir_as_cwd() as dir:
...     assert os.path.samefile(os.getcwd(), dir)
c                ó@   a a€ V V3R  lp\         P                  ! V4      # )c            	   ?  óÊ   <"  € S! V / VB ;_uu_ 4       pS! V4      ;_uu_ 4       pVx € R R R 4       R R R 4       R #   + '       g   i     L; i  + '       g   i     R # ; i5i©Nr   )ÚargsÚkwargsÚsavedÚresÚinnerÚouters   *,  €€r   ÚcomposedÚ/_compose.<locals>.compose_two.<locals>.composedd   s@   øé € Ù˜Ð' ×'Ò'¨5±%¸·,´,À#Ø’	÷ 3?×'Ñ'·,·,ú×'×'Ð'üs/   ƒA#”A¥<	ªA²
A#¼AÁAÁA 	Á	A#)Ú
contextlibÚcontextmanager)r<   r=   r>   s   ff r   Úcompose_twoÚ_compose.<locals>.compose_twoc   s   ù€ ö	ô ×(Ò(¨Ó2Ð2r   )Ú	functoolsÚreduceÚreversed)ÚcmgrsrB   s   * r   Ú_composerH   O   s    € ò(3ô ×Ò˜K¬°%«Ó9Ð9r   c            	   /  ó2  "  € \         P                  ! R \        ^R7       VP                  R\        4      p\        V / VB ;_uu_ 4       q2! V4      ;_uu_ 4       pVx € RRR4       RRR4       R#   + '       g   i     L; i  + '       g   i     R# ; i5i)zBtarball_context is deprecated. Use tarball or tarball_cwd instead.©Ú
stacklevelr   N)ÚwarningsÚwarnÚDeprecationWarningÚpopr   r,   )r8   r9   Ú	pushd_ctxÚtballr   s   *,   r   Útarball_contextrR   p   sj   é € ä‡M‚MØLÜØõð
 —
‘
˜7¤EÓ*€IÜ	�$Ð	!˜&×	!Ò	! U¨I°e×,<Ô,<ÀØŠ	÷ -=×	!Ñ	!×,<×,<ú×	!×	!Ð	!üs6   ‚ABÁ	BÁA0	ÁBÁ&
BÁ0B Á;BÂB	Â	Bc                ó†   € \         P                  ! R\        ^R7       V RR p\        RRRR7      pVP	                  VR4      # )	zì
Given a URL or filename, infer the compression code for tar.

>>> infer_compression('http://foo/bar.tar.gz')
'z'
>>> infer_compression('http://foo/bar.tgz')
'z'
>>> infer_compression('file.bz')
'j'
>>> infer_compression('file.xz')
'J'
z3infer_compression is deprecated with no replacementrJ   NÚzÚjÚJ)ÚgzÚbzÚxzéþÿÿÿ)rL   rM   rN   ÚdictÚget)r)   Úcompression_indicatorÚmappings   &  r   Úinfer_compressionr_   |   sG   € ô ‡M‚MØ=ÜØõð    ˜HÐÜ�c˜c cÔ*€Gà�;‰;Ð,¨cÓ2Ð2r   c              #  ól   "  € \         P                  ! 4       p Vx € V ! V4       R#   T ! T4       i ; i5i)a@  
Create a temporary directory context. Pass a custom remover
to override the removal behavior.

>>> import pathlib
>>> with temp_dir() as the_dir:
...     assert os.path.isdir(the_dir)
...     _ = pathlib.Path(the_dir).joinpath('somefile').write_text('contents', encoding='utf-8')
>>> assert not os.path.exists(the_dir)
N)ÚtempfileÚmkdtemp)ÚremoverÚtemp_dirs   & r   rd   rd   •   s/   é € ô ×ÒÓ!€HðØŠá�Öø‰�Õüs   ‚4™' �
4§
1±4Tc              #  óR  "  € RV 9   d   RMRpV! 4       ;_uu_ 4       pVRW.pV'       d   VP                  RV.4       \        \        P                  P                  R4      pV'       d   TMRp\
        P                  ! WhR7       Vx € RRR4       R#   + '       g   i     R# ; i5i)z�
Check out the repo indicated by url.

If dest_ctx is supplied, it should be a context manager
to yield the target directory for the check out.
ÚgitÚhgÚclonez--branchÚwN)Ústdout)Úextendr$   r   r   ÚdevnullÚ
subprocessÚ
check_call)	r)   ÚbranchÚquietÚdest_ctxÚexeÚrepo_dirÚcmdrl   rj   s	   &&&&     r   Úrepo_contextru   ¨   sx   é € ð ˜C”<‰% T€CÙ	�Œ�xØ�G˜SÐ+ˆßØ�J‰J˜
 FÐ+Ô,Ü”r—w‘w—‘¨Ó,ˆß!‘ tˆÜ×Ò˜cÕ1ØŠ÷ 
��Šüs   ‚B'�A,BÂ	
B'ÂB$	Â	B'c                 óf   € \         P                  ! R\        ^R7       \        P                  ! 4       # )a(  
A null context suitable to stand in for a meaningful context.

>>> with null() as value:
...     assert value is None

This context is most useful when dealing with two or more code
branches but only some need a context. Wrap the others in a null
context to provide symmetry across all options.
z.null is deprecated. Use contextlib.nullcontextrJ   )rL   rM   rN   r@   Únullcontextr   r   r   Únullrx   »   s*   € ô ‡M‚MØ8ÜØõô
 ×!Ò!Ó#Ð#r   c                  ó‚   € ] tR t^ÎtRtRt]33R ltR t]	R 4       t
]	R 4       t]	R 4       tR tR	 tR
]/R ltR tRtR# )ÚExceptionTrapaA  
A context manager that will catch certain exceptions and provide an
indication they occurred.

>>> with ExceptionTrap() as trap:
...     raise Exception()
>>> bool(trap)
True

>>> with ExceptionTrap() as trap:
...     pass
>>> bool(trap)
False

>>> with ExceptionTrap(ValueError) as trap:
...     raise ValueError("1 + 1 is not 3")
>>> bool(trap)
True
>>> trap.value
ValueError('1 + 1 is not 3')
>>> trap.tb
<traceback object at ...>

>>> with ExceptionTrap(ValueError) as trap:
...     raise Exception()
Traceback (most recent call last):
...
Exception

>>> bool(trap)
False
Nc                	ó   € Wn         R # r7   )Ú
exceptions)Úselfr|   s   &&r   Ú__init__ÚExceptionTrap.__init__ò   s   € Ø$Žr   c                	ó   € V # r7   r   ©r}   s   &r   Ú	__enter__ÚExceptionTrap.__enter__õ   ó   € Øˆr   c                	ó(   € V P                   ^ ,          # ©r   ©Úexc_infor�   s   &r   ÚtypeÚExceptionTrap.typeø   ó   € à�}‰}˜QÕÐr   c                	ó(   € V P                   ^,          # )é   r‡   r�   s   &r   ÚvalueÚExceptionTrap.valueü   r‹   r   c                	ó(   € V P                   ^,          # )r   r‡   r�   s   &r   ÚtbÚExceptionTrap.tb   r‹   r   c                	ór   € V^ ,          pT;'       d    \        W P                  4      pV'       d   Wn        V# r†   )Ú
issubclassr|   rˆ   )r}   rˆ   r‰   Úmatchess   &*  r   Ú__exit__ÚExceptionTrap.__exit__  s.   € Ø˜�{ˆØ×<Ð<œ: d¯O©OÓ<ˆßØ$ŒMØˆr   c                	ó,   € \        V P                  4      # r7   )Úboolr‰   r�   s   &r   Ú__bool__ÚExceptionTrap.__bool__  s   € Ü�D—I‘I‹Ðr   Ú_testc               óN   a aa€ \         P                  ! S4      VVV 3R l4       pV# )aQ  
Wrap func and replace the result with the truth
value of the trap (True if an exception occurred).

First, give the decorator an alias to support Python 3.8
Syntax.

>>> raises = ExceptionTrap(ValueError).raises

Now decorate a function that always fails.

>>> @raises
... def fail():
...     raise ValueError('failed')
>>> fail()
True
c                 ó–   <€ \        SP                  4      ;_uu_ 4       pS! V / VB  R R R 4       S! X4      #   + '       g   i     L; ir7   )rz   r|   )r8   r9   Útraprœ   Úfuncr}   s   *, €€€r   ÚwrapperÚ%ExceptionTrap.raises.<locals>.wrapper!  s9   ø€ ä˜tŸ™×/Ô/°4Ù�dÐ%˜fÒ%÷ 0á˜“;Ð÷ 0×/ús	   Ÿ	8¸A	)rD   Úwraps)r}   r    rœ   r¡   s   ffd r   ÚraisesÚExceptionTrap.raises  s'   ú€ ô& 
�Š˜Ó	ö	ó 
ð	ð
 ˆr   c                óD   € V P                  V\        P                  R7      # )aJ  
Wrap func and replace the result with the truth
value of the trap (True if no exception).

First, give the decorator an alias to support Python 3.8
Syntax.

>>> passes = ExceptionTrap(ValueError).passes

Now decorate a function that always fails.

>>> @passes
... def fail():
...     raise ValueError('failed')

>>> fail()
False
)rœ   )r¤   ÚoperatorÚnot_)r}   r    s   &&r   ÚpassesÚExceptionTrap.passes)  s   € ð& �{‰{˜4¤x§}¡}ˆ{Ó5Ð5r   )rˆ   r|   )NNN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rˆ   Ú	Exceptionr~   r‚   Úpropertyr‰   rŽ   r‘   r–   rš   r™   r¤   r©   Ú__static_attributes__r   r   r   rz   rz   Î   su   † ñðB  €Hà#, ,ô %òð ñ ó ð ð ñ ó ð ð ñ ó ð òòð Dô ö66r   rz   c                  ó   € ] tR tRtRtRtR# )Úsuppressi?  z‡
A version of contextlib.suppress with decorator support.

>>> @suppress(KeyError)
... def key_error():
...     {}['']
>>> key_error()
r   N)r«   r¬   r­   r®   r¯   r²   r   r   r   r´   r´   ?  s   † õr   r´   c                  ó0   € ] tR tRtRtRR ltR tR tRtR# )	Úon_interruptiJ  aÊ  
Replace a KeyboardInterrupt with SystemExit(1)

>>> def do_interrupt():
...     raise KeyboardInterrupt()
>>> on_interrupt('error')(do_interrupt)()
Traceback (most recent call last):
...
SystemExit: 1
>>> on_interrupt('error', code=255)(do_interrupt)()
Traceback (most recent call last):
...
SystemExit: 255
>>> on_interrupt('suppress')(do_interrupt)()
>>> with __import__('pytest').raises(KeyboardInterrupt):
...     on_interrupt('ignore')(do_interrupt)()
c               	ó   € Wn         W n        R # r7   ©ÚactionÚcode)r}   r¹   rº   s   ""&r   r~   Úon_interrupt.__init__]  s   € ØŒØŽ	r   c                	ó   € V # r7   r   r�   s   &r   r‚   Úon_interrupt.__enter__a  r„   r   c                	ó¨   € V\         Jg   V P                  R 8X  d   R# V P                  R8X  d   \        V P                  4      VhV P                  R8H  # )ÚignoreNÚerrorr´   )ÚKeyboardInterruptr¹   Ú
SystemExitrº   )r}   ÚexctypeÚexcinstÚexctbs   &&&&r   r–   Úon_interrupt.__exit__d  sE   € ØÔ+Ó+¨t¯{©{¸hÔ/FÙØ�[‰[˜GÔ#Ü˜TŸY™YÓ'¨WÐ4Ø�{‰{˜jÑ(Ð(r   r¸   N)rÀ   r�   )	r«   r¬   r­   r®   r¯   r~   r‚   r–   r²   r   r   r   r¶   r¶   J  s   † ñô$òö)r   r¶   )é   é   r7   )"Ú
__future__r   r@   rD   r§   r   r'   rm   Úsysra   Úurllib.requestr!   rL   Útypingr   Úversion_infoÚ	backportsr   rA   r   r,   r&   rH   Útarball_cwdrR   r_   r(   rd   ru   rx   rz   r´   ÚContextDecoratorr¶   r   r   r   Ú<module>rÑ      s*  ðÝ "ã Û Û Û 	Û Û Û 
Û Û Û Ý ð ×Ñ�gÔÞ!ãð ×Ñôó ðð  ×Ñö"ó ð"õ>ò:ñ< �u˜gÓ&€ð ×Ññó ðò3ð2 ×ÑØ—]‘]ó ó ðð$ ×ÑØ!¨¸ó ó ðò$$÷&n6ñ n6ôbˆz×"Ñ" J×$?Ñ$?ô ô)�:×.Ñ.ö )r   