U
    g r                  O   @   s  d dl Z d dlmZ dd Zdd Zdd Zd	d
 ZeeeeeeeeeeeeeeeeeeeeeeedZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdddZdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3dcdd Z4dedf Z5dgdh Z6didj Z7e7dke8e7dle9e7dme e7dnee7doe.e7dpee3e e4e e e5e2e"e e e e8e e e e e e e*e e-e-e e e e e e-e/e e e e e ee%eee e8e8dqdr e1e1e e6e$dsdr e e ee e e ee e e e e(e ee$dtdr eee e8e eee&duHZ:e7dvdwdr e7dxee7dyee7dzd{dr e7d|d}dr e7d~ddr ddr eddr ddr ddr eeddr ddr ddr e#eddr ddr ddr eddr ee
eeee)eee!e'dZ;e7dvddr e7dddr e7dneddr e0ddr ddr eeeeddr ddr ddr dZ<dS )    Nstr_if_bytesc                 C   s8   | sdS zt | } W n tk
r*   Y dS X tj| S )z5Converts a unix timestamp to a Python datetime objectN)int
ValueErrordatetimefromtimestampresponse r
   :/tmp/pip-unpacked-wheel-f3sx1i9r/redis/_parsers/helpers.pytimestamp_to_datetime   s    r   c                 C   sP   t | } d|  } tdd |  D } d}|D ]}|| kr.t| | | |< q.| S )zDParse the results of Redis's DEBUG OBJECT command into a Python dictztype:c                 s   s   | ]}| d V  qdS :Nsplit).0kvr
   r
   r   	<genexpr>   s     z%parse_debug_object.<locals>.<genexpr>)refcountZserializedlengthZlruZlru_seconds_idle)r   dictr   r   )r	   Z
int_fieldsfieldr
   r
   r   parse_debug_object   s    r   c                    s   i }t | }  fdd |  D ]}|r |ds |ddkr|dd\}}|dkrh|dd\}}|dkr|d	g  | q |||< q |d
g | q |S )z;Parse the result of Redis's INFO command into a Python dictc                    s   d| krLd| krLz d| kr$t | W S t| W S W q tk
rH   |  Y S X nld| krl fdd| dD S i }| dD ]8}|sqzd|kr|dd\}} |||< qzd||< qz|S d S )N,=.c                    s   g | ]}|r |qS r
   r
   )r   v	get_valuer
   r   
<listcomp>2   s      z1parse_info.<locals>.get_value.<locals>.<listcomp>   T)floatr   r   r   rsplit)valueZsub_dictitemkr   r   r
   r   r   (   s$    

zparse_info.<locals>.get_value#r   r   Zcmdstat_hostmodulemodulesZ__raw__)r   
splitlines
startswithfindr   r!   
setdefaultappend)r	   infolinekeyr"   r
   r   r   
parse_info#   s    r1   c                 K   sJ   t | ddd}| D ].\}}|drt|trt |ddd||< q|S )z!Parse the results of MEMORY STATST)decode_keysdecode_string_valueszdb.)pairs_to_dictitemsr*   
isinstancelist)r	   kwargsstatsr0   r"   r
   r
   r   parse_memory_statsV   s      r:   )zcan-failover-its-masterzconfig-epochzdown-after-millisecondszfailover-timeoutzinfo-refreshzlast-hello-messagezlast-ok-ping-replyzlast-ping-replyzlast-ping-sentzmaster-link-down-timezmaster-portznum-other-sentinelsz
num-slaveszo-down-timezpending-commandszparallel-syncsportZquorumzrole-reported-timezs-down-timezslave-priorityzslave-repl-offsetzvoted-leader-epochc                 C   s:   t | t}t|d d}dD ]\}}||k||< q |S )Nflagsr   ))Z	is_mastermaster)Zis_slaveZslave)Zis_sdownZs_down)Zis_odownZo_down)Zis_sentinelsentinel)Zis_disconnectedZdisconnected)Zis_master_downZmaster_down)pairs_to_dict_typedSENTINEL_STATE_TYPESsetr   )r#   resultr<   nameflagr
   r
   r   parse_sentinel_state|   s
    
	rE   c                 C   s   t tt| S NrE   mapr   r   r
   r
   r   parse_sentinel_master   s    rI   c              	   C   sz   i }| D ]R}z$t | t| | }||t|< W q tk
