U
    puf‰  ã                   @   s^   d Z ddlZddlZddlZddlmZ ejddd„ƒZejddd„ƒZG d	d
„ d
ej	ƒZ
dS )zImplementation of coroutines without using ``async def``/``await`` keywords.

``@asyncio.coroutine`` and ``yield from`` are  used here instead.
é    N)ÚEOFc              
   #   sÒ   |   ¡ }|d k	r|S | jjs^tƒ ‰ ˆ  | ¡ t ¡  ‡ fdd„| j¡E d H \}‰ ˆ |f| j_n| jj\‰ }ˆ  | ¡ | ¡  zt 	ˆ j
|¡E d H W S  tjk
rÌ } z| ¡  |  |¡ W Y ¢S d }~X Y nX d S )Nc                      s   ˆ S ©N© r   ©Úpwr   ú</tmp/pip-unpacked-wheel-v5brguv_/pexpect/_async_pre_await.pyÚ<lambda>   ó    zexpect_async.<locals>.<lambda>)Zexisting_dataÚspawnZasync_pw_transportÚPatternWaiterÚset_expecterÚasyncioZget_event_loopZconnect_read_pipeZresume_readingÚwait_forÚfutÚTimeoutErrorÚpause_readingÚtimeout)Úexpecterr   ÚidxÚ	transportÚer   r   r   Úexpect_async   s&    

 ÿ
r   éÿÿÿÿc                 c   s®   g }| j  |d ¡ |dd … D ]2}| j|ddE d H  | | j j¡ | j  |¡ q | j|ddE d H }|dkrš| j  tj¡ | jdddE d H  tdƒ‚d 	|| j jg ¡S )Nr   é   T)r   Zasync_z1Continuation prompt found - input was incomplete:Ú )
ÚchildZsendlineZ_expect_promptÚappendÚbeforeÚkillÚsignalÚSIGINTÚ
ValueErrorÚjoin)ÚreplZcmdlinesr   ÚresÚlineZ
prompt_idxr   r   r   Úrepl_run_command_async%   s    r&   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )r   Nc                 C   s   || _ t ¡ | _d S r   )r   r   ZFuturer   )Úselfr   r   r   r   r   ;   s    zPatternWaiter.set_expecterc                 C   s$   | j  ¡ s | j  |¡ | j ¡  d S r   )r   ÚdoneZ
set_resultr   r   )r'   Úresultr   r   r   Úfound?   s    
zPatternWaiter.foundc                 C   s$   | j  ¡ s | j  |¡ | j ¡  d S r   )r   r(   Zset_exceptionr   r   ©r'   Úexcr   r   r   ÚerrorD   s    
zPatternWaiter.errorc                 C   s
   || _ d S r   )r   )r'   r   r   r   r   Úconnection_madeI   s    zPatternWaiter.connection_madec              
   C   s¤   | j j}|j |¡}| |d¡ | j ¡ rF|j |¡ |j	 |¡ d S z"| j  
|¡}|d k	rf|  |¡ W n6 tk
rž } z| j  ¡  |  |¡ W 5 d }~X Y nX d S )NÚread)r   r
   Ú_decoderÚdecodeÚ_logr   r(   Z_beforeÚwriteÚ_bufferZnew_datar*   Ú	ExceptionZerroredr-   )r'   Údatar
   ÚsÚindexr   r   r   r   Údata_receivedL   s    

zPatternWaiter.data_receivedc              
   C   sT   zd| j j_| j  ¡ }W n, tk
rD } z|  |¡ W 5 d }~X Y nX |  |¡ d S )NT)r   r
   Zflag_eofÚeofr   r-   r*   )r'   r8   r   r   r   r   Úeof_received_   s    
zPatternWaiter.eof_receivedc                 C   s6   t |tƒr |jtjkr |  ¡  n|d k	r2|  |¡ d S r   )Ú
isinstanceÚOSErrorÚerrnoZEIOr;   r-   r+   r   r   r   Úconnection_lostj   s    
zPatternWaiter.connection_lost)Ú__name__Ú
__module__Ú__qualname__r   r   r*   r-   r.   r9   r;   r?   r   r   r   r   r   8   s   r   )N)r   )Ú__doc__r   r>   r   Zpexpectr   Ú	coroutiner   r&   ÚProtocolr   r   r   r   r   Ú<module>   s   