o
    €Ï2  ã                   @   s„   d dl mZ d dlZzd dlmZ W n ey!   d dlmZ Y nw ddlmZ G dd„ de	ƒZ
G d	d
„ d
e	ƒZG dd„ deƒZdS )é    )Úabsolute_importN)Ú	monotonic)Útimeé   )ÚCachec                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
Ú_Link)ÚkeyÚexpireÚnextÚprevNc                 C   s   || _ || _d S ©N)r   r	   )Úselfr   r	   © r   ú7/tmp/google-cloud-sdk/lib/third_party/cachetools/ttl.pyÚ__init__   ó   
z_Link.__init__c                 C   s   t | j| jffS r   )r   r   r	   ©r   r   r   r   Ú
__reduce__   s   z_Link.__reduce__c                 C   s   | j }| j}||_ ||_d S r   )r
   r   )r   r
   r   r   r   r   Úunlink   s   
z_Link.unlink)NN)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   r   r   r   r   r   r      s
    
r   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú_Timerc                 C   s   || _ d| _d S ©Nr   )Ú_Timer__timerÚ_Timer__nesting)r   Útimerr   r   r   r   !   r   z_Timer.__init__c                 C   s   | j dkr	|  ¡ S | jS r   ©r   r   Ú_Timer__timer   r   r   r   Ú__call__%   s   
z_Timer.__call__c                 C   s2   | j dkr|  ¡  | _}n| j}|  j d7  _ |S )Nr   r   r   ©r   r   r   r   r   Ú	__enter__+   s
   
z_Timer.__enter__c                 G   s   |  j d8  _ d S ©Nr   )r   )r   Úexcr   r   r   Ú__exit__3   s   z_Timer.__exit__c                 C   s   t | jffS r   )r   r   r   r   r   r   r   6   ó   z_Timer.__reduce__c                 C   s   t | j|ƒS r   )Úgetattrr   )r   Únamer   r   r   Ú__getattr__9   r&   z_Timer.__getattr__N)	r   r   r   r   r    r"   r%   r   r)   r   r   r   r   r      s    r   c                       sø   e Zd ZdZedfdd„Zdd„ Zejfdd„Zej	fd	d
„Z	ej
fdd„Z
dd„ Zdd„ Zdd„ Zejfdd„Ze‡ fdd„ƒZedd„ ƒZedd„ ƒZd+dd„Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zeejd'ƒrtd(d)„ Z‡  ZS d*d)„ Z‡  ZS ),ÚTTLCachez@LRU Cache implementation with per-item time-to-live (TTL) value.Nc                 C   sD   t  | ||¡ tƒ  | _}| |_|_t ¡ | _t	|ƒ| _
|| _d S r   )r   r   r   Ú_TTLCache__rootr   r
   ÚcollectionsÚOrderedDictÚ_TTLCache__linksr   Ú_TTLCache__timerÚ_TTLCache__ttl)r   ÚmaxsizeÚttlr   Ú	getsizeofÚrootr   r   r   r   @   s   


zTTLCache.__init__c                 C   s4   z| j | }W n
 ty   Y dS w |j|  ¡ k  S ©NF)r.   ÚKeyErrorr	   r/   )r   r   Úlinkr   r   r   Ú__contains__H   s   ÿzTTLCache.__contains__c                 C   sL   z|   |¡}W n ty   d}Y nw |j|  ¡ k }|r!|  |¡S || |ƒS r5   )Ú_TTLCache__getlinkr6   r	   r/   Ú__missing__)r   r   Úcache_getitemr7   Úexpiredr   r   r   Ú__getitem__P   s   ÿ

zTTLCache.__getitem__c                 C   s¬   | j }|  |¡ || ||ƒ W d   ƒ n1 sw   Y  z|  |¡}W n ty7   t|ƒ | j|< }Y nw | ¡  || j |_| j |_	}|j
 |_
}| |_	|_
d S r   )r/   r	   r9   r6   r   r.   r   r0   r+   r
   r   )r   r   ÚvalueÚcache_setitemr   r7   r4   r   r   r   r   Ú__setitem__\   s   
þÿzTTLCache.__setitem__c                 C   s8   || |ƒ | j  |¡}| ¡  |j|  ¡ k rt|ƒ‚d S r   )r.   Úpopr   r	   r/   r6   )r   r   Úcache_delitemr7   r   r   r   Ú__delitem__k   s   
ÿzTTLCache.__delitem__c                 c   sd    | j }|j}||ur0| j}|j|k s|jV  W d   ƒ n1 s"w   Y  |j}||usd S d S r   )r+   r
   r/   r	   r   )r   r4   Úcurrr   r   r   r   Ú__iter__r   s   €
