U
    /e                     @   st   d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
 G dd	 d	eZG d
d deZG dd de
ZdS )zf Implements a fully blocking kernel client.

Useful for test suites and blocking terminal interfaces.
    N)EmptyQueue)Type   )InProcessChannel)InProcessKernelClientc                       sB   e Zd ZdZ fddZdd Zddd	Zd
d Zdd Z  Z	S )BlockingInProcessChannelzA blocking in-process channel.c                    s   t  j|| t | _dS )zInitialize the channel.N)super__init__r   	_in_queue)selfargskwds	__class__ @/tmp/pip-unpacked-wheel-g43y689f/ipykernel/inprocess/blocking.pyr
      s    z!BlockingInProcessChannel.__init__c                 C   s   | j | dS )z Call the handlers for a message.N)r   putr   msgr   r   r   call_handlers   s    z&BlockingInProcessChannel.call_handlersTNc                 C   s   |dkrd}| j ||S )z-Gets a message if there is one that is ready.Ni:	 )r   get)r   blocktimeoutr   r   r   get_msg#   s    z BlockingInProcessChannel.get_msgc                 C   s:   g }z| | jdd W q tk
r2   Y q6Y qX q|S )z*Get all messages that are currently ready.F)r   )appendr   r   )r   Zmsgsr   r   r   get_msgs+   s    z!BlockingInProcessChannel.get_msgsc                 C   s   | j   S )z*Is there a message that has been received?)r   empty)r   r   r   r   	msg_ready5   s    z"BlockingInProcessChannel.msg_ready)TN)
__name__
__module____qualname____doc__r
   r   r   r   r   __classcell__r   r   r   r   r      s   

r   c                   @   s   e Zd ZdZdd ZdS )BlockingInProcessStdInChannelz$A blocking in-process stdin channel.c                 C   sV   |d d }|dkrR| j jj}|d d }t|dtjd tj  | j |  dS )	zfOverridden for the in-process channel.

        This methods simply calls raw_input directly.
        headermsg_typeZinput_requestcontentprompt )endfileN)clientkernelZ_sys_raw_inputprintsys
__stdout__flushinput)r   r   r&   
_raw_inputr(   r   r   r   r   =   s    

z+BlockingInProcessStdInChannel.call_handlersN)r   r    r!   r"   r   r   r   r   r   r$   :   s   r$   c                   @   s0   e Zd ZdZeeZeeZeeZ	dd Z
dS )BlockingInProcessKernelClientz$A blocking in-process kernel client.c                 C   s   |    z| jjddd}W n tk
r0   Y q X |d dkr z| jjddd W n tk
rf   Y q X | | qvq z | jjddd}t|d  W qv tk
r   Y qY qvX qvdS )z,Wait for kernel info reply on shell channel.Tr   )r   r   r&   Zkernel_info_replyg?N)Zkernel_infoZshell_channelr   r   Ziopub_channelZ_handle_kernel_info_replyr.   r   r   r   r   wait_for_readyS   s"    
z,BlockingInProcessKernelClient.wait_for_readyN)r   r    r!   r"   r   r   Zshell_channel_classZiopub_channel_classr$   Zstdin_channel_classr5   r   r   r   r   r4   K   s
   r4   )r"   r/   queuer   r   Z	traitletsr   Zchannelsr   r,   r   r   r$   r4   r   r   r   r   <module>   s   #