
    2                         d dl mZ d dlZ	 d dlmZ ddlmZ  G d de	      Z
 G d	 d
e	      Z G d de      Zy# e$ r	 d dlmZ Y 5w xY w)    )absolute_importN)	monotonic)time   )Cachec                   $    e Zd ZdZddZd Zd Zy)_Link)keyexpirenextprevNc                      || _         || _        y N)r
   r   )selfr
   r   s      !lib/third_party/cachetools/ttl.py__init__z_Link.__init__   s    DHDK    c                 >    t         | j                  | j                  ffS r   )r	   r
   r   r   s    r   
__reduce__z_Link.__reduce__   s    488T[[)))r   c                 P    | j                   }| j                  }||_         ||_        y r   )r   r   )r   r   r   s      r   unlinkz_Link.unlink   s"    99D99DDIDIr   )NN)__name__
__module____qualname__	__slots__r   r   r    r   r   r	   r	      s    /)*r   r	   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)_Timerc                      || _         d| _        y Nr   )_Timer__timer_Timer__nesting)r   timers     r   r   z_Timer.__init__!   s    DLDNr   c                 X    | j                   dk(  r| j                         S | j                  S r!   r#   r"   _Timer__timer   s    r   __call__z_Timer.__call__%   s$    ~~\\^[[r   c                     | j                   dk(  r| j                         x| _        }n| j                  }| xj                   dz  c_         |S )Nr   r   r&   r   r   s     r   	__enter__z_Timer.__enter__+   s<    ~~<<>)dkD[[dNNaNKr   c                 .    | xj                   dz  c_         y Nr   )r#   )r   excs     r   __exit__z_Timer.__exit__3   s    NNaNr   c                 (    t         | j                  ffS r   )r   r"   r   s    r   r   z_Timer.__reduce__6   s    DLL?""r   c                 .    t        | j                  |      S r   )getattrr"   )r   names     r   __getattr__z_Timer.__getattr__9   s    4<<&&r   N)	r   r   r   r   r(   r+   r/   r   r4   r   r   r   r   r      s     #'r   r   c                   H    e Zd ZdZedfdZd Zej                  fdZej                  fdZ	ej                  fdZ
d Zd	 Zd
 Zej                  fdZe fd       Zed        Zed        ZddZd Zd Zd Zd Zd Z eej6                  d      rd Z xZS d Z xZS )TTLCachez@LRU Cache implementation with per-item time-to-live (TTL) value.Nc                     t        j                  | ||       t               x| _        }|x|_        |_        t        j                         | _        t        |      | _
        || _        y r   )r   r   r	   _TTLCache__rootr   r   collectionsOrderedDict_TTLCache__linksr   _TTLCache__timer_TTLCache__ttl)r   maxsizettlr$   	getsizeofroots         r   r   zTTLCache.__init__@   sP    	NN4), DK$  DI	**,DL%=DLDJr   c                 |    	 | j                   |   }|j                  | j                         k   S # t        $ r Y yw xY wNF)r;   r   r<   KeyError)r   r
   links      r   __contains__zTTLCache.__contains__H   sC    0\\#d ++.//  s   / 	;;c                     	 | j                  |      }|j                  | j                         k  }|r| j	                  |      S  || |      S # t        $ r d}Y )w xY wrC   )_TTLCache__getlinkr   r<   rD   __missing__)r   r
   cache_getitemrE   expireds        r   __getitem__zTTLCache.__getitem__P   sb    -^^C d dlln,gc""4%%  gs   A AAc                    | j                   5 }| j                  |        || ||       d d d        	 | j                  |      }|j                          | j                  z   |_        | j                  x|_	        }|j                  x|_
        }|x|_	        |_
        y # 1 sw Y   txY w# t        $ r t        |      x| j                  |<   }Y zw xY wr   )r<   r   rH   r   rD   r	   r;   r=   r8   r   r   )r   r
   valuecache_setitemr   rE   rA   r   s           r   __setitem__zTTLCache.__setitem__\   s    	
kk$D#u% 
^^C d kkm#DK{{"DIyy DI  DI	 

  ,!&s+dll3$,s   BB( B%(#CCc                      || |       | j                   j                  |      }|j                          |j                  | j	                         k  rt        |      y r   )r;   popr   r   r<   rD   )r   r
   cache_delitemrE   s       r   __delitem__zTTLCache.__delitem__k   sJ    $<<C DKKM{{T\\^#SM $r   c              #      K   | j                   }|j                  }||urD| j                  5 }|j                  |k  s|j                   d d d        |j                  }||urCy y # 1 sw Y   xY wwr   )r8   r   r<   r   r
   )r   rA   currr   s       r   __iter__zTTLCache.__iter__r   s]     ;;D99D
d
<<4d".  YYd d
<s"   )A0A$	A0"A0$A-)A0c                     | j                   }|j                  }| j                         }t        | j                        }||ur4|j
                  |k  r%|dz  }|j                  }||ur|j
                  |k  r%|S r-   )r8   r   r<   lenr;   r   )r   rA   rV   r   counts        r   __len__zTTLCache.__len__|   sn    ;;D99D<<>DE
