o
    ¾¿i  ã                   @   sŠ   d dl mZmZ d dlmZ d dlmZ d dlZdZG dd„ deƒZ	G dd	„ d	eƒZ
G d
d„ de
ƒZG dd„ dejƒZG dd„ deƒZdS )é    )ÚABCÚabstractmethod)ÚEnum)ÚCallableNé<   c                   @   s   e Zd ZdZdZdZdS )ÚStateÚclosedÚopenz	half-openN)Ú__name__Ú
__module__Ú__qualname__ÚCLOSEDÚOPENÚ	HALF_OPEN© r   r   úI/home/ubuntu/.local/lib/python3.10/site-packages/redis/multidb/circuit.pyr   
   s    r   c                   @   sª   e Zd Zeedefdd„ƒƒZejedefdd„ƒƒZeedefdd„ƒƒZ	e	jedefd	d„ƒƒZ	eed
d„ ƒƒZ
e
jedd„ ƒƒZ
eded eegdf fdd„ƒZdS )ÚCircuitBreakerÚreturnc                 C   ó   dS )z@The grace period in seconds when the circle should be kept open.Nr   ©Úselfr   r   r   Úgrace_period   ó   zCircuitBreaker.grace_periodr   c                 C   r   )z Set the grace period in seconds.Nr   ©r   r   r   r   r   r      s    c                 C   r   )z!The current state of the circuit.Nr   r   r   r   r   Ústate   r   zCircuitBreaker.stater   c                 C   r   )z!Set current state of the circuit.Nr   ©r   r   r   r   r   r   "   r   c                 C   r   )z&Database associated with this circuit.Nr   r   r   r   r   Údatabase(   r   zCircuitBreaker.databasec                 C   r   )z*Set database associated with this circuit.Nr   ©r   r   r   r   r   r   .   r   ÚcbNc                 C   r   ©z6Callback called when the state of the circuit changes.Nr   ©r   r   r   r   r   Úon_state_changed4   ó   zCircuitBreaker.on_state_changed)r
   r   r   Úpropertyr   Úfloatr   Úsetterr   r   r   r   r!   r   r   r   r   r      s*    "r   c                   @   s¦   e Zd ZdZdejfdd„Zedefdd„ƒZ	e	j
defd	d„ƒZ	edefd
d„ƒZej
defdd„ƒZedd„ ƒZej
dd„ ƒZededeegdf fdd„ƒZdS )ÚBaseCircuitBreakerz;
    Base implementation of Circuit Breaker interface.
    r   c                 C   s4   || _ tj| j jtj| j jtj| j ji| _d | _	d S ©N)
Ú_cbr   r   Úcloser   r	   r   Ú	half_openÚ_state_pb_mapperÚ	_databaser    r   r   r   Ú__init__?   s   


ý
zBaseCircuitBreaker.__init__r   c                 C   s   | j jS r'   ©r(   Úreset_timeoutr   r   r   r   r   H   s   zBaseCircuitBreaker.grace_periodr   c                 C   s   || j _d S r'   r.   r   r   r   r   r   L   s   c                 C   s   t | jjjdS ©N)Úvalue)r   r(   r   Únamer   r   r   r   r   P   ó   zBaseCircuitBreaker.stater   c                 C   s   | j | ƒ  d S r'   )r+   r   r   r   r   r   T   r3   c                 C   s   | j S r'   ©r,   r   r   r   r   r   X   s   zBaseCircuitBreaker.databasec                 C   s
   || _ d S r'   r4   r   r   r   r   r   \   s   
r   Nc                 C   r   r   r   r    r   r   r   r!   `   r"   z#BaseCircuitBreaker.on_state_changed)r
   r   r   Ú__doc__Ú	pybreakerr   r-   r#   r$   r   r%   r   r   r   r   r   r!   r   r   r   r   r&   :   s"    	

"r&   c                   @   s4   e Zd ZdZdeeeegdf fdd„Zdd„ ZdS )Ú
PBListenerzDWrapper for callback to be compatible with pybreaker implementation.r   Nc                 C   s   || _ || _dS )zî
        Initialize a PBListener instance.

        Args:
            cb: Callback function that will be called when the circuit breaker state changes.
            database: Database instance associated with this circuit breaker.
        N)r(   r,   )r   r   r   r   r   r   r-   i   s   
zPBListener.__init__c                 C   s:   t |ƒ}| j|_t|jd}t|jd}|  |||¡ d S r0   )ÚPBCircuitBreakerAdapterr,   r   r   r2   r(   )r   r   Ú	old_stateÚ	new_stater   r   r   Ústate_changey   s
   zPBListener.state_change)	r
   r   r   r5   r   r   r   r-   r;   r   r   r   r   r7   f   s    
þr7   c                       s@   e Zd Zdejf‡ fdd„Zdedeegdf fdd„Z‡  Z	S )r8   r   c                    s   t ƒ  |¡ dS )a  
        Initialize a PBCircuitBreakerAdapter instance.

        This adapter wraps pybreaker's CircuitBreaker implementation to make it compatible
        with our CircuitBreaker interface.

        Args:
            cb: A pybreaker CircuitBreaker instance to be adapted.
        N)Úsuperr-   r    ©Ú	__class__r   r   r-   ‚   s   
z PBCircuitBreakerAdapter.__init__r   Nc                 C   s   t || jƒ}| j |¡ d S r'   )r7   r   r(   Úadd_listener)r   r   Úlistenerr   r   r   r!   Ž   s   z(PBCircuitBreakerAdapter.on_state_changed)
r
   r   r   r6   r   r-   r   r   r!   Ú__classcell__r   r   r=   r   r8      s    $r8   )Úabcr   r   Úenumr   Útypingr   r6   ÚDEFAULT_GRACE_PERIODr   r   r&   ÚCircuitBreakerListenerr7   r8   r   r   r   r   Ú<module>   s    *,