U
    bh
                     @  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	 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 ddlmZ ejdkrddlmZ nddlmZ erddlmZ dZeeZdZe dedZ!e"edZ#eddZ$edefddZ%e	G dd dZ&G dd dZ'dS )z"Timer scheduling Python callbacks.    )annotationsN)
namedtuple)datetime)total_ordering)	monotonic)time)TYPE_CHECKING)proxy)wraps)
get_logger)   	   )ZoneInfo)TracebackType)EntryTimerto_timestamp   UTCpypy_version_info	scheduled)etapriorityentryc                 C  sF   t | trB| jdkr | j|d} t |  }t| t  | dS | S )z^Convert datetime to timestamp.

    If d' is already a timestamp, then that will be used.
    N)tzinfor   )
isinstancer   r   replace_timemaxEPOCHtotal_seconds)dZdefault_timezoner   Zdiff r"   </tmp/pip-unpacked-wheel-earovzxb/kombu/asynchronous/timer.pyr   &   s    

r   c                   @  s\   e Zd ZdZesdZdddZdd Zdd	 Zd
d Z	dd Z
edd Zejdd ZdS )r   zSchedule Entry.)funargskwargstrefcanceled	_last_run__weakref__Nc                 C  s4   || _ |pg | _|pi | _t| | _d | _d| _d S )NF)r$   r%   r&   weakrefproxyr'   r)   r(   )selfr$   r%   r&   r"   r"   r#   __init__=   s    


zEntry.__init__c                 C  s   | j | j| jS N)r$   r%   r&   r,   r"   r"   r#   __call__E   s    zEntry.__call__c                 C  s&   zd| j _W n tk
r    Y nX d S NT)r'   r(   ReferenceErrorr/   r"   r"   r#   cancelH   s    zEntry.cancelc                 C  s   d | jj| j| jS )Nz<TimerEntry: {}(*{!r}, **{!r}))formatr$   __name__r%   r&   r/   r"   r"   r#   __repr__N   s
      zEntry.__repr__c                 C  s   t | t |k S r.   )id)r,   otherr"   r"   r#   __lt__S   s    zEntry.__lt__c                 C  s   | j S r.   r(   r/   r"   r"   r#   	cancelledV   s    zEntry.cancelledc                 C  s
   || _ d S r.   r:   )r,   valuer"   r"   r#   r;   Z   s    )NN)r5   
__module____qualname____doc__IS_PYPY	__slots__r-   r0   r3   r6   r9   propertyr;   setterr"   r"   r"   r#   r   3   s   

r   c                   @  s   e Zd ZdZeZdZd0ddZdd Zddd	d
dddZd1ddZ	d2ddZ
d3ddZddefddZdefddZejfddZdd Zdd Zd d! Zeeejejfd"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zeejfd,d-Zed.d/ ZdS )4r   zAsync timer implementation.Nc                 K  s$   t |pt| _|p| j| _g | _d S r.   )floatDEFAULT_MAX_INTERVALmax_intervalon_error_queue)r,   rF   rG   r&   r"   r"   r#   r-   f   s    zTimer.__init__c                 C  s   | S r.   r"   r/   r"   r"   r#   	__enter__k   s    zTimer.__enter__ztype[BaseException] | NonezBaseException | NonezTracebackType | NoneNone)exc_typeexc_valexc_tbreturnc                 C  s   |    d S r.   )stop)r,   rK   rL   rM   r"   r"   r#   __exit__n   s    zTimer.__exit__r"   r   c                 C  s$   |si n|}|  | |||||S r.   )enter_atr   )r,   r   r$   r%   r&   r   r"   r"   r#   call_atv   s    zTimer.call_atc                 C  s$   |si n|}|  || ||||S r.   )enter_afterr   )r,   secsr$   r%   r&   r   r"   r"   r#   
call_afterz   s    zTimer.call_afterc                   sP   |si n|}  ||t  fdd}|_d _S )Nc                    sz   j t  }}|r|j  n}z$|rB|krB|_  | |W S W 5 jstj }|rb||  n}| X d S r.   )r)   r   r(   rS   )r%   r&   lastnowZlsincenextr$   r   rT   r,   r'   r"   r#   _reschedules   s    z+Timer.call_repeatedly.<locals>._reschedules)r   r
   r$   r)   rS   )r,   rT   r$   r%   r&   r   rZ   r"   rY   r#   call_repeatedly~   s    zTimer.call_repeatedlyc              
   C  sh   |dkr| }t |trZzt|}W n4 tk
