
    2ie<              
          U d Z 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mZm	Z	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 ddlmZmZ dZi Zeed	f   ed
<    e        Z!ee   ed<    G d d      Z" G d d      Z# G d d      Z$ G d d      Z% G d de%      Z& G d de&      Z' G d de&      Z( G d de&      Z) G d de%      Z* G d de*      Z+ G d  d!e*      Z,ejZ                   G d" d#             Z.ejZ                   G d$ d%             Z/ G d& d'e%      Z0 G d( d)e%      Z1 G d* d	      Z2d+efd,Z3d-e$d+e4fd.Z5d/e4d0e4d1e4d+ee4e4f   fd2Z6d/e4d0e4d1e4d+ee4e4f   fd3Z7 G d4 d5e&      Z8y)6z
Helper classes and methods used in mixins implementing various commands.
Unlike _helpers.py, here the methods should be used only in mixins.
    N)TupleUnionOptionalAnyTypeListCallableSequenceDictSet
Collection   )_msgs)null_terminateSimpleErrorDatabase)VersionType
ServerTypei    	SignatureSUPPORTED_COMMANDSCOMMANDS_WITH_SUBc                   D    e Zd ZdZ e       Zdefdeee      deddfdZ	y)Keyz6Marker to indicate that argument in signature is a keyNtype_missing_returnreturnc                      || _         || _        y N)r   r   )selfr   r   s      ]/mnt/e/genesis-system/.venvs/voice-bridge/lib/python3.12/site-packages/fakeredis/_commands.py__init__zKey.__init__   s    
,    )
__name__
__module____qualname____doc__objectUNSPECIFIEDr   r   r   r!    r"   r    r   r      s6    @(K48P[ -htCy1 -# -`d -r"   r   c                   (    e Zd ZdZddgZdeddfdZy)ItemzAn item stored in the databasevalueexpireatr   Nc                      || _         d | _        y r   )r,   r-   r   r,   s     r    r!   zItem.__init__%   s    
r"   )r#   r$   r%   r&   	__slots__r   r!   r)   r"   r    r+   r+       s"    (*%Ic d r"   r+   c                      e Zd ZdZddededed    deddf
dZe	defd	       Z
e
j                  d
eddfd       Z
e	dee   fd       Zej                  dee   ddfd       ZdedefdZd
eddfdZddZddeddfdZdefdZeZy)CommandItemzuAn item referenced by a command.

    It wraps an Item but has extra fields to manage updates and notifications.
    Nkeydbitemdefaultr   c                     |  ||| _         d | _        n"|j                  | _         |j                  | _        || _        || _        d| _        d| _        y NF)_value	_expireatr,   r-   r3   r4   	_modified_expireat_modified)r   r3   r4   r5   r6   s        r    r!   zCommandItem.__init__0   sK    <!DK!DN**DK!]]DN"'r"   c                     | j                   S r   r9   r   s    r    r,   zCommandItem.value=   s    {{r"   	new_valuec                 .    || _         d| _        d | _        y NT)r9   r;   r-   r   r@   s     r    r,   zCommandItem.valueA   s    r"   c                     | j                   S r   )r:   r?   s    r    r-   zCommandItem.expireatG   s    ~~r"   r,   c                 .    || _         d| _        d| _        y rB   )r:   r<   r;   r/   s     r    r-   zCommandItem.expireatK   s    "&r"   c                 "    | r| j                   S |S r   r>   )r   r6   s     r    getzCommandItem.getQ   s    "t{{//r"   c                      || _         d| _        y rB   )r9   r;   rC   s     r    updatezCommandItem.updateT   s    r"   c                     d| _         y rB   )r;   r?   s    r    updatedzCommandItem.updatedX   s	    r"   remove_empty_valc                 \   | j                   r| j                  j                  | j                         t	        | j
                  t              sA| j
                  | j
                  s)|r'| j                  j                  | j                  d        y | j                  j                  | j                  t        d             }| j
                  |_        | j                  |_
        y | j                  rB| j                  | j                  v r)| j                  | j                  | j                     _
        y y y r   )r;   r4   notify_watchr3   
