o
    jD                     @  sh  d dl mZ d dlZd dlZd dlmZ d dlZd dlmZ d dlm	Z	 d dl
mZ 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mZmZmZmZm Z  dZ!W n e"yq   dZ!Y nw 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/m0Z0 ejdddAddZ1e1j2ddedAddZ3e1j2d dej4d!dd"d#ej4d$dd%d#ej4d&dd'd#ej4d(dd)d#ej4d*dd+d#e			,		dBdCd5d6Z5e1j2d7dej4d!dd"d#ej4d$dd%d#ej4d&dd'd#ej4d(ddd8d9ej4d:dd;d<e			,	dDdEd>d?Z6e7d@kr2e1  dS dS )F    )annotationsN)partial)ClickException)current_app)with_appcontext)Consolegroup)Live)Pretty)Confirm)Table)Tree   )get_filtered_endpointlimiter_themerender_funcrender_limitrender_limitsrender_storagerender_strategyTF)	TypedDict)Rule)Limiter)RuntimeLimit)Callable	Generator)
ConfigVarsHeaderNamesz,Flask-Limiter maintenance & utility commands)helpreturnNonec                   C  s   t stdd S )NziMissing dependencies for flask-limiter cli. Please install the cli extra (pip install flask-limiter[cli]))CLI_DEPS_AVAILABLEr    r"   r"   K/var/www/ai-app/venv/lib/python3.10/site-packages/flask_limiter/commands.pycli*   s
   r$   z View the extension configurationc            	   	   C  s  t   ttd} tt jdt }|ot|d }|rtdd}|	d |	d |	d |
d	tjt|j |
d
tjt|j |
dtjt|j ttj}tt|j}|tj}|d |d |tj |d |t| |
d|| |jjr|
dtjtdd |jjD  |
d tjt|j  |
d tj!t|j" |
d tj#t|j$ |
d tj%t|j& n
|
dtjtg  |jj'r|
dtj(tdd |jj'D  |
d tj)t|j* |
d tj+t|j, |
d tj-t|j. |
d tj/t|j0 n
|
dtj(tg  |j1r:|
dtj2tdd t3j4|j1 D  |j5rttj6}|tj7 |tj8 |tj9 |tj: tt|j5}|t|j;t<j=  |t|j;t<j>  |t|j;t<j?  |t|j@ |
d|| n
|
dtj6td |
dtjAt|jB |
dtjCt|jD | E| n| jEdt  dd W d    d S W d    d S 1 sw   Y  d S )Nthemelimiterr   zFlask-Limiter Config)titleNotesConfigurationValueEnabledzKey Functionz
Key PrefixInstanceBackendStatuszRate Limiting ConfigApplication Limitsc                 S     g | ]}t |qS r"   r   .0limitr"   r"   r#   
<listcomp>S       zconfig.<locals>.<listcomp>zApplicationLimits LimitszDefault Limitsc                 S  r1   r"   r2   r3   r"   r"   r#   r6   t   r7   zMeta Limitsc                 S  r1   r"   r2   r3   r"   r"   r#   r6      r7   zHeader configurationFzFail on first breachzOn breach callback(No Flask-Limiter extension installed on bold redstyle)Fr   test_request_contextr   r   list
extensionsgetsetr   
add_columnadd_rowr   ENABLEDr
   enabledKEY_FUNCr   	_key_func
KEY_PREFIX_key_prefixr   STRATEGYr   r'   addSTORAGE_URISTORAGE_OPTIONSr   limit_managerapplication_limitsAPPLICATION_LIMITSAPPLICATION_LIMITS_PER_METHOD_application_limits_per_methodAPPLICATION_LIMITS_EXEMPT_WHEN_application_limits_exempt_whenAPPLICATION_LIMITS_DEDUCT_WHEN_application_limits_deduct_whenAPPLICATION_LIMITS_COST_application_limits_costdefault_limitsDEFAULT_LIMITSDEFAULT_LIMITS_PER_METHOD_default_limits_per_methodDEFAULT_LIMITS_EXEMPT_WHEN_default_limits_exempt_whenDEFAULT_LIMITS_DEDUCT_WHEN_default_limits_deduct_whenDEFAULT_LIMITS_COST_default_limits_cost_meta_limitsMETA_LIMITS	itertoolschain_headers_enabledHEADERS_ENABLEDHEADER_RESETHEADER_REMAININGHEADER_RETRY_AFTERHEADER_RETRY_AFTER_VALUE_header_mappingr   RESET	REMAININGRETRY_AFTER_retry_afterFAIL_ON_FIRST_BREACH_fail_on_first_breach	ON_BREACH
_on_breachprint)	consolelimitersr'   extension_detailslimiter_configlimiter_config_valuesnodeheader_configsheader_valuesr"   r"   r#   config2   s
  










   $r~   z3Enumerate details about all routes with rate limitsz
