U
    42i                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d dlZd dlZe
rxd dlmZ G d	d
 d
ZddddZejdddddddZejdddddddZejdddddddZdS )    )annotationsN)TracebackType)Any)Callable)	Generator)TYPE_CHECKING)Selfc                   @  sP   e Zd ZdZddddZddddd	Zd
dddZdddddddZdS )catch_threading_exceptiona  Context manager catching threading.Thread exception using
    threading.excepthook.

    Storing exc_value using a custom hook can create a reference cycle. The
    reference cycle is broken explicitly when the context manager exits.

    Storing thread using a custom hook can resurrect it if it is set to an
    object which is being finalized. Exiting the context manager clears the
    stored object.

    Usage:
        with threading_helper.catch_threading_exception() as cm:
            # code spawning a thread which raises an exception
            ...
            # check the thread exception: use cm.args
            ...
        # cm.args attribute no longer exists at this point
        # (to break a reference cycle)
    Nonereturnc                 C  s   d | _ d | _d S N)args	_old_hookself r   ;/tmp/pip-unpacked-wheel-7n2p7kht/_pytest/threadexception.py__init__)   s    z"catch_threading_exception.__init__zthreading.ExceptHookArgs)r   r   c                 C  s
   || _ d S r   )r   )r   r   r   r   r   _hook-   s    zcatch_threading_exception._hookr   c                 C  s   t j| _| jt _| S r   )	threading
excepthookr   r   r   r   r   r   	__enter__0   s    z#catch_threading_exception.__enter__ztype[BaseException] | NonezBaseException | NonezTracebackType | None)exc_typeexc_valexc_tbr   c                 C  s$   | j d k	st| j t_d | _ | `d S r   )r   AssertionErrorr   r   r   )r   r   r   r   r   r   r   __exit__5   s    z"catch_threading_exception.__exit__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r	      s
   r	   zGenerator[None]r   c                  c  s   t  t} z
d V  W 5 | jrt| jjd kr*dn| jjj}d| d}|dt| jj| jj| jj	7 }t
t| X W 5 Q R X d S )Nz	<unknown>zException in thread z

 )r	   r   threadnamejoin	tracebackformat_exceptionr   	exc_valueexc_tracebackwarningswarnpytestZ%PytestUnhandledThreadExceptionWarning)cmZthread_namemsgr   r   r   thread_exception_runtest_hookA   s    
r/   T)wrapperZtrylastc                   c  s   t  E d H  d S r   r/   r   r   r   r   pytest_runtest_setupU   s    r2   )r0   Ztryfirstc                   c  s   t  E d H  d S r   r1   r   r   r   r   pytest_runtest_callZ   s    r3   c                   c  s   t  E d H  d S r   r1   r   r   r   r   pytest_runtest_teardown_   s    r4   )
__future__r   r   r&   typesr   typingr   r   r   r   r*   r,   Ztyping_extensionsr   r	   r/   Zhookimplr2   r3   r4   r   r   r   r   <module>   s&   -