o
    —¨ÊhwÀ  ã                   @  sˆ  d Z ddlm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 ddlmZ dd	lmZ dd
lmZm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 ddlmZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) zddl*Z*W n e+y“   dZ*Y nw zddl*m,Z, W n e+y§   dZ,Y nw edƒZ-e-j.e-j/Z0Z/dZ1dZ2dZ3g d¢Z4eddƒZ5dd„ Z6dd „ Z7G d!d"„ d"e8ƒZ9e
d#d$„ ƒZ:d%d&„ Z;G d'd(„ d(ƒZ<G d)d*„ d*e<e*j=ƒZ>G d+d,„ d,e<e*j?j@ƒZAG d-d.„ d.e*j?jBƒZCG d/d0„ d0e)jDƒZDG d1d2„ d2ƒZEG d3d4„ d4e)jFƒZFG d5d6„ d6e)jGƒZGe,�r2G d7d8„ d8e,jHe*jIƒZJG d9d:„ d:eFƒZKG d;d<„ d<eGƒZLdS )=aÉ  Redis transport module for Kombu.

Features
========
* Type: Virtual
* Supports Direct: Yes
* Supports Topic: Yes
* Supports Fanout: Yes
* Supports Priority: Yes
* Supports TTL: No

Connection String
=================
Connection string has the following format:

.. code-block::

    redis://[USER:PASSWORD@]REDIS_ADDRESS[:PORT][/VIRTUALHOST]
    rediss://[USER:PASSWORD@]REDIS_ADDRESS[:PORT][/VIRTUALHOST]

To use sentinel for dynamic Redis discovery,
the connection string has following format:

.. code-block::

    sentinel://[USER:PASSWORD@]SENTINEL_ADDRESS[:PORT]

Transport Options
=================
* ``sep``
* ``ack_emulation``: (bool) If set to True transport will
  simulate Acknowledge of AMQP protocol.
* ``unacked_key``
* ``unacked_index_key``
* ``unacked_mutex_key``
* ``unacked_mutex_expire``
* ``visibility_timeout``
* ``unacked_restore_limit``
* ``fanout_prefix``
* ``fanout_patterns``
* ``global_keyprefix``: (str) The global key prefix to be prepended to all keys
  used by Kombu
* ``socket_timeout``
* ``socket_connect_timeout``
* ``socket_keepalive``
* ``socket_keepalive_options``
* ``queue_order_strategy``
* ``max_connections``
* ``health_check_interval``
* ``retry_on_timeout``
* ``priority_steps``
é    )ÚannotationsN)Úbisect)Ú
namedtuple)Úcontextmanager)ÚEmpty)Útime)Úpromise)ÚInconsistencyErrorÚVersionMismatch)Ú
get_logger)Úregister_after_fork)Úbytes_to_str)ÚERRÚREADÚpoll)Úaccepts_argument)ÚdumpsÚloads)Úcached_property)Úcycle_by_name)Ú
_parse_urlé   )Úvirtual)Úsentinelzkombu.transport.redisië  é   )r   é   é   é	   Úerror_classes_t)Úconnection_errorsÚchannel_errorsc               
   C  sb   ddl m}  t| dƒr| j}n| j}ttjjt	t
jtt| j| j| j| jf tjj|| j| jf ƒS )z$Return tuple of redis error classes.r   ©Ú
exceptionsÚInvalidData)Úredisr"   Úhasattrr#   Ú	DataErrorr   r   Ú	Transportr   r	   ÚsocketÚerrorÚIOErrorÚOSErrorÚConnectionErrorÚBusyLoadingErrorÚAuthenticationErrorÚTimeoutErrorr    ÚInvalidResponseÚResponseError)r"   r&   © r2   úG/var/www/html/env/lib/python3.10/site-packages/kombu/transport/redis.pyÚget_redis_error_classesy   s*   
ø	ýör4   c                  C  s   ddl m}  | jS )z1Return the redis ConnectionError exception class.r   r!   )r$   r"   r,   r!   r2   r2   r3   Úget_redis_ConnectionError“   s   r5   c                   @  ó   e Zd ZdZdS )Ú	MutexHeldz)Raised when another party holds the lock.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   r2   r2   r3   r7   ™   s    r7   c                 c  s�   � | j ||d�}d}z(|jdd�}|rdV  ntƒ ‚W |r1z| ¡  W dS  tjjy0   Y dS w dS |rGz| ¡  W w  tjjyF   Y w w w )zTAcquire redis lock in non blocking way.

    Raise MutexHeld if not successful.
    ©ÚtimeoutF)ÚblockingN)ÚlockÚacquirer7   Úreleaser$   r"   ÚLockNotOwnedError)ÚclientÚnameÚexpirer@   Úlock_acquiredr2   r2   r3   ÚMutex�   s,   €þþýþýrH   c                 C  ó   |   ¡  d S ©N)Ú_after_fork©Úchannelr2   r2   r3   Ú_after_fork_cleanup_channel´   ó   rN   c                      sl   e Zd ZdZg d¢Zdddœdddœdddœdddœd	œZd
d„ Z‡ fdd„Z‡ fdd„Zddd„Z	‡  Z
S )ÚGlobalKeyPrefixMixina  Mixin to provide common logic for global key prefixing.

    Overriding all the methods used by Kombu with the same key prefixing logic
    would be cumbersome and inefficient. Hence, we override the command
    execution logic that is called by all commands.
    )ÚHDELÚHGETÚHLENÚHSETÚLLENÚLPUSHÚPUBLISHÚRPUSHÚRPOPÚSADDÚSREMÚSETÚSMEMBERSÚZADDÚZREMÚZREVRANGEBYSCOREr   N)Ú
args_startÚargs_endéÿÿÿÿé   r   )ÚDELÚBRPOPÚEVALSHAÚWATCHc                   s¶   t |ƒ}| d¡}|ˆ jv rˆ jt|d ƒ |d< n<|ˆ jv rVˆ j| d }ˆ j| d }|dkr7|d |… ng }g }|d urE||d … }|‡ fdd„|||… D ƒ | }|g|¢S )Nr   ra   rb   c                   ó   g | ]	}ˆ j t|ƒ ‘qS r2   ©Úglobal_keyprefixÚstr©Ú.0Úarg©Úselfr2   r3   Ú
<listcomp>ê   ó    ÿÿz5GlobalKeyPrefixMixin._prefix_args.<locals>.<listcomp>)ÚlistÚpopÚPREFIXED_SIMPLE_COMMANDSrk   rl   ÚPREFIXED_COMPLEX_COMMANDS)rq   ÚargsÚcommandra   rb   Úpre_argsÚ	post_argsr2   rp   r3   Ú_prefix_argsÚ   s"   



