
    Ki                        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 d dlZd dlmZmZ d dlmZmZ d dlmZmZ  e j2                  d      Zdeeed	f   eef   d
efdZded
efdZ G d d      Z G d de       Z!y)    N)defaultdict)DictTupleAnyListOptionalUnionSetType)DatabaseFakeSelector)VersionType
ServerType)AccessControlList
ClientInfo	fakeredisv.returnc                     t        | t              r| S t        | t              r| fS t        | t              r#| j	                  d      }t        d |D              S | S )N.c              3   2   K   | ]  }t        |        y wN)int.0xs     ]/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/fakeredis/_server.py	<genexpr>z"_create_version.<locals>.<genexpr>   s     -SV-   )
isinstancetupler   strsplit)r   v_splits     r   _create_versionr%      sO    !U!St!S''#,-W---H    c                 h    t        | t              rdj                  d | D              S t        |       S )Nr   c              3   2   K   | ]  }t        |        y wr   )r"   r   s     r   r   z"_version_to_str.<locals>.<genexpr>   s     *1A*r   )r    r!   joinr"   )r   s    r   _version_to_strr*      s*    !Uxx****q6Mr&   c            
           e Zd ZU i Zeed f   ed<   	 	 	 ddedede	ee
e
f      ddfdZdefdZed	edededd fd
       Zy)
FakeServer_servers_mapNversionserver_typeconfigr   c                 0    t        j                          _        t         fd       _        i  _        t        t        j                         _        t        t        j                         _	        t        t        j                         _
        t        t        j                                _        d _        g  _        g  _        t#        |       _        |dvrt'        d|       | _        |xs i  _        t-                _        i  _        d _        y)a  Initialize a new FakeServer instance.
        :param version: The version of the server (e.g. 6, 7.4, "7.4.1", can also be a tuple)
        :param server_type: The type of server (redis, dragonfly, valkey)
        :param config: A dictionary of configuration options.

        Configuration options:
        - `requirepass`: The password required to authenticate to the server.
        - `aclfile`: The path to the ACL file.
        c                  .    t         j                        S r   )r   lock)selfs   r   <lambda>z%FakeServer.__init__.<locals>.<lambda>5   s    HTYY<O r&   T)redis	dragonflyvalkeyzUnsupported server type:    N)	threadingLockr3   r   dbsscript_cacheweakrefWeakSetsubscriberspsubscribersssubscribersr   timelastsave	connectedsocketsclosed_socketsr%   r.   
ValueErrorr/   r0   r   aclclients_next_client_id)r4   r.   r/   r0   s   `   r   __init__zFakeServer.__init__%   s     NN$	(34O(P02>I'//>Z?J7???[?J7???[ -"$)+$3G$<>>8FGG'2*0,B&7&924 r&   c                     | j                   5  | j                  }| xj                  dz  c_        d d d        |S # 1 sw Y   S xY w)Nr9   )r3   rK   )r4   	client_ids     r   get_next_client_idzFakeServer.get_next_client_idI   sE    YY 	&,,I  A% 	& 	& s	   "9Akeyc                     | t         j                  vrt        ||      t         j                  | <   t         j                  |    S )N)r.   r/   )r,   r-   )rP   r.   r/   s      r   
get_serverzFakeServer.get_serverO   s9    j---+5gS^+_J##C(&&s++r&   ))   r6   N)__name__
__module____qualname__r-   r   r"   __annotations__r   r   r   bytesrL   r   rO   staticmethodrR    r&   r   r,   r,   "   s    ,.L$sL().  $")/3	"!"!  "! eUl+,	"!
 
"!HC  , ,k ,
 ,| , ,r&   r,   c                        e Zd Zdddej                  ddddddededed	ee	   d
e
ej                     deee      dedee   deddf fdZ xZS )FakeBaseConnectionMixin)rS   r   r6   NT)r.   r/   serverclient_classlua_moduleswriterrE   pathargsr.   r/   r]   r^   r_   rE   ra   kwargsr   c          	      2   d| _         |  d| _        d| _        || _        || _        || _        || _        |}|}| j                  |r|| _        n.|
j                  d      |
j                  d      }}| d| | _        | xj                  d| dt        |      d    z  c_        t        j                  | j                  ||      | _        || j                  _        |
j                  di       }t        | <  |	i |
 t!        | d	d
      }|j#                  t%        d2i d| j                  j'                         dddddddddddddddddddddddddd d!d"d#dd$d%d&dd'dd(dd)dd*d+d,d-d.d/d0dd1|       t)        d2i || _        y)3z
        Initializes the class and sets up the required attributes and configurations for the server and client interaction.

        Nhostport:z:vr   )r/   r.   client_infoprotocol   idaddrz127.0.0.1:57275laddrz127.0.0.1:6379fd   name idleflagsNdbsubpsubssubmultiqbuf0   	qbuf_freeiA  argv_mem   	multi_memrbsi   rbpoblollomemtot_memi1I  eventsrcmdauthredirresprZ   )client_name_sock	_selector_server_client_class_lua_modules_writer
server_keygetr*   r,   rR   rE   popsuperrL   getattrupdatedictrO   r   _client_info)r4   r.   r/   r]   r^   r_   r`   rE   ra   rb   rc   re   rf   rh   ri   	__class__s                  r   rL   z FakeBaseConnectionMixin.__init__W   s<   " +/
15)'	<<"&#ZZ/F1Cd%)F!D6"2OO;-r/'2J12M1NOOO%00kcj0kDL%.DLL"jj3$)&)4Q/ <<224& ' 	
              !" #$ %& '( )* +, -. /0 12 34 5	
< '55r&   )rT   rU   rV   r6   Redisr   r   r   r   r,   r   r
   r"   boolrL   __classcell__)r   s   @r   r\   r\   V   s      &")'+*/++*."F6F6 F6  	F6
 $F6 5;;'F6 c#h'F6 F6 smF6 F6 
F6 F6r&   r\   )"loggingr:   rC   r>   collectionsr   typingr   r   r   r   r   r	   r
   r   r6   fakeredis._helpersr   r   fakeredis._typingr   r   fakeredis.modelr   r   	getLoggerLOGGERr   r"   r%   r*   r,   objectr\   rZ   r&   r   <module>r      s        # E E E  5 5 9			;	'uU38_c367 K { s 1, 1,hG6f G6r&   