d
t{{T1qjeYYd d
t{{T1 Lr   c                 R   | j                   j                  |       | j                  }|x|_        |_        t        | j                  j                         d       D ]*  }||_        |j                  x|_        }|x|_        |_        , | j                  | j                                y )Nc                     | j                   S r   )r   )objs    r   <lambda>z'TTLCache.__setstate__.<locals>.<lambda>   s    cjjr   )r
   )
__dict__updater8   r   r   sortedr;   valuesr   r<   )r   staterA   rE   r   s        r   __setstate__zTTLCache.__setstate__   s    MM;;D  DI	t||**,2HIdi"di$""di$) J 	KKr   c                 x    | j                   5 }| j                  |        ||       cd d d        S # 1 sw Y   y xY wr   )r<   r   )r   
cache_reprr   s      r   __repr__zTTLCache.__repr__   s)    	
kk$ 
   09c                     | j                   5 }| j                  |       t        t        |   cd d d        S # 1 sw Y   y xY wr   )r<   r   superr6   currsize)r   r   	__class__s     r   rl   zTTLCache.currsize   s,    	
kk$8T+ 
s	   7A c                     | j                   S )z%The timer function used by the cache.)r<   r   s    r   r$   zTTLCache.timer   s     <<r   c                     | j                   S )z,The time-to-live value of the cache's items.)r=   r   s    r   r?   zTTLCache.ttl   s     ::r   c                 `   || j                         }| j                  }|j                  }| j                  }t        j
                  }||urd|j                  |k  rT || |j                         ||j                  = |j                  }|j                          |}||ur|j                  |k  rRyyyy)z$Remove expired items from the cache.N)	r<   r8   r   r;   r   rT   r   r
   r   )r   r   rA   rV   linksrS   r   s          r   r   zTTLCache.expire   s    |\\^d;;D99DLLE%%M
d
t{{T1D$((#
/YYd
kkmd d
t{{T1
1
r   c                     | j                   5 }| j                  |       t        j                  |        d d d        y # 1 sw Y   y xY wr   )r<   r   r   clearr*   s     r   rs   zTTLCache.clear   s-    	
kk$kk$ 
s	   '=Ac                 x    | j                   5  t        j                  | g|i |cd d d        S # 1 sw Y   y xY wr   )r<   r   getr   argskwargss      r   ru   zTTLCache.get   )    	YYt-d-f- 
ri   c                 x    | j                   5  t        j                  | g|i |cd d d        S # 1 sw Y   y xY wr   )r<   r   rR   rv   s      r   rR   zTTLCache.pop   ry   ri   c                 x    | j                   5  t        j                  | g|i |cd d d        S # 1 sw Y   y xY wr   )r<   r   
setdefaultrv   s      r   r|   zTTLCache.setdefault   s+    	d4T4V4 
ri   c                 *   | j                   5 }| j                  |       	 t        t        | j                              }|| j                  |      fcddd       S # t        $ r# t        d| j                  j                  z        w xY w# 1 sw Y   yxY w)znRemove and return the `(key, value)` pair least recently used that

        has not already expired.

        Nz%s is empty)
r<   r   r   iterr;   rR   StopIterationrD   rm   r   )r   r   r
   s      r   popitemzTTLCache.popitem   s     

kk$$4%& TXXc]# 
  @}t~~'>'>>??@	 
s!   B	AB	,BB		Bmove_to_endc                 Z    | j                   |   }| j                   j                  |       |S r   )r;   r   r   r
   rN   s      r   	__getlinkzTTLCache.__getlink   s'    ll3e
lls#lr   c                 Z    | j                   j                  |      }|| j                   |<   |S r   )r;   rR   r   s      r   r   zTTLCache.__getlink   s)    lls#edll3lr   r   )r   r   r   __doc__default_timerr   rF   r   rL   rP   rT   rW   r[   re   rh   propertyrl   r$   r?   r   rs   ru   rR   r|   r   hasattrr9   r:   rH   __classcell__)rm   s   @r   r6   r6   =   s    H)6$ 0 ,1+<+< 
& 382C2C ! ,1+<+<   !& 
 , ,
    
..5$ [$$m4r   r6   )
__future__r   r9   r   r   r   ImportErrorcacher   objectr	   r   r6   r   r   r   <module>r      sS    & )- F $'V '<bu bm  )()s   : AA