þý
z!GlobalKeyPrefixMixin._prefix_argsc                   sH   t ƒ j||fi |¤Ž}|dkr"|r"|\}}|t| jƒd… }||fS |S )zŸParse a response from the Redis server.

        Method wraps ``redis.parse_response()`` to remove prefixes of keys
        returned by redis command.
        rf   N)ÚsuperÚparse_responseÚlenrk   )rq   Ú
connectionÚcommand_nameÚoptionsÚretÚkeyÚvalue©Ú	__class__r2   r3   r~   ñ   s   z#GlobalKeyPrefixMixin.parse_responsec                   ó   t ƒ j|  |¡i |¤ŽS rJ   ©r}   Úexecute_commandr|   ©rq   rx   Úkwargsr†   r2   r3   rŠ   þ   ó   z$GlobalKeyPrefixMixin.execute_commandTc                 C  s   t | j| j||| jd�S )N©rk   )ÚPrefixedRedisPipelineÚconnection_poolÚresponse_callbacksrk   )rq   ÚtransactionÚ
shard_hintr2   r2   r3   Úpipeline  s   ûzGlobalKeyPrefixMixin.pipeline)TN)r9   r:   r;   r<   rv   rw   r|   r~   rŠ   r”   Ú__classcell__r2   r2   r†   r3   rP   ¸   s    ürP   c                   @  s    e Zd ZdZdd„ Zdd„ ZdS )ÚPrefixedStrictRedisz@Returns a ``StrictRedis`` client that prefixes the keys it uses.c                 O  s,   |  dd¡| _tjj| g|¢R i |¤Ž d S ©Nrk   Ú )ru   rk   r$   ÚRedisÚ__init__r‹   r2   r2   r3   rš     s   zPrefixedStrictRedis.__init__c                 K  s   t | jfd| ji|¤ŽS )Nrk   )ÚPrefixedRedisPubSubr�   rk   )rq   rŒ   r2   r2   r3   Úpubsub  s   ÿþýzPrefixedStrictRedis.pubsubN)r9   r:   r;   r<   rš   rœ   r2   r2   r2   r3   r–     s    r–   c                   @  s   e Zd ZdZdd„ ZdS )r�   a   Custom Redis pipeline that takes global_keyprefix into consideration.

    As the ``PrefixedStrictRedis`` client uses the `global_keyprefix` to prefix
    the keys it uses, the pipeline called by the client must be able to prefix
    the keys as well.
    c                 O  s.   |  dd¡| _tjjj| g|¢R i |¤Ž d S r—   )ru   rk   r$   rD   ÚPipelinerš   r‹   r2   r2   r3   rš   "  s    zPrefixedRedisPipeline.__init__N)r9   r:   r;   r<   rš   r2   r2   r2   r3   r�     s    r�   c                      sD   e Zd ZdZdZ‡ fdd„Zdd„ Z‡ fdd„Z‡ fd	d
„Z‡  Z	S )r›   zCRedis pubsub client that takes global_keyprefix into consideration.)Ú	SUBSCRIBEÚUNSUBSCRIBEÚ
PSUBSCRIBEÚPUNSUBSCRIBEc                   s$   |  dd¡| _tƒ j|i |¤Ž d S r—   )ru   rk   r}   rš   r‹   r†   r2   r3   rš   1  s   zPrefixedRedisPubSub.__init__c                   s8   t |ƒ}| d¡}|ˆ jv r‡ fdd„|D ƒ}|g|¢S )Nr   c                   ri   r2   rj   rm   rp   r2   r3   rr   :  rs   z4PrefixedRedisPubSub._prefix_args.<locals>.<listcomp>)rt   ru   ÚPUBSUB_COMMANDS)rq   rx   ry   r2   rp   r3   r|   5  s   


þ
z PrefixedRedisPubSub._prefix_argsc                   sF   t ƒ j|i |¤Ž}|du r|S |�^}}}|g‡ fdd„|D ƒ¢|‘S )z Parse a response from the Redis server.

        Method wraps ``PubSub.parse_response()`` to remove prefixes of keys
        returned by redis command.
        Nc                   s   g | ]}|t ˆ jƒd … ‘qS rJ   )r   rk   )rn   rM   rp   r2   r3   rr   S  s    z6PrefixedRedisPubSub.parse_response.<locals>.<listcomp>)r}   r~   )rq   rx   rŒ   rƒ   Úmessage_typeÚchannelsÚmessager†   rp   r3   r~   A  s   ÿþýz"PrefixedRedisPubSub.parse_responsec                   rˆ   rJ   r‰   r‹   r†   r2   r3   rŠ   W  r�   z#PrefixedRedisPubSub.execute_command)
r9   r:   r;   r<   r¢   rš   r|   r~   rŠ   r•   r2   r2   r†   r3   r›   '  s    r›   c                      s¼   e Zd ZdZdZ‡ fdd„Z‡ fdd„Zd#dd	„Z‡ fd
d„Zd$‡ fdd„	Z	e
d%dd„ƒZd#dd„Zd&dd„Zd'dd„Zedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZ‡  ZS )(ÚQoSzRedis Ack Emulation.Tc                   s   t ƒ j|i |¤Ž d| _d S )Nr   )r}   rš   Ú_vrestore_countr‹   r†   r2   r3   rš   `  s   
zQoS.__init__c              	     sª   |j }|d |d }}tjd dkr|tƒ ig}ntƒ |g}|  ¡ �(}|j| jg|¢R Ž  | j|t	|j
||gƒ¡ ¡  tƒ  ||¡ W d   ƒ d S 1 sNw   Y  d S )NÚexchangeÚrouting_keyr   r   )Údelivery_infor$   ÚVERSIONr   Úpipe_or_acquireÚzaddÚunacked_index_keyÚhsetÚunacked_keyr   Ú_rawÚexecuter}   Úappend)rq   r¥   Údelivery_tagÚdeliveryÚEXÚRKÚ	zadd_argsÚpiper†   r2   r3   r³   d  s   

