a
    <+b/                     @   s   d Z ddl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lm	Z	 ddl
mZ ddlmZ ddlmZ d	Zd
Zdadadd Zd%ddZedf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G d#d$ d$eZdS )(z%utilities for testing IPython kernels    N)TemporaryDirectory)time)contextmanager)Empty)STDOUT)manager<   d   c               	   K   sL   t | d< zddl}| | d< W n ttfy6   Y n0 tjf dti| S )zostart a new kernel, and return its Manager and Client

    Integrates with our output capturing for tests.
    stderrr   NstdoutZstartup_timeout)r   noseiptest_stdstreams_filenoImportErrorAttributeErrorr   start_new_kernelSTARTUP_TIMEOUT)kwargsr    r   4lib/python3.9/site-packages/ipykernel/tests/utils.pyr      s    r   c              	   C   s^   ddl m} | du rt} | j| jfD ]4}z|dd}W n tyL   Y q$Y q(0 || q(q$dS )z'flush any messages waiting on the queue   validate_messageNg?timeout)test_message_specr   KCZget_shell_msgget_iopub_msgr   )kcr   get_msgmsgr   r   r   flush_channels)   s    
r    shellc                 C   sd   t  }t| d| d}||d}|d d |kr4q`td| d|  t  }||| 8 }|}q|S )NZget_Z_msgr   Zparent_headermsg_idzIgnoring reply not to z: )r   getattrprint)r   r"   r   ZchannelZt0r   replyt1r   r   r   	get_reply9   s    
r'    c                 K   s   ddl m} |du rt}|jf d| i|}t||t}||d| |jtd}||d| |d d	 d
kspJ |ds|jtd}||d| |d d | ksJ |d drtd	|d d t
jd ||d fS )zBwrapper for doing common steps for validating an execution requestr   r   NcodeZexecute_replyr   statuscontentexecution_statebusyZsilentexecute_input	traceback
)file)r   r   r   executer'   TIMEOUTr   getr$   joinsysr
   )r)   r   r   r   r"   r%   r-   r.   r   r   r   r2   H   s     
r2   c                   C   s*   t du 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_kernel`   s
    
r;   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)r;   r   r   r   r   kernelj   s    
r<   c                    s     fdd} j |_  j|_|S )z.Decorator for tests that use the global kernelc                     s2   t  }  |  W d    n1 s$0    Y  d S N)r<   )r   test_fr   r   wrapped_testx   s    z!uses_kernel.<locals>.wrapped_test)__doc____name__)r?   r@   r   r>   r   uses_kernelv   s    rC   c                   C   s,   t   da tdu 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_channelsr7   Zshutdown_kernelr   r   r   r   r:      s    r:   c              	   C   sX   dt i}zddl}| |d< W n ttfy6   Y n0 | durH| |d< tjf i |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   Nr   Zextra_arguments)r   r   r   r   r   r   Z
run_kernel)argvr   r   r   r   r   
new_kernel   s    	rE   c                 C   s   d}d}| dd}|d }|d }|dkr:|d dkr:qq|d d	kr|d
 dkr`||d 7 }q|d
 dkrz||d 7 }qt d|d
  qq||fS )z%assemble stdout/err from an executionr(   r   r   msg_typer+   r*   r,   idlestreamnamer   textr
   zbad stream: %r)KeyError)r   r   r
   r   rF   r+   r   r   r   assemble_output   s    
rL   c                 C   s8   | j dd}|d }|d }|dkr |d dkr q4q d S )Nr   r   rF   r+   r*   r,   rG   )r   )r   r   rF   r+   r   r   r   wait_for_idle   s
    rM   c                       s,   e Zd ZdZ fddZ fddZ  ZS )TemporaryWorkingDirectoryz
    Creates a temporary directory and sets the cwd to that directory.
    Automatically reverts to previous cwd upon cleanup.
    Usage example:

        with TemporaryWorkingDirectory() as tmpdir:
            ...
    c                    s    t  | _t | j t  S r=   )osgetcwdold_wdchdirrI   super	__enter__)self	__class__r   r   rT      s    
z#TemporaryWorkingDirectory.__enter__c                    s   t | j t |||S r=   )rO   rR   rQ   rS   __exit__)rU   excvaluetbrV   r   r   rX      s    z"TemporaryWorkingDirectory.__exit__)rB   
__module____qualname__rA   rT   rX   __classcell__r   r   rV   r   rN      s   rN   )N)r(   N)N) rA   r8   rO   platformr6   Ztempfiler   r   
contextlibr   Zqueuer   
subprocessr   Zjupyter_clientr   r   r3   r7   r   r   r    r'   r2   r;   r<   rC   r:   rE   rL   rM   rN   r   r   r   r   <module>   s6   



	

	