B
    `                 @   s   d dl 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m
Z
 d dlZG dd	 d	Zed
 dddZejddded
 dddZejddded
 dddZejddded
 dddZdS )    N)TracebackType)Any)Callable)	Generator)Optional)Typec               @   s`   e Zd ZdZddddZddddd	Zd dd
dZeee	  ee	 ee
 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)
    N)returnc             C   s   d | _ d | _d S )N)args	_old_hook)self r   _/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/_pytest/threadexception.py__init__$   s    z"catch_threading_exception.__init__zthreading._ExceptHookArgs)r
   r	   c             C   s
   || _ d S )N)r
   )r   r
   r   r   r   _hook)   s    zcatch_threading_exception._hookc             C   s   t j| _| jt _| S )N)	threading
excepthookr   r   )r   r   r   r   	__enter__,   s    z#catch_threading_exception.__enter__)exc_typeexc_valexc_tbr	   c             C   s$   | j d k	st| j t_d | _ | `d S )N)r   AssertionErrorr   r   r
   )r   r   r   r   r   r   r   __exit__1   s    z"catch_threading_exception.__exit__)__name__
__module____qualname____doc__r   r   r   r   r   BaseExceptionr   r   r   r   r   r   r      s   
r   )NNN)r	   c           	   c   s~   t  n} d V  | jrp| jjd k	r,| jjj}nd}d| d}|dt| jj| jj| jj	7 }t
t| W d 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_hook=   s    r+   T)hookwrapperZtrylastc               c   s   t  E d H  d S )N)r+   r   r   r   r   pytest_runtest_setupN   s    r-   )r,   Ztryfirstc               c   s   t  E d H  d S )N)r+   r   r   r   r   pytest_runtest_callS   s    r.   c               c   s   t  E d H  d S )N)r+   r   r   r   r   pytest_runtest_teardownX   s    r/   )r   r"   r&   typesr   typingr   r   r   r   r   r(   r   r+   Zhookimplr-   r.   r/   r   r   r   r   <module>   s"   .