ÿ"ûz
QoS.appendNc                 C  sT   | j  |¡�}| jD ]	}| j||d� q
W d   ƒ n1 sw   Y  | j ¡  d S )N©rD   )rM   Úconn_or_acquireÚ
_deliveredÚrestore_by_tagÚclear)rq   rD   Útagr2   r2   r3   Úrestore_unackedu  s   
ÿÿzQoS.restore_unackedc                   s   |   |¡ ¡  tƒ  |¡ d S rJ   )Ú_remove_from_indicesr²   r}   Úack)rq   r´   r†   r2   r3   rÂ   {  s   zQoS.ackFc                   s2   |r
| j |dd� n|  |¡ ¡  tƒ  |¡ d S ©NT)Úleftmost)r½   rÁ   r²   r}   rÂ   )rq   r´   Úrequeuer†   r2   r3   Úreject  s   z
QoS.rejectc                 c  sL   � |r|V  d S | j  |¡�}| ¡ V  W d   ƒ d S 1 sw   Y  d S rJ   )rM   r»   r”   )rq   r¹   rD   r2   r2   r3   r¬   †  s   €
"ÿzQoS.pipe_or_acquirec                 C  sF   |   |¡�}| | j|¡ | j|¡W  d   ƒ S 1 sw   Y  d S rJ   )r¬   Úzremr®   Úhdelr°   )rq   r´   r¹   r2   r2   r3   rÁ   Ž  s   
$þzQoS._remove_from_indicesr   é
   c           	   
   C  sî   |  j d7  _ | j d | rd S | j ¡ �X}tƒ | j }z7t|| j| jƒ�% |j| j	|d|o/||dd�}|p7g D ]
\}}|  
||¡ q8W d   ƒ n1 sMw   Y  W n	 ty\   Y n	w W d   ƒ d S W d   ƒ d S 1 spw   Y  d S )Nr   r   T)ÚstartÚnumÚ
withscores)r§   rM   r»   r   Úvisibility_timeoutrH   Úunacked_mutex_keyÚunacked_mutex_expireÚzrevrangebyscorer®   r½   r7   )	rq   rÊ   rË   ÚintervalrD   ÚceilÚvisibler¿   Úscorer2   r2   r3   Úrestore_visible“  s2   ÿ
þÿû€ÿ€ö"õzQoS.restore_visiblec                   sP   ‡ ‡‡fdd„}ˆj  |¡�}| |ˆj¡ W d   ƒ d S 1 s!w   Y  d S )Nc                   sT   |   ˆjˆ¡}|  ¡  ˆ ˆ| ¡ |r(tt|ƒƒ\}}}ˆj |||| ˆ ¡ d S d S rJ   )Úhgetr°   ÚmultirÁ   r   r   rM   Ú_do_restore_message)r¹   ÚpÚMr¶   r·   ©rÄ   rq   r¿   r2   r3   Úrestore_transaction¦  s   þz/QoS.restore_by_tag.<locals>.restore_transaction)rM   r»   r’   r°   )rq   r¿   rD   rÄ   rÜ   r2   rÛ   r3   r½   ¤  s   "ÿzQoS.restore_by_tagc                 C  ó   | j jS rJ   )rM   r°   rp   r2   r2   r3   r°   ±  ó   zQoS.unacked_keyc                 C  rÝ   rJ   )rM   r®   rp   r2   r2   r3   r®   µ  rÞ   zQoS.unacked_index_keyc                 C  rÝ   rJ   )rM   rÎ   rp   r2   r2   r3   rÎ   ¹  rÞ   zQoS.unacked_mutex_keyc                 C  rÝ   rJ   )rM   rÏ   rp   r2   r2   r3   rÏ   ½  rÞ   zQoS.unacked_mutex_expirec                 C  rÝ   rJ   )rM   rÍ   rp   r2   r2   r3   rÍ   Á  rÞ   zQoS.visibility_timeoutrJ   ©F©NN)r   rÉ   rÉ   )NF)r9   r:   r;   r<   Úrestore_at_shutdownrš   r³   rÀ   rÂ   rÆ   r   r¬   rÁ   rÕ   r½   r   r°   r®   rÎ   rÏ   rÍ   r•   r2   r2   r†   r3   r¦   [  s.    







r¦   c                   @  s¶   e Zd ZdZeeB ZdZ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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$d%„Zed&d'„ ƒZdS ))ÚMultiChannelPollerz%Async I/O poller for Redis transport.FNc                 C  s(   t ƒ | _i | _i | _tƒ | _t ƒ | _d S rJ   )ÚsetÚ	_channelsÚ_fd_to_chanÚ_chan_to_sockr   ÚpollerÚ
after_readrp   r2   r2   r3   rš   Ñ  s
   zMultiChannelPoller.__init__c              
   C  sX   | j  ¡ D ]}z| j |¡ W q ttfy   Y qw | j ¡  | j ¡  | j  ¡  d S rJ   )	ræ   Úvaluesrç   Ú
unregisterÚKeyErrorÚ
ValueErrorrä   r¾   rå   )rq   Úfdr2   r2   r3   ÚcloseÝ  s   ÿ

zMultiChannelPoller.closec                 C  ó   | j  |¡ d S rJ   )rä   Úadd©rq   rM   r2   r2   r3   rð   ç  ó   zMultiChannelPoller.addc                 C  rï   rJ   )rä   Údiscardrñ   r2   r2   r3   ró   ê  rò   zMultiChannelPoller.discardc              	   C  s.   z
| j  |j¡ W d S  ttfy   Y d S w rJ   )rç   rê   Ú_sockÚAttributeErrorÚ	TypeError©rq   r€   r2   r2   r3   Ú_on_connection_disconnectí  s
   ÿz,MultiChannelPoller._on_connection_disconnectc                 C  sr   |||f| j v r|  |||¡ |jjd u r|j ¡  |jj}||f| j| ¡ < || j |||f< | j || j	¡ d S rJ   )
ræ   Ú_unregisterr€   rô   Úconnectrå   Úfilenorç   ÚregisterÚ
eventflags)rq   rM   rD   ÚtypeÚsockr2   r2   r3   Ú	_registeró  s   
zMultiChannelPoller._registerc                 C  s   | j  | j|||f ¡ d S rJ   )rç   rê   ræ   )rq   rM   rD   rþ   r2   r2   r3   rù   ý  s   zMultiChannelPoller._unregisterc                 C  s:   t |dd ƒd u r|j d¡|_|jjd uo|||f| jv S )Nr€   Ú_)Úgetattrr�   Úget_connectionr€   rô   ræ   )rq   rM   rD   Úcmdr2   r2   r3   Ú_client_registered   s
   ÿz%MultiChannelPoller._client_registeredc                 C  sB   ||j df}|  ||j d¡sd|_| j|Ž  |js| ¡  dS dS )zEnable BRPOP mode for channel.rf   FN)rD   r  Ú_in_pollr   Ú_brpop_start)rq   rM   Úidentr2   r2   r3   Ú_register_BRPOP  s   
