B
    U[                 @   sj   d Z ddlmZ ddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZmZ G dd	 d	e
Zee d
S )z A client for in-process kernels.    )DummySocket)TypeInstancedefault)KernelClientABC)KernelClient   )InProcessChannelInProcessHBChannelc                   s   e Zd ZdZeeZeeZeeZee	Z
edddZeddd Z fdd	Z fd
dZedd Zedd Zedd Zedd Zddi dfddZd,ddZd-ddZd.ddZd/d d!Zd"d# Zd0d$d%Zd&d' Zd(d) Zd*d+ Z  Z S )1InProcessKernelClienta  A client for an in-process kernel.

    This class implements the interface of
    `jupyter_client.clientabc.KernelClientABC` and allows
    (asynchronous) frontends to be used seamlessly with an in-process kernel.

    See `jupyter_client.client.KernelClient` for docstrings.
    z,ipykernel.inprocess.ipkernel.InProcessKernelT)Z
allow_noneZblocking_classc             C   s   ddl m} |S )Nr   )BlockingInProcessKernelClient)Zblockingr   )selfr    r   9lib/python3.7/site-packages/ipykernel/inprocess/client.py_default_blocking_class5   s    z-InProcessKernelClient._default_blocking_classc                s   t t|  }| j|d< |S )Nkernel)superr   get_connection_infor   )r   d)	__class__r   r   r   :   s    
z)InProcessKernelClient.get_connection_infoc                s    t t|   | jj|  d S )N)r   r   start_channelsr   Z	frontendsappend)r   argskwargs)r   r   r   r   ?   s    z$InProcessKernelClient.start_channelsc             C   s   | j d kr| | | _ | j S )N)Z_shell_channelshell_channel_class)r   r   r   r   shell_channelC   s    
z#InProcessKernelClient.shell_channelc             C   s   | j d kr| | | _ | j S )N)Z_iopub_channeliopub_channel_class)r   r   r   r   iopub_channelI   s    
z#InProcessKernelClient.iopub_channelc             C   s   | j d kr| | | _ | j S )N)Z_stdin_channelstdin_channel_class)r   r   r   r   stdin_channelO   s    
z#InProcessKernelClient.stdin_channelc             C   s   | j d kr| | | _ | j S )N)Z_hb_channelhb_channel_class)r   r   r   r   
hb_channelU   s    
z InProcessKernelClient.hb_channelFNc             C   sD   |d kr| j }t|||||d}| jd|}| | |d d S )N)codesilentstore_historyuser_expressionsallow_stdinZexecute_requestheadermsg_id)r&   dictsessionmsg_dispatch_to_kernel)r   r"   r#   r$   r%   r&   contentr+   r   r   r   execute^   s    
zInProcessKernelClient.executec             C   s@   |d krt |}t||d}| jd|}| | |d d S )N)r"   
cursor_posZcomplete_requestr'   r(   )lenr)   r*   r+   r,   )r   r"   r/   r-   r+   r   r   r   completei   s    
zInProcessKernelClient.completer   c             C   sB   |d krt |}t|||d}| jd|}| | |d d S )N)r"   r/   detail_levelZinspect_requestr'   r(   )r0   r)   r*   r+   r,   )r   r"   r/   r2   r-   r+   r   r   r   inspectq   s    
zInProcessKernelClient.inspectrangec             K   s:   t f |||d|}| jd|}| | |d d S )N)rawoutputhist_access_typeZhistory_requestr'   r(   )r)   r*   r+   r,   )r   r5   r6   r7   kwdsr-   r+   r   r   r   history{   s
    
zInProcessKernelClient.historyc             C   s   t dd S )Nz!Cannot shutdown in-process kernel)NotImplementedError)r   Zrestartr   r   r   shutdown   s    zInProcessKernelClient.shutdownc             C   s"   | j d}| | |d d S )zRequest kernel info.Zkernel_info_requestr'   r(   )r*   r+   r,   )r   r+   r   r   r   kernel_info   s    
z!InProcessKernelClient.kernel_infoc             C   s<   |dkri }n
t |d}| jd|}| | |d d S )z6Request a dictionary of valid comms and their targets.N)target_nameZcomm_info_requestr'   r(   )r)   r*   r+   r,   )r   r=   r-   r+   r   r   r   	comm_info   s    

zInProcessKernelClient.comm_infoc             C   s   | j d krtd|| j _d S )Nz*Cannot send input reply. No kernel exists.)r   RuntimeErrorZraw_input_str)r   stringr   r   r   input   s    
zInProcessKernelClient.inputc             C   s(   | j dd|i}| | |d d S )NZis_complete_requestr"   r'   r(   )r*   r+   r,   )r   r"   r+   r   r   r   is_complete   s    
z!InProcessKernelClient.is_completec             C   sb   | j }|dkrtdt }| j|| | }||| | jj|dd\}}| j	| dS )z: Send a message to the kernel and handle a reply.
        Nz&Cannot send request. No kernel exists.F)copy)
r   r?   r   r*   sendZrecv_multipartZdispatch_shellZrecvr   Zcall_handlers_later)r   r+   r   streamZ	msg_partsZidentsZ	reply_msgr   r   r   r,      s    z)InProcessKernelClient._dispatch_to_kernel)N)Nr   )TFr4   )F)N)!__name__
__module____qualname____doc__r   r	   r   r   r   r
   r    r   r   r   r   r   r   propertyr   r   r   r!   r.   r1   r3   r9   r;   r<   r>   rA   rB   r,   __classcell__r   r   )r   r   r      s2   	







r   N)rI   Zipykernel.inprocess.socketr   Z	traitletsr   r   r   Zjupyter_client.clientabcr   Zjupyter_client.clientr   Zchannelsr	   r
   r   registerr   r   r   r   <module>   s   	 