
    Ne                        d 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
Z
ddlmZ ddlmZ ddlmZ dd	lmZ ej                   j"                  Ze
j&                  j)                  ej*                  j-                  d
      d      ZddgddZd$dZ G d de      Zd%dZ G d d      Zd Z G d de      Z G d dee      Z  G d dee      Z! G d de      Z" G d  d!e"e      Z# G d" d#e"e      Z$y)&z(Testing utils for jupyter_client tests

    N)TemporaryDirectory)Dict)patch)AsyncKernelManager)AsyncMultiKernelManager)KernelManager)MultiKernelManagerwinWindows)reasoncatz{connection_file}zTest kernelargvdisplay_namec                    t        | |      }t        j                  |       |xs	 t        d   |xs	 t        d   d}t        |d      }t	        |d      5 }t        j                  ||       ddd       |S # 1 sw Y   |S xY w)z'install a kernel in a kernels directoryr   r   r   zkernel.jsonwN)pjoinosmakedirssample_kernel_jsonopenjsondump)kernels_dirr   namer   
kernel_dirkernel_json	json_filefs           </usr/lib/python3/dist-packages/jupyter_client/tests/utils.pyinstall_kernelr!      s    {D)JKK
2*62$J(:>(JK j-0I	i	 "		+q!""s   A66B c                   (    e Zd ZdZd Zd Zd Zd Zy)test_envzuSet Jupyter path variables to a temporary directory

    Useful as a context manager or with explicit start/stop
    c           
      X   t               x| _        }t        j                  t        j
                  t        |j                  d      t        |j                  d      t        |j                  d      t        |j                  d      dd      | _        | j                  j                          y )Njupyterjupyter_datajupyter_runtimeipython
test_var_1)JUPYTER_CONFIG_DIRJUPYTER_DATA_DIRJUPYTER_RUNTIME_DIR
IPYTHONDIR	TEST_VARS)
r   test_dirr   dictr   environr   r   	env_patchstart)selftds     r    r3   ztest_env.start1   s{    /11JJ&+BGGY&?$)"''>$B',RWW6G'H#BGGY7)	
 	    c                     | j                   j                          	 | j                  j                          y # t        t
        f$ r t        j                  dk7  r Y y w xY w)Nnt)r2   stopr/   cleanupPermissionErrorNotADirectoryErrorr   r   r4   s    r    r9   ztest_env.stop?   sO    	MM!!#!34 	ww$ 	s   7 #AAc                 N    | j                          | j                  j                  S N)r3   r/   r   r=   s    r    	__enter__ztest_env.__enter__G   s    

}}!!!r6   c                 $    | j                          y r?   )r9   )r4   exc_infos     r    __exit__ztest_env.__exit__K   s    		r6   N)__name__
__module____qualname____doc__r3   r9   r@   rC    r6   r    r#   r#   +   s    
"r6   r#   c                 j   ddl m} |t        } |j                  dd| i|}|j	                  t
              } ||d|       |j                  t
              } ||d|       |d   d   d	k(  sJ |j                  d
      s-|j                  t
              } ||d|       |d   d   | k(  sJ ||d   fS )zBwrapper for doing common steps for validating an execution request   )validate_messagecode)timeoutexecute_replystatuscontentexecution_statebusysilentexecute_inputrH   )test_message_specrK   KCexecuteget_shell_msgTIMEOUTget_iopub_msgget)rL   kckwargsrK   msg_idreplyrR   rT   s           r    rW   rW   O   s    3	zRZZ,T,V,FW-EUOV4G,DT8V,	?,-777::h(((9@Y'/47775###r6   c                   \     e Zd ZU eeef   ed<    fdZdeddfdZdedefdZ	d	dZ
 xZS )
RecordCallMixinmethod_callsc                 2    t        |   di | i | _        y )NrH   )super__init__rb   )r4   r]   	__class__s     r    re   zRecordCallMixin.__init__g   s    "6"r6   method_namereturnNc                 l    || j                   vrd| j                   |<   | j                   |xx   dz  cc<   y )Nr   rJ   rb   r4   rg   s     r    recordzRecordCallMixin.recordk   s6    d///-.Dk*+&!+&r6   c                 Z    || j                   vrd| j                   |<   | j                   |   S Nr   rj   rk   s     r    
call_countzRecordCallMixin.call_countp   s1    d///-.Dk*  --r6   c                 D    | j                   D ]  }d| j                   |<    y rn   rj   )r4   rl   s     r    reset_countszRecordCallMixin.reset_countsu   s'    '' 	*F()Df%	*r6   )rh   N)rD   rE   rF   r   strint__annotations__re   rl   ro   rq   __classcell__)rf   s   @r    ra   ra   d   sA    sCx. ,# ,$ ,
.c .c .
*r6   ra   c                       fd}|S )Nc                     | j                  j                         t        | j                  j                        } || g|i |} | g|i | |S r?   )rl   rD   getattr_superclass)r4   argsr]   methodrr   s        r    wrappedz"subclass_recorder.<locals>.wrapped{   sT    AJJ))1::64)$)&)	$   r6   rH   )r   r}   s   ` r    subclass_recorderr~   z   s     Nr6   c                       e Zd Zed        Zedd       Zedd       Zed        Zedd       Zedd       Z	ed        Z
ed	        Zedd
       Zedefd       Zed        Zeddefd       Zy)