ÿz"MultiChannelPoller._register_BRPOPc                 C  s<   |   ||jd¡sd|_|  ||jd¡ |js| ¡  dS dS )zEnable LISTEN mode for channel.ÚLISTENFN)r  Ú	subclientÚ
_in_listenr   Ú
_subscriberñ   r2   r2   r3   Ú_register_LISTEN  s   ÿz#MultiChannelPoller._register_LISTENc                 C  s:   | j D ]}|jr|j ¡ r|  |¡ |jr|  |¡ qd S rJ   )rä   Úactive_queuesÚqosÚcan_consumer	  Úactive_fanout_queuesr  rñ   r2   r2   r3   Úon_poll_start  s   



€ûz MultiChannelPoller.on_poll_startc                 C  s(   || _ | jD ]}|jj|jd�  S d S ©N)rË   )rç   rä   r  rÕ   Úunacked_restore_limit)rq   rç   rM   r2   r2   r3   Úon_poll_init  s   

ÿÿzMultiChannelPoller.on_poll_initc                 C  s*   | j D ]}|jr|jj|jd�  S qd S r  )rä   r  r  rÕ   r  rñ   r2   r2   r3   Úmaybe_restore_messages&  s   

ÿþÿz)MultiChannelPoller.maybe_restore_messagesc                 C  s<   | j D ]}|j d¡}|d urtt|dd ƒƒr| ¡  qd S )Nr  Úcheck_health)rä   Ú__dict__ÚgetÚcallabler  r  )rq   rM   rD   r2   r2   r3   Úmaybe_check_subclient_health.  s   
ÿ€ûz/MultiChannelPoller.maybe_check_subclient_healthc                 C  s,   | j | \}}|j ¡ r|j| ƒ  d S d S rJ   )rå   r  r  Úhandlers)rq   rû   Úchanrþ   r2   r2   r3   Úon_readable6  s   
ÿzMultiChannelPoller.on_readablec                 C  s>   |t @ r|  |¡| fS |t@ r| j| \}}| |¡ d S d S rJ   )r   r  r   rå   Ú_poll_error)rq   rû   Úeventr  rþ   r2   r2   r3   Úhandle_event;  s   þzMultiChannelPoller.handle_eventc           	      C  sþ   d| _ z]| jD ]}|jr|j ¡ r|  |¡ |jr|  |¡ q| j 	|¡}|rZ|D ]0\}}|  
||¡}|rY W d| _ | jrWz| j ¡ }W n
 tyN   Y d S w |ƒ  | js=d S d S q)|  ¡  tƒ ‚d| _ | jr~z| j ¡ }W n	 tyw   Y w w |ƒ  | jsgw )NTF)Ú_in_protected_readrä   r  r  r  r	  r  r  rç   r   r"  rè   ru   rë   r  r   )	rq   Úcallbackr>   rM   Úeventsrû   r!  rƒ   Úfunr2   r2   r3   r  B  sJ   



€ÿúøüúzMultiChannelPoller.getc                 C  s   | j S rJ   )rå   rp   r2   r2   r3   Úfds`  s   zMultiChannelPoller.fdsrJ   )r9   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  Úpropertyr'  r2   r2   r2   r3   râ   Æ  s0    

	
râ   c                      s€  e Zd ZdZeZdZdZdZdZdZ	dZ
dZdZdZi ZdZdZd	Zd
ZdZdZdZeZdZdZdZdZdZdZeZdZ dZ!dZ"dZ#dZ$dZ%e&j'j(d Z(e)rQe)j*ndZ+e)rXe)j,ndZ-‡ fdd„Z.dd„ Z/dd„ Z0dd„ Z1	drdd„Z2dr‡ fdd„	Z3dd„ Z4‡ fdd „Z5d!d"„ Z6‡ fd#d$„Z7d%d&„ Z8d'd(„ Z9d)d*„ Z:d+d,„ Z;d-d.„ Z<d/d0„ Z=d1d2„ Z>dsd4d5„Z?d6d7„ Z@d8d9„ ZAd:d;„ ZBd<d=„ ZCd>d?„ ZDd@dA„ ZEdBdC„ ZFdDdE„ ZGdrdFdG„ZHdHdI„ ZIdJdK„ ZJdLdM„ ZKdNdO„ ZLdPdQ„ ZM‡ fdRdS„ZNdTdU„ ZOdVdW„ ZP		dtdXdY„ZQdrdZd[„ZRdrd\d]„ZSdrd^d_„ZTd`da„ ZUeVdudbdc„ƒZWeXddde„ ƒZYeXdfdg„ ƒZZe[dhdi„ ƒZ\e[djdk„ ƒZ]dldm„ Z^dndo„ Z_eXdpdq„ ƒZ`‡  ZaS )vÚChannelzRedis Channel.NFTz_kombu.binding.%sz/{db}.zÚunackedÚunacked_indexÚunacked_mutexi,  i  rÉ   r˜   Úround_robin)ÚsepÚack_emulationr°   r®   rÎ   rÏ   rÍ   r  Úfanout_prefixÚfanout_patternsrk   Úsocket_timeoutÚsocket_connect_timeoutÚsocket_keepaliveÚsocket_keepalive_optionsÚqueue_order_strategyÚmax_connectionsÚhealth_check_intervalÚretry_on_timeoutÚpriority_stepsc                   sð   t ƒ j|i |¤Ž | jstj| _d| _t| jƒƒ | _|  	¡ | _
|  ¡ | _tƒ | _tƒ | _i | _| j| jdœ| _| jrEt| jtƒrD| j| _nd| _z| j ¡  W n ty[   |  ¡  ‚ w | jj | ¡ d| _| jj| _t d urvt | t!ƒ d S d S )NF)rf   r
  r˜   T)"r}   rš   r/  r   r¦   Ú_registeredr   r6  Ú_queue_cycleÚ_get_clientÚClientÚ_get_response_errorr1   rã   r  Úauto_delete_queuesÚ_fanout_to_queueÚ_brpop_readÚ_receiver  r0  Ú
isinstancerl   Úkeyprefix_fanoutrD   ÚpingÚ	ExceptionÚ_disconnect_poolsr€   Úcyclerð   r   r   rN   r‹   r†   r2   r3   rš   Ð  s8   

€þ
ÿzChannel.__init__c                 C  rI   rJ   )rH  rp   r2   r2   r3   rK   ø  rO   zChannel._after_forkc                 C  s@   | j }| j}d  | _| _ |d ur| ¡  |d ur| ¡  d S d S rJ   )Ú_poolÚ_async_poolÚ
disconnect)rq   ÚpoolÚ
async_poolr2   r2   r3   rH  û  s   ÿzChannel._disconnect_poolsc                 C  sH   | j |u rd | _ | j|u rd | _| jr | jjr"| jj |¡ d S d S d S rJ   )r  r  r€   rI  rø   r÷   r2   r2   r3   rø     s   

ÿz!Channel._on_connection_disconnectc                 C  s    z>zd|d d< d|d d d< W n	 t y   Y nw |  ||¡D ]}| j|dd�}|r/|jn|j|  ||¡t|ƒƒ q!W d S  tyO   td|dd	� Y d S w )
NTÚheadersÚredeliveredÚ
propertiesrª   F©ÚreversezCould not restore message: %r©Úexc_info)	rë   Ú_lookupÚ_get_message_priorityÚlpushÚrpushÚ
_q_for_prir   rG  Úcrit)rq   Úpayloadr¨   r©   r¹   rÄ   ÚqueueÚprir2   r2   r3   rØ     s    ÿÿýÿzChannel._do_restore_messagec                   sd   ˆj s	tƒ  |¡S |j‰‡ ‡‡fdd„}ˆ ¡ �}| |ˆj¡ W d   ƒ d S 1 s+w   Y  d S )Nc                   sT   |   ˆjˆ¡}|  ¡  |  ˆjˆ¡ |r(tt|ƒƒ\}}}ˆ |||| ˆ ¡ d S d S rJ   )rÖ   r°   r×   rÈ   r   r   rØ   )r¹   ÚPrÚ   r¶   r·   rÛ   r2   r3   rÜ   %  s   þz-Channel._restore.<locals>.restore_transaction)r/  r}   Ú_restorer´   r»   r’   r°   )rq   r¥   rÄ   rÜ   rD   r†   rÛ   r3   r`     s   
"ÿzChannel._restorec                 C  s   | j |dd�S rÃ   )r`  )rq   r¥   r2   r2   r3   Ú_restore_at_beginning0  s   zChannel._restore_at_beginningc                   sT   || j v r| j | \}}| j |¡ || j|< tƒ j|g|¢R i |¤Ž}|  ¡  |S rJ   )Ú_fanout_queuesr  rð   rA  r}   Úbasic_consumeÚ_update_queue_cycle)rq   r]  rx   rŒ   r¨   r  rƒ   r†   r2   r3   rc  3  s   

zChannel.basic_consumec                 C  s8   | j }|r|jjr|jj t| j|fƒ¡S |  |¡S d S rJ   )r€   rI  r#  rè   rð   r   Ú_basic_cancel)rq   Úconsumer_tagr€   r2   r2   r3   Úbasic_cancelG  s   ÿ
ûzChannel.basic_cancelc                   sœ   z| j | }W n
 ty   Y d S w z| j |¡ W n	 ty#   Y nw |  |¡ z| j| \}}| j |¡ W n	 tyA   Y nw tƒ  	|¡}|  
