
    ph!                     R   S SK JrJr  S SKJrJrJr  S SKrS SKJ	r	  S SK
JrJrJr  S SKJrJr  S SKJr  S SKJrJr  S S	KJrJrJr  S S
KJrJr  S SKJrJrJ r J!r!  S SK"J#r#J$r$J%r%J&r&J'r'  S SK(J)r)J*r*J+r+J,r,J-r-J.r.J/r/  S SK0J1r1  Sr2S\4S jr3\ " S S5      5       r4\ " S S5      5       r5g)    )	dataclassfield)ListTypeUnionN)Optional)ConnectionPoolRedisRedisCluster)ExponentialWithJitterBackoff	NoBackoff)WeightedList)EventDispatcherEventDispatcherInterface)DEFAULT_GRACE_PERIODCircuitBreakerPBCircuitBreakerAdapter)Database	Databases)DEFAULT_FAILOVER_ATTEMPTSDEFAULT_FAILOVER_DELAYFailoverStrategyWeightBasedFailoverStrategy)DEFAULT_FAILURE_RATE_THRESHOLD!DEFAULT_FAILURES_DETECTION_WINDOWDEFAULT_MIN_NUM_FAILURESCommandFailureDetectorFailureDetector)DEFAULT_HEALTH_CHECK_DELAYDEFAULT_HEALTH_CHECK_INTERVALDEFAULT_HEALTH_CHECK_POLICYDEFAULT_HEALTH_CHECK_PROBESHealthCheckHealthCheckPoliciesPingHealthCheck)Retryx   returnc                      [        5       $ N)r        N/home/james-whalen/.local/lib/python3.13/site-packages/redis/multidb/config.pydefault_event_dispatcherr.   ,   s    r,   c                       \ rS rSr% SrSr\\S'   \" \	S9r
\	\S'   Sr\\   \S'   Sr\\   \S	'   Sr\\   \S
'   \r\\S'   Sr\\   \S'   S\4S jrSrg)DatabaseConfig0   a  
Dataclass representing the configuration for a database connection.

This class is used to store configuration settings for a database connection,
including client options, connection sourcing details, circuit breaker settings,
and cluster-specific properties. It provides a structure for defining these
attributes and allows for the creation of customized configurations for various
database setups.

Attributes:
    weight (float): Weight of the database to define the active one.
    client_kwargs (dict): Additional parameters for the database client connection.
    from_url (Optional[str]): Redis URL way of connecting to the database.
    from_pool (Optional[ConnectionPool]): A pre-configured connection pool to use.
    circuit (Optional[CircuitBreaker]): Custom circuit breaker implementation.
    grace_period (float): Grace period after which we need to check if the circuit could be closed again.
    health_check_url (Optional[str]): URL for health checks. Cluster FQDN is typically used
        on public Redis Enterprise endpoints.

Methods:
    default_circuit_breaker:
        Generates and returns a default CircuitBreaker instance adapted for use.
