
    Pqh\                        d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZ d dlmZ d dlZd dl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 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( d dl)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7  e$dddddddddddd      Z8dedee9ef   fdZ:d e/de&fd!Z;d"ede9fd#Z<d$e/d%e9d&e7d'e9d(e9de9fd)Z=dXd&e7d+e>de9fd,Z?ddde2j                  dd-d.fd/ed$e/d0ee	e7   d1f   d%e
e9   d2e
e9   d3e
e-   d4e2d5e
e9   d(e9d6e
e9   de&fd7ZA	 dYd/ed8ed%e
e9   d9e
e9   d(e
e9   de
e9   fd:ZB ej4                  d;<      dZd=       ZCeCj                  d><      edZd?              ZEeCj                  d@<       ej                  dAddBC       ej                  dDddEC       ej                  dFddGC       ej                  dHddIC       ej                  dJdKdLC      e	 	 	 	 	 d[d%e
e9   d9e
e9   d(e9d'e
e9   dMe>ddfdN                                                 ZGeCj                  dO<       ej                  dAddBC       ej                  dDddEC       ej                  dFddGC       ej                  dHdd*dPQ       ej                  dRd*dST      e	 	 	 	 d\d'e9d%e
e9   d9e
e9   d(e9dUe>ddfdV                                                 ZHeIdWk(  r eC        yy)]    N)partial)	AnyCallableDict	GeneratorListOptionalSetTupleUnion)urlparse)Flaskcurrent_app)with_appcontext)RateLimiter)Consolegroup)Live)Pretty)Confirm)Table)Theme)Tree)	TypedDict)MethodNotAllowedNotFound)Rule)Limiter)
ConfigVarsExemptionScopeHeaderNames)get_qualified_name)Limitz
bold greenbold redmagentacyanyellowzbold yellow)successdangererror	blueprintdefaultcallableentityexemptroutehttpoptionfuncreturnc                     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   )r3   s    W/srv/www/ollama/chat-ollama/venv/lib/python3.12/site-packages/flask_limiter/commands.pyrender_funcr:   ,   sQ    ~==J&((9FFDOO,Admm_MJJ$<    extc                    t        | j                  xs d      }| j                  r|j                  d| j                  j                  j
                   d       |j                  d| j                  j                   d       |j                  t        | j                  xs i              | j                  j                         }|r|j                  d       |S |j                  d       |S )NzN/A[entity]	[/entity]z[success]OK[/success]z[error]Error[/error])	r   _storage_uristorageadd	__class__r7   r   _storage_optionscheck)r<   renderhealths      r9   render_storagerH   4   s    #""+e,F
{{

Xckk33<<=YGH

Xckk112)<=

6#..4"56""$JJ./ M JJ-.Mr;   strategyc                 6    d| j                   j                   dS )Nr>   r?   )rC   r7   )rI   s    r9   render_strategyrK   B   s    h((112)<<r;   limiterendpointlimitkeymethodc                    ||j                  ||      g}| j                  r&| j                  r| j                  j                         sy | j                  j                  |j
                  g| } | j                  j                  |j
                  g| }|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_forrA   rE   rL   testrN   get_window_statsamount)rL   rM   rN   rO   rP   argsrT   statss           r9   render_limit_staterY   F   s     623D??ww7L7L7N77??3d3D,GOO,,U[[@4@E%eAhZx8J8J7K;W	
 -U1XJhu{{?Q?Q>RR]^^r;   Tsimplec                 :   t        | j                        }|r|S g }| j                  r'|j                  dt	        | j                                | j
                  r'|j                  dt	        | j
                                |r| ddj                  |       d}|S )Nzdeduct_when: zexempt_when: z
 [option]{z, z
}[/option])strrN   deduct_whenappendr:   exempt_whenjoin)rN   rZ   rF   optionss       r9   render_limitrb   V   s    FG{53D3D'E&FGH{53D3D'E&FGH8;tyy'9&:+FMr;   GET applimits.r+   ruleexemption_scoperT   labelc
                 ,   d }
|r	|r| d| }
|
xs |	xs d}	t        |	      }g }|d   |d   z   D ]%  }|rm| j                  j                  |d       }|r ||j                  j	                  | |      v rdn-||j                  j                  |rt        |      nd      v rdnd}nd}|j                  rd|rb|j                  rV|j                  D ]F  }t        |d      }d	| d
| d| d| d
	}|r|t        ||xs d|||      z  }|j                  |       H t        |d      }d	| d
