B
    U[                 @   s   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 yddlmZ W n  ek
rt   ddlmZ Y nX ddlZddlmZ dZd	Zdadad
d ZdddZd ddZdd Zedd Zdd Zdd Zd!ddZdd Zdd ZdS )"z%utilities for testing IPython kernels    )print_functionN)contextmanager)PIPESTDOUT)Empty)manager<      c              K   sR   yt  }W n tk
r*   ttj}Y nX | t|td t	j
f dti| S )zostart a new kernel, and return its Manager and Client

    Integrates with our output capturing for tests.
    )stdoutstderrZstartup_timeout)noseiptest_stdstreams_filenoAttributeErroropenosdevnullupdatedictr   r   start_new_kernelSTARTUP_TIMEOUT)kwargsr
    r   4lib/python3.7/site-packages/ipykernel/tests/utils.pyr      s    r   c          	   C   sj   ddl m} | dkrt} xL| j| jfD ]<}x6y|jddd}W n tk
rT   P Y q,X || q,W q&W dS )z'flush any messages waiting on the queue   )validate_messageNTg?)blocktimeout)test_message_specr   KCZshell_channeliopub_channelget_msgr   )kcr   Zchannelmsgr   r   r   flush_channels,   s    r#    c             K   s   ddl m} |dkrt}|jf d| i|}|jtd}||d| |jtd}||d| |d d	 d
kspt|ds|jtd}||d| |d d | kst|d drt	d
|d d tjd ||d fS )zBwrapper for doing common steps for validating an execution requestr   )r   Ncode)r   Zexecute_replystatuscontentexecution_statebusyZsilentexecute_input	traceback
)file)r   r   r   executeZget_shell_msgTIMEOUTZget_iopub_msgAssertionErrorgetprintjoinsysr   )r%   r!   r   r   Zmsg_idZreplyr)   r*   r   r   r   r.   <   s     
r.   c               C   s*   t dkrt \a att ntt tS )zCstart the global kernel (if it isn't running) and return its clientN)KMr   r   atexitregisterstop_global_kernelr#   r   r   r   r   start_global_kernelT   s
    
r9   c               c   s   t  V  dS )zContext manager for the global kernel instance

    Should be used for most kernel tests

    Returns
    -------
    kernel_client: connected KernelClient instance
    N)r9   r   r   r   r   kernel^   s    
r:   c                s     fdd} j |_  j|_|S )z.Decorator for tests that use the global kernelc           	      s   t  }  |  W d Q R X d S )N)r:   )r!   )test_fr   r   wrapped_testl   s    z!uses_kernel.<locals>.wrapped_test)__doc____name__)r;   r<   r   )r;   r   uses_kernelj   s    r?   c               C   s,   t   da tdkrdS tjdd dadS )z4Stop the global shared kernel instance, if it existsNT)Znow)r   Zstop_channelsr5   Zshutdown_kernelr   r   r   r   r8   s   s    r8   c             C   s:   t tdttj}t|td}| dk	r.| |d< tjf |S )zContext manager for a new kernel in a subprocess

    Should only be used for tests where the kernel must not be re-used.

    Returns
    -------
    kernel_client: connected KernelClient instance
    r   )r
   r   NZextra_arguments)	getattrr   r   r   r   r   r   r   Z
run_kernel)argvr
   r   r   r   r   
new_kernel}   s
    	rB   c             C   s   d}d}x| j ddd}|d }|d }|dkr@|d d	kr@P q
|d d
kr
|d dkrf||d 7 }q|d dkr||d 7 }qtd|d  q
q
W ||fS )z%assemble stdout/err from an executionr$   Tr   )r   r   msg_typer'   r&   r(   idlestreamnamer
   textr   zbad stream: %r)r    KeyError)Ziopubr
   r   r"   rC   r'   r   r   r   assemble_output   s     rI   c             C   s@   x:| j jddd}|d }|d }|dkr|d dkrP qW d S )	NTr   )r   r   rC   r'   r&   r(   rD   )r   r    )r!   r"   rC   r'   r   r   r   wait_for_idle   s    rJ   )N)r$   N)N) r=   Z
__future__r   r6   r   r4   
contextlibr   
subprocessr   r   Zqueuer   ImportErrorZQueuer   Zjupyter_clientr   r   r/   r5   r   r   r#   r.   r9   r:   r?   r8   rB   rI   rJ   r   r   r   r   <module>   s4   


	