KMSubclassc                      yz#Record call and defer to superclassNrH   )r4   kws     r    start_kernelzKMSubclass.start_kernel       r6   c                      yr   rH   )r4   nowrestarts      r    shutdown_kernelzKMSubclass.shutdown_kernel   r   r6   c                      yr   rH   )r4   r   r   s      r    restart_kernelzKMSubclass.restart_kernel   r   r6   c                      yr   rH   r=   s    r    interrupt_kernelzKMSubclass.interrupt_kernel   r   r6   c                      yr   rH   r4   r   s     r    request_shutdownzKMSubclass.request_shutdown   r   r6   Nc                      yr   rH   )r4   waittimepollintervalr   s       r    finish_shutdownzKMSubclass.finish_shutdown   r   r6   c                      yr   rH   )r4   
kernel_cmdr   s      r    _launch_kernelzKMSubclass._launch_kernel   r   r6   c                      yr   rH   r=   s    r    _kill_kernelzKMSubclass._kill_kernel   r   r6   c                      yr   rH   r   s     r    cleanup_resourceszKMSubclass.cleanup_resources   r   r6   signumc                      yr   rH   )r4   r   s     r    signal_kernelzKMSubclass.signal_kernel   r   r6   c                      yr   rH   r=   s    r    is_alivezKMSubclass.is_alive   r   r6   r   c                      yr   rH   r   s     r    _send_kernel_sigtermzKMSubclass._send_kernel_sigterm   r   r6   FFFNg?F)rD   rE   rF   r~   r   r   r   r   r   r   r   r   r   rs   r   r   boolr   rH   r6   r    r   r      s    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2C 2 2 2 2 2D 2 2r6   r   c                       e Zd ZdZeZy)SyncKMSubclassMUsed to test subclass hierarchies to ensure methods are called when expected.N)rD   rE   rF   rG   r   ry   rH   r6   r    r   r      s
    WKr6   r   c                       e Zd ZdZeZy)AsyncKMSubclassr   N)rD   rE   rF   rG   r   ry   rH   r6   r    r   r      s
    W$Kr6   r   c                       e Zd Zd Zed        Zed        Zedd       Zedd       Zedd       Z	ed        Z
edd	       Zedd
       Zedd       Zedd       Zy)MKMSubclassc                      yNz)jupyter_client.tests.utils.SyncKMSubclassrH   r=   s    r    _kernel_manager_class_defaultz)MKMSubclass._kernel_manager_class_default       :r6   c                      yr   rH   r4   	kernel_ids     r    
get_kernelzMKMSubclass.get_kernel   r   r6   c                      yr   rH   r   s     r    remove_kernelzMKMSubclass.remove_kernel   r   r6   Nc                      yr   rH   )r4   kernel_namer]   s      r    r   zMKMSubclass.start_kernel   r   r6   c                      yr   rH   )r4   r   r   r   s       r    r   zMKMSubclass.shutdown_kernel   r   r6   c                      yr   rH   )r4   r   r   s      r    r   zMKMSubclass.restart_kernel   r   r6   c                      yr   rH   r   s     r    r   zMKMSubclass.interrupt_kernel   r   r6   c                      yr   rH   r4   r   r   s      r    r   zMKMSubclass.request_shutdown   r   r6   c                      yr   rH   )r4   r   r   r   r   s        r    r   zMKMSubclass.finish_shutdown   r   r6   c                      yr   rH   r   s      r    r   zMKMSubclass.cleanup_resources   r   r6   c                      yr   rH   )r4   r   s     r    shutdown_allzMKMSubclass.shutdown_all   r   r6   r?   r   r   r   )rD   rE   rF   r   r~   r   r   r   r   r   r   r   r   r   r   rH   r6   r    r   r      s    ; 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2r6   r   c                       e Zd ZeZd Zy)SyncMKMSubclassc                      yr   rH   r=   s    r    r   z-SyncMKMSubclass._kernel_manager_class_default   r   r6   N)rD   rE   rF   r	   ry   r   rH   r6   r    r   r      s    $K;r6   r   c                       e Zd ZeZd Zy)AsyncMKMSubclassc                      y)Nz*jupyter_client.tests.utils.AsyncKMSubclassrH   r=   s    r    r   z.AsyncMKMSubclass._kernel_manager_class_default   s    ;r6   N)rD   rE   rF   r   ry   r   rH   r6   r    r   r      s    )K<r6   r   )NtestN) N)%rG   r   r   systempfiler   typingr   unittest.mockr   pytestjupyter_clientr   r   r   r	   pathjoinr   markskipifplatform
startswith
skip_win32r   r!   objectr#   rW   ra   r~   r   r   r   r   r   r   rH   r6   r    <module>r      s     	 
 '    - 2 ( -
[[ 7 7 >yQ
 '(! !v !H$** *,/2 /2d Z  %j"4 %*2/ *2Z;k#5 ;<{$; <r6   