¡  |S rJ   )Ú_tag_to_queuerë   r  ÚremoveÚ_unsubscribe_fromrb  rA  ru   r}   rg  rd  )rq   rf  r]  r¨   r  rƒ   r†   r2   r3   re  T  s(   ÿÿ
ÿzChannel._basic_cancelc                 C  s.   |r| j rd | j|d|g¡S d | j|g¡S )Nr˜   ú/)r1  ÚjoinrE  )rq   r¨   r©   r2   r2   r3   Ú_get_publish_topich  s   
zChannel._get_publish_topicc                 C  s   | j | \}}|  ||¡S rJ   )rb  rm  )rq   r]  r¨   r©   r2   r2   r3   Ú_get_subscribe_topicm  s   zChannel._get_subscribe_topicc                   sN   ‡ fdd„ˆ j D ƒ}|sd S ˆ j}|jjd u r|j ¡  |jˆ _| |¡ d S )Nc                   s   g | ]}ˆ   |¡‘qS r2   )rn  ©rn   r]  rp   r2   r3   rr   r  s    ÿz&Channel._subscribe.<locals>.<listcomp>)r  r  r€   rô   rú   r  Ú
psubscribe)rq   ÚkeysÚcr2   rp   r3   r  q  s   
ÿ
zChannel._subscribec                 C  s6   |   |¡}| j}|jr|jjr| |g¡ d S d S d S rJ   )rn  r  r€   rô   Úunsubscribe)rq   r]  Útopicrr  r2   r2   r3   rj  |  s
   
ÿzChannel._unsubscribe_fromc                 C  sŠ   t |d ƒdkr|d dkrd|_d S t |d ƒdkr.|d |d |d |d f\}}}}n|d d |d |d f\}}}}||||dœS )	Nr   rs  rd   FÚpmessager   r   )rþ   ÚpatternrM   Údata)r   Ú
subscribed)rq   rD   Úrrþ   rv  rM   rw  r2   r2   r3   Ú_handle_message‚  s   & üzChannel._handle_messagec                 C  sz   | j }g }z
| |  |¡¡ W n	 ty   Y nw |jd ur9|jjdd�r9| |  |¡¡ |jd ur9|jjdd�s%t|ƒS )Nr   r=   )r  r³   Ú_receive_oner   r€   Úcan_readÚany)rq   rr  rƒ   r2   r2   r3   rC  ’  s   ÿÿzChannel._receivec              	   C  s  d }z|  ¡ }W n | jy   d | _‚ w t|ttfƒr||  ||¡}t|d ƒ d¡r~t|d ƒ}|d r€|d dkrC| 	d¡\}}}z
t
t|d ƒƒ}W n ttfyg   td|t|ƒd d	… d
d� tƒ ‚w | dd
¡d }| j || j| ¡ dS d S d S d S )Nrþ   r¥   rM   rw  r   rk  Ú.z&Cannot process event on channel %r: %si   r   rT  T)r~   r   r  rD  rt   Útuplerz  r   ÚendswithÚ	partitionr   rö   rì   ÚwarningÚreprr   Úsplitr€   Ú_deliverrA  )rq   rr  Úresponser\  rM   r  r¥   r¨   r2   r2   r3   r{  �  s<   þÿý
ÿðzChannel._receive_oner   c                   sr   ˆj  tˆjƒ¡‰ ˆ sd S ‡ ‡fdd„ˆjD ƒ|pdg }ˆjjˆ_dg|¢}ˆjr0ˆj 	|¡}ˆjjj
|Ž  d S )Nc                   s"   g | ]}ˆ D ]}ˆ  ||¡‘qqS r2   )rZ  )rn   r^  r]  ©Úqueuesrq   r2   r3   rr   º  s
    ÿÿz(Channel._brpop_start.<locals>.<listcomp>r   rf   )r<  Úconsumer   r  r:  rD   r€   r  rk   r|   Úsend_command)rq   r>   rq  Úcommand_argsr2   r‡  r3   r  ¶  s   ÿ