rX } z| |sB W Y dS d}~X Y nX | |||S )zEnter function into the scheduler.

        Arguments:
        ---------
            entry (~kombu.asynchronous.timer.Entry): Item to enter.
            eta (datetime.datetime): Scheduled time.
            priority (int): Unused.
        N)r   r   r   	Exceptionhandle_error_enter)r,   r   r   r   r   excr"   r"   r#   rQ      s    	

zTimer.enter_atc                 C  s   |  || t| |S r.   )rQ   rD   )r,   rT   r   r   r   r"   r"   r#   rS      s    zTimer.enter_afterc                 C  s   || j t||| |S r.   )rH   r   )r,   r   r   r   pushr"   r"   r#   r^      s    zTimer._enterc              
   C  sL   z
|  W n< t k
rF } z| |s6tjd|dd W 5 d }~X Y nX d S )NzError in timer: %rT)exc_info)r\   r]   loggererror)r,   r   r_   r"   r"   r#   apply_entry   s
    

zTimer.apply_entryc                 C  s   | j r|  | dS d S r1   )rG   )r,   ra   r"   r"   r#   r]      s    
zTimer.handle_errorc                 C  s   d S r.   r"   r/   r"   r"   r#   rO      s    z
Timer.stopc                 c  s   | j }| j}|r~|d }| |d  }}	||	k rF||	| |dfV  q||}
|
|krr|d }|jsd|fV  qq|||
 qdV  qdS )zIterate over schedule.

        This iterator yields a tuple of ``(wait_seconds, entry)``,
        where if entry is :const:`None` the caller should wait
        for ``wait_seconds`` until it polls the schedule again.
        r   Nr   )NN)rF   rH   r(   )r,   minZnowfunpopr`   rF   queueZeventArW   r   ZeventBr   r"   r"   r#   __iter__   s    
zTimer.__iter__c                 C  s   g | j d d < d S r.   )rH   r/   r"   r"   r#   clear   s    zTimer.clearc                 C  s   |   d S r.   )r3   )r,   r'   r"   r"   r#   r3      s    zTimer.cancelc                 C  s
   t | jS r.   )lenrH   r/   r"   r"   r#   __len__   s    zTimer.__len__c                 C  s   dS r1   r"   r/   r"   r"   r#   __nonzero__   s    zTimer.__nonzero__c                   s&   t | j} fdd|gt| D S )z%Snapshot of underlying datastructure.c                   s   g | ]} |qS r"   r"   ).0v_popr"   r#   
<listcomp>   s     zTimer.queue.<locals>.<listcomp>)listrH   rj   )r,   rp   eventsr"   ro   r#   rg      s    
zTimer.queuec                 C  s   | S r.   r"   r/   r"   r"   r#   schedule   s    zTimer.schedule)NN)r"   Nr   )r"   Nr   )r"   Nr   )r5   r=   r>   r?   r   rG   r-   rI   rP   rR   rU   r[   r   rQ   rS   heapqheappushr^   rd   r]   rO   re   heappoprh   ri   r3   rk   rl   rB   rg   rt   r"   r"   r"   r#   r   _   s6   



 
r   )(r?   
__future__r   ru   syscollectionsr   r   	functoolsr   r   r   r   typingr   weakrefr	   r+   Z
vine.utilsr
   Z	kombu.logr   version_infoZzoneinfor   Zbackports.zoneinfotypesr   __all__r5   rb   rE   fromtimestampr   hasattrr@   r   r   r   r   r"   r"   r"   r#   <module>   s6   


+