rX   | t| |t|< Y qX qt|d d}||d< |S )Nr<   r   )r@   r   	ExceptionrA   r   )r	   rB   r0   r"   r<   r
   r
   r   parse_sentinel_state_resp3   s    rK   c                 C   s,   i }| D ]}t tt|}|||d < q|S )NrC   rG   )r	   rB   r#   stater
   r
   r   parse_sentinel_masters   s
    rM   c                 C   s   dd | D S )Nc                 S   s   g | ]}t |qS r
   )rE   )r   r=   r
   r
   r   r      s     z0parse_sentinel_masters_resp3.<locals>.<listcomp>r
   r   r
   r
   r   parse_sentinel_masters_resp3   s    rN   c                 C   s   dd | D S )Nc                 S   s   g | ]}t tt|qS r
   rG   r   r#   r
   r
   r   r      s     z7parse_sentinel_slaves_and_sentinels.<locals>.<listcomp>r
   r   r
   r
   r   #parse_sentinel_slaves_and_sentinels   s    rP   c                 C   s   dd | D S )Nc                 S   s   g | ]}t |qS r
   )rK   rO   r
   r
   r   r      s     z=parse_sentinel_slaves_and_sentinels_resp3.<locals>.<listcomp>r
   r   r
   r
   r   )parse_sentinel_slaves_and_sentinels_resp3   s    rQ   c                 C   s   | r| d t | d fpd S Nr   r   r   r   r
   r
   r   parse_sentinel_get_master   s    rT   Fc                 C   st   | dkri S |s|rZ| ddd }|r0t t|}| ddd }|rLt t|}tt||S t| }tt||S dS )z-Create a dict given a list of key/value pairsN   r   )rH   r   r   zipiter)r	   r2   r3   keysvaluesitr
   r
   r   r4      s    

r4   c              	   C   sZ   t | }i }t||D ]>\}}||krLz|| |}W n tk
rJ   Y nX |||< q|S rF   )rW   rV   rJ   )r	   Z	type_inforZ   rB   r0   r"   r
   r
   r   r?      s    
r?   c                 K   s:   | r| ds| S | dt}t| }tt|t||S )zr
    If ``withscores`` is specified in the options, return the response as
    a list of (value, score) pairs
    Z
withscoresscore_cast_func)getr    rW   r7   rV   rH   )r	   optionsr[   rZ   r
   r
   r   zset_score_pairs   s
    r^   c                    s:   r| dsS |d  tt fddt D  S )z
    If ``groups`` is specified, return the response as a list of
    n-element tuples with n being the value found in options['groups']
    groupsc                    s   g | ]}|d   qS rF   r
   r   inr	   r
   r   r      s     z&sort_return_tuples.<locals>.<listcomp>)r\   r7   rV   ranger	   r]   r
   rb   r   sort_return_tuples   s    rf   c                 C   sL   | d krd S g }| D ]2}|d k	r<| |d t|d f q| d q|S )Nr   r   )NN)r-   r4   )r	   datarr
   r
   r   parse_stream_list   s    ri   c                 C   s   t | ddS )NTr2   r4   r   r
   r
   r   pairs_to_dict_with_str_keys   s    rl   c                 C   s   t tt| S rF   )r7   rH   rl   r   r
   r
   r   parse_list_of_dicts   s    rm   c                 K   s   | ddr| S t| S )Nparse_justidFr\   ri   re   r
   r
   r   parse_xclaim  s    rp   c                 K   s(   | ddr| d S t| d | d< | S )Nrn   Fr   ro   re   r
   r
   r   parse_xautoclaim  s    rq   c                 K   sL  t | trt| dd}ndd |  D }|dds|d}|d k	rl|d d k	rl|d t|d	 f|d< |d
 }|d k	r|d d k	r|d t|d	 f|d
< ndd |d D |d< t|d dkr2t |d d tr2dd |d D |d< |d D ]2}|d r|d d d k	rdd |d D |d< qndd |d D |d< |S )NTrj   c                 S   s   i | ]\}}t ||qS r
   r   r   r$   r   r
   r
   r   