zChannel._brpop_startc                 K  sž   zJz| j j| j jdfi |¤Ž}W n | jy   | j j ¡  ‚ w |rH|\}}t|ƒ | jd¡d }| j 	|¡ | j 
tt|ƒƒ|¡ W d | _dS tƒ ‚d | _w )Nrf   r   r   T)rD   r~   r€   r   rL  r   Úrsplitr.  r<  Úrotater…  r   r  r   )rq   r‚   Ú
dest__itemÚdestÚitemr2   r2   r3   rB  Ä  s(   ÿ
þü
þzChannel._brpop_readc                 K  s,   |dkr| j  ¡  d S | j | jj|¡ d S )Nr
  )r  r~   rD   r€   )rq   rþ   r‚   r2   r2   r3   r   Ú  s   zChannel._poll_errorc                 C  sd   |   ¡ �$}| jD ]}| |  ||¡¡}|r$tt|ƒƒ  W  d   ƒ S qtƒ ‚1 s+w   Y  d S rJ   )r»   r:  ÚrpoprZ  r   r   r   )rq   r]  rD   r^  r�  r2   r2   r3   Ú_getà  s   

üûzChannel._getc              	   C  sœ   |   ¡ �@}| ¡ �+}| jD ]}| |  ||¡¡}q| ¡ }tdd„ |D ƒƒW  d   ƒ W  d   ƒ S 1 s7w   Y  W d   ƒ d S 1 sGw   Y  d S )Nc                 s  s    � | ]}t |tjƒr|V  qd S rJ   )rD  ÚnumbersÚIntegral)rn   Úsizer2   r2   r3   Ú	<genexpr>î  s   € 
ÿz Channel._size.<locals>.<genexpr>)r»   r”   r:  ÚllenrZ  r²   Úsum)rq   r]  rD   r¹   r^  Úsizesr2   r2   r3   Ú_sizeè  s   


üÿ"ÿzChannel._sizec                 C  s$   |   |¡}|r|› | j› |› �S |S rJ   )Úpriorityr.  )rq   r]  r^  r2   r2   r3   rZ  ñ  s   
zChannel._q_for_pric                 C  s   | j }|t||ƒd  S )Nr   )r:  r   )rq   ÚnÚstepsr2   r2   r3   r›  ÷  s   zChannel.priorityc                 K  sT   | j |dd�}|  ¡ �}| |  ||¡t|ƒ¡ W d  ƒ dS 1 s#w   Y  dS )zDeliver message.FrR  N)rW  r»   rX  rZ  r   )rq   r]  r¥   rŒ   r^  rD   r2   r2   r3   Ú_putû  s   
"ÿzChannel._putc                 K  sF   |   ¡ �}| |  ||¡t|ƒ¡ W d  ƒ dS 1 sw   Y  dS )zDeliver fanout message.N)r»   Úpublishrm  r   )rq   r¨   r¥   r©   rŒ   rD   r2   r2   r3   Ú_put_fanout  s   

þ"ÿzChannel._put_fanoutc                 K  s   |r
| j  |¡ d S d S rJ   )r@  rð   )rq   r]  Úauto_deleterŒ   r2   r2   r3   Ú
_new_queue
  s   ÿzChannel._new_queuec              	   C  s‚   |   |¡jdkr|| dd¡f| j|< |  ¡ � }| | j|f | j |p%d|p(d|p+dg¡¡ W d   ƒ d S 1 s:w   Y  d S )NÚfanoutú#Ú*r˜   )	Útypeofrþ   Úreplacerb  r»   ÚsaddÚkeyprefix_queuer.  rl  )rq   r¨   r©   rv  r]  rD   r2   r2   r3   Ú_queue_bind  s   
ÿ
þÿ"ÿzChannel._queue_bindc           
   	   O  sÐ   | j  |¡ | j| d¡d��O}| | j|f | j |pd|p d|p#dg¡¡ | ¡ �}| j	D ]}	| 
|  ||	¡¡}q/| ¡  W d   ƒ n1 sIw   Y  W d   ƒ d S W d   ƒ d S 1 saw   Y  d S )NrD   rº   r˜   )r@  ró   r»   r  Úsremr©  r.  rl  r”   r:  ÚdeleterZ  r²   )
rq   r]  r¨   r©   rv  rx   rŒ   rD   r¹   r^  r2   r2   r3   Ú_delete  s    þÿ


ýû"ûzChannel._deletec              	   K  sŽ   |   ¡ �9}| ¡ �$}| jD ]}| |  ||¡¡}qt| ¡ ƒW  d   ƒ W  d   ƒ S 1 s0w   Y  W d   ƒ d S 1 s@w   Y  d S rJ   )r»   r”   r:  ÚexistsrZ  r}  r²   )rq   r]  rŒ   rD   r¹   r^  r2   r2   r3   Ú
_has_queue&  s   



ýÿ"ÿzChannel._has_queuec                   sh   ˆ j | }ˆ  ¡ �!}| |¡}|sg W  d   ƒ S ‡ fdd„|D ƒW  d   ƒ S 1 s-w   Y  d S )Nc                   s    g | ]}t t|ƒ ˆ j¡ƒ‘qS r2   )r  r   r„  r.  )rn   Úvalrp   r2   r3   rr   5  s     z%Channel.get_table.<locals>.<listcomp>)r©  r»   Úsmembers)rq   r¨   r„   rD   ré   r2   rp   r3   Ú	get_table-  s   


û$úzChannel.get_tablec              	   C  s¦   |   ¡ �E}| ¡ �0}| jD ]}|  ||¡}| |¡ |¡}q| ¡ }t|d d d… ƒW  d   ƒ W  d   ƒ S 1 s<w   Y  W d   ƒ d S 1 sLw   Y  d S )Nrd   )r»   r”   r:  rZ  r—  r¬  r²   r˜  )rq   r]  rD   r¹   r^  Úpriqr™  r2   r2   r3   Ú_purge7  s   


ûÿ"ÿzChannel._purgec                   s–   d| _ | jrz|  ¡  W n	 ty   Y nw | jsD| jj | ¡ | j 	d¡}|d ur<| j
D ]}|| jv r;| j||d� q-|  ¡  |  ¡  tƒ  ¡  d S )NTrD   rº   )Ú_closingr  rB  r   Úclosedr€   rI  ró   r  r  rb  r@  Úqueue_deleterH  Ú_close_clientsr}   rî   )rq   rD   r]  r†   r2   r3   rî   @  s$   ÿ

