U
    .e                     @  s0  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j!ed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tzinfo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.
    Nr   r   )
isinstancer   r   replace_timemaxEPOCHtotal_seconds)dZdefault_timezoner   Zdiff r#   </tmp/pip-unpacked-wheel-48hrr5dg/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)   ReferenceErrorr0   r#   r#   r$   cancelH   s    zEntry.cancelc                 C  s   d | jj| j| jS )Nz<TimerEntry: {}(*{!r}, **{!r}))formatr%   __name__r&   r'   r0   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)   r0   r#   r#   r$   	cancelledV   s    zEntry.cancelledc                 C  s
   || _ d S r/   r;   )r-   valuer#   r#   r$   r<   Z   s    )NN)r6   
__module____qualname____doc__IS_PYPY	__slots__r.   r1   r4   r7   r:   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-   rG   rH   r'   r#   r#   r$   r.   f   s    zTimer.__init__c                 C  s   | S r/   r#   r0   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-   rL   rM   rN   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)   rT   )r&   r'   lastnowZlsincenextr%   r   rU   r-   r(   r#   r$   _reschedules   s    z+Timer.call_repeatedly.<locals>._reschedules)r   r
   r%   r*   rT   )r-   rU   r%   r&   r'   r   r[   r#   rZ   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$   rR      s    	

zTimer.enter_atc                 C  s   |  || t| |S r/   )rR   rE   )r-   rU   r   r   r   r#   r#   r$   rT      s    zTimer.enter_afterc                 C  s   || j t||| |S r/   )rI   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 r2   )rH   )r-   rb   r#   r#   r$   r^      s    
zTimer.handle_errorc                 C  s   d S r/   r#   r0   r#   r#   r$   rP      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)rG   rI   r)   )r-   minZnowfunpopra   rG   queueZeventArX   r   ZeventBr   r#   r#   r$   __iter__   s    
zTimer.__iter__c                 C  s   g | j d d < d S r/   )rI   r0   r#   r#   r$   clear   s    zTimer.clearc                 C  s   |   d S r/   )r4   )r-   r(   r#   r#   r$   r4      s    zTimer.cancelc                 C  s
   t | jS r/   )lenrI   r0   r#   r#   r$   __len__   s    zTimer.__len__c                 C  s   dS r2   r#   r0   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>)listrI   rk   )r-   rq   eventsr#   rp   r$   rh      s    
zTimer.queuec                 C  s   | S r/   r#   r0   r#   r#   r$   schedule   s    zTimer.schedule)NN)r#   Nr   )r#   Nr   )r#   Nr   )r6   r>   r?   r@   r   rH   r.   rJ   rQ   rS   rV   r\   r   rR   rT   heapqheappushr_   re   r^   rP   rf   heappopri   rj   r4   rl   rm   rC   rh   ru   r#   r#   r#   r$   r   _   s6   



 
r   ))r@   
__future__r   rv   syscollectionsr   r   	functoolsr   r   r   r   typingr   weakrefr	   r,   Z
vine.utilsr
   Z	kombu.logr   version_infoZzoneinfor   Zbackports.zoneinfotypesr   __all__r6   rc   rF   utcfromtimestampr   r    hasattrrA   r   r   r   r   r#   r#   r#   r$   <module>   s6   


+