o
    ;h                      @   s  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZ d dlmZ d dlmZmZmZ z*d dlZejdZeed  dkpZeed  dkoZeed	 d
kZesaedW n eym   dZY nw zd dlZdZW n ey   dZY nw zd dlZdZW n ey   dZY nw d dlm Z  dd Z!edd Z"dee#e$f de#fddZ%dd Z&dee#ef de	e#ef fddZ'dd Z(dd Z)dHd!d"Z*dId#d$Z+	 	 	
dHd%ee,e#f d&e#d'e#d(e#d)ef
d*d+Z-d,gg d d fd-e,d.e,d'e#d(e#fd/d0Z.d1d2 Z/d3d4 Z0d5e#d6e1de#fd7d8Z2d9e#d:e#defd;d<Z3d=d> Z4				dJd?ee d@ee dAee dBee de
e f
dCdDZ5dKdFdGZ6dS )L    N)contextmanagerwraps)AnyDictListMappingOptionalUnion)	DataError)
AbsExpiryT
EncodableTExpiryT.         z"hiredis package should be >= 3.2.0FT)metadatac                 K   s   ddl m} |j| fi |S )z
    Returns an active Redis client generated from the given database URL.

    Will attempt to extract the database id from the path url fragment, if
    none is provided.
    r   )Redis)Zredis.clientr   from_url)urlkwargsr    r   >/var/www/html/venv/lib/python3.10/site-packages/redis/utils.pyr   )   s   r   c                 c   s    |   }|V  |  d S N)pipelineexecute)Z	redis_objpr   r   r   r   5   s   r   valuereturnc                 C   s   t | tr| jdddS | S )Nutf-8replace)errors)
isinstancebytesdecoder   r   r   r   str_if_bytes<   s   r'   c                 C   s   t t| S r   )strr'   r&   r   r   r   safe_strB      r)   dictsc                  G   s   i }| D ]}| | q|S )za
    Merge all provided dicts into 1 dict.
    *dicts : `dict`
        dictionaries to merge
    )update)r+   Zmergeddr   r   r   
dict_mergeF   s   r.   c                 C   s   t | |S r   )dictfromkeys)Zkey_listcallbackr   r   r   list_keys_to_dictT   r*   r2   c                 C   s0   t  }| D ]}|D ]}|| qqt|S )z
    Merge all items in `res` into a list.

    This command is used when sending a command to multiple nodes
    and the result from each node should be merged into a single list.

    res : 'dict'
    )setvaluesaddlist)commandresresultvr   r   r   r   merge_resultX   s   	r;    c                 C   sP   dd l }d|  d}|r|d| d7 }|r|d| d7 }|j|t|d d S )Nr   zCall to deprecated r    () -- Deprecated since version category
stacklevelwarningswarnDeprecationWarning)namereasonversionrB   rD   msgr   r   r   warn_deprecatedj   s   rK   c                    s    fdd}|S )z5
    Decorator to mark a function as deprecated.
    c                    s   t   fdd}|S )Nc                     s$   t p jdd  | i |S )Nr   rB   )rK   __name__)argsr   )funcrG   rH   rI   r   r   wrapper{   s   z7deprecated_function.<locals>.decorator.<locals>.wrapperr   rO   rP   rG   rH   rI   rO   r   	decoratorz   s   z&deprecated_function.<locals>.decoratorr   )rH   rI   rG   rT   r   rR   r   deprecated_functionu   s   rU   arg_namefunction_namerH   rI   rB   c                 C   sV   dd l }d| d|  d}|r|d| d7 }|r!|d| d7 }|j|t|d	 d S )
