
    2i$              
          d dl 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 d dlm	Z	m
Z
mZmZmZmZmZmZmZ d dlZ G d d      Z G d de      Z G d d	      Z ed
      Z ed      Z ed      ZdefdZdedefdZdededefdZdede fdZ!dedefdZ"dedejF                  fdZ$ G d de      Z%eeee&ee'fZ(eeee&ee'e)e fZ*d%de	dededefdZ+ G d de,      Z-de
e    fd Z.d!eej^                     d"e	d#e	dee e	f   fd$Z0y)&    N)defaultdict)	AnySetCallableDictOptionalIteratorAnyStrTypeMutableMappingc                   B    e Zd ZdeddfdZededefd       ZdefdZy)SimpleStringvaluereturnNc                 H    t        |t              st        d      || _        y )Nz SimpleString value must be bytes)
isinstancebytes	TypeErrorr   selfr   s     \/mnt/e/genesis-system/.venvs/voice-bridge/lib/python3.12/site-packages/fakeredis/_helpers.py__init__zSimpleString.__init__   s    %'>??
    c                     |S N )clsr   s     r   decodezSimpleString.decode   s    r   c                 N    | j                   j                   d| j                  dS )N())	__class____name__r   r   s    r   __repr__zSimpleString.__repr__   s$    ..))*!DJJ>;;r   )	r#   
__module____qualname__r   r   classmethodr   strr%   r   r   r   r   r      sC    e  
 5 U  <# <r   r   c                        e Zd ZdZdeddfdZy)SimpleErrorzAException that will be turned into a frontend-specific exception.r   r   Nc                 H    t        |t              st        d      || _        y )NzSimpleError value must be str)r   r)   r   r   r   s     r   r   zSimpleError.__init__   s    %%;<<
r   )r#   r&   r'   __doc__r)   r   r   r   r   r+   r+      s    Kc d r   r+   c                       e Zd ZdZy)
NoResponsezLReturned by pub/sub commands to indicate that no response should be returnedN)r#   r&   r'   r-   r   r   r   r/   r/   $   s    Vr   r/   s   OKs   QUEUEDs   Background saving startedr   c                  B    t        t        j                         dz        S )zReturn current_time in msi  )inttimer   r   r   current_timer3   /   s    tyy{T!""r   sc                 t    | j                  d      }|dkD  r| d | j                         S | j                         S )N    )findlower)r4   inds     r   null_terminater;   4   s6     &&-C
Rx#w}}779r   abc                 0    t        |       t        |      k(  S r   )r;   )r<   r=   s     r   	casematchr?   =   s    !q 111r   c                 D    | j                  dd      j                         S )Nutf-8replace)encodingerrors)r   r9   )r4   s    r   decode_command_bytesrE   A   s    88WY87==??r   r   c                 H    t        | t              r| j                  d      S | S )NrA   )r   r)   encode)r   s    r   asbytesrH   E   s     %||G$$Lr   pattern_bytesc                 T   | j                  d      }dg}d}t        |      }||k  r,||   }|dz  }|dk(  r|j                  d       n|dk(  r|j                  d       n|d	k(  r8||k(  r|dz  }|j                  t        j                  ||                |dz  }n|d
k(  r|j                  d
       ||k  r||   dk(  r|dz  }|j                  d       t        |      }||k  r||   d	k(  r5|dz   |k  r-|dz  }|j                  t        j                  ||                n||   dk(  r|dz  }n|dz   |k  rd||dz      dk(  rY||   }||dz      }||kD  r||}}|j                  t        j                  |      dz   t        j                  |      z          |dz  }n'|j                  t        j                  ||                |dz  }||k  rt        |      |k(  r7|d   d
k(  rd|d<   n_|d   dk7  rt        d      |j                          d|d<   n6|j                  d       n$|j                  t        j                  |             ||k  r,|j                  d       dj                  |      j                  d      }	t        j                  |	t        j                        S )af  Compile a glob pattern (e.g., for keys) to a `bytes` regex.

    `fnmatch.fnmatchcase` doesn't work for this because it uses different
    escaping rules to redis, uses ! instead of ^ to negate a character set,
    and handles invalid cases (such as a [ without a ]) differently. This
    implementation was written by studying the redis implementation.
    zlatin-1^r      ?.*z.*\[]   -r7   z(?:$.)zInvalid patternz\Z )flags)r   lenappendreescapeAssertionErrorpopjoinrG   compileS)