g      ?weightdefault_factoryclient_kwargsNfrom_url	from_poolcircuitgrace_periodhealth_check_urlr(   c                 T    [         R                  " U R                  S9n[        U5      $ )N)reset_timeout)	pybreakerr   r9   r   )selfcircuit_breakers     r-   default_circuit_breaker&DatabaseConfig.default_circuit_breakerR   s#    #22ARARS&77r,   r+   )__name__
__module____qualname____firstlineno____doc__r2   float__annotations__r   dictr5   r6   r   strr7   r	   r8   r   r   r9   r:   r@   __static_attributes__r+   r,   r-   r0   r0   0   ss    0 FE5M45"Hhsm"*.Ix'.(,GXn%,.L%.&*hsm*8 8r,   r0   c                      \ rS rSr% Sr\\   \S'   \r	\
\\\4      \S'   \" \" SSS9SS	9r\\S
'   Sr\\\      \S'   \r\\S'   \r\\S'   \r\\S'   Sr\\\      \S'   \r\\S'   \r \\S'   \!r"\\S'   \#r$\%\S'   Sr&\\'   \S'   \(r)\\S'   \*r+\\S'   \,r-\\S'   \." \/S9r0\1\S'   S\24S jr3S\\   4S jr4S\\   4S jr5S\'4S jr6S r7g)!MultiDbConfigW   aV  
Configuration class for managing multiple database connections in a resilient and fail-safe manner.

Attributes:
    databases_config: A list of database configurations.
    client_class: The client class used to manage database connections.
    command_retry: Retry strategy for executing database commands.
    failure_detectors: Optional list of additional failure detectors for monitoring database failures.
    min_num_failures: Minimal count of failures required for failover
    failure_rate_threshold: Percentage of failures required for failover
    failures_detection_window: Time interval for tracking database failures.
    health_checks: Optional list of additional health checks performed on databases.
    health_check_interval: Time interval for executing health checks.
    health_check_probes: Number of attempts to evaluate the health of a database.
    health_check_probes_delay: Delay between health check attempts.
    health_check_policy: Policy for determining database health based on health checks.
    failover_strategy: Optional strategy for handling database failover scenarios.
    failover_attempts: Number of retries allowed for failover operations.
    failover_delay: Delay between failover attempts.
    auto_fallback_interval: Time interval to trigger automatic fallback.
    event_dispatcher: Interface for dispatching events related to database operations.

Methods:
    databases:
        Retrieves a collection of database clients managed by weighted configurations.
        Initializes database clients based on the provided configuration and removes
        redundant retry objects for lower-level clients to rely on global retry logic.

    default_failure_detectors:
        Returns the default list of failure detectors used to monitor database failures.

    default_health_checks:
        Returns the default list of health checks used to monitor database health
        with specific retry and backoff strategies.

    default_failover_strategy:
        Provides the default failover strategy used for handling failover scenarios
        with defined retry and backoff configurations.
databases_configclient_class   
   )basecap   )backoffretriescommand_retryNfailure_detectorsmin_num_failuresfailure_rate_thresholdfailures_detection_windowhealth_checkshealth_check_intervalhealth_check_probeshealth_check_probes_delayhealth_check_policyfailover_strategyfailover_attemptsfailover_delayauto_fallback_intervalr3   event_dispatcherr(   c           
         [        5       nU R                   GHS  nUR                  R                  S[	        S[        5       S905        UR                  (       a2  U R                  R                  " UR                  40 UR                  D6nO|UR                  (       aO  UR                  R                  [	        S[        5       S95        U R                  R                  UR                  S9nOU R                  " S0 UR                  D6nUR                  c  UR                  5       OUR                  nUR                  [        UUUR                  UR                  S9UR                  5        GMV     U$ )Nretryr   )rW   rV   )connection_pool)clientr8   r2   r:   r+   )r   rO   r5   updater&   r   r6   rP   r7   	set_retryr8   r@   addr   r2   r:   )r>   	databasesdatabase_configrj   r8   s        r-   rn   MultiDbConfig.databases   sP    N	#44O ))00%9;?@ ''**33#,,0?0M0M !**))33!Y[9 **44$3$=$= 5  **K_-J-JK #**2  779$,, 
 MM!#*11%4%E%E	  &&5  5H r,   c                 V    [        U R                  U R                  U R                  S9/$ )N)rZ   r[   failure_detection_window)r   rZ   r[   r\   r>   s    r-   default_failure_detectors'MultiDbConfig.default_failure_detectors   s/    "!%!6!6'+'B'B)-)G)G
 	
r,   c                     [        5       /$ r*   )r%   rs   s    r-   default_health_checks#MultiDbConfig.default_health_checks   s    
 	
r,   c                     [        5       $ r*   )r   rs   s    r-   default_failover_strategy'MultiDbConfig.default_failover_strategy   s    *,,r,   r+   )8rB   rC   rD   rE   rF   r   r0   rH   r
   rP   r   r   r   r&   r   rX   rY   r   r   r   rZ   intr   r[   rG   r   r\   r]   r#   r    r^   r"   r_   r   r`   r!   ra   r$   rb   r   r   rc   r   rd   DEFAULT_AUTO_FALLBACK_INTERVALre   r   r.   rf   r   r   rn   rt   rw   rz   rK   r+   r,   r-   rM   rM   W   sG   &P >**5:L$uUL012: ,!<aM5  :>x_ 56=4c4$BEB'HuH15M8D-.5#@5@::'AuA/J,J48x 0186s62NE2$BEB1602. '9 'R
4+@ 

tK'8 

-+; -r,   rM   )6dataclassesr   r   typingr   r   r   r=   typing_extensionsr   redisr	   r
   r   redis.backoffr   r   redis.data_structurer   redis.eventr   r   redis.multidb.circuitr   r   r   redis.multidb.databaser   r   redis.multidb.failoverr   r   r   r   redis.multidb.failure_detectorr   r   r   r   r   redis.multidb.healthcheckr   r    r!   r"   r#   r$   r%   redis.retryr&   r}   r.   r0   rM   r+   r,   r-   <module>r      s    ( $ $  & 5 5 A - A 
 7     !$ ":  #8 #8 #8L w- w- w-r,   