U
    d                     @   s  d 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 zddlmZ W n ek
r   dZY nX dZeeZdZedjedZeedZeddZee	fddZeG dd dZ G dd dZ!dS )z"Timer scheduling Python callbacks.    N)
namedtuple)datetime)total_ordering)	monotonic)time)proxy)wraps)
get_logger)utc)EntryTimerto_timestamp   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-hqfrjlvz/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__7   s    


zEntry.__init__c                 C   s   | j | j| jS N)r   r    r!   r'   r   r   r   __call__?   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   cancelB   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__H   s
      zEntry.__repr__c                 C   s   t | t |k S r)   )id)r'   otherr   r   r   __lt__M   s    zEntry.__lt__c                 C   s   | j S r)   r#   r*   r   r   r   	cancelledP   s    zEntry.cancelledc                 C   s
   || _ d S r)   r5   )r'   valuer   r   r   r6   T   s    )NN)r0   
__module____qualname____doc__IS_PYPY	__slots__r(   r+   r.   r1   r4   propertyr6   setterr   r   r   r   r   -   s   

r   c                   @   s   e Zd ZdZeZdZd+ddZdd Zdd Zd,ddZ	d-ddZ
d.d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 )/r   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'   rA   rB   r!   r   r   r   r(   `   s    zTimer.__init__c                 C   s   | S r)   r   r*   r   r   r   	__enter__e   s    zTimer.__enter__c                 G   s   |    d S r)   )stopr'   exc_infor   r   r   __exit__h   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_atk   s    zTimer.call_atc                 C   s$   |si n|}|  || ||||S r)   )enter_afterr   )r'   secsr   r    r!   r   r   r   r   
call_aftero   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#   rK   )r    r!   lastnowZlsincenextr   r   rL   r'   r"   r   r   _reschedulesw   s    z+Timer.call_repeatedly.<locals>._reschedules)r   r   r   r$   rK   )r'   rL   r   r    r!   r   rR   r   rQ   r   call_repeatedlys   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   rI      s    

zTimer.enter_atc                 C   s   |  || t| |S r)   )rI   r?   )r'   rL   r   r   r   r   r   r   rK      s    zTimer.enter_afterc                 C   s   || j t||| |S r)   )rC   r   )r'   r   r   r   pushr   r   r   rV      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)rG   )rT   rU   loggererror)r'   r   rW   r   r   r   apply_entry   s
    

zTimer.apply_entryc                 C   s   | j r|  | dS d S r,   )rB   rF   r   r   r   rU      s    
zTimer.handle_errorc                 C   s   d S r)   r   r*   r   r   r   rE      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)rA   rC   r#   )r'   minZnowfunpoprX   rA   queueZeventArO   r   ZeventBr   r   r   r   __iter__   s    
zTimer.__iter__c                 C   s   g | j d d < d S r)   )rC   r*   r   r   r   clear   s    zTimer.clearc                 C   s   |   d S r)   )r.   )r'   r"   r   r   r   r.      s    zTimer.cancelc                 C   s
   t | jS r)   )lenrC   r*   r   r   r   __len__   s    zTimer.__len__c                 C   s   dS r,   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>)listrC   ra   )r'   rg   eventsr   rf   r   r^      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   )r0   r8   r9   r:   r   rB   r(   rD   rH   rJ   rM   rS   r   rI   rK   heapqheappushrV   r[   rU   rE   r\   heappopr_   r`   r.   rb   rc   r=   r^   rk   r   r   r   r   r   Y   s6   



 
r   )"r:   rl   syscollectionsr   r   	functoolsr   r   r   r   weakrefr   r&   Z
vine.utilsr   Z	kombu.logr	   Zpytzr
   ImportError__all__r0   rY   r@   utcfromtimestampr   r   hasattrr;   r   r   r   r   r   r   r   r   <module>   s0   


+