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)redis.clientr   from_url)urlkwargsr    r   k/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/redis/utils.pyr   )   s   r   c                 c   s    |   }|V  |  d S N)pipelineexecute)	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-   mergeddr   r   r   
dict_mergeF   s   r1   c                 C   s   t | |S r   )dictfromkeys)key_listcallbackr   r   r   list_keys_to_dictT   r,   r6   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versionrF   rH   msgr   r   r   warn_deprecatedj   s   rO   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   rF   )rO   __name__)argsr   )funcrK   rL   rM   r   r   wrapper{   s   z7deprecated_function.<locals>.decorator.<locals>.wrapperr   rS   rT   rK   rL   rM   rS   r   	decoratorz   s   z&deprecated_function.<locals>.decoratorr   )rL   rM   rK   rX   r   rV   r   deprecated_functionu   s   rY   arg_namefunction_namerL   rM   rF   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'.rA   rB   rC   r   rD   rG   )rZ   r[   rL   rM   rF   rH   rN   r   r   r   warn_deprecated_arg_usage   s   r\   *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selfr]   r   r   rP   )__code__co_varnamesco_argcountr2   zipr.   poplenr\   r:   keysrQ   )rR   r   	arg_namesprovided_argsallowed_argarg)r_   r^   rS   rL   rM   r   r   rT      s*   

z3deprecated_args.<locals>.decorator.<locals>.wrapperr   rU   r_   r^   rL   rM   rW   r   rX      s   z"deprecated_args.<locals>.decoratorr   )r^   r_   rL   rM   rX   r   rl   r   deprecated_args   s   rm   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)
    push_responseN)
loggingrootmanager
loggerDictrg   	getLoggersetLevelINFOStreamHandler
addHandler)loggerhandlerr   r   r   _set_info_logger   s   
rz   c                  C   s,   zt d} W | S  t jy   d} Y | S w )Nredisz99.99.99)r   rM   PackageNotFoundError)libverr   r   r   get_lib_version   s   r~   
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. )rR   rf   )r   r   r   r   r   format_error_message   s   r   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   )r:   mapintsplitrf   rangeappend	enumerate)r   r   num_versions1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 )NEXz$ex must be datetime.timedelta or intPXi  z$px must be datetime.timedelta or intEXATPXAT)r   r%   datetime	timedeltar   total_secondsr*   isdigitr   	timestampextend)r   r   r   r   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   ro   r   
contextlibr   	functoolsr   typingr   r   r   r   r	   r
   redis.exceptionsr   redis.typingr   r   r   hiredis__version__r   hiredis_versionr   HIREDIS_AVAILABLEImportErrorsslSSL_AVAILABLEcryptographyCRYPTOGRAPHY_AVAILABLE	importlibr   r   r   r*   r&   r)   r+   r1   r6   r?   rO   rY   r:   r\   rm   rz   r~   BaseExceptionr   r   r   r   r   r   r   r   r   <module>   s     
"




-

%