
    Pqh                    8   d dl mZ 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	m
Z
 d dlmZ d dlmZ d dlmZmZ d dlmZ ej(                  rdd	lmZ  G d
 d      Z ej0                  dd       G d d             Z ej0                  dd       G d d             Zy)    )annotationsN)CallableIteratorListOptionalTupleUnion)request)Response)RateLimitItem
parse_many)RateLimiter   )Limiterc                      e Zd ZU dZded<   ded<   ded<   ded<   	 	 	 	 	 	 	 	 	 	 	 	 dd	Zedd
       Zedd       Zedd       Z	edd       Z
y)RequestLimitzJ
    Provides details of a rate limit within the context of a request
    r   limitstrkeyboolbreachedsharedc                    t        j                  |      | _        || _        || _         |j
                  | | _        || _        || _        d | _	        y N)
weakrefproxy	extensionr   request_argskey_forr   r   r   _window)selfr   r   r   r   r   s         W/srv/www/ollama/chat-ollama/venv/lib/python3.12/site-packages/flask_limiter/wrappers.py__init__zRequestLimit.__init__"   sJ     6=]]95M
( 5==,/ 26    c                ^    t        j                  t        | j                  j                        S r   )typingcastr   r   limiterr!   s    r"   r(   zRequestLimit.limiter2   s    {{;(>(>??r$   c                    | j                   s6 | j                  j                  | j                  g| j                   | _         | j                   S r   )r    r(   get_window_statsr   r   r)   s    r"   windowzRequestLimit.window6   s:    ||84<<88XdFWFWXDL||r$   c                8    t        | j                  d   dz         S )z/Timestamp at which the rate limit will be resetr   r   )intr,   r)   s    r"   reset_atzRequestLimit.reset_at=   s     4;;q>A%&&r$   c                     | j                   d   S )z&Quantity remaining for this rate limitr   )r,   r)   s    r"   	remainingzRequestLimit.remainingC   s     {{1~r$   N)r   r   r   r   r   z	List[str]r   r   r   r   returnNone)r2   r   )r2   zTuple[int, int]r2   r.   )__name__
__module____qualname____doc____annotations__r#   propertyr(   r,   r/   r1    r$   r"   r   r      s    
  
H N L77 7  	7
 7 7 
7  @ @   ' '
  r$   r   T)equnsafe_hashc                     e Zd ZU dZded<   ded<   ded<   dZd	ed
<   dZded<   dZded<   dZded<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZd	ed<   d"dZed#d       Zed$d       Zed%d       Zed#d        Zd&d!Zy)'Limitz@
    simple wrapper to encapsulate limits and their context
    r   r   Callable[[], str]key_func*Optional[Union[str, Callable[[str], str]]]_scopeFr   
per_methodNOptional[Tuple[str, ...]]methodsOptional[str]error_messageOptional[Callable[[], bool]]exempt_whenOptional[bool]override_defaults$Optional[Callable[[Response], bool]]deduct_when6Optional[Callable[[RequestLimit], Optional[Response]]]	on_breachr   zUnion[Callable[[], int], int]_costr   c                    | j                   r7t        | j                   D cg c]  }|j                          c}      | _         y y c c}w r   )rF   tuplelower)r!   ks     r"   __post_init__zLimit.__post_init__]   s2    << T\\!B!'')!BCDL !Bs   Ac                <    | j                   r| j                         S y)zCheck if the limit is exempt.F)rJ   r)   s    r"   	is_exemptzLimit.is_exempta   s     ##%%r$   c                    t        | j                        r#| j                  t        j                  xs d      S | j                  S )N )callablerC   r
   endpointr)   s    r"   scopezLimit.scopei   s<     $ KK((.B/	
 	
r$   c                n    t        | j                  t              r| j                  S | j                         S r   )
isinstancerQ   r.   r)   s    r"   costz
Limit.costq   s&    djj#&::zz|r$   c                v    | j                   duxr* t        j                  j                         | j                   vS )z4Check if the limit is not applicable for this methodN)rF   r
   methodrT   r)   s    r"   method_exemptzLimit.method_exemptx   s.     ||4'VGNN,@,@,B$,,,VVr$   c                    | j                   }|r| j                  r|}n
| d| }n|}| j                  r|sJ |d|j                          z  }|S )z
        Derive final bucket (scope) for this limit given the endpoint
        and request method. If the limit is shared between multiple
        routes, the scope does not include the endpoint.
        :)r]   r   rD   upper)r!   r\   rb   limit_scoper]   s        r"   	scope_forzLimit.scope_for~   s\     jj{{##*Ak]3E??M6q())Er$   )r2   r3   )r2   r   )r2   rG   r4   )r\   r   rb   rG   r2   r   )r5   r6   r7   r8   r9   rD   rF   rH   rJ   rL   rN   rP   rQ   r   rV   r:   rX   r]   r`   rc   rh   r;   r$   r"   r?   r?   J   s     66J)-G&-#'M='04K-4(-~-8<K5<HLIEL+,E(,FDD   
 
   W W
r$   r?   c                      e Zd ZU dZded<   ded<   dZded<   dZd	ed
<   dZded<   dZded<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   ddZy)
LimitGroupzf
    represents a group of related limits either from a string or a callable
    that returns one
    zUnion[Callable[[], str], str]limit_providerr@   key_functionNrB   r]   rE   rF   rG   rH   rI   rJ   FrK   rL   rM   rN   rO   rP   r   rD   z'Optional[Union[Callable[[], int], int]]r`   r   c              #    K   t        | j                        r| j                         n| j                  }|rt        |      ng }|D ]  }t        || j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  xs d| j                          y w)Nr   )r[   rk   r   r?   rl   r]   rD   rF   rH   rJ   rL   rN   rP   r`   r   )r!   	limit_strlimit_itemsr   s       r"   __iter__zLimitGroup.__iter__   s      ++, !$$ 	
 09j+b  	E!!

""  &&  		Q 	s   CC)r2   zIterator[Limit])r5   r6   r7   r8   r9   r]   rF   rH   rJ   rL   rN   rP   rD   r`   r   rp   r;   r$   r"   rj   rj      s    
 21##8<E5<)-G&-#'M='04K-4(-~-8<K5<HLIELJ48D
18FDr$   rj   )
__future__r   dataclassesr&   r   r   r   r   r   r   r	   flaskr
   flask.wrappersr   limitsr   r   limits.strategiesr   TYPE_CHECKINGr   r   r   	dataclassr?   rj   r;   r$   r"   <module>ry      s    "    C C  # , )	"6 6r $D1E E 2EP $D1) ) 2)r$   