o
    j                     @  s:  d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ eddddddddddddZ dIddZ!dJdd Z"dKd$d%Z#dLd,d-Z$dMdNd1d2Z%d3d3d3ej&d3d4d5fdOdBdCZ'	3dPdQdGdHZ(d3S )R    )annotations)Anycast)urlparse)Flaskcurrent_app)RateLimiter)Console)Pretty)Theme)Tree)MethodNotAllowedNotFound)Rule)ExemptionScopeLimiter)RuntimeLimit)get_qualified_namez
bold greenzbold redmagentacyanyellowzbold yellow)successdangererror	blueprintdefaultcallableentityexemptroutehttpoptionfuncr   returnstr | Prettyc                 C  s>   t | r| jdkrd| j dS d| j d| j dS t| S )Nz<lambda>z[callable]<lambda>(z)[/callable]z
[callable].z()[/callable])r   __name__
__module__r
   )r"    r(   G/var/www/ai-app/venv/lib/python3.10/site-packages/flask_limiter/_cli.pyrender_func$   s
   
r*   extr   r   c                 C  s   t | jpd}| jr>|d| jjj d |d| jj d |t| jp(i  | j }|r9|d |S |d |S )NzN/A[entity]	[/entity]z[success]OK[/success]z[error]Error[/error])	r   _storage_uristorageadd	__class__r&   r
   _storage_optionscheck)r+   renderhealthr(   r(   r)   render_storage,   s   


r6   strategyr   strc                 C  s   d| j j dS )Nr,   r-   )r1   r&   )r7   r(   r(   r)   render_strategy:   s   r9   limiterendpointlimitr   keymethodc                 C  s   || ||g}| jr| jr| j sdS | jj|jg|R  }| jj|jg|R  }|s:d|d  d|jj dS d|d  d|jj dS )Nz&: [error]Storage not available[/error]z: [error]Fail[/error] (   z out of z remaining)z: [success]Pass[/success] ()	scope_forr/   r3   r:   testr<   get_window_statsamount)r:   r;   r<   r=   r>   argsrA   statsr(   r(   r)   render_limit_state>   s   rF   Tsimpleboolc                 C  sl   t | j}|r	|S g }| jr|dt| j  | jr'|dt| j  |r4| dd| d}|S )Nzdeduct_when: zexempt_when: z
 [option]{z, z
}[/option])r8   r<   deduct_whenappendr*   exempt_whenjoin)r<   rG   r4   optionsr(   r(   r)   render_limitL   s   
rN   NGET appr   limitstuple[list[RuntimeLimit], ...]
str | Noner   ruleRule | Noneexemption_scoper   rA   labelc
                   s~  d }
|r|r| d| }
|
p|	pd}	t |	 g }|d |d  D ]}|rL| j|d }|r9||j| |v r9dn||j|rCt|ndv rIdnd}nd}|jr|r|jr|jD ])}t	|d}d	| d
| d| d| d
	}|r}|t
||pwd|||7 }|| qYq!t	|d}d	| d
| d| d
}|r|t
||pd|||7 }|| q!|s|r d  S  fdd|D   S )N: rP   r   r?   r   r   r   F[]z [http](z
)[/http][/z[/z[exempt]Exempt[/exempt]c                   s   g | ]}  |qS r(   )r0   ).0entry
renderabler(   r)   
<listcomp>   s    z!render_limits.<locals>.<listcomp>)r   view_functionsgetlimit_managerblueprint_limitsdecorated_limitsr   
per_methodmethodsrN   rF   rJ   r0   )rQ   r:   rR   r;   r   rU   rW   rA   r>   rX   _labelentriesr<   	view_funcsourcerenderedr]   r(   r^   r)   render_limitsZ   sP   



rm   consoler	   pathc           	   
   C  s   |s|sd S |r|t jv r|S |d| d t|rg| jd}t|}z|j|j||jd\}}t	t
|W S  tyK   |d| d Y t tyf   |sUJ |d|  d| d Y tw t)Nz[red]Error: z
 not foundzdev.null)r>   
query_argsz[error]Error: z, could not be matched to an endpoint[/error]rY   )r   ra   printurl_mapbindr   matchro   queryr   r8   r   r   upper
SystemExit)	rQ   rn   r;   ro   r>   adapterparsedfilter_endpoint_r(   r(   r)   get_filtered_endpoint   s0   
r|   )r"   r   r#   r$   )r+   r   r#   r   )r7   r   r#   r8   )r:   r   r;   r8   r<   r   r=   r8   r>   r8   r#   r8   )T)r<   r   rG   rH   r#   r8   )rQ   r   r:   r   rR   rS   r;   rT   r   rT   rU   rV   rW   r   rA   rT   r>   r8   rX   rT   r#   r   )N)rQ   r   rn   r	   r;   rT   ro   rT   r>   rT   r#   rT   ))
__future__r   typingr   r   urllib.parser   flaskr   r   limits.strategiesr   rich.consoler	   rich.prettyr
   
rich.themer   	rich.treer   werkzeug.exceptionsr   r   werkzeug.routingr   flask_limiterr   r   flask_limiter._limitsr   flask_limiter.utilr   limiter_themer*   r6   r9   rF   rN   NONErm   r|   r(   r(   r(   r)   <module>   sV    



>