| d| d
}|r|t        ||xs d|||      z  }|j                  |       ( |s|r|j                  d       |S |D cg c]  }|j                  |       c} |S c c}w )N: rd   r   rR   r+   r0   r,   F[]z [http](z
)[/http][/z[/z[exempt]Exempt[/exempt])r   view_functionsgetlimit_managerblueprint_limitsdecorated_limitsr"   
per_methodmethodsrb   rY   r^   rB   )re   rL   rf   rM   r+   rg   rh   rT   rP   ri   _label
renderableentriesrN   	view_funcsourcerenderedentrys                     r9   render_limitsr|   d   s    F:Rv&!e!rEeJGVAY&  "**..x>I W22CCCSS  ((995>&y1B 
   F,, &'u5F81XJhvhjPQR/Rf E u%& $E51Hxq
"VHA6E+X^UD&  NN5!A "B 01  -445	4 	5s   4Fconsolepathc                    |s|sy |r/|t         j                  v r|S |j                  d| d       t        |rT| j                  j	                  d      }t        |      }	 |j                  |j                  ||j                        \  }}|S t        # t        $ r |j                  d| d       Y t        t        $ r2 |sJ |j                  d|j                          d| d       Y t        w xY w)Nz[red]Error: z
 not foundzdev.null)rP   
query_argsz[error]Error: z, could not be matched to an endpoint[/error]rk   )r   rn   printurl_mapbindr   matchr~   queryr   r   upper
SystemExit)	re   r}   rM   r~   rP   adapterparsedfilter_endpoint_s	            r9   get_filtered_endpointr      s    {111OMML
*=>& % 
++"":.$	!(Fv|| "/ "OQ #"   	MM &RS    	M6MM  04&>? 	s    ,B C282C21C2z-Flask-Limiter maintenance & utility commmands)helpc                       y N r   r;   r9   clir      s    r;   z View the extension configurationc                     t        j                         5  t        t              } t	        t         j
                  j                  dt                           }|xr t	        |      d   }|r t        d      }|j                  d       |j                  d       |j                  d       |j                  d	t        j                  t        |j                               |j                  d
t        j                  t!        |j"                               |j                  dt        j$                  t        |j&                               t)        t        j*                        }t)        t-        |j.                              }|j1                  t        j2                        }|j1                  d       |j1                  d       |j1                  t        j4                         |j1                  d       |j1                  t7        |             |j                  d||       |j8                  j:                  r&|j                  dt        j<                  t        |j8                  j:                  D cg c]  }t?        |       c}             |j                  d t        j@                  t        |jB                               |j                  d t        jD                  t!        |jF                               |j                  d t        jH                  t!        |jJ                               |j                  d t        jL                  t        |jN                               n*|j                  dt        j<                  t        g              |j8                  jP                  r&|j                  dt        jR                  t        |j8                  jP                  D cg c]  }t?        |       c}             |j                  d t        jT                  t        |jV                               |j                  d t        jX                  t!        |jZ                               |j                  d t        j\                  t!        |j^                               |j                  d t        j`                  t!        |jb                               n*|j                  dt        jR                  t        g              |jd                  r[|j                  dt        jf                  t        ti        jj                  |jd                   D cg c]  }t?        |       c}             |jl                  rt)        t        jn                        }|j1                  t        jp                         |j1                  t        jr                         |j1                  t        jt                         |j1                  t        jv                         t)        t        |jl                              }	|	j1                  t        |jx                  tz        j|                                  |	j1                  t        |jx                  tz        j~                                  |	j1                  t        |jx                  tz        j                                  |	j1                  t        |j                               |j                  d||	       n*|j                  dt        jn                  t        d             |j                  dt        j                  t        |j                               |j                  dt        j                  t!        |j                               | j                  |       n| j                  dt          d       d d d        y c c}w c c}w c c}w # 1 sw Y   y xY w)NthemerL   r   zFlask-Limiter Config)titleNotesConfigurationValueEnabledzKey Functionz
Key PrefixInstanceBackendStatuszRate Limiting ConfigApplication LimitszApplicationLimits LimitszDefault LimitszMeta LimitszHeader configurationFzFail on first breachzOn breach callback(No Flask-Limiter extension installed on r$   style)Gr   test_request_contextr   limiter_themelist
extensionsro   setr   
add_columnadd_rowr   ENABLEDr   enabledKEY_FUNCr:   	_key_func
KEY_PREFIX_key_prefixr   STRATEGYrK   rL   rB   STORAGE_URISTORAGE_OPTIONSrH   rp   application_limitsAPPLICATION_LIMITSrb   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_breachr   )
r}   limitersrL   extension_detailslimiter_configlimiter_config_valuesnoderN   header_configsheader_valuess
             r9   configr      s8    
	)	)	+ [...229ceDE0tH~a0 %,B C((1((9((1%%:--vgoo/F %%
 3 3[ARAR5S %%j33VG<O<O5P "*"5"56N$()I$J!!%%j&<&<=DHHZ HHYz99:x(!%%nW&=>%%&8M $$77!))(11 *1)>)>)Q)Q % )/	 "))<<7AAB
 "))== G GH
 "))== G GH
 "))667;;< ")).112J
 $$33!))$-- *1)>)>)M)M % )/	 "))887==>
 "))99 C CD
 "))99 C CD
 "))22 < <= "))$j&?&? ##!))!** *3':N:N)O % )/	 ''!%j&@&@!A"":#:#:;"":#>#>?"":#@#@A"":#F#FG $VG,D,D%E F!!&)@)@ARAR)S"TU!!722;3H3HIJ !!722;3J3JKL !!&)=)=">?!))*"! "))*J,F,Fu %%&//w445
 %%$$$G../ MM+,MM:;-H   q[ [DJHW[ [s9   I^>+^/=E^>^4$E^>4^9I ^>/^>>_z3Enumerate details about all routes with rate limitsz
--endpointzEndpoint to filter by)r,   r   z--pathzPath to filter byz--methodzHTTP Method to filter byz--keyzTest the limitz--watch/--no-watchFzCreate a live dashboardwatchc                 R    t        j                         5  t         j                  j                  dt	                     }|rt        |      d   nd t        t              }rj                  }i t        t         |       }t        t         j                  j                  |      d       D ]"  }	|	j                  }
|
dk(  rt        |
j                  d            dkD  rdj!                  |
j                  d      d d	       }j#                  |g       j%                  t'        t(        t         |j+                  t         |
|      |
||	|j-                  t         |
|      

             j#                  dg       j%                  t'        t(        t         |j+                  t         |