isinstancer,   bytespop
setdefaultr+   r-   r<   )r   rL   r5   s      r    	writebackzCommandItem.writeback[   s    >>GG  *djj%0djj6HQUQ[Q[`pDHHd+77%%dhhT
;DDJ MMDM""txx477':)-DGGDHH& (;"r"   c                 d    t        | j                        xs t        | j                  t              S r   )boolr9   rO   rP   r?   s    r    __bool__zCommandItem.__bool__i   s!    DKK BJt{{E$BBr"   )NN)r   N)T)r#   r$   r%   r&   rP   r   r   r   r!   propertyr,   setterfloatr-   rG   rI   rK   rU   rS   rV   __nonzero__r)   r"   r    r2   r2   *   s   
(E (x (x7N (`c (os ( s   \\s t  
 (5/   __huo $  
03 03 0  7$ 7$ 7C$ C Kr"   r2   c                       e Zd Zed        Zy)	RedisTypec                     t         r   )NotImplementedError)clsargskwargss      r    decodezRedisType.decodep   s    !!r"   N)r#   r$   r%   classmethodrb   r)   r"   r    r\   r\   o   s    " "r"   r\   c                       e Zd ZdZej
                  Zej                  ZdZ	dZ
ededefd       Zeddedee   defd	       Zededefd
       Zy)Intz-Argument converter for 64-bit signed integersl         l    r,   r   c                 J    | j                   |cxk  xr | j                  k  S c S r   )	MIN_VALUE	MAX_VALUEr_   r,   s     r    validz	Int.valid}   s     }}66666r"   Ndecode_errorc                     	 t        |      }| j                  |      rt        |      j                         |k7  rt        |S # t        $ r t        |xs | j                        w xY wr   )intrj   strencode
