U
    `»{j½  ã                   @  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   úV/var/www/html/bwave/python/venv/lib/python3.8/site-packages/_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,   Útyping_extensionsr   r	   r/   Zhookimplr2   r3   r4   r   r   r   r   Ú<module>   s&   -