d      |
d |	|j-                  t         |
d       

             % t/               dt0        f fd       }|s|j3                   |              n]t5         |       |dd      5 }	 	 |j7                   |              t9        j:                  d       -|j3                  dt          d       d d d        y # t<        $ r Y nw xY w	 d d d        "# 1 sw Y   +xY w# 1 sw Y   y xY w)NrL   r   r   c                     t        |       S r   r\   rs    r9   <lambda>zlimits.<locals>.<lambda>      sSTv r;   rO   staticr6   rR   )rh   rP   rT   rootrd   r4   c            	   3     K   rj                   j                  rmsksit        t        t	        t        j                  j                         g fd       t        t        j                   j                  g fd       D ]_  } | dk(  rt        dt        j                   d      }nt        d|  d      }|    D cg c]  }|j                   |              c} | a y c c}w w)	Nz[gold3]Meta Limits[/gold3])rT   rP   ri   z![gold3]Application Limits[/gold3]r   z[gold3]z[/gold3]z[blue]z[/blue])rp   r   r|   r   r   r   r   r   r   namerB   )	r   
group_treerv   rM   groupsrO   rL   rP   r~   s	      r9   console_renderablez"limits.<locals>.console_renderable  s      --@@%'#ioow/C/CDErJ %:  (# ..AA2F %A  # %Dv~%)GK4D4D3EX*N%O
%)F4&*@%A
DJ4LQjZ^^JL1Q$$%
 Rs   CC3C.$C3g?T)r}   refresh_per_secondscreenr   r$   r   )r   r   r   ro   r   r   r   r   rp   r   sortedr   
