
    jKj                         d dl Z d dlZd dlZd dlmZmZmZmZmZ dZ	 e j                  d      Zeeef   Zdedededefd	Z G d
 d      Z G d d      Zy)    N)CallableDictHashableOptionalUniong     @posthog	min_value	max_valuelabelreturnc                     t        | t              st        | t        t        f      st        j                  | d| d       |S | |kD  r t        j                  | d| d| d       |S | |k  r t        j                  | d| d| d       |S | S )Nz# must be a number. Using max value .z cannot be greater than z. Using z cannot be less than )
isinstanceboolintfloatlogwarning)valuer	   r
   r   s       n/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/bucketed_rate_limiter.py_clamp_to_ranger      s    %je&Eug@1MNyug5i[STUVyug29+Xi[PQRSL    c                        e Zd ZdZdedefdZy)_Buckettokenslast_accessr   r   c                      || _         || _        y Nr   )selfr   r   s      r   __init__z_Bucket.__init__!   s    &r   N)__name__
__module____qualname__	__slots__Numberr   r!    r   r   r   r      s    )I'v 'E 'r   r   c                       e Zd ZdZdej
                  fdedededeee	gdf      deg e
f   f
dZd	ed
e
ddfdZde	defdZddZy)BucketedRateLimiteru  Token bucket rate limiter that tracks a separate bucket per key.

    Each key starts with a full bucket of ``bucket_size`` tokens and every
    call to :meth:`consume_rate_limit` consumes one token. ``refill_rate``
    tokens are restored per elapsed ``refill_interval_seconds`` (whole
    intervals only, fractional elapsed time is carried over), capped at
    ``bucket_size``.

    The call that empties a bucket is itself reported as rate limited — a
    burst over a fresh bucket lets ``bucket_size - 1`` events through before
    limiting kicks in — and ``on_bucket_rate_limited`` fires once each time a
    bucket is drained.

    Thread-safe. ``clock`` must return seconds and is injectable for tests.
    Nbucket_sizerefill_raterefill_interval_secondson_bucket_rate_limitedclockc                     t        |ddd      | _        t        |d| j                  d      | _        t        |dt        d      | _        || _        || _        i | _        t        j                         | _
        y )Nr   d   r*   r+   r,   )r   _bucket_size_refill_rateONE_DAY_IN_SECONDS_refill_interval_on_bucket_rate_limited_clock_buckets	threadingLock_lock)r    r*   r+   r,   r-   r.   s         r   r!   zBucketedRateLimiter.__init__7   ss     ,KCO+D--}
 !0#Q(:<U!
 (>$13^^%
r   bucketnowr   c                 `   | j                   dk  r| j                  |_        ||_        y ||j                  z
  }t	        || j                   z        }|dkD  rZ|| j
                  z  }t        |j                  |z   | j                        |_        |xj                  || j                   z  z  c_        y y )Nr   )r4   r1   r   r   r   r2   min)r    r;   r<   elapsedrefill_intervalstokens_to_adds         r   _apply_refillz!BucketedRateLimiter._apply_refillK   s      A% --FM!$F***w$*?*??@a,t/@/@@M =t?P?PQFM "2T5J5J"JJ  r   keyc                    d}| j                   5  | j                         }| j                  j                  |      }|'t	        | j
                  |      }|| j                  |<   n| j                  ||       |j                  dk  r
	 ddd       y|xj                  dz  c_        |j                  dk  }|r| j                  }ddd       | ||       S # 1 sw Y   xY w)z<Consume one token for ``key``. Returns True if rate limited.Nr   r   T   )	r:   r6   r7   getr   r1   rB   r   r5   )r    rC   callbackr<   r;   rate_limiteds         r   consume_rate_limitz&BucketedRateLimiter.consume_rate_limit[   s    ZZ++-C]]&&s+F~ (9(9sK%+c"""63/}}! Z MMQM!==A-L77! $ SM) Zs   A7C2CCc                 z    | j                   5  | j                  j                          d d d        y # 1 sw Y   y xY wr   )r:   r7   clear)r    s    r   stopzBucketedRateLimiter.stopu   s#    ZZMM! ZZs   1:)r   N)r"   r#   r$   __doc__time	monotonicr&   r   r   r   r   r!   r   rB   r   rI   rL   r'   r   r   r)   r)   &   s    * HL%)^^&& & "(	&
 !)8*d2B)C D& E	"&(KG K% KD K h 4 4"r   r)   )loggingr8   rN   typingr   r   r   r   r   r3   	getLoggerr   r   r   r&   strr   r   r)   r'   r   r   <module>rT      st   
    < < g	"	sEz	
f 
 
 
PV 
' 'Q" Q"r   