<dictcomp>  s      z&parse_xinfo_stream.<locals>.<dictcomp>fullFzfirst-entryr   r   z
last-entryc                 S   s   i | ]\}}|t |qS r
   rk   )r   Z_identryr
   r
   r   rs     s      entriesr_   c                 S   s   g | ]}t |d dqS Trj   rk   r   groupr
   r
   r   r     s    z&parse_xinfo_stream.<locals>.<listcomp>	consumersc                 S   s   g | ]}t |d dqS rw   rk   )r   cr
   r
   r   r   #  s    c                 S   s   g | ]}d d |  D qS )c                 S   s   i | ]\}}t ||qS r
   r   rr   r
   r
   r   rs   (  s      z1parse_xinfo_stream.<locals>.<listcomp>.<dictcomp>r5   rx   r
   r
   r   r   '  s   )r6   r7   r4   r5   r\   len)r	   r]   rg   firstlastgr
   r
   r   parse_xinfo_stream  s0    

&

r   c                 C   s   | d krg S dd | D S )Nc                 S   s    g | ]}|d  t |d gqS )r   r   ri   r   rh   r
   r
   r   r   1  s     zparse_xread.<locals>.<listcomp>r
   r   r
   r
   r   parse_xread.  s    r   c                 C   s   | d kri S dd |   D S )Nc                 S   s   i | ]\}}|t |gqS r
   r   r   r0   r"   r
   r
   r   rs   7  s      z%parse_xread_resp3.<locals>.<dictcomp>r|   r   r
   r
   r   parse_xread_resp34  s    r   c                 K   sD   | ddrt| S dd | d p$g D }| d | d | d |d	S )
NZparse_detailFc                 S   s   g | ]\}}|t |d qS ))rC   pendingrS   )r   rc   pr
   r
   r   r   =  s     z"parse_xpending.<locals>.<listcomp>   r   r   rU   )r   minmaxrz   )r\   parse_xpending_range)r	   r]   rz   r
   r
   r   parse_xpending:  s    r   c                    s   d  fdd| D S )N)Z
message_idZconsumerZtime_since_deliveredZtimes_deliveredc                    s   g | ]}t t |qS r
   )r   rV   r   r$   r
   r   r   H  s     z(parse_xpending_range.<locals>.<listcomp>r
   r   r
   r   r   r   F  s    r   c                 C   s   | d krd S t | S rF   r    r   r
   r
   r   float_or_noneK  s    r   c                 K   s   t | dkS NOKr   re   r
   r
   r   bool_okQ  s    r   c                 K   s&   | d krd S | drt| S t| S )NZas_score)r\   r    r   re   r
   r
   r   
parse_zaddU  s
    