Nr   z	Call to 'z6' function with deprecated usage of input argument/s 'z'.r=   r>   r?   r   r@   rC   )rV   rW   rH   rI   rB   rD   rJ   r   r   r   warn_deprecated_arg_usage   s   rX   *args_to_warnallowed_argsc                    s    fdd}|S )z
    Decorator to mark specified args of a function as deprecated.
    If '*' is in args_to_warn, all arguments will be marked as deprecated.
    c                    s    t   fdd}|S )Nc                     s   j jd j j }tt|| }|| |dd   D ]}||d  qD ])}|dkrDt|dkrDtt	|
 jdd q)||v rRt|jdd q)| i |S )NselfrY   r   r   rL   )__code__co_varnamesco_argcountr/   zipr,   poplenrX   r6   keysrM   )rN   r   	arg_namesZprovided_argsZallowed_argarg)r[   rZ   rO   rH   rI   r   r   rP      s*   

z3deprecated_args.<locals>.decorator.<locals>.wrapperr   rQ   r[   rZ   rH   rI   rS   r   rT      s   z"deprecated_args.<locals>.decoratorr   )rZ   r[   rH   rI   rT   r   rf   r   deprecated_args   s   rg   c                  C   sN   dt jjj vr%t d} | t j t  }|t j | 	| dS dS )zo
    Set up a logger that log info logs to stdout.
    (This is used by the default push response handler)
    Zpush_responseN)
loggingrootmanager
loggerDictrc   	getLoggersetLevelINFOStreamHandler
addHandler)loggerhandlerr   r   r   _set_info_logger   s   
rs   c                  C   s,   zt d} W | S  t jy   d} Y | S w )NZredisz99.99.99)r   rI   PackageNotFoundError)Zlibverr   r   r   get_lib_version   s   ru   
host_error	exceptionc                 C   s\   |j s	d|  dS t|j dkrd|j d  d|  dS d|j d  d|  d|j d  dS )NzError connecting to r   r   zError r   z connecting to z. )rN   rb   )rv   rw   r   r   r   format_error_message   s   rx   version1version2c                 C   s   t tt| d}t tt|d}t|t|kr1t|t| }t|D ]}|d q(nt|t|k rMt|t| }t|D ]}|d qEt|D ]\}}|| || kr` dS || || k rk dS qQdS )z
    Compare two versions.

    :return: -1 if version1 > version2
             0 if both versions are equal
             1 if version1 < version2
    r   r   r   )r6   mapintsplitrb   rangeappend	enumerate)ry   rz   Znum_versions1Znum_versions2diff_iverr   r   r   compare_versions   s$   	r   c                 C   s*   t | tr
| dS t | tr| S td)Nr    z$Key must be either a string or bytes)r#   r$   r%   r(   	TypeError)keyr   r   r   ensure_string  s
   


r   expxexatpxatc                 C   s<  g }| d ur>| d t| tjr| t|   |S t| tr(| |  |S t| tr:|  r:| t|  |S td|d urj| d t|tjrZ| t| d  |S t|trf| | |S td|d urt|tjrzt|	 }|
d|g |S |d urt|tjrt|	 d }|
d|g |S )NZEXz$ex must be datetime.timedelta or intZPXi  z$px must be datetime.timedelta or intZEXATZPXAT)r   r#   datetime	timedeltar}   total_secondsr(   isdigitr   	timestampextend)r   r   r   r   Zexp_optionsr   r   r   extract_expire_flags  s@   





r   d   c                 C   s   t j| |dddS )Nz...T)textwidthplaceholderbreak_long_words)textwrapshorten)txt
max_lengthr   r   r   truncate_text3  s   r   )r<   r<   r   )r<   r<   N)NNNN)r   )7r   rh   r   
contextlibr   	functoolsr   typingr   r   r   r   r	   r
   Zredis.exceptionsr   Zredis.typingr   r   r   Zhiredis__version__r~   Zhiredis_versionr}   ZHIREDIS_AVAILABLEImportErrorsslZSSL_AVAILABLEZcryptographyZCRYPTOGRAPHY_AVAILABLE	importlibr   r   r   r(   r$   r'   r)   r.   r2   r;   rK   rU   r6   rX   rg   rs   ru   BaseExceptionrx   r   r   r   r   r   r   r   r   <module>   s     
"




-

%