ValueErrorr   DECODE_ERROR)r_   r,   rk   outs       r    rb   z
Int.decode   s`    	@e*C99S>SX__%6%%?  J 	@l>c.>.>??	@s   ?A #A%c                     | j                  |      rt        |      j                         S t        | j                        r   )rj   rn   ro   r   ENCODE_ERRORri   s     r    ro   z
Int.encode   s2    99Uu:$$&&c..//r"   r   )r#   r$   r%   r&   msgsINVALID_INT_MSGrq   OVERFLOW_MSGrt   rg   rh   rc   rm   rU   rj   rP   r   rn   rb   ro   r)   r"   r    re   re   u   s    7''L$$LII7# 7$ 7 7 @5 @ @ @ @ 03 05 0 0r"   re   c                   0    e Zd ZdZej
                  ZdZdZy)DbIndexz'Argument converter for database indicesr      N)	r#   r$   r%   r&   ru   INVALID_DB_MSGrq   rg   rh   r)   r"   r    ry   ry      s    1&&LIIr"   ry   c                   <    e Zd ZdZej
                  ZdZdez  dz
  Z	y)	BitOffsetz-Argument converter for unsigned bit positionsr      r   N)
r#   r$   r%   r&   ru   INVALID_BIT_OFFSET_MSGrq   rg   MAX_STRING_SIZErh   r)   r"   r    r}   r}      s$    7..LIO#a'Ir"   r}   c                   ,    e Zd Zej                  ZdZdZy)BitValuer   r   N)r#   r$   r%   ru   INVALID_BIT_VALUE_MSGrq   rg   rh   r)   r"   r    r   r      s    --LIIr"   r   c                       e Zd ZdZej
                  Ze	 	 	 	 	 ddede	de	de	de	de
e   d	efd
       Zedede	d	efd       Zy)FloatzArgument converter for floating-point values.

    Redis uses long double for some cases (INCRBYFLOAT, HINCRBYFLOAT)
    and double for others (zset scores), but Python doesn't support
    `long double`.
    Nr,   allow_leading_whitespaceallow_erangeallow_empty	crop_nullrk   r   c                    	 |rt        |      }|r|dk(  rd}|s|d d j                         rt        |dd  j                         rt        t        |      }t	        j
                  |      rt        |s@|t        j                  t        j                   dfv rt        j                  d|      rt        |S # t        $ r t        |xs | j                        w xY w)Nr"   s   0.0r           s   ^[^a-zA-Z]*[1-9])r   isspacerp   rY   mathisnaninfrematchr   rq   )r_   r,   r   r   r   r   rk   rr   s           r    rb   zFloat.decode   s    	@&u-u|+bq	0A0A0C  RSz!!#  ,Czz#   488dhhY44BUW\9]$$J 	@l>c.>.>??	@s   B3B6 6#Chumanfriendlyc                    t        j                  |      rt        |      j                         S |r8dj	                  |      }t        j                  dd|      }|j                         S dj	                  |      j                         S )Nz{:.17f}z\.?0+$ z{:.17g})r   isinfrn   ro   formatr   sub)r_   r,   r   rr   s       r    ro   zFloat.encode   sl    ::eu:$$&&""5)C&&B,C::<##E*1133r"   )FFFFN)r#   r$   r%   r&   ru   INVALID_FLOAT_MSGrq   rc   rP   rU   r   rn   rY   rb   ro   r)   r"   r    r   r      s     ))L */"!&*@@ #'@ 	@
 @ @ sm@ 
@ @B 	45 	4 	4% 	4 	4r"   r   c                   ,    e Zd ZdZej
                  ZdZy)TimeoutzArgument converter for timeoutsr   N)r#   r$   r%   r&   ru   TIMEOUT_NEGATIVE_MSGrq   rg   r)   r"   r    r   r      s    ),,LIr"   r   c                   p     e Zd Zej                  Ze	 	 	 	 	 d	dededededede	e
   def fd       Z xZS )
	SortFloatr,   r   r   r   r   rk   r   c                 *    t         |   |ddd      S )NT)r   r   r   )superrb   )r_   r,   r   r   r   r   rk   	__class__s          r    rb   zSortFloat.decode   s     w~edPT`d~eer"   )TFTTN)r#   r$   r%   ru   INVALID_SORT_FLOAT_MSGrq   rc   rP   rU   r   rn   rY   rb   __classcell__r   s   @r    r   r      s    ..L *." &*	f	f #'	f 		f
 	f 	f sm	f 
	f 	fr"   r   c                   8    e Zd ZdedefdZdedefdZdefdZy)	BeforeAnyotherr   c                      yr8   r)   r   r   s     r    __gt__zBeforeAny.__gt__       r"   c                 "    t        |t              S r   )rO   r   r   s     r    __eq__zBeforeAny.__eq__   s    %++r"   c                      yNr   r)   r?   s    r    __hash__zBeforeAny.__hash__      r"   N)	r#   r$   r%   r   rU   r   r   rm   r   r)   r"   r    r   r      s4    C D ,C ,D ,# r"   r   c                   8    e Zd ZdedefdZdedefdZdefdZy)AfterAnyr   r   c                      yr8   r)   r   s     r    __lt__zAfterAny.__lt__  r   r"   c                 "    t        |t              S r   )rO   r   r   s     r    r   zAfterAny.__eq__
  s    %**r"   c                      yr   r)   r?   s    r    r   zAfterAny.__hash__  r   r"   N)	r#   r$   r%   r   rU   r   r   rm   r   r)   r"   r    r   r     s4    C D +C +D +# r"   r   c                       e Zd ZdZddededee   fdZe	dedd fd       Z
defd	Zedeeeeef   f   fd
       Zedeeeeef   f   fd       Zy)	ScoreTestz2Argument converter for sorted set score endpoints.Nr,   	exclusive	bytes_valc                 .    || _         || _        || _        y r   )r,   r   r   )r   r,   r   r   s       r    r!   zScoreTest.__init__  s    
""r"   r   c                     	 |}d}|d d dk(  rd}|dd  }t         j                  |dddd      } | |||      S # t        $ r t        t        j                        w xY w)NFr      (T)r   r   r   r   )r   rb   r   ru   INVALID_MIN_MAX_FLOAT_MSG)r_   r,   original_valuer   fvalues        r    rb   zScoreTest.decode  s    	>"NIRayD  	ab	\\)-!  " F vy.99 	>d<<==	>s	   69 #Ac                 z    | j                   rdj                  | j                        S t        | j                        S )Nz({!r})r   r   r,   reprr?   s    r    __str__zScoreTest.__str__,  s+    >>>>$**--