r   c                 K   s8   g }t |  D ]"}|tdd |dD  q|S )Nc                 s   s   | ]}| d dV  qdS )r   r   Nr   )r   pairr
   r
   r   r   a  s     z$parse_client_list.<locals>.<genexpr> )r   r)   r-   r   r   )r	   r]   Zclientsr{   r
   r
   r   parse_client_list]  s     r   c                 K   s   dd | D } | rt | pi S )Nc                 S   s    g | ]}|d k	rt |nd qS rF   r   r`   r
   r
   r   r   f  s     z$parse_config_get.<locals>.<listcomp>rk   re   r
   r
   r   parse_config_gete  s    r   c                 K   s   | \}}t ||fS rF   rS   )r	   r]   cursorrh   r
   r
   r   
parse_scanj  s    r   c                 K   s>   | \}}| dd}|r"|pg }n|r.t|p0i }t||fS )N	no_valuesF)r\   r4   r   )r	   r]   r   rh   r   payloadr
   r
   r   parse_hscano  s    
r   c                 K   s8   | dt}| \}}t|}t|tt|t||fS )Nr[   )r\   r    rW   r   r7   rV   rH   )r	   r]   r[   r   rh   rZ   r
   r
   r   parse_zscany  s    r   c                 K   s   dd | D S )Nc                 S   s    g | ]}|d k	rt |nd qS rF   r   )r   Zscorer
   r
   r   r     s     z!parse_zmscore.<locals>.<listcomp>r
   re   r
   r
   r   parse_zmscore  s    r   c                    s2   | ddrdndfdd  fdd| D S )	NZdecode_responsesFr       c                    s   | d t | d t | d d}t| d trf | d |d< t| dkr| d |d	< | d
 |d< nB| d |d<  | d |d< t| dkr| d
 |d	< | d |d< |S )Nr   r   rU   )id
start_timedurationr   command      client_address   Zclient_nameZ
complexity   )r   r6   r7   joinr}   )r#   rB   )spacer
   r   
parse_item  s     z%parse_slowlog_get.<locals>.parse_itemc                    s   g | ]} |qS r
   r
   rO   )r   r
   r   r     s     z%parse_slowlog_get.<locals>.<listcomp>)r\   re   r
   )r   r   r   parse_slowlog_get  s    r   c                 K   s~   | ddrt| S | ddrv| ddr@dd | d D }ndd | d D }t| d	 |t| d
 t| d iS t| S )a  
    Parse the response from `STRALGO` command.
    Without modifiers the returned value is string.
    When LEN is given the command returns the length of the result
    (i.e integer).
    When IDX is given the command returns a dictionary with the LCS
    length and all the ranges in both the strings, start and end
    offset for each string, where there are matches.
    When WITHMATCHLEN is given, each array representing a match will
    also have the length of the match at the beginning of the array.
    r}   FidxZwithmatchlenc              	   S   s0   g | ](}t |d  gttt|dd   qS )r&   N)r   r7   rH   tupler   matchr
   r
   r   r     s   z!parse_stralgo.<locals>.<listcomp>r   c                 S   s   g | ]}t tt|qS r
   )r7   rH   r   r   r
   r
   r   r     s     r   rU   r   )r\   r   r   )r	   r]   matchesr
   r
   r   parse_stralgo  s    
 
 
r   c                 K   s   t | } tdd |  D S )Nc                 s   s   | ]}|r| d V  qdS r   r   )r   r/   r
   r
   r   r     s      z%parse_cluster_info.<locals>.<genexpr>)r   r   r)   re   r
   r
   r   parse_cluster_info  s    r   c                 C   s   |  d}|  dd d \}}}}}}}}	| dd }
d|krbd|krb| dd  dd nd}|||||||g g |	dkrd	nd
d
}t|dkrt|dd  \}}|| |d< |d< |
|fS )Nr      @r   r   r    	connectedTF)
node_idhostnamer<   	master_idZlast_ping_sentZlast_pong_rcvdepochslots
migrationsr   	   r   r   )r   r}   _parse_slots)r/   Z
line_itemsr   addrr<   r   ZpingZpongr   r   ipr   Z	node_dictr   r   r
   r
   r   _parse_node_line  s&    
",r   c                 C   s   g g  }}| D ]}d|krF|dd  dd\}}|||dd qd|krz|dd  dd\}}|||dd qdd	 | d
D }|| q||fS )Nz->-r   r&   Z	migrating)Zslotr   rL   z-<-Z	importingc                 S   s   g | ]}|qS r
   r
   )r   slr
   r
   r   r     s     z _parse_slots.<locals>.<listcomp>-)r   r-   )Zslot_rangesr   r   Zs_rangeZslot_idZdst_node_idZsrc_node_idr
   r
   r   r     s    


r   c                 K   s(   t | ttfr|  } tdd | D S )z
    @see: https://redis.io/commands/cluster-nodes  # string / bytes
    @see: https://redis.io/commands/cluster-replicas # list of string / bytes
    c                 s   s   | ]}t t|V  qd S rF   )r   r   )r   noder
   r
   r   r     s     z&parse_cluster_nodes.<locals>.<genexpr>)r6   strbytesr)   r   re   r
   r
   r   parse_cluster_nodes  s    r   c                    s   zd sd r| W S W n t k
r2   |  Y S X t| tsF| g}n| }d sfd sfd sf|S tdd td d	d g fd
ddD 7 fdd|D S )z
    Parse the response of 'GEOSEARCH', GEORADIUS' and 'GEORADIUSBYMEMBER'
    commands according to 'withdist', 'withhash' and 'withcoord' labels.
    storeZ
store_distwithdist	withcoordwithhashc                 S   s   t | d t | d fS rR   r   Zllr
   r
   r   <lambda>      z)parse_geosearch_generic.<locals>.<lambda>)r   r   r   c                 S   s   | S rF   r
   xr
   r
   r   r     r   c                    s   g | ]}| r | qS r
   r
   )r   o)castr]   r
   r   r     s      z+parse_geosearch_generic.<locals>.<listcomp>)r   r   r   c                    s$   g | ]}t td d t |qS )c                 S   s   | d | d S rR   r
   )Zfvr
   r
   r   r     r   z4parse_geosearch_generic.<locals>.<listcomp>.<lambda>)r7   rH   rV   r   )fr
   r   r     s     )KeyErrorr6   r7   r    r   )r	   r]   Zresponse_listr
   )r   r   r]   r   parse_geosearch_generic  s"    



r   c                 K   s   i }| D ]}i }t |d }||d< t|d |d< dd |d D |d< |d	 |d
< |d |d< |d |d< t|dkr|d |d< |d |d< |d |d< |||< q|S )Nr   rC   r   arityc                 S   s   g | ]}t |qS r
   r   r   rD   r
   r
   r   r   $  s     z!parse_command.<locals>.<listcomp>rU   r<   r   first_key_posr   last_key_posr   
step_countr   tipsr   key_specificationsr   subcommands)r   r   r}   r	   r]   commandsr   Zcmd_dictcmd_namer
   r
   r   parse_command  s     
r   c                 K   s   i }| D ]}i }t |d }||d< |d |d< dd |d D |d< |d	 |d
< |d |d< |d |d< |d |d< t|dkr|d |d< |d |d< |d |d< |||< q|S )Nr   rC   r   r   c                 S   s   h | ]}t |qS r
   r   r   r
   r
   r   	<setcomp>7  s     z&parse_command_resp3.<locals>.<setcomp>rU   r<   r   r   r   r   r   r   r   Zacl_categoriesr   r   r   r   r   r   )r   r}   r   r
   r
   r   parse_command_resp30  s"    
r   c                 K   s"   t t| dd d | dd d S )Nr   rU   r   )r7   rV   re   r
   r
   r   parse_pubsub_numsubE  s    r   c                 K   s   t | tr| S t| dkS r   )r6   r   r   re   r
   r
   r   parse_client_killI  s    
r   c                 K   s  | d krd S t | tr$t| dd}ndd |  D }ttt|d |d< ttt|d |d< t|d |d< t |d tst |d trtt|d d	|d< |d d
gkrg |d< d|krt |d tst |d trtt|d d	|d< |d d
gkrg |d< d|kr~|d g krZt |d d trZdd |d D |d< n$|d g kr~dd |d D |d< g g  }}|d d	D ]$}d|kr|	|n|	| q||d< ||d< d|d k|d< |S )NTrj   c                 S   s   i | ]\}}t ||qS r
   r   r   r
   r
   r   rs   U  s      z%parse_acl_getuser.<locals>.<dictcomp>r<   	passwordsr   rX   r   r   Zchannels	selectorsr   c                 S   s   g | ]}t tt|qS r
   r7   rH   r   r   selectorr
   r
   r   r   f  s    z%parse_acl_getuser.<locals>.<listcomp>c                 S   s   g | ]}d d |  D qS )c                 S   s   i | ]\}}t |t |qS r
   r   rr   r
   r
   r   rs   k  s      z0parse_acl_getuser.<locals>.<listcomp>.<dictcomp>r|   r   r
   r
   r   r   j  s   r   
categoriesonZenabled)
r6   r7   r4   r5   rH   r   r   r   r   r-   )r	   r]   rg   r   r   r   r
   r
   r   parse_acl_getuserO  sB    


"

"r   c                 K   sp   | d krd S t | trdg }| D ]B}t|dd}|dd}t||d< t|d |d< || qnt| }|S )NTzclient-infor   zage-seconds)r6   r7   r4   r\   parse_client_infor    r-   r   )r	   r]   rg   logZlog_dataclient_infor
   r
   r   parse_acl_logz  s    
r   c                 C   sN   i }t |   D ]}|d\}} | ||< qdD ]}t|| ||< q4|S )zg
    Parsing client-info in ACL Log in following format.
    "key1=value1 key2=value2 key3=value3"
    r   >   multitot-memageolloblsubdbqbufidle	qbuf-freeomempsubargv-memr   )r   stripr   r   )r"   r   r.   r0   Zint_keyr
   r
   r   r     s    
r   c                 K   s   | dr| S | ot| dkS )z
    Handle SET result since GET argument is available since Redis 6.2.
    Parsing SET result into:
    - BOOL
    - String when GET argument is used
    r\   r   )r\   r   re   r
   r
   r   parse_set_result  s    
r  c                 C   s   t |  |S rF   )r   fromkeysr   )Z
key_stringcallbackr
   r
   r   string_keys_to_dict  s    r  zoAUTH COPY EXPIRE EXPIREAT HEXISTS HMSET MOVE MSETNX PERSIST PSETEX PEXPIRE PEXPIREAT RENAMENX SETEX SETNX SMOVEzHINCRBYFLOAT INCRBYFLOATz{ASKING FLUSHALL FLUSHDB LSET LTRIM MSET PFMERGE READONLY READWRITE RENAME SAVE SELECT SHUTDOWN SLAVEOF SWAPDB WATCH UNWATCHzXREAD XREADGROUPz%GEORADIUS GEORADIUSBYMEMBER GEOSEARCHzXRANGE XREVRANGEc                 C   s   t | dkS )NZPONGr   rh   r
   r
   r   r     r   r   c                 C   s   t tt| S rF   )r7   rH   boolr  r
   r
   r   r     r   c                 C   s   t | d t | d fS rR   rS   r   r
   r
   r   r     r   )HzACL GETUSERzACL LOADACL LOGzACL SETUSERzACL SAVEzCLIENT INFOzCLIENT KILLzCLIENT LISTzCLIENT PAUSEzCLIENT SETINFOzCLIENT SETNAMEzCLIENT UNBLOCKzCLUSTER ADDSLOTSzCLUSTER ADDSLOTSRANGEzCLUSTER DELSLOTSzCLUSTER DELSLOTSRANGEzCLUSTER FAILOVERzCLUSTER FORGETzCLUSTER INFOzCLUSTER MEETzCLUSTER NODESzCLUSTER REPLICASzCLUSTER REPLICATEzCLUSTER RESETzCLUSTER SAVECONFIGzCLUSTER SET-CONFIG-EPOCHzCLUSTER SETSLOTzCLUSTER SLAVESCOMMANDzCONFIG RESETSTATz
CONFIG SETzFUNCTION DELETEzFUNCTION FLUSHzFUNCTION RESTOREZGEODISTZHSCANINFOZLASTSAVEzMEMORY PURGEzMODULE LOADzMODULE UNLOADZPINGzPUBSUB NUMSUBzPUBSUB SHARDNUMSUBZQUITZSETZSCANzSCRIPT EXISTSzSCRIPT FLUSHzSCRIPT KILLzSCRIPT LOADzSENTINEL CKQUORUMzSENTINEL FAILOVERzSENTINEL FLUSHCONFIGz SENTINEL GET-MASTER-ADDR-BY-NAMEzSENTINEL MONITORzSENTINEL RESETzSENTINEL REMOVEzSENTINEL SETzSLOWLOG GETzSLOWLOG RESETZSORTZSSCANZTIMEZ
XAUTOCLAIMZXCLAIMzXGROUP CREATEzXGROUP DESTROYzXGROUP SETIDzXINFO STREAMZXPENDINGZZSCANzSDIFF SINTER SMEMBERS SUNIONc                 C   s   | rt | pt  S rF   rA   r  r
   r
   r   r     r   zbZDIFF ZINTER ZPOPMAX ZPOPMIN ZRANGE ZRANGEBYSCORE ZRANK ZREVRANGE ZREVRANGEBYSCORE ZREVRANK ZUNIONzZINCRBY ZSCOREzBGREWRITEAOF BGSAVEc                 C   s   dS )NTr
   r  r
   r
   r   r   $  r   zBLPOP BRPOPc                 C   s   | rt | pd S rF   )r   r  r
   r
   r   r   %  r   zBZPOPMAX BZPOPMINc                 C   s"   | r| d | d t | d fp d S )Nr   r   rU   r   r  r
   r
   r   r   '  r   c                 C   s   t tt| S rF   r   r  r
   r
   r   r   )  r   c                 C   s   t tt| S rF   r   r  r
   r
   r   r   +  r   c                 C   s   t tt| S rF   r   r  r
   r
   r   r   ,  r   c                 C   s   t tt| S rF   r   r  r
   r
   r   r   -  r   c                 C   s   t tt| S rF   r   r  r
   r
   r   r   0  r   c                 C   s   t tt| S rF   r   r  r
   r
   r   r   1  r   c                 C   s   t tt| S rF   r   r  r
   r
   r   r   2  r   c                 C   s   t tt| S rF   r   r  r
   r
   r   r   5  r   c                 C   s   t tdd | S )Nc                 S   s$   | d k	r t | d t | d fS d S rR   r   r   r
   r
   r   r   7  r   z<lambda>.<locals>.<lambda>)r7   rH   r  r
   r
   r   r   6  s   c                 C   s   | rt | pi S rF   rk   r  r
   r
   r   r   9  r   c                 C   s   dd | D S )Nc                 S   s   g | ]}t |qS r
   rk   )r   mr
   r
   r   r   ;  s     <lambda>.<locals>.<listcomp>r
   r  r
   r
   r   r   ;  r   )zACL CATzACL GENPASSzACL HELPzACL LISTz	ACL USERSz
ACL WHOAMIzCLIENT GETNAMEzCLIENT TRACKINGINFOzCLUSTER GETKEYSINSLOTzCOMMAND GETKEYS
CONFIG GETzDEBUG OBJECTZGEOHASHZGEOPOSZHGETALLMEMORY STATSzMODULE LISTRESETSENTINEL MASTERSENTINEL MASTERSSENTINEL SENTINELSSENTINEL SLAVESSTRALGOXINFO CONSUMERSXINFO GROUPSZZADDZZMSCOREc                 C   s   | rt | pt  S rF   r  r  r
   r
   r   r   K  r   z`ZRANGE ZINTER ZPOPMAX ZPOPMIN ZRANGEBYSCORE ZREVRANGE ZREVRANGEBYSCORE ZUNION HGETALL XREADGROUPc                 K   s   | S rF   r
   )rh   r8   r
   r
   r   r   P  r   c                 C   s    t | trdd | D S t| S )Nc                 S   s   g | ]}d d |  D qS )c                 S   s   i | ]\}}t |t |qS r
   r   r   r
   r
   r   rs   U  s      '<lambda>.<locals>.<listcomp>.<dictcomp>r|   r   r   r
   r
   r   r   T  s   r  )r6   r7   r   r  r
   r
   r   r   S  s
    c                 C   s   dd |   D S )Nc                 S   s6   i | ].\}}|d k	rt |nd |d k	r.t |nd qS rF   r   r   r
   r
   r   rs   \  s   <lambda>.<locals>.<dictcomp>r|   r  r
   r
   r   r   \  s   c                 C   s   dd |   D S )Nc                 S   s   i | ]\}}t ||qS r
   r   r   r
   r
   r   rs   b  s      r  r|   r  r
   r
   r   r   b  r   c                 K   s$   t | trdd |  D S t| S )Nc                 S   s   i | ]\}}t |t |qS r
   r   r   r
   r
   r   rs   h  s      r  )r6   r   r5   r   )rh   r]   r
   r
   r   r   g  s    c                 C   s   dd | D S )Nc                 S   s   g | ]}d d |  D qS )c                 S   s   i | ]\}}t ||qS r
   r   r   r
   r
   r   rs   m  s      r  r|   r  r
   r
   r   r   l  s    r  r
   r  r
   r
   r   r   l  s   c                 C   s   dd | D S )Nc                 S   s   g | ]}d d |  D qS )c                 S   s   i | ]\}}t ||qS r
   r   r   r
   r
   r   rs   p  s      r  r|   )r   dr
   r
   r   r   o  s    r  r
   r  r
   r
   r   r   o  s   )r  r	  r  r  r  r  r  r  r  r  r  )FF)=r   Zredis.utilsr   r   r   r1   r:   r   r@   rE   rI   rK   rM   rN   rP   rQ   rT   r4   r?   r^   rf   ri   rl   rm   rp   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r    Z_RedisCallbacksZ_RedisCallbacksRESP2Z_RedisCallbacksRESP3r
   r
   r
   r   <module>   s  3


$+^  0 