B
    zf              	   @   s   d Z dZdZdZddlmZ ddlmZ ddlZyddlZW n e	e
fk
rX   dZY nX G dd	 d	eZG d
d deZG dd deZeZeZG dd deZeZeZdS )zDaniel Greenfeldzpydanny@gmail.comz1.5.2ZBSD    )wraps)timeNc               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	cached_propertya   
    A property that is only computed once per instance and then replaces itself
    with an ordinary attribute. Deleting the attribute resets the property.
    Source: https://github.com/bottlepy/bottle/commit/fa7733e075da0d790d809aa3d2f53071897e6f76
    c             C   s   t |d| _|| _d S )N__doc__)getattrr   func)selfr    r	   R/home/ankuromar296_gmail_com/.local/lib/python3.7/site-packages/cached_property.py__init__   s    zcached_property.__init__c             C   sB   |d kr| S t r&t | jr&| |S | | }|j| jj< |S )N)asyncioiscoroutinefunctionr   _wrap_in_coroutine__dict____name__)r   objclsvaluer	   r	   r
   __get__   s    
zcached_property.__get__c                s"   t  tj fdd}| S )Nc                 s"   t  } |  jjj< | S )N)r   ensure_futurer   r   r   )future)r   r   r	   r
   wrapper(   s    z3cached_property._wrap_in_coroutine.<locals>.wrapper)r   r   	coroutine)r   r   r   r	   )r   r   r
   r   '   s    z"cached_property._wrap_in_coroutineN)r   
__module____qualname__r   r   r   r   r	   r	   r	   r
   r      s   
r   c               @   s    e Zd ZdZdd Zdd ZdS )threaded_cached_propertyz
    A cached_property version for use in environments where multiple threads
    might concurrently try to access the property.
    c             C   s    t |d| _|| _t | _d S )Nr   )r   r   r   	threadingRLocklock)r   r   r	   r	   r
   r   8   s    z!threaded_cached_property.__init__c          
   C   s\   |d kr| S |j }| jj}| j2 y|| S  tk
rL   ||| |S X W d Q R X d S )N)r   r   r   r   KeyError
setdefault)r   r   r   obj_dictnamer	   r	   r
   r   =   s    z threaded_cached_property.__get__N)r   r   r   r   r   r   r	   r	   r	   r
   r   2   s   r   c               @   sB   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dS )cached_property_with_ttlz
    A property that is only computed once per instance and then replaces itself
    with an ordinary attribute. Setting the ttl to a number expresses how long
    the property will last before being timed out.
    Nc             C   s*   t |r|}d }nd }|| _| | d S )N)callablettl_prepare_func)r   r%   r   r	   r	   r
   r   T   s    z!cached_property_with_ttl.__init__c             C   s   |  | | S )N)r&   )r   r   r	   r	   r
   __call__]   s    
z!cached_property_with_ttl.__call__c       	      C   sz   |d kr| S t  }|j}| j}y|| \}}W n tk
rB   Y nX | joV| j|| k }|s`|S | |}||f||< |S )N)r   r   r   r   r%   r   )	r   r   r   nowr!   r"   r   Zlast_updatedZttl_expiredr	   r	   r
   r   a   s    
z cached_property_with_ttl.__get__c             C   s   |j | jd  d S )N)r   popr   )r   r   r	   r	   r
   
__delete__u   s    z#cached_property_with_ttl.__delete__c             C   s   |t  f|j| j< d S )N)r   r   r   )r   r   r   r	   r	   r
   __set__x   s    z cached_property_with_ttl.__set__c             C   s&   || _ |r"|j| _|j| _|j| _d S )N)r   r   r   r   )r   r   r	   r	   r
   r&   {   s
    z&cached_property_with_ttl._prepare_func)N)
r   r   r   r   r   r'   r   r*   r+   r&   r	   r	   r	   r
   r#   M   s   
	r#   c                   s.   e Zd ZdZd fdd	Z fddZ  ZS )!threaded_cached_property_with_ttlz
    A cached_property version for use in environments where multiple threads
    might concurrently try to access the property.
    Nc                s   t t| | t | _d S )N)superr,   r   r   r   r   )r   r%   )	__class__r	   r
   r      s    z*threaded_cached_property_with_ttl.__init__c          	      s$   | j  tt| ||S Q R X d S )N)r   r-   r,   r   )r   r   r   )r.   r	   r
   r      s    z)threaded_cached_property_with_ttl.__get__)N)r   r   r   r   r   r   __classcell__r	   r	   )r.   r
   r,      s   r,   )
__author__	__email____version____license__	functoolsr   r   r   r   ImportErrorSyntaxErrorobjectr   r   r#   Zcached_property_ttlZtimed_cached_propertyr,   Zthreaded_cached_property_ttlZtimed_threaded_cached_propertyr	   r	   r	   r
   <module>   s$   
 7