##r"   c                 \    | j                   | j                  rt               fS t               fS r   )r,   r   r   r   r?   s    r    lower_boundzScoreTest.lower_bound2  s#    zz8:HHY[HHr"   c                 \    | j                   | j                  rt               fS t               fS r   )r,   r   r   r   r?   s    r    upper_boundzScoreTest.upper_bound6  s#    zz$..9;HHhjHHr"   )FN)r#   r$   r%   r&   rY   rU   r   rP   r!   rc   rb   rn   r   rW   r   r   r   r   r   r   r)   r"   r    r   r     s    <#e # #RW #
 >5 >[ > >$$ $ IU5%)0C*D#DE I I IU5%)0C*D#DE I Ir"   r   c                   F    e Zd ZdZdeeeef   defdZ	e
dedd fd       Zy)
StringTestz0Argument converter for sorted set LEX endpoints.r,   r   c                      || _         || _        y r   )r,   r   )r   r,   r   s      r    r!   zStringTest.__init__>  s    
"r"   r   c                     |dk(  r | t               d      S |dk(  r | t               d      S |d d dk(  r | |dd  d      S |d d dk(  r | |dd  d      S t        t        j                        )N   -T   +r   r      [F)r   r   r   ru   INVALID_MIN_MAX_STR_MSGri   s     r    rb   zStringTest.decodeB  s    D=y{D))d]xz4((2AY$uQRy$''2AY$uQRy%((d::;;r"   N)r#   r$   r%   r&   r   rP   r   r   rU   r!   rc   rb   r)   r"   r    r   r   ;  sF    :#eE9h$>? #D # 
<5 
<\ 
< 
<r"   r   c                       e Zd Z	 	 	 	 ddededeeeeef         deeeeef         dee   dede	e
   fdZdee   d	ed
dfdZdee   ded	ed
eee   eee   ee   f   f   fdZy)r   name	func_namefixedrepeatr`   flagsserver_typesc                     || _         || _        || _        || _        t	        |      | _        || _        t	        |      | _        y r   )r   r   r   r   setr   command_argsr   )r   r   r   r   r   r`   r   r   s           r    r!   zSignature.__init__Y  s@     	"
Z
 -0->r"   versionr   Nc                    t        |      t        | j                        k(  ry t        |      t        | j                        z
  }|dk  s| j                  s4t        j                  j                  | j                        }t        |      |t        | j                        z  dk7  rI|dk\  rt        j                  n(t        j                  j                  | j                        }t        |      y )Nr   )   )	lenr   r   ru   WRONG_ARGS_MSG6r   r   r   WRONG_ARGS_MSG7)r   r`   r   deltamsgs        r    check_arityzSignature.check_arityo  s    t9DJJ'D	C

O+19DKK&&--dii8Cc""3t{{##q(*1T/$&&t?S?S?Z?Z[_[d[d?eCc"" )r"   r4   c           
      :   | j                  ||       t        | j                        }|j                  t	        t        |      t        |      z
        D cg c]'  }| j                  |t        | j                        z     ) c}       t        |      }t        t        ||            D ]i  \  }\  }}t        |t              r1|j                  t        j                  us6||vs;|j                  fc S |t        usS|j                  ||         ||<   k g }	t        t        ||            D ]  \  }\  }}t        |t              s|j                  |      }
d}|j                   <|
:t#        |
j$                        |j                   urt'        t(        j*                        t(        j,                  | j.                  vr0|j                   $|
"|j                   t        ur|j!                         }t1        |||
|      ||<   |	j3                  ||           ||	fS c c}w )zReturns a tuple, which is either:
        - transformed args and a dict of CommandItems; or
        - a single containing a short-circuit return value
        N)r6   )r   listr   extendranger   r   	enumerateziprO   r   r   r(   rP   rb   rG   r   typer,   r   ru   WRONGTYPE_MSGFLAG_DO_NOT_CREATEr   r2   append)r   r`   r4   r   typesi	args_listargr   command_itemsr5   r6   s               r    applyzSignature.applyz  s    	w'TZZ s4ySVW\S]G]A^_Adkk!c$++&6"67_`J	(Y)>? 	OA|U%%''s>3b=!0022e#$||aL 	!	 ,.(Y)>? 	3OA|U%%vvc{;;*t/?DDT\a\g\gDg%d&8&899++4::=/50#kkmG*3D'J	!$$Yq\2	3  -''? `s   ,H)r)   r)   r   )redisvalkey	dragonfly)r#   r$   r%   rn   r   r   r   r\   rP   r   r   r!   r
   r   r   r   r   r   r2   r   r)   r"   r    r   r   X  s     8:0
?? ? T%	5 0123	?
 d5E!1234? Cj? ? !,?,	# 	# 	# 	#)(SM)('/)(:E)(	uSz5cD,=!=>>	?)(r"   r   c                       dt         dt        f   dt        dd f fddt         dt        f   dt         dt        f   ffd}|S )Nfunc.cmd_namer   c                     d|v r't         j                  |j                  d      d          t        || j                  gi t
        |<   y )N r   )r   addsplitr   r#   r   )r   r   r`   ra   s     r    create_signaturez!command.<locals>.create_signature  sG    (?!!(.."5a"89'04=='Z4'ZSY'Z8$r"   c                    j                  d| j                        }t        |t              r |D ]  } | |j	                                 | S t        |t
              r | |j	                                | S t        d      )Nr   z2command name should be a string or list of strings)rQ   r#   rO   r   lowerrn   rp   )r   	cmd_namesr   r   ra   s      r    	decoratorzcommand.<locals>.decorator  sz    JJvt}}5	i&% 9 x~~'789 	 	3'T9??#45  QRRr"   )r	   r   rn   )r`   ra   r  r   s   `` @r    commandr    sW    [xS1 [S [T [
	c* 	xS/A 	 r"   keysc                      d}t               }| D ];  }|s|j                  |vsd |_        |j                  |j                         |dz  }= |S )Nr   r   )r   r3   r,   r   )r  ansdoner3   s       r    delete_keysr    sR    