--endpointzEndpoint to filter by)defaultr   z--pathzPath to filter byz--methodzHTTP Method to filter byz--keyzTest the limitz--watch/--no-watchzCreate a live dashboardGETendpoint
str | Nonepathmethodstrkeywatchboolc                   s  t   t jdt }|rt|d nd ttd}rj}i t	t | }t
t j|dd dD ]^}	|	j}
|
dkrAq7t|
dd	krvd|
dd d
 }|g ttt |t |
||
||	|t |
|d
 q7dg ttt |t |
d|
d |	|t |
d d
 q7t d fdd}|s||  nMt| |ddd!}	 z||  td W n	 ty   Y nw qW d    n1 sw   Y  n|jdt  dd W d    d S W d    d S W d    d S 1 sw   Y  d S )Nr'   r   r%   c                 S     t | S Nr   rr"   r"   r#   <lambda>       zlimits.<locals>.<lambda>r   static.r   )exemption_scoper   testroot r   r   c                  3  s    r-j jr-s-s-ttttjj g fddV  ttj jg fddV  D ]&} | dkr?tdtj	 d ntd|  d  fd	d
|  D   V  q/d S )Nz[gold3]Meta Limits[/gold3])r   r   labelz![gold3]Application Limits[/gold3]r   z[gold3]z[/gold3]z[blue]z[/blue]c                   s   g | ]}  | qS r"   )rJ   )r4   
renderable
group_treer"   r#   r6     s    z6limits.<locals>.console_renderable.<locals>.<listcomp>)
rM   rN   r   r   r=   rd   re   rb   r   name)r   r   groupsr   r'   r   r   r   r#   console_renderable   s2   
z"limits.<locals>.console_renderableg?T)rv   refresh_per_secondscreenr8   r9   r:   )r   r   )r   r<   r>   r?   r@   r=   r   r   rM   r   sortedurl_map
iter_rulesr   lensplitjoin
setdefaultappendr   r   resolve_limitsr   r   ru   r	   updatetimesleepKeyboardInterrupt)r   r   r   r   r   rw   rv   managerfilter_endpointrulerule_endpointbp_fullnamer   liver"   r   r#   limits   s   


 O$r   zClear limits for a specific keyzKey to reset the limits for)r   requiredr   z-yzSkip prompt for confirmation)is_flagr   yc                 C  s  t  b tt jdt }|r|d nd }ttd}|rM|j}t	t ||||}	G dd dt
}
i }tt j|	dd dD ]:}|j}|d	krKqAt|d
dkrnd
|d
d d }|
||t ||d||< qA|
||t |dd||< qAd }|	s|jj}|s|r|tt ||g fd| d | D ]\}}|d r|tt ||d ||d | d q|std|  drL|rtd}|D ]}|j|j| |d| |t| d q|| | D ]`\}}|d rKt|}|d \}}|| D ]C}|j r-|d r-|d j!r-|s-|d j!D ]}|j|j| ||| qn|j|j| ||| |t| d q|| qn|jdt  dd W d    d S W d    d S 1 skw   Y  d S )Nr'   r   r%   c                   @  s   e Zd ZU ded< ded< dS )zclear.<locals>.Detailsr   r   ztuple[list[RuntimeLimit], ...]r   N)__name__
__module____qualname____annotations__r"   r"   r"   r#   DetailsF  s   
 r   c                 S  r   r   r   r   r"   r"   r#   r   L  r   zclear.<locals>.<lambda>r   r   r   r   r   )r   r   r   r0   )r   r   r   r   )r   r   z/Proceed with resetting limits for key: [danger]z
[/danger]?z: [success]Cleared[/success]r8   r9   r:   )"r   r<   r=   r>   r?   r@   r   r   rM   r   r   r   r   r   r   r   r   r   r   rN   ru   r   itemsr   askr   r'   clearr5   	scope_forrJ   r   
per_methodmethods)r   r   r   r   r   rw   r'   rv   r   r   r   rule_limitsr   r   r   rN   detailsr{   r5   r   	decoratedrule_methodr"   r"   r#   r   0  s   

	






$ r   __main__)r   r    )NNr   NF)r   r   r   r   r   r   r   r   r   r   r   r    )NNr   F)r   r   r   r   r   r   r   r   r   r   r   r    )8
__future__r   rd   r   	functoolsr   clickr   flaskr   	flask.clir   rich.consoler   r   	rich.liver	   rich.prettyr
   rich.promptr   
rich.tabler   	rich.treer   _clir   r   r   r   r   r   r   r!   ImportErrortyping_extensionsr   werkzeug.routingr   
_extensionr   _limitsr   _typingr   r   	constantsr   r   r$   commandr~   optionr   r   r   r"   r"   r"   r#   <module>   sx    $


 

k
k
