o
    Ee$                     @   s   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ejdd Z	ejdde	fddZ
dd Zejejfdd	Zejdd
efddZej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 )    Nc              	   c   s8    t  }t |  z| V  W t | dS t | w )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)dirorig r   e/var/www/bmteknikk.ddns.net/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/context.pypushd   s   	
r	   c                 c   s   |du rt j| dddd}|du r tjtjdd}nt	dt
 |djdi t  zMd	}d
}d||f}||jddt| it  || |V  W d   n1 s^w   Y  W |djdi t  dS W |djdi t  dS |djdi t  w )z
    Get a tarball, extract it, change to that directory, yield, then
    clean up.
    `runner` is the function to invoke commands.
    `pushd` is a context manager for changing the directory.
    Nz.tar.gz z.tgzT)shellzrunner parameter is deprecatedzmkdir {target_dir}zwget {url} -O -z7tar x{compression} --strip-components=1 -C {target_dir}z | compressionzrm -Rf {target_dir}r   )r   pathbasenamereplace	functoolspartial
subprocess
check_callwarningswarnDeprecationWarningformatvarsjoininfer_compression)url
target_dirrunnerr	   getterextractcmdr   r   r   tarball_context   s$   
2r!   c                 C   s&   | 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'
    NzjJ)gzbzxz)dictget)r   compression_indicatormappingr   r   r   r   :   s   r   c                 c   s*    t  }z
|V  W | | dS | | w )aN  
    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')
    >>> assert not os.path.exists(the_dir)
    N)tempfilemkdtemp)removertemp_dirr   r   r   r0   N   s
   r0   Tc           	      c   s    d| v rdnd}| /}|d| |g}|r| d|g ttjjd}|r'|nd}tj||d |V  W d   dS 1 s>w   Y  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.
    githgclonez--branchwN)stdout)extendopenr   r   devnullr   r   )	r   branchquietdest_ctxexerepo_dirr    r8   r5   r   r   r   repo_contexta   s   "r>   c                   c   s    dV  dS )z
    A null context suitable to stand in for a meaningful context.

    >>> with null() as value:
    ...     assert value is None
    Nr   r   r   r   r   nullt   s   
r?   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 N)
exceptions)selfrB   r   r   r   __init__      
zExceptionTrap.__init__c                 C      | S rA   r   rC   r   r   r   	__enter__      zExceptionTrap.__enter__c                 C   
   | j d S Nr   exc_inforG   r   r   r   type      
zExceptionTrap.typec                 C   rJ   )N   rL   rG   r   r   r   value   rO   zExceptionTrap.valuec                 C   rJ   )N   rL   rG   r   r   r   tb   rO   zExceptionTrap.tbc                 G   s&   |d }|ot || j}|r|| _|S rK   )
issubclassrB   rM   )rC   rM   rN   matchesr   r   r   __exit__   s
   zExceptionTrap.__exit__c                 C   s
   t | jS rA   )boolrN   rG   r   r   r   __bool__   rE   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                     sF   t j}| i | W d     |S 1 sw   Y   |S rA   )r@   rB   )argskwargstraprZ   funcrC   r   r   wrapper   s   
z%ExceptionTrap.raises.<locals>.wrapper)r   wraps)rC   r_   rZ   r`   r   r^   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
        rY   )rb   operatornot_)rC   r_   r   r   r   passes   s   zExceptionTrap.passesN)__name__
__module____qualname____doc__rM   	ExceptionrD   rH   propertyrN   rQ   rS   rV   rX   rW   rb   re   r   r   r   r   r@      s    !


r@   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)rf   rg   rh   ri   r   r   r   r   rl      s    rl   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)()
    errorrP   c                 C   s   || _ || _d S rA   )actioncode)rC   ro   rp   r   r   r   rD     s   
zon_interrupt.__init__c                 C   rF   rA   r   rG   r   r   r   rH     rI   zon_interrupt.__enter__c                 C   s6   |t us	| jdkrd S | jdkrt| j|| jdkS )Nignorern   rl   )KeyboardInterruptro   
SystemExitrp   )rC   exctypeexcinstexctbr   r   r   rV     s
   

zon_interrupt.__exit__N)rn   rP   )rf   rg   rh   ri   rD   rH   rV   r   r   r   r   rm      s    

rm   )r   r   
contextlibr   r-   shutilrc   r   contextmanagerr	   r!   r   rmtreer0   r>   r?   r@   rl   ContextDecoratorrm   r   r   r   r   <module>   s,    


q