B
    U[                 @   s   d Z ddlm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 ddlmZmZmZ G dd deZG dd deZee dS )zAn in-process kernel    )contextmanagerN)InteractiveShellABC)
json_clean)AnyEnumInstanceListTypedefault)IPythonKernel)ZMQInteractiveShell   )INPROCESS_KEY)DummySocket   )	OutStreamBackgroundSocketIOPubThreadc                   s.  e Zd ZeedddZedddZe Z	e Z
e ZeddZe Ze ZeedZeeZedd	d
 ZeeZ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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 )-InProcessKernelz0ipykernel.inprocess.client.InProcessKernelClientT)
allow_none)ZtkZgtkZwxZqtZqt4inliner   )Zdefault_value iopub_threadc             C   s   t | j}|  |S )N)r   _underlying_iopub_socketstart)selfZthreadr   r   ;lib/python3.7/site-packages/ipykernel/inprocess/ipkernel.py_default_iopub_thread9   s    
z%InProcessKernel._default_iopub_threadiopub_socketc             C   s   | j jS )N)r   Zbackground_socket)r   r   r   r   _default_iopub_socketA   s    z%InProcessKernel._default_iopub_socketc                s2   t t| jf | | jj| jdgd | | j_d S )NZmessage_sent)names)superr   __init__r   Zobserve_io_dispatchshellkernel)r   Ztraits)	__class__r   r   r"   G   s    zInProcessKernel.__init__c          	      s,   |    tt| ||| W dQ R X dS )z( Override for temporary IO redirection. N)_redirected_ior!   r   execute_request)r   streamidentparent)r&   r   r   r(   M   s    
zInProcessKernel.execute_requestc             C   s   d| j _dS )z3 Override registration of dispatchers for streams. FN)r$   Zexit_now)r   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   r   _abort_queueV   s    zInProcessKernel._abort_queueFc             C   s   d | _ tj  tj  tt||d}| jd||}x@| j	D ]&}|jj|d d krB|j
| P qBW td t S x| j d kr|j
  q~W | j S )N)promptpasswordZinput_requestheadersessionz'No frontend found for raw_input request)raw_input_strsysstderrflushstdoutr   dictr0   msg	frontendsZstdin_channelcall_handlersloggingerrorstrZprocess_events)r   r-   r*   r+   r.   Zcontentr7   frontendr   r   r   _input_requestZ   s    


zInProcessKernel._input_requestc             c   s8   t jt j }}| j| j t _t _dV  || t _t _dS )z0 Temporarily redirect IO to the kernel.
        N)r2   r5   r3   )r   Z
sys_stdoutZ
sys_stderrr   r   r   r'   t   s    zInProcessKernel._redirected_ioc             C   s6   | j j| jdd\}}x| jD ]}|j| qW dS )z9 Called when a message is sent to the IO socket.
        F)copyN)r0   Zrecvr   r8   Ziopub_channelr9   )r   Zchanger*   r7   r=   r   r   r   r#      s    zInProcessKernel._io_dispatchlogc             C   s
   t tS )N)r:   Z	getLogger__name__)r   r   r   r   _default_log   s    zInProcessKernel._default_logr0   c             C   s   ddl m} || tdS )Nr   )Session)r+   key)Zjupyter_client.sessionrC   r   )r   rC   r   r   r   _default_session   s    z InProcessKernel._default_sessionshell_classc             C   s   t S )N)InProcessInteractiveShell)r   r   r   r   _default_shell_class   s    z$InProcessKernel._default_shell_classr5   c             C   s   t | j| jdS )Nr5   )r   r0   r   )r   r   r   r   _default_stdout   s    zInProcessKernel._default_stdoutr3   c             C   s   t | j| jdS )Nr3   )r   r0   r   )r   r   r   r   _default_stderr   s    zInProcessKernel._default_stderr)F)(rA   
__module____qualname__r   r   r8   r   guir   r1   r5   r3   r	   rF   Zshell_streamsZcontrol_streamr   r   r   r   r
   r   r   r   r   Zstdin_socketr"   r(   r   r,   r>   r   r'   r#   rB   rE   rH   rI   rJ   __classcell__r   r   )r&   r   r      s:   




	r   c                   sB   e Zd ZedddZdddZd fdd	Zd fd
d	Z  ZS )rG   z,ipykernel.inprocess.ipkernel.InProcessKernelT)r   Nc             C   s0   ddl m} |s| jj}||| jd || _dS )z&Enable GUI integration for the kernel.r   )
enable_gui)r%   N)Zipykernel.eventloopsrO   r%   rM   Zactive_eventloop)r   rM   rO   r   r   r   rO      s
    z$InProcessInteractiveShell.enable_guic                s   |s| j j}tt| |S )z-Enable matplotlib integration for the kernel.)r%   rM   r!   rG   enable_matplotlib)r   rM   )r&   r   r   rP      s    z+InProcessInteractiveShell.enable_matplotlibFc                s    |s| j j}tt| |||S )z"Activate pylab support at runtime.)r%   rM   r!   rG   enable_pylab)r   rM   Z
import_allZwelcome_message)r&   r   r   rQ      s    z&InProcessInteractiveShell.enable_pylab)N)N)NTF)	rA   rK   rL   r   r%   rO   rP   rQ   rN   r   r   )r&   r   rG      s
   
	rG   )__doc__
contextlibr   r:   r2   ZIPython.core.interactiveshellr   Zipykernel.jsonutilr   Z	traitletsr   r   r   r   r	   r
   Zipykernel.ipkernelr   Zipykernel.zmqshellr   Z	constantsr   Zsocketr   Ziostreamr   r   r   r   rG   registerr   r   r   r   <module>   s     