C5D 377$&CIHHSWW1HC	
 Jr"   startendlengthc                     | dk  rt        d| |z         } |dk  r||z  }| |kD  s| |k\  ryt        ||dz
        }| |dz   fS Nr   )r   r   r   maxminr	  r
  r  s      r    	fix_ranger    sW    qyAuv~&
Qwvs{evo
c6A:
C#'>r"   c                     d| cxkD  r|kD  r	n n|dk  ry| dk  rt        d| |z         } |dk  rt        d||z         }t        ||dz
        }| |dz   fS r  r  r  s      r    fix_range_stringr    sb    5337qyAuv~&
Qw!S6\"
c6A:
C#'>r"   c                   B     e Zd ZdZeddedee   def fd       Z	 xZ
S )	Timestampz!Argument converter for timestampsr,   rk   r   c                     |dk(  r t        t        j                         dz        S |dk(  ry|dk(  rt        j                  S t        |   |t        j                        S )N   *i  r   r   r   )rk   )rm   timesysmaxsizer   rb   ru   INVALID_EXPIRE_MSG)r_   r,   rk   r   s      r    rb   zTimestamp.decode  sT    D=tyy{T)**D=D=;;w~e$2I2I~JJr"   r   )r#   r$   r%   r&   rc   rP   r   rn   rm   rb   r   r   s   @r    r  r    s6    +K5 K K K Kr"   r  )9r&   	functoolsr   r   r  r  typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   ru   _helpersr   r   r   _typingr   r   r   r   rn   __annotations__r   r   r   r+   r2   r\   re   ry   r}   r   r   r   r   total_orderingr   r   r   r   r   r  rm   r  r  r  r  r)   r"   r    <module>r#     s  
   	 
  e e e e  ; ; ,#-/ Dk)* /!e 3s8 #- - B BJ" "0) 0<c ( (s 64I 64re f f       'I	 'IT< <:K( K(\ ({ s 	S 	s 	C 	E#s(O 		C 	c 	3 	5c? 	K Kr"   