o
    si                     @  s   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rEdd	lmZ G d
d dZejdddG dd dZejdddG dd dZdS )    )annotationsN)CallableIteratorListOptionalTupleUnion)request)Response)RateLimitItem
parse_many)RateLimiter   )Limiterc                   @  st   e Zd ZU dZded< ded< ded< ded< dddZedddZedddZed ddZ	ed ddZ
dS )!RequestLimitzJ
    Provides details of a rate limit within the context of a request
    r   limitstrkeyboolbreachedshared	extensionr   request_args	List[str]returnNonec                 C  s:   t || _|| _|| _|j| | _|| _|| _d | _	d S N)
weakrefproxyr   r   r   key_forr   r   r   _window)selfr   r   r   r   r    r"   U/var/www/html/pca-backend/venv/lib/python3.10/site-packages/flask_limiter/wrappers.py__init__"   s   
zRequestLimit.__init__r   c                 C  s   t t| jjS r   )typingcastr   r   limiterr!   r"   r"   r#   r'   2   s   zRequestLimit.limiterTuple[int, int]c                 C  s&   | j s| jj| jg| jR  | _ | j S r   )r    r'   get_window_statsr   r   r(   r"   r"   r#   window6   s   zRequestLimit.windowintc                 C  s   t | jd d S )z/Timestamp at which the rate limit will be resetr   r   )r,   r+   r(   r"   r"   r#   reset_at=   s   zRequestLimit.reset_atc                 C  s
   | j d S )z&Quantity remaining for this rate limitr   )r+   r(   r"   r"   r#   	remainingC   s   
zRequestLimit.remainingN)r   r   r   r   r   r   r   r   r   r   r   r   )r   r   )r   r)   r   r,   )__name__
__module____qualname____doc____annotations__r$   propertyr'   r+   r-   r.   r"   r"   r"   r#   r      s   
 
r   T)equnsafe_hashc                   @  s   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dZed/d d!Zed0d"d#Zed1d%d&Zed/d'd(Zd2d,d-ZdS )3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   r   r   c                 C  s$   | j rtdd | j D | _ d S d S )Nc                 S  s   g | ]}|  qS r"   )lower).0kr"   r"   r#   
<listcomp>_   s    z'Limit.__post_init__.<locals>.<listcomp>)r?   tupler(   r"   r"   r#   __post_init__]   s   zLimit.__post_init__c                 C  s   | j r|   S dS )zCheck if the limit is exempt.F)rC   r(   r"   r"   r#   	is_exempta   s   zLimit.is_exemptc                 C  s    t | jr| tjpdS | jS )N )callabler<   r	   endpointr(   r"   r"   r#   scopei   s
   zLimit.scoper,   c                 C  s   t | jtr	| jS |  S r   )
isinstancerJ   r,   r(   r"   r"   r#   costq   s   z
Limit.costc                 C  s   | j duotj | j vS )z4Check if the limit is not applicable for this methodN)r?   r	   methodrK   r(   r"   r"   r#   method_exemptx   s   zLimit.method_exemptrT   r   rX   c                 C  sN   | j }|r| jr|}n
| d| }n|}| jr%|sJ |d|  7 }|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.
        :)rU   r   r=   upper)r!   rT   rX   limit_scoperU   r"   r"   r#   	scope_for~   s   zLimit.scope_for)r   r   )r   r   )r   r@   r/   )rT   r   rX   r@   r   r   )r0   r1   r2   r3   r4   r=   r?   rA   rC   rE   rG   rI   rJ   r   rP   r5   rQ   rU   rW   rY   r]   r"   r"   r"   r#   r8   J   s0   
 
r8   c                   @  s   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dZdS ) 
LimitGroupzf
    represents a group of related limits either from a string or a callable
    that returns one
    zUnion[Callable[[], str], str]limit_providerr9   key_functionNr;   rU   r>   r?   r@   rA   rB   rC   FrD   rE   rF   rG   rH   rI   r   r=   z'Optional[Union[Callable[[], int], int]]rW   r   r   Iterator[Limit]c                 c  sr    t | jr
|  n| j}|rt|ng }|D ]}t|| j| j| j| j| j| j	| j
| j| j| jp1d| jV  qd S )Nr   )rS   r_   r   r8   r`   rU   r=   r?   rA   rC   rE   rG   rI   rW   r   )r!   	limit_strlimit_itemsr   r"   r"   r#   __iter__   s,   
zLimitGroup.__iter__)r   ra   )r0   r1   r2   r3   r4   rU   r?   rA   rC   rE   rG   rI   r=   rW   r   rd   r"   r"   r"   r#   r^      s   
 r^   )
__future__r   dataclassesr%   r   r   r   r   r   r   r   flaskr	   flask.wrappersr
   limitsr   r   limits.strategiesr   TYPE_CHECKINGr   r   r   	dataclassr8   r^   r"   r"   r"   r#   <module>   s      9H