B
    U²È[ü  ã               @   sž   d Z ddlZyddlmZmZ W n$ ek
rD   ddlmZmZ Y nX 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)ÚQueueÚEmpty)ÚTypeé   )ÚInProcessChannel)ÚInProcessKernelClientc                   s>   e Zd Z‡ fdd„Zdd„ Zddd„Zd	d
„ Zdd„ Z‡  ZS )ÚBlockingInProcessChannelc                s   t t| ƒj||Ž tƒ | _d S )N)Úsuperr   Ú__init__r   Ú	_in_queue)ÚselfÚargsÚkwds)Ú	__class__© ú;lib/python3.7/site-packages/ipykernel/inprocess/blocking.pyr
      s    z!BlockingInProcessChannel.__init__c             C   s   | j  |¡ d S )N)r   Z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 }x2y|  | jdd¡ W q tk
r2   P Y qX qW |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__r
   r   r   r   r   Ú__classcell__r   r   )r   r   r      s
   

r   c               @   s   e Zd Zdd„ ZdS )ÚBlockingInProcessStdInChannelc             C   sV   |d d }|dkrR| j jj}|d d }t|dtjd tj ¡  | j  |ƒ ¡ dS )	zg Overridden for the in-process channel.

        This methods simply calls raw_input directly.
        ÚheaderÚmsg_typeZinput_requestZcontentÚpromptÚ )ÚendÚfileN)ÚclientZkernelZ_sys_raw_inputÚprintÚsysÚ
__stdout__ÚflushÚinput)r   r   r"   Z
_raw_inputr#   r   r   r   r   ;   s    

z+BlockingInProcessStdInChannel.call_handlersN)r   r   r   r   r   r   r   r   r    :   s   r    c               @   s,   e Zd ZeeƒZeeƒZeeƒZdd„ Z	dS )ÚBlockingInProcessKernelClientc             C   sn   x*| j jdd}|d dkr|  |¡ P qW x<y | jjddd}t|d ƒ W q. tk
rd   P Y q.X q.W d S )NT)r   r"   Zkernel_info_replygš™™™™™É?)r   r   )Zshell_channelr   Z_handle_kernel_info_replyZiopub_channelr(   r   )r   r   r   r   r   Úwait_for_readyO   s    
z,BlockingInProcessKernelClient.wait_for_readyN)
r   r   r   r   r   Zshell_channel_classZiopub_channel_classr    Zstdin_channel_classr.   r   r   r   r   r-   H   s   r-   )Ú__doc__r)   Zqueuer   r   ÚImportErrorZ	traitletsr   Zchannelsr   r'   r   r   r    r-   r   r   r   r   Ú<module>   s    