€zChannel.closec                 C  sL   dD ]!}z| j | }|jd }|_| ¡  W q tt| jfy#   Y qw d S )N)rD   r  )r  r€   rL  rë   rõ   r1   )rq   ÚattrrD   r€   r2   r2   r3   r¸  U  s   
ÿûzChannel._close_clientsc                 C  sd   t |tjƒs0|r|dkrt}n| d¡r|dd … }zt|ƒ}W |S  ty/   td |¡ƒ‚w |S )Nrk  r   z/Database is int between 0 and limit - 1, not {})rD  r“  r”  Ú
DEFAULT_DBÚ
startswithÚintrì   Úformat)rq   Úvhostr2   r2   r3   Ú_prepare_virtual_host_  s    

ûÿÿÿzChannel._prepare_virtual_hostc                 K  s   |S rJ   r2   )rq   r4  r5  Úparamsr2   r2   r3   Ú_filter_tcp_connparamsn  s   zChannel._filter_tcp_connparamsc                   sÊ  | j j}|jpd|jp| j j|j|j|j| j| j	| j
| j| j| j| jdœ}| j}t|dƒrN|g}t|dƒr<|t|jƒ7 }|D ]
}t|jdƒrH nq>| d¡ |jrhz| |j¡ | j|d< W n	 tyg   Y nw |d }d|v r¼t|ƒ\}}	}	}
}}}|d	kr¨| jdi |¤Ž}|jtjd
| dœfi |¤Ž | dd ¡ | dd ¡ | dd ¡ |
|d< ||d< | dd ¡ | dd ¡ |  | dd ¡¡|d< | ‰ | d¡pÐ| j}|rßG ‡ fdd„d|ƒ}|}||d< |S )Nz	127.0.0.1)ÚhostÚportÚvirtual_hostÚusernameÚpasswordr7  r2  r3  r4  r5  r8  r9  rš   Ú	__bases__r8  Úconnection_classrÂ  z://r(   rk  )rÈ  Úpathr3  r4  r5  rÅ  rÆ  rÃ  rÄ  Údbc                      s   e Zd Z‡ ‡fdd„Z‡  ZS )z'Channel._connparams.<locals>.Connectionc                   s$   t ƒ j|Ž  ˆjrˆ | ¡ d S d S rJ   )r}   rL  r;  rø   )rq   rx   )r‡   rM   r2   r3   rL  ·  s   ÿz2Channel._connparams.<locals>.Connection.disconnect)r9   r:   r;   rL  r•   r2   rL   r†   r3   Ú
Connection¶  s    rË  r2   ) r€   rD   ÚhostnamerÃ  Údefault_portrÄ  ÚuseridrÆ  r7  r2  r3  r4  r5  r8  r9  rÈ  r%   rt   rÇ  r   rš   ru   ÚsslÚupdateÚconnection_class_sslrö   r   rÁ  r$   ÚUnixDomainSocketConnectionr¿  r  )rq   ÚasynchronousÚconninfoÚ
connparamsÚ
conn_classÚclassesÚklassrÂ  Úschemer  rÅ  rÆ  rÉ  ÚqueryÚconnection_clsrË  r2   rL   r3   Ú_connparamsr  sz   ô

ÿ
ÿþþ
ÿ
þzChannel._connparamsc                 C  s    |r	| j | jd�S | j | jd�S )N)r�   )r>  rN  rM  )rq   rÓ  r2   r2   r3   Ú_create_clientÃ  s   zChannel._create_clientc                 C  s0   | j |d�}| jj|d d�| _tjdi |¤ŽS )N©rÓ  rÊ  ©rÊ  r2   )rÜ  rE  r½  r$   ÚConnectionPool©rq   rÓ  rÀ  r2   r2   r3   Ú	_get_poolÈ  s   zChannel._get_poolc                 C  s4   t jdk rtd t ¡ƒ‚| jrtjt| jd�S t jS )N)r   rd   r   zSRedis transport requires redis-py versions 3.2.0 or later. You have {0.__version__}rŽ   )	r$   r«   r
   r½  rk   Ú	functoolsÚpartialr–   r™   rp   r2   r2   r3   r=  Í  s   
þþzChannel._get_clientc                 c  s   � |r|V  d S |   ¡ V  d S rJ   ©rÝ  ©rq   rD   r2   r2   r3   r»   Û  s   €
zChannel.conn_or_acquirec                 C  s   | j d u r
|  ¡ | _ | j S rJ   )rJ  râ  rp   r2   r2   r3   rM  â  s   

