o
    <‘ði;7  ã                   @   sÔ  d dl Z d dlZ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
 d dlmZmZ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 erRd dlmZ z*d dlZej d	¡Ze ed  ƒd
kpte ed  ƒd
kote ed ƒdkZ!e!s{e"dƒ‚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 zd dl%Z%dZ&W n e"y¯   dZ&Y nw d dl'm(Z( de)deddf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"„ Z0d#d$„ Z1ddd&d'„Z2ded(d)„Z3	%	%	ddd*ee4e)f d+e)d,e)d-e)d.e f
d/d0„Z5ed1ed2�Z6	dfd3ed4e7de8d5eee)  de8f
d6d7„Z9			%	%dgd8eee)  d5eee)  d,e)d-e)dee6ge6f f
d9d:„Z:d;d<„ Z;	
dhd=eee)e f  d>e de<fd?d@„Z=dAdB„ Z>dCe)dDe?de)fdEdF„Z@dGe)dHe)de fdIdJ„ZAdKdL„ ZB				didMee dNee dOee dPee dee f
dQdR„ZCdjdTdU„ZDdVdW„ ZEdXdY„ ZFdZd[„ ZGdkd\d]„ZHdee6ge6f fd^d_„ZI	dkd*ee4e)f d+e)d.e fd`da„ZJ	dfd8eee)  dee6ge6f fdbdc„ZKdS )lé    N)ÚCallable)Úcontextmanager)Úwraps)ÚTYPE_CHECKINGÚAnyÚDictÚListÚMappingÚOptionalÚTypeVarÚUnion)Ú	DataError)Ú
AbsExpiryTÚ
EncodableTÚExpiryT©ÚRedisÚ.é   é   é   z"hiredis package should be >= 3.2.0FT)ÚmetadataÚurlÚkwargsÚreturnr   c                 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   r   )Úredis.clientr   Úfrom_url)r   r   r   © r   úJ/root/parts/websockify/install/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    ;   s   €r    Úvaluec                 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_bytesB   s   ÿÿr,   c                 C   s   t t| ƒƒS r   )Ústrr,   r+   r   r   r   Úsafe_strH   ó   r.   Údictsc                  G   s   i }| D ]}|  |¡ q|S )za
    Merge all provided dicts into 1 dict.
    *dicts : `dict`
        dictionaries to merge
    )Úupdate)r0   ÚmergedÚdr   r   r   Ú
dict_mergeL   s   r4   c                 C   s   t  | |¡S r   )ÚdictÚfromkeys)Úkey_listÚcallbackr   r   r   Úlist_keys_to_dictZ   r/   r9   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_result^   s   	ÿrB   Ú 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ÚversionrI   rK   Úmsgr   r   r   Úwarn_deprecatedp   s   rR   c                    s   ‡ ‡‡fdd„}|S )z5
    Decorator to mark a function as deprecated.
    c                    sF   t  ˆ ¡rtˆ ƒ‡ ‡‡‡fdd„ƒ}|S tˆ ƒ‡ ‡‡‡fdd„ƒ}|S )Nc                  Ÿ   s,   �t ˆpˆ jˆˆdd� ˆ | i |¤ŽI d H S ©Nr   ©rI   ©rR   Ú__name__©Úargsr   ©ÚfuncrN   rO   rP   r   r   Úasync_wrapperƒ   s   €z=deprecated_function.<locals>.decorator.<locals>.async_wrapperc                     s$   t ˆpˆ jˆˆdd� ˆ | i |¤ŽS rS   rU   rW   rY   r   r   Úwrapper‹   s   z7deprecated_function.<locals>.decorator.<locals>.wrapper©ÚinspectÚiscoroutinefunctionr   ©rZ   r[   r\   ©rN   rO   rP   ©rZ   r   Ú	decorator€   s   
z&deprecated_function.<locals>.decoratorr   )rO   rP   rN   rc   r   ra   r   Údeprecated_function{   s   rd   Úarg_nameÚfunction_namerO   rP   rI   c                 C   sV   dd l }d|› d| › d�}|r|d|› d�7 }|r!|d|› d�7 }|j|t|d	� d S )
Nr   ú	Call to 'z6' function with deprecated usage of input argument/s 'ú'.rD   rE   rF   r   rG   rJ   )re   rf   rO   rP   rI   rK   rQ   r   r   r   Úwarn_deprecated_arg_usage•   s   ÿÿri   ÚC)ÚboundrZ   rX   Úallowed_argsc                 C   sV   | j jd| j j… }tt||ƒƒ}| |¡ | dd¡ |r)|D ]}| |d¡ q |S )z¡
    Extract arguments from function call that should be checked for deprecation/experimental warnings.
    Excludes 'self' and any explicitly allowed args.
    NÚself)Ú__code__Úco_varnamesÚco_argcountr5   Úzipr1   Úpop)rZ   rX   r   rl   Ú	arg_namesÚfilterable_argsÚallowed_argr   r   r   Ú_get_filterable_args¬   s   
rv   Úargs_to_warnc                    sF   ˆdu rdg‰ˆdu rg ‰‡‡‡fdd„‰ dt dt f‡ ‡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.
    NÚ*c                    s\   ˆ D ])}|dkrt |ƒdkrtt| ¡ ƒ| jˆˆdd� q||v r+t|| jˆˆdd� qdS )z*Check and warn about deprecated arguments.rx   r   é   rT   N)Úlenri   r=   ÚkeysrV   ©rZ   rt   Úarg)rw   rO   rP   r   r   Ú_check_deprecated_argsÌ   s   
ûÿ€öz/deprecated_args.<locals>._check_deprecated_argsrZ   r   c                    sB   t  ˆ ¡rtˆ ƒ‡‡‡ fdd„ƒ}|S tˆ ƒ‡‡‡ fdd„ƒ}|S )Nc                  Ÿ   s.   �t ˆ| |ˆƒ}ˆ ˆ|ƒ ˆ| i |¤ŽI d H S r   ©rv   ©rX   r   rt   ©r~   rl   rZ   r   r   r[   ß   s   €
z9deprecated_args.<locals>.decorator.<locals>.async_wrapperc                     s&   t ˆ| |ˆƒ}ˆ ˆ|ƒ ˆ| i |¤ŽS r   r   r€   r�   r   r   r\   è   s   
z3deprecated_args.<locals>.decorator.<locals>.wrapperr]   r`   )r~   rl   rb   r   rc   Ü   s   
z"deprecated_args.<locals>.decorator©rj   )rw   rl   rO   rP   rc   r   )r~   rl   rw   rO   rP   r   Údeprecated_args½   s   
rƒ   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Ú
loggerDictr{   Ú	getLoggerÚsetLevelÚINFOÚStreamHandlerÚ
addHandler)ÚloggerÚhandlerr   r   r   Ú_set_info_loggeró   s   
ûr�   ÚprotocolÚexpected_versionc                 C   sF   | d u rdS t | tƒrz	t| ƒ} W | |kS  ty   Y dS w | |kS )NF)r(   r-   ÚintÚ
ValueError)r‘   r’   r   r   r   Úcheck_protocol_version   s   

