U
    _B                  	   @   s  d Z ddlZddlZddlZddlmZ ddlmZ ddddd	d
dddg	Zedg7 Zej	dd dkrnej
ZnedefddiZdd Zdd ZG dd deZG dd	 d	eZG dd deZdd ZG dd deZG dd deZG d d deZG d!d deZG d"d deZej	d d#kZer@d$d% Zd&d' Znd(d% Zd)d' Zzdd*lmZ W n ek
rz   eZ Y n
X d+d, Z G d-d
 d
eZ!G d.d de!Z"G d/d deZ#dS )0zAcontextlib2 - backports and enhancements to the contextlib module    N)dequewrapscontextmanagerclosingnullcontextAbstractContextManagerContextDecorator	ExitStackredirect_stdoutredirect_stderrsuppressContextStack   )      ABC	__slots__ c                 C   s0   | |krd S | |  | jD ]}t|| q|S N)append	__bases___classic_mro)CresultBr   r   J/home/toby/toby_env/lib/python3.8/site-packages/pip/_vendor/contextlib2.pyr      s    

r   c                 G   sv   z
| j }W n" tk
r,   tt| g }Y nX |D ]>}|D ],}||jkr:|j| d krbt    S  q2q:t  S q2dS )NT)__mro__AttributeErrortupler   __dict__NotImplemented)r   methodsmromethodr   r   r   r   _check_methods$   s    


r%   c                   @   s2   e Zd ZdZdd Zejdd Zedd Z	dS )	r   z,An abstract base class for context managers.c                 C   s   | S )z0Return `self` upon entering the runtime context.r   selfr   r   r   	__enter__8   s    z AbstractContextManager.__enter__c                 C   s   dS )z9Raise any exception triggered within the runtime context.Nr   )r'   exc_type	exc_value	tracebackr   r   r   __exit__<   s    zAbstractContextManager.__exit__c                 C   s   | t krt|ddS tS )z<Check whether subclass is considered a subclass of this ABC.r(   r,   )r   r%   r!   )clsr   r   r   r   __subclasshook__A   s    z'AbstractContextManager.__subclasshook__N)
__name__
__module____qualname____doc__r(   abcabstractmethodr,   classmethodr.   r   r   r   r   r   5   s   
c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r	   zJA base class or mixin that enables context managers to work as decorators.c                 C   s   t dt |  S )a  Returns the context manager used to actually wrap the call to the
        decorated function.

        The default implementation just returns *self*.

        Overriding this method allows otherwise one-shot context managers
        like _GeneratorContextManager to support use as decorators via
        implicit recreation.

        DEPRECATED: refresh_cm was never added to the standard library's
                    ContextDecorator API
        z2refresh_cm was never added to the standard library)warningswarnDeprecationWarning_recreate_cmr&   r   r   r   
refresh_cmL   s    zContextDecorator.refresh_cmc                 C   s   | S )a6  Return a recreated instance of self.

        Allows an otherwise one-shot context manager like
        _GeneratorContextManager to support use as
        a decorator via implicit recreation.

        This is a private interface just for _GeneratorContextManager.
        See issue #11647 for details.
        r   r&   r   r   r   r9   ]   s    
zContextDecorator._recreate_cmc                    s   t   fdd}|S )Nc               
      s*       | |W  5 Q R  S Q R X d S r   )r9   argskwdsfuncr'   r   r   innerj   s    
z(ContextDecorator.__call__.<locals>.innerr   )r'   r?   r@   r   r>   r   __call__i   s    zContextDecorator.__call__N)r/   r0   r1   r2   r:   r9   rA   r   r   r   r   r	   I   s   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )_GeneratorContextManagerz%Helper for @contextmanager decorator.c                 C   sJ   |||| _ |||  | _| _| _t|dd }|d kr@t| j}|| _d S )Nr2   )genr?   r<   r=   getattrtyper2   )r'   r?   r<   r=   docr   r   r   __init__t   s    
z!_GeneratorContextManager.__init__c                 C   s   |  | j| j| jS r   )	__class__r?   r<   r=   r&   r   r   r   r9      s    z%_GeneratorContextManager._recreate_cmc                 C   s.   zt | jW S  tk
r(   tdY nX d S )Nzgenerator didn't yield)nextrC   StopIterationRuntimeErrorr&   r   r   r   r(      s    z"_GeneratorContextManager.__enter__c              
   C   s   |d kr8zt | j W n tk
