U
    X7hP%                     @  sZ  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Zd dlZd dlmZ ejdk rd dlmZ nd dlZejdddd	d
Zejd&dddddZdddddZdd ZeeeZejdd Zdd ZejejfddZejddefddZdd ZG d d! d!ZG d"d# d#ejej ZG d$d% d%ej Z!dS )'    )annotationsN)Iterator)      )tarfilezstr | os.PathLikezIterator[str | os.PathLike])dirreturnc              	   c  s.   t  }t |  z
| V  W 5 t | X dS )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   orig r   [/var/www/formularioweb/env/lib/python3.8/site-packages/setuptools/_vendor/jaraco/context.pypushd   s
    	

r   zstr | os.PathLike | None)
target_dirr   c              	   c  s~   |dkr$t j| dddd}t | z>tj	| }t
j|dd}|j|td W 5 Q R X |V  W 5 t| X dS )a  
    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shutilrmtreeurllibZrequestZurlopenr   open
extractallstrip_first_component)urlr   reqZtfr   r   r   tarball'   s    

r!   ztarfile.TarInfo)memberr   c                 C  s   | j dd\}| _ | S )N/   )namesplit)r"   r   _r   r   r   r   G   s    r   c                  G  s   dd }t |t| S )a  
    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                   s    fdd}t |S )Nc               
   ?  s4    | | }|}|V  W 5 Q R X W 5 Q R X d S Nr   )argskwargsZsavedresinnerouterr   r   composedd   s    z/_compose.<locals>.compose_two.<locals>.composed)
contextlibcontextmanager)r-   r.   r/   r   r,   r   compose_twoc   s    z_compose.<locals>.compose_two)	functoolsreducereversed)Zcmgrsr2   r   r   r   _composeO   s    r6   c               
   o  sP   t jdtdd |dt}t| | }||}|V  W 5 Q R X W 5 Q R X d S )NzBtarball_context is deprecated. Use tarball or tarball_cwd instead.   
stacklevelr   )warningswarnDeprecationWarningpopr   r!   )r)   r*   Z	pushd_ctxZtballr   r   r   r   tarball_contextp   s    r>   c                 C  s6   t jdtdd | dd }tdddd	}||dS )
a  
    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 replacementr7   r8   NzjJ)gzZbzxz)r:   r;   r<   dictget)r   Zcompression_indicatormappingr   r   r   infer_compression|   s    rH   c                 c  s"   t  }z
|V  W 5 | | X dS )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)Zremovertemp_dirr   r   r   rK      s    
rK   Tc           	   	   c  sr   d| krdnd}| R}|d| |g}|r6| d|g ttjjd}|rL|nd}tj||d |V  W 5 Q R X dS )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.
    gitZhgZclonez--branchwN)stdout)extendr   r	   r   devnull
subprocess
check_call)	r   branchquietZdest_ctxZexeZrepo_dircmdrP   rN   r   r   r   repo_context   s    rV   c                   C  s   t jdtdd t S )aD  
    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.nullcontextr7   r8   )r:   r;   r<   r0   nullcontextr   r   r   r   null   s    rX   c                   @  st   e Zd ZdZdZeffddZdd Zedd Z	ed	d
 Z
edd Zdd Zdd ZedddZdd ZdS )ExceptionTrapa  
    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
    )NNNc                 C  s
   || _ d S r(   )
exceptions)selfrZ   r   r   r   __init__   s    zExceptionTrap.__init__c                 C  s   | S r(   r   r[   r   r   r   	__enter__   s    zExceptionTrap.__enter__c                 C  s
   | j d S Nr   exc_infor]   r   r   r   type   s    zExceptionTrap.typec                 C  s
   | j d S )Nr$   r`   r]   r   r   r   value   s    zExceptionTrap.valuec                 C  s
   | j d S )Nr7   r`   r]   r   r   r   tb   s    zExceptionTrap.tbc                 G  s&   |d }|ot || j}|r"|| _|S r_   )
issubclassrZ   ra   )r[   ra   rb   matchesr   r   r   __exit__  s
    zExceptionTrap.__exit__c                 C  s
   t | jS r(   )boolrb   r]   r   r   r   __bool__  s    zExceptionTrap.__bool___testc                  s   t  fdd}|S )a  
        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(   t j}| | W 5 Q R X  |S r(   )rY   rZ   )r)   r*   traprk   funcr[   r   r   wrapper!  s    z%ExceptionTrap.raises.<locals>.wrapper)r3   wraps)r[   rn   rk   ro   r   rm   r   raises  s    zExceptionTrap.raisesc                 C  s   | j |tjdS )a  
        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
        rj   )rq   operatornot_)r[   rn   r   r   r   passes)  s    zExceptionTrap.passesN)__name__
__module____qualname____doc__ra   	Exceptionr\   r^   propertyrb   rc   rd   rg   ri   rh   rq   rt   r   r   r   r   rY      s   !


rY   c                   @  s   e Zd ZdZdS )suppressz
    A version of contextlib.suppress with decorator support.

    >>> @suppress(KeyError)
    ... def key_error():
    ...     {}['']
    >>> key_error()
    N)ru   rv   rw   rx   r   r   r   r   r{   ?  s   r{   c                   @  s*   e Zd ZdZdddZdd Zdd	 Zd
S )on_interrupta  
    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)()
    errorr$   c                C  s   || _ || _d S r(   )actioncode)r[   r~   r   r   r   r   r\   ]  s    zon_interrupt.__init__c                 C  s   | S r(   r   r]   r   r   r   r^   a  s    zon_interrupt.__enter__c                 C  s6   |t k	s| jdkrd S | jdkr,t| j|| jdkS )Nignorer}   r{   )KeyboardInterruptr~   
SystemExitr   )r[   exctypeexcinstexctbr   r   r   rg   d  s
    
zon_interrupt.__exit__N)r}   r$   )ru   rv   rw   rx   r\   r^   rg   r   r   r   r   r|   J  s   
r|   )N)"
__future__r   r0   r3   rr   r	   r   rQ   sysrI   Zurllib.requestr   r:   typingr   version_info	backportsr   r1   r   r!   r   r6   Ztarball_cwdr>   rH   r   rK   rV   rX   rY   r{   ContextDecoratorr|   r   r   r   r   <module>   sB   
 

q