þÿr•   c                  C   s,   zt  d¡} W | S  t jy   d} Y | S w )NÚredisz99.99.99)r   rP   Ú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. )rX   rz   )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=   Úmapr“   Úsplitrz   Ú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rƒt|tjƒrzt| 	¡ ƒ}| 
d|g¡ |S |d urœt|tjƒr•t| 	¡ 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_flagsH  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_textm  s   ÿrÈ   c                   C   s   dS )zT
    Fake function for a Retry object if you don't need to handle each failure.
    Nr   r   r   r   r   Ú
dummy_fails  s   rÉ   c                   Ã   s   �dS )zZ
    Async fake function for a Retry object if you don't need to handle each failure.
    Nr   r   r   r   r   Údummy_fail_asyncz  s   €rÊ   c                    s&   ˆ j ‰tˆƒ‡ ‡fdd„ƒ}|ˆ _ ˆ S )z4
    Decorator to mark a class as experimental.
    c                    s2   t jˆ j› d�tdd� ˆ| g|¢R i |¤Ž d S )NzD is an experimental and may change or be removed in future versions.r   rG   )rK   rL   rV   ÚUserWarning)rm   rX   r   ©ÚclsÚoriginal_initr   r   Únew_init‡  s   
ýzexperimental.<locals>.new_init)Ú__init__r   )rÍ   rÏ   r   rÌ   r   Úexperimental�  s
   rÑ   c                 C   s(   dd l }d| › d�}|j|t|d� d S )Nr   zCall to experimental method zS. Be aware that the function arguments can change or be removed in future versions.rG   ©rK   rL   rË   )rN   rI   rK   rQ   r   r   r   Úwarn_experimental”  s   