zChannel.poolc                 C  s   | j d u r| jdd�| _ | j S )NTrÞ  )rK  râ  rp   r2   r2   r3   rN  è  s   
zChannel.async_poolc                 C  s   | j dd�S )z+Client used to publish messages, BRPOP etc.TrÞ  rå  rp   r2   r2   r3   rD   î  s   zChannel.clientc                 C  s   | j dd�}| ¡ S )z1Pub/Sub connection used to consume fanout queues.TrÞ  )rÝ  rœ   ræ  r2   r2   r3   r  ó  s   zChannel.subclientc                 C  s   | j  | j¡ d S rJ   )r<  rÐ  r  rp   r2   r2   r3   rd  ù  s   zChannel._update_queue_cyclec                 C  s   ddl m} |jS )Nr   r!   )r$   r"   r1   )rq   r"   r2   r2   r3   r?  ü  s   zChannel._get_response_errorc                   s   ‡ fdd„ˆ j D ƒS )z<Set of queues being consumed from (excluding fanout queues).c                   s   h | ]	}|ˆ j vr|’qS r2   )r  ro  rp   r2   r3   Ú	<setcomp>  s    
ÿz(Channel.active_queues.<locals>.<setcomp>)Ú_active_queuesrp   r2   rp   r3   r     s   zChannel.active_queuesrß   )r   rà   rJ   )br9   r:   r;   r<   r¦   Ú_clientÚ
_subclientrµ  Úsupports_fanoutr©  rE  r.  r  r  rb  r/  r°   r®   rÎ   rÏ   r  rÍ   ÚPRIORITY_STEPSr:  r2  r3  r4  r5  r9  r7  ÚDEFAULT_HEALTH_CHECK_INTERVALr8  r0  r1  rk   r6  rK  rJ  r   r)  Úfrom_transport_optionsr$   rË  rÈ  ÚSSLConnectionrÑ  rš   rK   rH  rø   rØ   r`  ra  rc  rg  re  rm  rn  r  rj  rz  rC  r{  r  rB  r   r’  rš  rZ  r›  rž  r   r¢  rª  r­  r¯  r²  r´  rî   r¸  r¿  rÁ  rÜ  rÝ  râ  r=  r   r»   r(  rM  rN  r   rD   r  rd  r?  r  r•   r2   r2   r†   r3   r)  e  sÂ    ÿÿ(	
ÿ
	

	

ÿ

Q




r)  c                      st   e Zd ZdZeZdZeZdZdZ	e
jjjdeg d¢ƒd�Zer$eƒ \ZZ‡ fdd„Zd	d
„ Zdd„ Zdd„ Z‡  ZS )r'   zRedis Transport.Nr$   T)Údirectrt  r£  )rÓ  Úexchange_typec                   s.   t d u rtdƒ‚tƒ j|i |¤Ž tƒ | _d S )Nz)Missing redis library (pip install redis))r$   ÚImportErrorr}   rš   râ   rI  r‹   r†   r2   r3   rš     s   zTransport.__init__c                 C  s   t jS rJ   )r$   Ú__version__rp   r2   r2   r3   Údriver_version!  s   zTransport.driver_versionc                   sˆ   | j ‰ˆ ˆj¡ ˆj‰ˆj‰ | j‰‡‡‡fdd„}|ˆ_‡ ‡‡‡fdd„‰ˆj ˆ¡ ˆ 	dˆj
¡ |jj dt¡}ˆ 	|ˆj¡ d S )Nc                   sD   | j r	ˆ | j ¡ ˆ jr z	ˆj ˆ¡ W d S  ty   Y d S w d S rJ   )rô   ri  r'  Úon_tickrë   )r€   )rI  Úloopr  r2   r3   Ú_on_disconnect+  s   ÿüz:Transport.register_with_event_loop.<locals>._on_disconnectc                     s    ˆƒ  ‡ ‡fdd„ˆj D ƒ d S )Nc                   s   g | ]}ˆ |ˆ|ƒ‘qS r2   r2   )rn   rí   )Ú
add_readerr  r2   r3   rr   :  s    zMTransport.register_with_event_loop.<locals>.on_poll_start.<locals>.<listcomp>)r'  r2   )rø  rI  Úcycle_poll_startr  r2   r3   r  8  s   z9Transport.register_with_event_loop.<locals>.on_poll_startrÉ   r8  )rI  r  rç   r  rø  r  rø   rõ  rð   Úcall_repeatedlyr  rD   Útransport_optionsr  rí  r  )rq   r€   rö  r÷  r8  r2   )rø  rI  rù  rö  r  r  r3   Úregister_with_event_loop$  s$   þþz"Transport.register_with_event_loopc                 C  s   | j  |¡ dS )z1Handle AIO event for one of our file descriptors.N)rI  r  )rq   rû   r2   r2   r3   r  F  s   zTransport.on_readable)r9   r:   r;   r<   r)  Úpolling_intervalÚDEFAULT_PORTrÍ  Údriver_typeÚdriver_namer   r'   Ú
implementsÚextendÚ	frozensetr$   r4   r   r    rš   rô  rü  r  r•   r2   r2   r†   r3   r'     s"    
þ
"r'   c                   @  r6   )ÚSentinelManagedSSLConnectionzâConnect to a Redis server using Sentinel + TLS.

        Use Sentinel to identify which Redis server is the current master
        to connect to and when connecting to the Master server, use an
        SSL Connection.
        Nr8   r2   r2   r2   r3   r  L  s    r  c                   @  sH   e Zd ZdZejd ZerejndZere	ndZ
d	dd„Zd	dd„ZdS )
ÚSentinelChannela  Channel with explicit Redis Sentinel knowledge.

    Broker url is supposed to look like:

    .. code-block::

        sentinel://0.0.0.0:26379;sentinel://0.0.0.0:26380/...

    where each sentinel is separated by a `;`.

    Other arguments for the sentinel should come from the transport options
    (see `transport_options` of :class:`~kombu.connection.Connection`).

    You must provide at least one option in Transport options:
     * `master_name` - name of the redis group to poll

    Example:
    -------
    .. code-block:: python

        >>> import kombu
        >>> c = kombu.Connection(
             'sentinel://sentinel1:26379;sentinel://sentinel2:26379',
             transport_options={'master_name': 'mymaster'}
        )
        >>> c.connect()
    )Úmaster_nameÚmin_other_sentinelsÚsentinel_kwargsNFc           	      C  sÜ   |   |¡}| ¡ }| dd ¡ | dd ¡ g }| jjjD ]}t|ƒ}|jdkr6|jp-| jj	}| 
|j|f¡ q|sD| 
|d |d f¡ tj|ft| ddƒt| dd ƒdœ|¤Ž}t| dd ƒ}|d u rftd	ƒ‚| |tj¡jS )
NrÂ  rÃ  r   r  r   r  )r  r  r  z1'master_name' transport option must be specified.)rÜ  Úcopyru   r€   rD   Úaltr   rÙ  rÃ  rÍ  r³   rÌ  r   ÚSentinelr  rì   Ú
master_forr$   r™   r�   )	rq   rÓ  rÕ  Úadditional_paramsÚ	sentinelsÚurlrÃ  Úsentinel_instr  r2   r2   r3   Ú_sentinel_managed_pool~  s@   

€ÿ

ýüÿþýz&SentinelChannel._sentinel_managed_poolc                 C  s*   | j |d�}| jj|d d�| _|  |¡S )NrÞ  rÊ  rß  )rÜ  rE  r½  r  rá  r2   r2   r3   râ  £  s   
zSentinelChannel._get_poolrß   )r9   r:   r;   r<   r)  rî  r   ÚSentinelManagedConnectionrÈ  r  rÑ  r  râ  r2   r2   r2   r3   r  Y  s    

%r  c                   @  s   e Zd ZdZdZeZdS )ÚSentinelTransportzRedis Sentinel Transport.ig  N)r9   r:   r;   r<   rÍ  r  r)  r2   r2   r2   r3   r  ©  s    r  )Mr<   Ú
__future__r   rã  r“  r(   r   Úcollectionsr   Ú
contextlibr   r]  r   r   Úviner   Úkombu.exceptionsr	   r
   Ú	kombu.logr   Úkombu.utils.compatr   Úkombu.utils.encodingr   Úkombu.utils.eventior   r   r   Úkombu.utils.functionalr   Úkombu.utils.jsonr   r   Úkombu.utils.objectsr   Úkombu.utils.schedulingr   Úkombu.utils.urlr   r˜   r   r$   rò  r   ÚloggerÚcriticalr‚  r[  rþ  rº  rí  rì  r   r4   r5   rG  r7   rH   rN   rP   r™   r–   rD   r�   r�   ÚPubSubr›   r¦   râ   r)  r'   r  rï  r  r  r  r2   r2   r2   r3   Ú<module>   s„    5ÿÿ

S4k       'D
þP