€þûzTTLCache.__iter__c                 C   sT   | j }|j}|  ¡ }t| jƒ}||ur(|j|k r(|d8 }|j}||ur(|j|k s|S r#   )r+   r
   r/   Úlenr.   r	   )r   r4   rD   r   Úcountr   r   r   Ú__len__|   s   
þzTTLCache.__len__c                 C   sj   | j  |¡ | j}| |_|_t| j ¡ dd„ dD ]}||_|j |_}| |_|_q|  |  	¡ ¡ d S )Nc                 S   ó   | j S r   )r	   )Úobjr   r   r   Ú<lambda>Š   s    z'TTLCache.__setstate__.<locals>.<lambda>)r   )
Ú__dict__Úupdater+   r   r
   Úsortedr.   Úvaluesr	   r/   )r   Ústater4   r7   r   r   r   r   Ú__setstate__†   s   zTTLCache.__setstate__c                 C   s<   | j }|  |¡ || ƒW  d   ƒ S 1 sw   Y  d S r   )r/   r	   )r   Ú
cache_reprr   r   r   r   Ú__repr__   s   
$þzTTLCache.__repr__c                    s@   | j }|  |¡ tt| ƒjW  d   ƒ S 1 sw   Y  d S r   )r/   r	   Úsuperr*   Úcurrsizer!   ©Ú	__class__r   r   rU   •   s   

$þzTTLCache.currsizec                 C   rI   )z%The timer function used by the cache.)r/   r   r   r   r   r   ›   ó   zTTLCache.timerc                 C   rI   )z,The time-to-live value of the cache's items.)r0   r   r   r   r   r2       rX   zTTLCache.ttlc                 C   s‚   |du r|   ¡ }| j}|j}| j}tj}||ur;|j|k r?|| |jƒ ||j= |j}| ¡  |}||ur=|j|k sdS dS dS dS )z$Remove expired items from the cache.N)	r/   r+   r
   r.   r   rC   r	   r   r   )r   r   r4   rD   ÚlinksrB   r
   r   r   r   r	   ¥   s   "ûzTTLCache.expirec                 C   s@   | j }|  |¡ t | ¡ W d   ƒ d S 1 sw   Y  d S r   )r/   r	   r   Úclearr!   r   r   r   rZ   ´   s   
"þzTTLCache.clearc                 O   óB   | j  tj| g|¢R i |¤ŽW  d   ƒ S 1 sw   Y  d S r   )r/   r   Úget©r   ÚargsÚkwargsr   r   r   r\   ¹   ó   $ÿzTTLCache.getc                 O   r[   r   )r/   r   rA   r]   r   r   r   rA   ½   r`   zTTLCache.popc                 O   r[   r   )r/   r   Ú
setdefaultr]   r   r   r   ra   Á   r`   zTTLCache.setdefaultc              	   C   st   | j -}|  |¡ z	tt| jƒƒ}W n ty!   td| jj ƒ‚w ||  	|¡fW  d  ƒ S 1 s3w   Y  dS )znRemove and return the `(key, value)` pair least recently used that

        has not already expired.

        z%s is emptyN)
r/   r	   r
   Úiterr.   ÚStopIterationr6   rW   r   rA   )r   r   r   r   r   r   ÚpopitemÅ   s   
ÿ$ùzTTLCache.popitemÚmove_to_endc                 C   s   | j | }| j  |¡ |S r   )r.   re   ©r   r   r>   r   r   r   Ú	__getlinkÖ   s   
zTTLCache.__getlinkc                 C   s   | j  |¡}|| j |< |S r   )r.   rA   rf   r   r   r   rg   Ü   s   
r   )r   r   r   Ú__doc__Údefault_timerr   r8   r   r=   r@   rC   rE   rH   rQ   rS   ÚpropertyrU   r   r2   r	   rZ   r\   rA   ra   rd   Úhasattrr,   r-   r9   Ú__classcell__r   r   rV   r   r*   =   s4    





r*   )Ú
__future__r   r,   r   r   ri   ÚImportErrorÚcacher   Úobjectr   r   r*   r   r   r   r   Ú<module>   s    ÿ