r,   Y d S X tdn|d krF| }z| j||| tdW n tk
r } z||k	 W Y S d }~X Y nj tk
r } z0||krW Y "dS tr|j|krW Y 
dS  W 5 d }~X Y n   t d |k	r Y nX d S )Nzgenerator didn't stopz#generator didn't stop after throw()F   )	rI   rC   rJ   rK   throw_HAVE_EXCEPTION_CHAINING	__cause__sysexc_info)r'   rE   valuer+   excr   r   r   r,      s,    


z!_GeneratorContextManager.__exit__N)r/   r0   r1   r2   rG   r9   r(   r,   r   r   r   r   rB   q   s
   rB   c                    s   t   fdd}|S )a  @contextmanager decorator.

    Typical usage:

        @contextmanager
        def some_generator(<arguments>):
            <setup>
            try:
                yield <value>
            finally:
                <cleanup>

    This makes this:

        with some_generator(<arguments>) as <variable>:
            <body>

    equivalent to this:

        <setup>
        try:
            <variable> = <value>
            <body>
        finally:
            <cleanup>

    c                     s   t  | |S r   )rB   r;   r?   r   r   helper   s    zcontextmanager.<locals>.helperr   )r?   rU   r   rT   r   r      s    c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r   a2  Context to automatically close something at the end of a block.

    Code like this:

        with closing(<module>.open(<arguments>)) as f:
            <block>

    is equivalent to this:

        f = <module>.open(<arguments>)
        try:
            <block>
        finally:
            f.close()

    c                 C   s
   || _ d S r   thing)r'   rW   r   r   r   rG      s    zclosing.__init__c                 C   s   | j S r   rV   r&   r   r   r   r(      s    zclosing.__enter__c                 G   s   | j   d S r   )rW   close)r'   rQ   r   r   r   r,      s    zclosing.__exit__Nr/   r0   r1   r2   rG   r(   r,   r   r   r   r   r      s   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )_RedirectStreamNc                 C   s   || _ g | _d S r   )_new_target_old_targets)r'   
new_targetr   r   r   rG      s    z_RedirectStream.__init__c                 C   s*   | j tt| j tt| j| j | jS r   )r\   r   rD   rP   _streamsetattrr[   r&   r   r   r   r(      s    z_RedirectStream.__enter__c                 C   s   t t| j| j  d S r   )r_   rP   r^   r\   popr'   exctypeexcinstexctbr   r   r   r,     s    z_RedirectStream.__exit__)r/   r0   r1   r^   rG   r(   r,   r   r   r   r   rZ      s   rZ   c                   @   s   e Zd ZdZdZdS )r   aA  Context manager for temporarily redirecting stdout to another file.

        # How to send help() to stderr
        with redirect_stdout(sys.stderr):
            help(dir)

        # How to write help() to a file
        with open('help.txt', 'w') as f:
            with redirect_stdout(f):
                help(pow)
    stdoutNr/   r0   r1   r2   r^   r   r   r   r   r     s   c                   @   s   e Zd ZdZdZdS )r   zCContext manager for temporarily redirecting stderr to another file.stderrNrf   r   r   r   r   r     s   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r   a?  Context manager to suppress specified exceptions

    After the exception is suppressed, execution proceeds with the next
    statement following the with statement.

         with suppress(FileNotFoundError):
             os.remove(somefile)
         # Execution still resumes here if the file was already removed
    c                 G   s
   || _ d S r   )_exceptions)r'   
exceptionsr   r   r   rG   )  s    zsuppress.__init__c                 C   s   d S r   r   r&   r   r   r   r(   ,  s    zsuppress.__enter__c                 C   s   |d k	ot || jS r   )
issubclassrh   ra   r   r   r   r,   /  s    
zsuppress.__exit__NrY   r   r   r   r   r     s   
r   c                    s    fdd}|S )Nc                    s4   | j }||krd S |d ks*| kr$q*|} q || _ d S r   )__context__)new_excold_excexc_context	frame_excr   r   _fix_exception_context@  s    z3_make_context_fixer.<locals>._fix_exception_contextr   )rp   rq   r   ro   r   _make_context_fixer?  s    rr   c                 C   s<   z| d j }| d W n  tk
r6   || d _  Y nX d S )NrL   )rk   BaseException)exc_details	fixed_ctxr   r   r   _reraise_with_existing_contextO  s    