rI   patternpartsipattern_lenc	parts_lenstartendregexs
             r   compile_patternri   K   s    !''G EE	Ag,K
k/AJ	Q8LL#XLL$YKQLL71:./FA#XLL;71:#4QS!E
Ik/1:%!a%+*=FALL71:!67QZ3&FAU[(WQU^s-B#AJE!!a%.Cs{%(%sLL5!1C!7"))C.!HIFALL71:!67Q! k/" 5zY&9# (E"I RyC',->??IIK #E"IS!LL1&a k/b 
LL775>((3E::e244((r   c                   P    e Zd Zdeej
                     dededdfdZddZd	e	ddfd
Z
d	e	deddfdZd	e	deddfdZdeg df   ddfdZdeg df   ddfdZddZdedefdZddZd	e	defdZd	e	deddfdZd	e	ddfdZdee	   fdZdefdZdef fdZdedef fdZ xZS )Databaselockargskwargsr   Nc                     t        |i || _        d| _        t        t        j
                        | _        t        j                  |      | _	        t               | _        y )Ng        )dict_dictr2   r   weakrefWeakSet_watches	threading	Condition	conditionset_change_callbacks)r   rl   rm   rn   s       r   r   zDatabase.__init__   sF    '+T'<V'<
	;Fw;W",,T2:=%r   otherc                     |j                   | j                   c| _         |_         |j                  | j                  c| _        |_        y r   )rq   r2   )r   rz   s     r   swapzDatabase.swap   s2    "'++tzz
EK %

DII	5:r   keyc                     | j                   j                  |t                     D ]  }|j                           | j                  j                          | j                  D ]	  } |         y r   )rt   getrx   notify_watchrw   
notify_allry   )r   r}   sockcallbacks       r   r   zDatabase.notify_watch   sZ    MM%%c351 	 D	 !!#.. 	HJ	r   r   c                 @    | j                   |   j                  |       y r   )rt   add)r   r}   r   s      r   	add_watchzDatabase.add_watch   s    ct$r   c                 d    | j                   |   }|j                  |       |s| j                   |= y y r   )rt   discard)r   r}   r   watchess       r   remove_watchzDatabase.remove_watch   s0    --$c" r   r   c                 :    | j                   j                  |       y r   )ry   r   r   r   s     r   add_change_callbackzDatabase.add_change_callback   s    ""8,r   c                 :    | j                   j                  |       y r   )ry   remover   s     r   remove_change_callbackzDatabase.remove_change_callback   s    %%h/r   c                 h    | D ]  }| j                  |        | j                  j                          y r   )r   rq   clearr   r}   s     r   r   zDatabase.clear   s/     	#Cc"	#

r   itemc                 T    |j                   d uxr |j                   | j                  k  S r   )expireatr2   )r   r   s     r   expiredzDatabase.expired   s#    }}D(FT]]TYY-FFr   c                     t        | j                        D ]0  }| j                  |   }| j                  |      s$| j                  |= 2 y r   )listrq   r   r   r}   r   s      r   _remove_expiredzDatabase._remove_expired   s>    

# 	$C::c?D||D!JJsO	$r   c                 v    | j                   |   }| j                  |      r| j                   |= t        |      |S r   )rq   r   KeyErrorr   s      r   __getitem__zDatabase.__getitem__   s5    zz#<<

33-r   r   c                 "    || j                   |<   y r   rq   )r   r}   r   s      r   __setitem__zDatabase.__setitem__   s    

