o
    ;h                     @  sp   d dl mZ d dlZd dlmZ d dlmZ d dlmZ eddded	d
dedddG dd deZ	dS )    )annotationsN)versionchanged)Version)RedisStoragez3.14.0z_
Dropped support for the :pypi:`redis-py-cluster` library
which has been abandoned/deprecated.
)versionreasonz2.5.0aa  
Cluster support was provided by the :pypi:`redis-py-cluster` library
which has been absorbed into the official :pypi:`redis` client. By
default the :class:`redis.cluster.RedisCluster` client will be used
however if the version of the package is lower than ``4.2.0`` the implementation
will fallback to trying to use :class:`rediscluster.RedisCluster`.
z4.3ztAdded support for using the redis client from :pypi:`valkey` if :paramref:`uri` has the ``valkey+cluster://`` schemac                      sd   e Zd ZU dZddgZ	 ddiZded< 	 eded	d
Ze	j
dfd fddZdddZ  ZS )RedisClusterStoragez
    Rate limit storage with redis cluster as backend

    Depends on :pypi:`redis` (or :pypi:`valkey` if :paramref:`uri`
    starts with ``valkey+cluster://``).
    zredis+clusterzvalkey+clusterZmax_connectionsi  zdict[str, float | str | bool]DEFAULT_OPTIONSz4.2.0z6.0)redisvalkeyFuristr
key_prefixwrap_exceptionsbooloptionsfloat | str | boolreturnNonec                   sD  t j|}i }|jr|j|d< |jr|j|d< |jdd }g }|j|d dD ]}	|	d\}
}||
t	|f q,| _
d _|drLdnd	 _i  j||} j j j _ fd
d|D } jd	kr| jjjdd|i| _n jjjdd|i| _ jsJ  | tt j||fi | dS )a  
        :param uri: url of the form
         ``redis+cluster://[:password]@host:port,host:port``

         If the uri scheme is ``valkey+cluster`` the implementation used will be from
         :pypi:`valkey`.
        :param key_prefix: the prefix for each key created in redis
        :param wrap_exceptions: Whether to wrap storage exceptions in
         :exc:`limits.errors.StorageError` before raising it.
        :param options: all remaining keyword arguments are passed
         directly to the constructor of :class:`redis.cluster.RedisCluster`
        :raise ConfigurationError: when the :pypi:`redis` library is not
         available or if the redis cluster cannot be reached.
        usernamepassword@   N,:r   r
   c                   s   g | ]	} j jj| qS  )
dependencyclusterZClusterNode).0cselfr   O/var/www/html/venv/lib/python3.10/site-packages/limits/storage/redis_cluster.py
<listcomp>`   s    z0RedisClusterStorage.__init__.<locals>.<listcomp>startup_nodesr   )urllibparseurlparser   r   netlocfindsplitappendintr   storage
startswithZtarget_serverr	   dependenciesmoduler   r   ZRedisClusterZValkeyClusterZinitialize_storagesuperr   __init__)r!   r   r   r   r   parsedZparsed_authsepZcluster_hostslochostportZmerged_optionsr$   	__class__r    r"   r2   8   s>   





zRedisClusterStorage.__init__
int | Nonec                   sR   |  d}d}| j D ]}| j|  |}|t fdd|D 7 }q|S )a  
        Redis Clusters are sharded and deleting across shards
        can't be done atomically. Because of this, this reset loops over all
        keys that are prefixed with :paramref:`RedisClusterStorage.prefix` and
        calls delete on them one at a time.

        .. warning::
         This operation was not tested with extremely large data sets.
         On a large production based system, care should be taken with its
         usage as it could be slow on very large data sets*r   c                   s   g | ]
}  |d qS )zutf-8)deletedecode)r   knoder   r"   r#      s    z-RedisClusterStorage.reset.<locals>.<listcomp>)Zprefixed_keyr-   Zget_primariesZget_redis_connectionkeyssum)r!   prefixcountprimaryrA   r   r?   r"   resetn   s   

zRedisClusterStorage.reset)
r   r   r   r   r   r   r   r   r   r   )r   r:   )__name__
__module____qualname____doc__ZSTORAGE_SCHEMEr	   __annotations__r   ZDEPENDENCIESr   PREFIXr2   rF   __classcell__r   r   r8   r"   r      s   
 6r   )

__future__r   r%   Zdeprecated.sphinxr   Zpackaging.versionr   Zlimits.storage.redisr   r   r   r   r   r"   <module>   s$    