rv   c                 C   s   dd S )Nc                 S   s   d S r   r   )rl   rm   r   r   r   <lambda>[      z%_make_context_fixer.<locals>.<lambda>r   ro   r   r   r   rr   Z  s    c                 C   s   | \}}}t d d S )Nz!raise exc_type, exc_value, exc_tb)exec)rt   r)   r*   exc_tbr   r   r   rv   _  s    
)InstanceTypec                 C   s   t | }|tkr| jS |S r   )rE   r{   rH   )objZobj_typer   r   r   	_get_typek  s    r}   c                   @   sX   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdS )r
   a  Context manager for dynamic management of a stack of exit callbacks

    For example:

        with ExitStack() as stack:
            files = [stack.enter_context(open(fname)) for fname in filenames]
            # All opened files will automatically be closed at the end of
            # the with statement, even if attempts to open files later
            # in the list raise an exception

    c                 C   s   t  | _d S r   )r   _exit_callbacksr&   r   r   r   rG     s    zExitStack.__init__c                 C   s   t |  }| j|_t | _|S )z?Preserve the context stack by transferring it to a new instance)rE   r~   r   )r'   	new_stackr   r   r   pop_all  s    
zExitStack.pop_allc                    s"    fdd} |_ | | dS )z:Helper to correctly register callbacks to __exit__ methodsc                     s    f|  S r   r   )rt   cmcm_exitr   r   _exit_wrapper  s    z.ExitStack._push_cm_exit.<locals>._exit_wrapperN)__self__push)r'   r   r   r   r   r   r   _push_cm_exit  s    zExitStack._push_cm_exitc                 C   sD   t |}z
|j}W n  tk
r2   | j| Y nX | || |S )a  Registers a callback with the standard __exit__ method signature

        Can suppress exceptions the same way __exit__ methods can.

        Also accepts any object with an __exit__ method (registering a call
        to the method instead of the object itself)
        )r}   r,   r   r~   r   r   )r'   exit_cb_typeexit_methodr   r   r   r     s    

zExitStack.pushc                    s$    fdd}|_ | | S )z\Registers an arbitrary callback and arguments.

        Cannot suppress exceptions.
        c                    s     d S r   r   )r)   rS   tbr<   callbackr=   r   r   r     s    z)ExitStack.callback.<locals>._exit_wrapper)__wrapped__r   )r'   r   r<   r=   r   r   r   r   r     s    
zExitStack.callbackc                 C   s(   t |}|j}||}| || |S )zEnters the supplied context manager

        If successful, also pushes its __exit__ method as a callback and
        returns the result of the __enter__ method.
        )r}   r,   r(   r   )r'   r   _cm_type_exitr   r   r   r   enter_context  s
    
zExitStack.enter_contextc                 C   s   |  ddd dS )z$Immediately unwind the context stackN)r,   r&   r   r   r   rX     s    zExitStack.closec                 C   s   | S r   r   r&   r   r   r   r(     s    zExitStack.__enter__c           	      G   s   |d d k	}t  d }t|}d}d}| jr| j }z|| rNd}d}d}W q(   t  }||d |d  d}|}Y q(X q(|rt| |o|S )Nr   rL   FT)NNN)rP   rQ   rr   r~   r`   rv   )	r'   rt   received_excrp   rq   suppressed_excpending_raisecbnew_exc_detailsr   r   r   r,     s(    
zExitStack.__exit__N)r/   r0   r1   r2   rG   r   r   r   r   r   rX   r(   r,   r   r   r   r   r
   s  s   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
r   z+Backwards compatibility alias for ExitStackc                    s   t dt tt|   d S )Nz*ContextStack has been renamed to ExitStack)r6   r7   r8   superr   rG   r&   rH   r   r   rG     s    zContextStack.__init__c                 C   s
   |  |S r   )r   )r'   r   r   r   r   register_exit  s    zContextStack.register_exitc                 O   s   | j |f||S r   )r   )r'   r   r<   r=   r   r   r   register  s    zContextStack.registerc                 C   s   |   S r   )r   r&   r   r   r   preserve  s    zContextStack.preserve)	r/   r0   r1   r2   rG   r   r   r   __classcell__r   r   r   r   r     s
   c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
r   aM  Context manager that does no additional processing.
    Used as a stand-in for a normal context manager, when a particular
    block of code is only sometimes used with a normal context manager:
    cm = optional_cm if condition else nullcontext()
    with cm:
        # Perform operation, using optional_cm if condition is True
    Nc                 C   s
   || _ d S r   enter_result)r'   r   r   r   r   rG     s    znullcontext.__init__c                 C   s   | j S r   r   r&   r   r   r   r(     s    znullcontext.__enter__c                 G   s   d S r   r   )r'   excinfor   r   r   r,     s    znullcontext.__exit__)NrY   r   r   r   r   r     s   
)$r2   r3   rP   r6   collectionsr   	functoolsr   __all__version_infor   Z_abc_ABCABCMetaobjectr   r%   r   r	   rB   r   r   rZ   r   r   r   rN   rr   rv   typesr{   ImportErrorrE   r}   r
   r   r   r   r   r   r   <module>   sT      

(H"

q