3r   c                     | j                   |= y r   r   r   s     r   __delitem__zDatabase.__delitem__   s    JJsOr   c                 L    | j                          t        | j                        S r   )r   iterrq   r$   s    r   __iter__zDatabase.__iter__   s    DJJr   c                 L    | j                          t        | j                        S r   )r   rW   rq   r$   s    r   __len__zDatabase.__len__   s    4::r   c                 6    t        t        t        |             S r   )hashsuperobject)r   r"   s    r   __hash__zDatabase.__hash__   s    E&$'((r   c                 *    t        t        |       |k(  S r   )r   r   )r   rz   r"   s     r   __eq__zDatabase.__eq__   s    VT"e++r   )rz   rk   r   N)r   N)r#   r&   r'   r   ru   Lockr   r   r|   r   r   r   r   r   r   r   r   boolr   r   r   r   r   r	   r   r1   r   r   r   r   __classcell__)r"   s   @r   rk   rk      sW   @Xinn5 @c @S @UY @6 $ %U %# %$ %# #S #T #-HRX,> -4 -0xD/A 0d 0
GC GD G$u   u  S  T  u   (5/   )# ),F ,t , ,r   rk   protocol_versionnestedc                     t        | t              r|sydk(  rt        nt        }| t        | |      syt        | t              rt        fd| D              ryy)NTrS   Fc              3   :   K   | ]  }t        |d          yw)TN)valid_response_type).0r   r   s     r   	<genexpr>z&valid_response_type.<locals>.<genexpr>   s     W&t-=tDDWs   )r   r/   _VALID_RESPONSE_TYPES_RESP2_VALID_RESPONSE_TYPES_RESP3r   any)r   r   r   allowed_typess    `  r   r   r      sS    %$V3Cq3H/NiME=!A%WQVWWr   c                   H    e Zd ZdefdZdee   defdZe	dedefd       Z
y)	FakeSelectorr   c                     || _         y r   )r   )r   r   s     r   r   zFakeSelector.__init__   s	    	r   timeoutr   c                 :   | j                   j                  j                         ry||dk  ryt        j                         }	 | j                   j                  j                         ryt        j                  d       t        j                         }|	|||z   kD  ryZ)NTr   Fg{Gz?)r   	responsesqsizer2   sleep)r   r   rf   nows       r   check_can_readzFakeSelector.check_can_read   s    99$$&7a< 		yy""((*JJt))+C"sUW_'< r   _c                      y)NTr   )r   s    r   check_is_ready_for_commandz'FakeSelector.check_is_ready_for_command  s    r   N)r#   r&   r'   r   r   r   floatr   r   staticmethodr   r   r   r   r   r      sG    S huo $ " c d  r   r   c                      t         j                  j                  j                  } | 
t	               S | D ]:  }|j
                  }t        |t              s t        |      dkD  s/t	        |      c S  t	               S )Nr   )	redisRedisr   __closure__rx   cell_contentsr   r   rW   )closurecellr   s      r   _get_args_to_warnr     sd    kk""..Gu ""eT"s5zA~u: 5Lr   redis_classrm   rn   c           	         t        t        j                  | j                        j                  j                               dd }t               }|j                  t        t        |            D ci c]  }||   j                  ||    c}       |j                  dt        j                         j                         t        |      D ci c]y  \  }}|j                   t        j"                  j$                  k7  rM|j                  |vs|j                  |v r1|j                  |j'                  |j                  |j                         { }}}|S c c}w c c}}w )zWInterpret the positional and keyword arguments according to the version of redis in userL   Nhost)r   inspect	signaturer   
parametersvaluesr   updaterangerW   name
setdefaultuuiduuid4hex	enumeratedefault	Parameteremptyr   )	r   rm   rn   r   args_to_warnrb   r:   pkwdss	            r   !convert_args_to_redis_init_kwargsr     s   g''(<(<=HHOOQRSTSUVJ$&L
MMc$i8HI1:a=%%tAw.IJ
fdjjl../  
+C99))///QVV<5OSTSYSY]cSc 	


166199--D 
 K Js   /EA>E)F)1r   rY   ru   r2   r   rr   collectionsr   typingr   r   r   r   r   r	   r
   r   r   r   r   	Exceptionr+   r/   OKQUEUEDBGSAVE_STARTEDr1   r3   r   r;   r   r?   r)   rE   rH   Patternri   rk   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   <module>r      s    	     # ] ] ] < <) 	 	 %	i	 :;#c #
e  2 25 2T 2@E @c @6 e C)5 C)RZZ C)LJ,~ J,Z  %lKTR $lKTSWY\] 	s 	c 	4 	TX 	6 43s8 43D S \_ dhilnqiqdr r   