U
    /e                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZ ddlmZ ddlm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 G dd deZG dd deZee dS )zAn in-process kernel    N)contextmanager)InteractiveShellABC)AnyEnumInstanceListTypedefault)IPythonKernel)
json_clean)ZMQInteractiveShell   )BackgroundSocketIOPubThread	OutStream   )INPROCESS_KEY)DummySocketc                       sJ  e Zd ZU dZeedddZedddZe	 Z
e	 Ze	 ZeddZeedZeeZeed	< eedZed	d
d ZeeZeed< eddd ZeedZ fddZ fddZdd Zdd Zdd Zd/ddZ e!dd Z"dd Z#ed d!d" Z$ed#d$d% Z%ed&d'd( Z&ed)d*d+ Z'ed,d-d. Z(  Z)S )0InProcessKernelzAn in-process kernel.z0ipykernel.inprocess.client.InProcessKernelClientT
allow_none)ZtkZgtkZwxZqtZqt4inliner   )default_value iopub_threadc                 C   s   t | j}|  |S N)r   _underlying_iopub_socketstart)selfthreadr   r   @/tmp/pip-unpacked-wheel-g43y689f/ipykernel/inprocess/ipkernel.py_default_iopub_thread8   s    
z%InProcessKernel._default_iopub_threadiopub_socketc                 C   s   | j jS r   )r   Zbackground_socketr   r   r   r    _default_iopub_socket@   s    z%InProcessKernel._default_iopub_socketc                    s.   t  jf | | jj| jdgd | | j_dS )zInitialize the kernel.Zmessage_sent)namesN)super__init__r   Zobserve_io_dispatchshellkernel)r   Ztraits	__class__r   r    r'   F   s    zInProcessKernel.__init__c              	      s.   |    t |||I dH  W 5 Q R X dS )z&Override for temporary IO redirection.N)_redirected_ior&   execute_request)r   streamidentparentr+   r   r    r.   M   s    
zInProcessKernel.execute_requestc                 C   s   d| j _dS )z1Override registration of dispatchers for streams.FN)r)   Zexit_nowr#   r   r   r    r   R   s    zInProcessKernel.startc                 C   s   dS )z-The in-process kernel doesn't abort requests.Nr   r#   r   r   r    _abort_queuesV   s    zInProcessKernel._abort_queuesc                    s   dS )z.No need to flush control queues for in-processNr   r#   r   r   r    _flush_control_queueZ   s    z$InProcessKernel._flush_control_queueFc                 C   s   d | _ tj  tj  tt||d}| jd||}| j	D ](}|jj|d d kr@|j
|  qxq@td dS | j d kr|j
  qx| j S )N)promptpasswordZinput_requestheadersessionz'No frontend found for raw_input request )raw_input_strsysstderrflushstdoutr   dictr7   msg	frontendsZstdin_channelcall_handlersloggingerrorZprocess_events)r   r4   r0   r1   r5   contentr?   frontendr   r   r    _input_request^   s    




zInProcessKernel._input_requestc              	   c   s@   t jt j }}z| j| j t _t _dV  W 5 || t _t _X dS )z&Temporarily redirect IO to the kernel.N)r:   r=   r;   )r   Z
sys_stdoutZ
sys_stderrr   r   r    r-   x   s
    
zInProcessKernel._redirected_ioc                 C   sF   | j jdk	st| jj| j jjdd\}}| jD ]}|j| q0dS )z/Called when a message is sent to the IO socket.NF)copy)	r"   Z	io_threadAssertionErrorr7   recvsocketr@   Ziopub_channelrA   )r   Zchanger0   r?   rE   r   r   r    r(      s    
zInProcessKernel._io_dispatchlogc                 C   s
   t tS r   )rB   	getLogger__name__r#   r   r   r    _default_log   s    zInProcessKernel._default_logr7   c                 C   s   ddl m} || tdS )Nr   )Session)r1   key)Zjupyter_client.sessionrO   r   )r   rO   r   r   r    _default_session   s    z InProcessKernel._default_sessionshell_classc                 C   s   t S r   )InProcessInteractiveShellr#   r   r   r    _default_shell_class   s    z$InProcessKernel._default_shell_classr=   c                 C   s   t | j| jdddS )Nr=   FZwatchfdr   r7   r   r#   r   r   r    _default_stdout   s    zInProcessKernel._default_stdoutr;   c                 C   s   t | j| jdddS )Nr;   FrU   rV   r#   r   r   r    _default_stderr   s    zInProcessKernel._default_stderr)F)*rM   
__module____qualname____doc__r   r   r@   r   guir   r9   r=   r;   r   rR   r   r   r   r   __annotations__Zshell_streamr	   r!   r   r"   r$   Zstdin_socketr'   r.   r   r2   r3   rF   r   r-   r(   rN   rQ   rT   rW   rX   __classcell__r   r   r+   r    r      sF   








	



r   c                       sP   e Zd ZU dZedddZeed< dddZd fd	d
	Z	d fdd	Z
  ZS )rS   z An in-process interactive shell.z,ipykernel.inprocess.ipkernel.InProcessKernelTr   r*   Nc                 C   s   |s| j j}|| _dS )z&Enable GUI integration for the kernel.N)r*   r\   Zactive_eventloopr   r\   r   r   r    
enable_gui   s    z$InProcessInteractiveShell.enable_guic                    s   |s| j j}t |S )z-Enable matplotlib integration for the kernel.)r*   r\   r&   enable_matplotlibr_   r+   r   r    ra      s    z+InProcessInteractiveShell.enable_matplotlibFc                    s   |s| j j}t |||S )z"Activate pylab support at runtime.)r*   r\   r&   enable_pylab)r   r\   Z
import_allZwelcome_messager+   r   r    rb      s    z&InProcessInteractiveShell.enable_pylab)N)N)NTF)rM   rY   rZ   r[   r   r*   r   r]   r`   ra   rb   r^   r   r   r+   r    rS      s   
 
rS   )r[   rB   r:   
contextlibr   ZIPython.core.interactiveshellr   Z	traitletsr   r   r   r   r   r	   Zipykernel.ipkernelr
   Zipykernel.jsonutilr   Zipykernel.zmqshellr   Ziostreamr   r   r   	constantsr   rJ   r   r   rS   registerr   r   r   r    <module>   s     