U
    Zf9                     @   s4   d dl Zd dlmZ d dlmZ G dd deZdS )    N)	BaseCache)RedisSerializerc                	   @   s  e Zd ZU dZdZejed< dZejed< e	 Z
d,ejeeje eeeje ejd	d
dZeje edddZeejdddZeejej dddZd-eejeje ejdddZd.eejeje ejdddZd/ejeejf eje ejej dddZeedddZeejej ddd Zeedd!d"Zed#d$d%Zd0eeejd'd(d)Zd1eeejd'd*d+ZdS )2
RedisCachea  Uses the Redis key-value store as a cache backend.

    The first argument can be either a string denoting address of the Redis
    server or an object resembling an instance of a redis.Redis class.

    Note: Python Redis API already takes care of encoding unicode strings on
    the fly.

    :param host: address of the Redis server or an object which API is
                 compatible with the official Python Redis client (redis-py).
    :param port: port number on which Redis server listens for connections.
    :param password: password authentication for the Redis server.
    :param db: db (zero-based numeric index) on Redis Server to connect.
    :param default_timeout: the default timeout that is used if no timeout is
                            specified on :meth:`~BaseCache.set`. A timeout of
                            0 indicates that the cache never expires.
    :param key_prefix: A prefix that should be added to all keys.

    Any additional keyword arguments will be passed to ``redis.Redis``.
    N_read_client_write_client	localhost  r   ,  )hostportpassworddbdefault_timeout
key_prefixkwargsc           
   
   K   s   t | | |d krtdt|trzdd l}W n, tk
r^ }	 ztd|	W 5 d }	~	X Y nX |dd rttd|j	f ||||d| | _
| _n| | _| _
|pd| _d S )Nz)RedisCache host parameter may not be Noner   zno redis module foundZdecode_responsesz0decode_responses is not supported by RedisCache.)r
   r   r   r    )r   __init__
ValueError
isinstancestrredisImportErrorRuntimeErrorgetZRedisr   r   r   )
selfr
   r   r   r   r   r   r   r   err r   2/tmp/pip-unpacked-wheel-7m7iy3r0/cachelib/redis.pyr   !   s(    

   zRedisCache.__init__)timeoutreturnc                 C   s   t | |}|dkrd}|S )zNormalize timeout by setting it to default of 300 if
        not defined (None) or -1 if explicitly set to zero.

        :param timeout: timeout to normalize.
        r   )r   _normalize_timeout)r   r   r   r   r   r!   <   s    zRedisCache._normalize_timeout)keyr   c                 C   s   | j | j| j| S N)
serializerloadsr   r   r   r   r"   r   r   r   r   G   s    zRedisCache.get)keysr   c                    s<    j r fdd|D }nt|} fdd j|D S )Nc                    s   g | ]} j | qS r   r   .0r"   r   r   r   
<listcomp>L   s     z'RedisCache.get_many.<locals>.<listcomp>c                    s   g | ]} j |qS r   )r$   r%   )r*   xr+   r   r   r,   O   s     )r   listr   Zmgetr   r'   Zprefixed_keysr   r+   r   get_manyJ   s    zRedisCache.get_many)r"   valuer   r   c                 C   sR   |  |}| j|}|dkr6| jj| j| |d}n| jj| j| ||d}|S )Nr    namer1   r3   r1   time)r!   r$   dumpsr   setr   setex)r   r"   r1   r   dumpresultr   r   r   r7   Q   s    
  zRedisCache.setc                 C   sR   |  |}| j|}| jj| j| |d}|rN|dkrN| jj| j| |d |S )Nr2   r    )r3   r5   )r!   r$   r6   r   Zsetnxr   Zexpire)r   r"   r1   r   r9   createdr   r   r   add\   s    
zRedisCache.add)mappingr   r   c                 C   s   |  |}| jjdd}| D ]H\}}| j|}|dkrR|j| j| |d q |j| j| ||d q |	 }dd t
| |D S )NF)Ztransactionr    r2   r4   c                 S   s   g | ]\}}|r|qS r   r   )r*   kZwas_setr   r   r   r,   t   s      z'RedisCache.set_many.<locals>.<listcomp>)r!   r   Zpipelineitemsr$   r6   r7   r   r8   executezipr'   )r   r=   r   piper"   r1   r9   resultsr   r   r   set_manye   s    
zRedisCache.set_manyc                 C   s   t | j| j| S r#   )boolr   deleter   r&   r   r   r   rF   v   s    zRedisCache.deletec                    sN   |sg S  j r" fdd|D }ndd |D } jj|   fdd|D S )Nc                    s   g | ]} j | qS r   r(   r)   r+   r   r   r,   }   s     z*RedisCache.delete_many.<locals>.<listcomp>c                 S   s   g | ]}|qS r   r   r*   r>   r   r   r   r,      s     c                    s   g | ]}  |s|qS r   )hasrG   r+   r   r   r,      s     
 )r   r   rF   r/   r   r+   r   delete_manyy   s    zRedisCache.delete_manyc                 C   s   t | j| j| S r#   )rE   r   existsr   r&   r   r   r   rH      s    zRedisCache.has)r   c                 C   s@   d}| j r.| j| j d }|r8| jj| }n
| j }t|S )Nr   *)r   r   r'   r   rF   ZflushdbrE   )r   statusr'   r   r   r   clear   s    
zRedisCache.clear   )r"   deltar   c                 C   s   | j j| j| |dS N)r3   amountr   incrr   r   r"   rO   r   r   r   inc   s    zRedisCache.incc                 C   s   | j j| j| | dS rP   rR   rT   r   r   r   dec   s    zRedisCache.dec)r   r   Nr   r	   N)N)N)N)rN   )rN   )__name__
__module____qualname____doc__r   _tAny__annotations__r   r   r$   intOptionalr   r   r!   r   Listr0   r7   r<   DictrD   rE   rF   rI   rH   rM   rU   rV   r   r   r   r   r      sH   
        
  


r   )typingr[   Zcachelib.baser   Zcachelib.serializersr   r   r   r   r   r   <module>   s   