iter_rulesrM   lensplitr`   
setdefaultr^   r   r|   resolve_limitsrh   r   r   r   r   updatetimesleepKeyboardInterrupt)rM   r~   rP   rO   r   r   r}   managerr   rg   rule_endpointbp_fullnamer   liver   rL   s   ````          @@r9   rf   rf   i  s    
	)	)	+ i!,!7!7!;!;Isu!M:BT(^A%6.++G;=F3WhfO ##..?EU * !% H,}**3/014"%((=+>+>s+CCR+H"IK%%k26==)'##22 +]K *' ,3,C,C +]K- $*!$& %%fb188)'##22;rR)  ,3,C,C +]D- $*!$7*X W%	 % % %< 023&(#'*	 "
 " KK(:(<= JJsO  MM:;-H   Mi iF  1 "!"!" " "si isN   HJ&J)+I8JJ8	JJJJ	JJ	JJ&zClear limits for a specific keyzKey to reset the limits for)r,   requiredr   z-yzSkip prompt for confirmation)is_flagr   yc                    t        j                         5  t        t         j                  j	                  dt                           }|r|d   nd }t        t              }|r>|j                  }t        t         ||||      }	t        dt        t        t        t           df   d      }
i }t        t         j                   j#                  |	      d       D ]  }|j$                  }|d	k(  rt'        |j)                  d
            dkD  rFd
j+                  |j)                  d
      d d       } |
||j-                  t         ||            ||<   x |
||j-                  t         |d            ||<    d }|	s|j                  j.                  }|so|r%|j1                  t3        t         ||g fd|              |j5                         D ]5  \  }}|d   s|j1                  t3        t         ||d   ||d   |              7 |st7        j8                  d|  d      r|rwt;        d      }|D ]V  }|j<                  j?                  |j@                  | |jC                  d|             |jE                  tG        |       d       X |j1                  |       |j5                         D ]  \  }}|d   st;        |      }|d   \  }}||z   D ]  }|jH                  rb|d   r]|d   jJ                  rN|sL|d   jJ                  D ]9  }|j<                  j?                  |j@                  | |jC                  ||             ; n7|j<                  j?                  |j@                  | |jC                  ||             |jE                  tG        |       d        |j1                  |        n|j1                  dt          d       d d d        y # 1 sw Y   y xY w)NrL   r   r   Details.)rg   rf   c                     t        |       S r   r   r   s    r9   r   zclear.<locals>.<lambda>  r   r;   r   r   r6   rR   r   rd   r   )ri   rT   rf   rg   )rg   rT   z/Proceed with resetting limits for key: [danger]z
[/danger]?z: [success]Cleared[/success]r   r$   r   )&r   r   r   r   ro   r   r   r   rp   r   r   r   r   r   r#   r   r   r   rM   r   r   r`   r   r   r   r|   itemsr   askr   rL   clearrN   rS   rB   rb   rs   rt   )rO   rM   r~   rP   r  r   rL   r}   r   r   r  rule_limitsrg   r   r   r   detailsr   rN   r,   	decoratedrule_methods                         r9   r	  r	    s    
	)	)	+ k..229ceDE4<Xa[$.++G3WhfO   #DK$45G /1K##..?EU  !% H,}**3/014"%((=+>+>s+CCR+H"IK18!&55' 2K. 29!&55k=RTU2K.& "&"%,%:%:%M%M"%MM%'#/4"6!$ *5):):)< %Hgx() + ' ' 1 (%,V_%(	 GKKA#jQ & 45D!3 W--!KK!OOB7
 L$7#88T!UVW MM$')4):):)< ,%Hgx(#H~-4X->*%,y%8 E % 0 0$+FO$+FO$;$;(.3:6?3J3J !&K$+OO$9$9(-(+(-+(N%&!& !( 5 5$)KK$'$)OOHf$E!"
 !HH#/#6"77S T',  d+5,8 MM:;-H   Qk k ks   F;OCO.DOO__main__)Tr   )r4   N)NNrc   NF)NNrc   F)Jr   r   	functoolsr   typingr   r   r   r   r   r	   r
   r   r   urllib.parser   clickflaskr   r   	flask.clir   limits.strategiesr   rich.consoler   r   	rich.liver   rich.prettyr   rich.promptr   
rich.tabler   
rich.themer   	rich.treer   typing_extensionsr   werkzeug.exceptionsr   r   werkzeug.routingr   flask_limiterr   flask_limiter.constantsr   r    r!   flask_limiter.utilr"   flask_limiter.wrappersr#   r   r\   r:   rH   rK   rY   boolrb   NONEr|   r   r   commandr   r2   rf   r	  r7   r   r;   r9   <module>r'     s}      T T T !  $ % ) '       ' : ! ! K K 1 ("c eCK0  D =k =c =__ #_,1_8;_EH__  t s $ ##&4&9&99	99 $u+s"#9 sm	9
 }9 4.9 $9 3-9 9 C=9 
9B ! 	   sm  3-	 
 SM  c] F AB	 C	 45\  6\~ GHlD/FGh+>?j$-GHgt*:;"E8QR"psmp
3-p p 
#	p
 p 
p  S < I @ H Ipf 34lD/FGh+>?j$-GHgtd9VWdD'EF #r	rsmr 3-r 	r
 r 
r  G X I @ H 5rj zE r;   