ÿrÓ   c                  C   s   dt dt fdd„} | S )z7
    Decorator to mark a function as experimental.
    rZ   r   c                    s:   t  ˆ ¡rtˆ ƒ‡ fdd„ƒ}|S tˆ ƒ‡ fdd„ƒ}|S )Nc                  Ÿ   s$   �t ˆ jdd� ˆ | i |¤ŽI d H S ©Nr   rT   ©rÓ   rV   rW   rb   r   r   r[   §  s   €z=experimental_method.<locals>.decorator.<locals>.async_wrapperc                     s   t ˆ jdd� ˆ | i |¤ŽS rÔ   rÕ   rW   rb   r   r   r\   ¯  s   z7experimental_method.<locals>.decorator.<locals>.wrapperr]   r`   r   rb   r   rc   ¤  s   
z&experimental_method.<locals>.decoratorr‚   )rc   r   r   r   Úexperimental_methodŸ  s   rÖ   c                 C   s.   dd l }d|› d| › d�}|j|t|d� d S )Nr   rg   z6' method with experimental usage of input argument/s 'rh   rG   rÒ   )re   rf   rI   rK   rQ   r   r   r   Úwarn_experimental_arg_usage¹  s   ÿÿr×   c                    s4   ˆdu rdg‰‡fdd„‰ dt dt f‡ fdd„}|S )	z–
    Decorator to mark specified args of a function as experimental.
    If '*' is in args_to_warn, all arguments will be marked as experimental.
    Nrx   c                    sT   ˆ D ]%}|dkrt |ƒdkrtt| ¡ ƒ| jdd� q||v r't|| jdd� qdS )z,Check and warn about experimental arguments.rx   r   é   rT   N)rz   r×   r=   r{   rV   r|   )rw   r   r   Ú_check_experimental_argsÑ  s   ÿ€úz3experimental_args.<locals>._check_experimental_argsrZ   r   c                    s>   t  ˆ ¡rtˆ ƒ‡‡ fdd„ƒ}|S tˆ ƒ‡‡ fdd„ƒ}|S )Nc                  Ÿ   s8   �t ˆ| |ƒ}t|ƒdkrˆ ˆ|ƒ ˆ| i |¤ŽI d H S ©Nr   ©rv   rz   r€   ©rÙ   rZ   r   r   r[   Þ  s
   €
z;experimental_args.<locals>.decorator.<locals>.async_wrapperc                     s0   t ˆ| |ƒ}t|ƒdkrˆ ˆ|ƒ ˆ| i |¤ŽS rÚ   rÛ   r€   rÜ   r   r   r\   è  s   
z5experimental_args.<locals>.decorator.<locals>.wrapperr]   r`   )rÙ   rb   r   rc   Û  s   
z$experimental_args.<locals>.decoratorr‚   )rw   rc   r   )rÙ   rw   r   Úexperimental_argsÇ  s
   
rÝ   )rC   rC   r   )rC   rC   Nr   )NNrC   rC   )r   )NNNN)r¿   )r   )Lr·   r^   r…   rÄ   rK   Úcollections.abcr   Ú
contextlibr   Ú	functoolsr   Útypingr   r   r   r   r	   r
   r   r   Úredis.exceptionsr   Úredis.typingr   r   r   r   r   ÚhiredisÚ__version__r¡   Úhiredis_versionr“   ÚHIREDIS_AVAILABLEÚImportErrorÚsslÚSSL_AVAILABLEÚcryptographyÚCRYPTOGRAPHY_AVAILABLEÚ	importlibr   r-   r   r    r)   r,   r.   r4   r9   rB   rR   rd   r=   ri   rj   Útupler5   rv   rƒ   r�   Úboolr•   r™   ÚBaseExceptionrœ   r«   r®   r¾   rÈ   rÉ   rÊ   rÑ   rÓ   rÖ   r×   rÝ   r   r   r   r   Ú<module>   s   (ÿÿÿÿÿ
"

û
ÿþýü
ûÿÿÿÿ
ÿ
þü
ÿ
þýü
û6ÿÿÿ
þ
üÿþýü
û
%
ý
ÿþ
ýÿ
ÿþ