U
    ڲg                     @   s   d Z ddlZddlZddlZddlZddlmZmZmZm	Z	 ddl
Z
ddl
mZ ddlmZ eeZdZG dd ded	d
e
jZG dd de
jZG dd de
jZe
jedddZeeedddZdS )z#Internal utilities for gRPC Python.    N)CallableDictOptionalSequence)_common)DoneCallbackTypez6Exception calling connectivity future "done" callback!c                   @   s   e Zd ZdS )RpcMethodHandlerN)__name__
__module____qualname__ r   r   3/tmp/pip-unpacked-wheel-8poujhl6/grpc/_utilities.pyr   !   s   r   Z_RpcMethodHandler)Zrequest_streamingZresponse_streamingZrequest_deserializerZresponse_serializerZunary_unaryZunary_streamZstream_unaryZstream_streamc                   @   sh   e Zd ZU eed< eeejf ed< eeeejf dddZedddZ	ej
eej d	d
dZdS )DictionaryGenericHandler_name_method_handlers)servicemethod_handlersc                    s"    | _  fdd| D | _d S )Nc                    s   i | ]\}}t  ||qS r   )r   Zfully_qualified_method).0methodZmethod_handlerr   r   r   
<dictcomp><   s   
 z5DictionaryGenericHandler.__init__.<locals>.<dictcomp>)r   itemsr   )selfr   r   r   r   r   __init__8   s    
z!DictionaryGenericHandler.__init__returnc                 C   s   | j S N)r   r   r   r   r   service_nameA   s    z%DictionaryGenericHandler.service_name)handler_call_detailsr   c                 C   s   |j }| j|S r   )r   r   get)r   r   Zdetails_methodr   r   r   r   D   s    z DictionaryGenericHandler.serviceN)r	   r
   r   str__annotations__r   grpcr   r   r   ZHandlerCallDetailsr   r   r   r   r   r   r   4   s   
 	r   c                   @   s  e Zd ZU ejed< ejed< eed< eed< e	e
 ed< ejdddZee d	d
ddZeej d	dddZedddZedddZedddZedddZd&ee d	d
ddZd'ee d	d
ddZd(ee d	d
ddZedd d!Zd"d# Zd$d% Zd	S ))_ChannelReadyFuture
_condition_channel_matured
_cancelled_done_callbacks)channelc                 C   s&   t  | _|| _d| _d| _g | _d S )NF)	threading	Conditionr%   r&   r'   r(   r)   )r   r*   r   r   r   r   T   s
    
z_ChannelReadyFuture.__init__N)timeoutr   c              	   C   s   |d krd n
t   | }| jl | jr0t q | jrDW 5 Q R  d S |d krX| j  q |t    }|dk rvt q | jj|d q W 5 Q R X d S )Nr   )r-   )timer%   r(   r#   ZFutureCancelledErrorr'   waitZFutureTimeoutError)r   r-   Zuntil	remainingr   r   r   _block\   s    

z_ChannelReadyFuture._block)connectivityr   c              	   C   s   | j V | jsJ|tjjkrJd| _| j| j | j 	  t
| j}d | _nW 5 Q R  d S W 5 Q R X |D ]0}z||  W qf tk
r   tt Y qfX qfd S )NT)r%   r(   r#   ChannelConnectivityZREADYr'   r&   unsubscribe_update
notify_alltupler)   	Exception_LOGGER	exception$_DONE_CALLBACK_EXCEPTION_LOG_MESSAGE)r   r2   done_callbacksdone_callbackr   r   r   r5   n   s     


z_ChannelReadyFuture._updater   c              	   C   s   | j J | js>d| _| j| j | j   t| j}d | _nW 5 Q R  dS W 5 Q R X |D ]0}z||  W qZ t	k
r   t
t Y qZX qZdS )NTF)r%   r'   r(   r&   r4   r5   r6   r7   r)   r8   r9   r:   r;   )r   r<   r=   r   r   r   cancel   s    

z_ChannelReadyFuture.cancelc              
   C   s$   | j  | jW  5 Q R  S Q R X d S r   )r%   r(   r   r   r   r   	cancelled   s    z_ChannelReadyFuture.cancelledc              
   C   s.   | j  | j o| j W  5 Q R  S Q R X d S r   r%   r(   r'   r   r   r   r   running   s    z_ChannelReadyFuture.runningc              
   C   s*   | j  | jp| jW  5 Q R  S Q R X d S r   r@   r   r   r   r   done   s    z_ChannelReadyFuture.donec                 C   s   |  | d S r   r1   r   r-   r   r   r   result   s    z_ChannelReadyFuture.resultc                 C   s   |  | d S r   rC   rD   r   r   r   r:      s    z_ChannelReadyFuture.exceptionc                 C   s   |  | d S r   rC   rD   r   r   r   	traceback   s    z_ChannelReadyFuture.traceback)fnc              	   C   sD   | j , | js.| js.| j| W 5 Q R  d S W 5 Q R X ||  d S r   )r%   r(   r'   r)   append)r   rG   r   r   r   add_done_callback   s
    z%_ChannelReadyFuture.add_done_callbackc              	   C   s(   | j  | jj| jdd W 5 Q R X d S )NT)Ztry_to_connect)r%   r&   	subscriber5   r   r   r   r   start   s    z_ChannelReadyFuture.startc              	   C   s0   | j   | js"| js"| j| j W 5 Q R X d S r   )r%   r(   r'   r&   r4   r5   r   r   r   r   __del__   s    z_ChannelReadyFuture.__del__)N)N)N)r	   r
   r   r+   r,   r"   r#   Channelboolr   r   r   r   floatr1   r3   r5   r>   r?   rA   rB   rE   r:   rF   r   rI   rK   rL   r   r   r   r   r$   M   s$   


r$   )r*   r   c                 C   s   t | }|  |S r   )r$   rK   )r*   Zready_futurer   r   r   channel_ready_future   s    rP   )version1version2r   c                 C   s   |  d}| d}zRtdD ]D}t|| t|| k rB W dS t|| t|| kr W dS qW n tk
r|   Y dS X t|t|k S )a  
    Compares two versions in the format '1.60.1' or '1.60.1.dev0'.

    This method will be used in all stubs generated by grpcio-tools to check whether
    the stub version is compatible with the runtime grpcio.

    Args:
        version1: The first version string.
        version2: The second version string.

    Returns:
        True if version1 is lower, False otherwise.
    .   TF)splitrangeint
ValueErrorlen)rQ   rR   Zversion1_listZversion2_listir   r   r   first_version_is_lower   s    

r[   )__doc__collectionsloggingr+   r.   typingr   r   r   r   r#   r   Zgrpc._typingr   	getLoggerr	   r9   r;   
namedtupler   ZServiceRpcHandlerr   ZFuturer$   rM   rP   r!   rN   r[   r   r   r   r   <module>   s,   

o