U
    9aP                     @   s"   G d d dZ G dd de ZdS )c                   @   s   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"ddZ
d#ddZd$ddZdd Zdd Zdd Zd%ddZd&dd ZdS )'	BaseCacheaM  Baseclass for the cache systems.  All the cache systems implement this
    API or a superset of it.

    :param default_timeout: the default timeout (in seconds) that is used if
                            no timeout is specified on :meth:`set`. A timeout
                            of 0 indicates that the cache never expires.
    ,  c                 C   s
   || _ d S Ndefault_timeout)selfr    r   1/tmp/pip-unpacked-wheel-bx08cqbu/cachelib/base.py__init__
   s    zBaseCache.__init__c                 C   s   |d kr| j }|S r   r   )r   timeoutr   r   r   _normalize_timeout   s    zBaseCache._normalize_timeoutc                 C   s   dS )zLook up key in the cache and return the value for it.

        :param key: the key to be looked up.
        :returns: The value if it exists and is readable, else ``None``.
        Nr   r   keyr   r   r   get   s    zBaseCache.getc                 C   s   dS )zDelete `key` from the cache.

        :param key: the key to delete.
        :returns: Whether the key existed and has been deleted.
        :rtype: boolean
        Tr   r   r   r   r   delete   s    zBaseCache.deletec                    s    fdd|D S )a<  Returns a list of values for the given keys.
        For each key an item in the list is created::

            foo, bar = cache.get_many("foo", "bar")

        Has the same error handling as :meth:`get`.

        :param keys: The function accepts multiple keys as positional
                     arguments.
        c                    s   g | ]}  |qS r   )r   ).0kr   r   r   
<listcomp>.   s     z&BaseCache.get_many.<locals>.<listcomp>r   r   keysr   r   r   get_many#   s    zBaseCache.get_manyc                 G   s   t t|| j| S )zLike :meth:`get_many` but return a dict::

            d = cache.get_dict("foo", "bar")
            foo = d["foo"]
            bar = d["bar"]

        :param keys: The function accepts multiple keys as positional
                     arguments.
        )dictzipr   r   r   r   r   get_dict0   s    
zBaseCache.get_dictNc                 C   s   dS )ak  Add a new key/value to the cache (overwrites value, if key already
        exists in the cache).

        :param key: the key to set
        :param value: the value for the key
        :param timeout: the cache timeout for the key in seconds (if not
                        specified, it uses the default timeout). A timeout of
                        0 indicates that the cache never expires.
        :returns: ``True`` if key has been updated, ``False`` for backend
                  errors. Pickling errors, however, will raise a subclass of
                  ``pickle.PickleError``.
        :rtype: boolean
        Tr   r   r   valuer
   r   r   r   set<   s    zBaseCache.setc                 C   s   dS )a  Works like :meth:`set` but does not overwrite the values of already
        existing keys.

        :param key: the key to set
        :param value: the value for the key
        :param timeout: the cache timeout for the key in seconds (if not
                        specified, it uses the default timeout). A timeout of
                        0 indicates that the cache never expires.
        :returns: Same as :meth:`set`, but also ``False`` for already
                  existing keys.
        :rtype: boolean
        Tr   r   r   r   r   addL   s    zBaseCache.addc                 C   s,   d}|  D ]\}}| |||sd}q|S )a  Sets multiple keys and values from a mapping.

        :param mapping: a mapping with the keys/values to set.
        :param timeout: the cache timeout for the key in seconds (if not
                        specified, it uses the default timeout). A timeout of
                        0 indicates that the cache never expires.
        :returns: Whether all given keys have been set.
        :rtype: boolean
        TF)itemsr   )r   mappingr
   rvr   r   r   r   r   set_many[   s
    
zBaseCache.set_manyc                    s   t  fdd|D S )zDeletes multiple keys at once.

        :param keys: The function accepts multiple keys as positional
                     arguments.
        :returns: Whether all given keys have been deleted.
        :rtype: boolean
        c                 3   s   | ]}  |V  qd S r   )r   )r   r   r   r   r   	<genexpr>s   s     z(BaseCache.delete_many.<locals>.<genexpr>)allr   r   r   r   delete_manyk   s    zBaseCache.delete_manyc                 C   s   t ddS )a  Checks if a key exists in the cache without returning it. This is a
        cheap operation that bypasses loading the actual data on the backend.

        This method is optional and may not be implemented on all caches.

        :param key: the key to check
        z%s doesn't have an efficient implementation of `has`. That means it is impossible to check whether a key exists without fully loading the key's data. Consider using `self.get` explicitly if you don't care about performance.N)NotImplementedErrorr   r   r   r   hasu   s    zBaseCache.hasc                 C   s   dS )zClears the cache.  Keep in mind that not all caches support
        completely clearing the cache.

        :returns: Whether the cache has been cleared.
        :rtype: boolean
        Tr   r   r   r   r   clear   s    zBaseCache.clear   c                 C   s&   |  |pd| }| ||r"|S dS )aH  Increments the value of a key by `delta`.  If the key does
        not yet exist it is initialized with `delta`.

        For supporting caches this is an atomic operation.

        :param key: the key to increment.
        :param delta: the delta to add.
        :returns: The new value or ``None`` for backend errors.
            Nr   r   r   r   deltar   r   r   r   inc   s    
zBaseCache.incc                 C   s&   |  |pd| }| ||r"|S dS )aL  Decrements the value of a key by `delta`.  If the key does
        not yet exist it is initialized with `-delta`.

        For supporting caches this is an atomic operation.

        :param key: the key to increment.
        :param delta: the delta to subtract.
        :returns: The new value or `None` for backend errors.
        r)   Nr*   r+   r   r   r   dec   s    
zBaseCache.dec)r   )N)N)N)r(   )r(   )__name__
__module____qualname____doc__r	   r   r   r   r   r   r   r   r!   r$   r&   r'   r-   r.   r   r   r   r   r      s   
	



	
r   c                   @   s   e Zd ZdZdd ZdS )	NullCachezA cache that doesn't cache.  This can be useful for unit testing.

    :param default_timeout: a dummy parameter that is ignored but exists
                            for API compatibility with other caches.
    c                 C   s   dS )NFr   r   r   r   r   r&      s    zNullCache.hasN)r/   r0   r1   r2   r&   r   r   r   r   r3      s   r3   N)r   r3   r   r   r   r   <module>   s    (