
    Pqh(                        d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	 d dl
Z
d dlmZ ddlmZ ddlmZ ddlmZmZ  G d	 d
      Zy)    )annotationsN)DictIterableListOptionalTuple)
OrderedSet   )ExemptionScope)get_qualified_name)Limit
LimitGroupc                     e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd       Zedd       ZddZddZ	 d	 	 	 	 	 	 	 ddZ	ddZ
ddZdd	Zdd
ZddZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZddZd dZ	 	 	 	 	 	 d!dZy)"LimitManagerc                    || _         || _        || _        || _        || _        || _        i | _        t        j                  d      | _	        y )Nzflask-limiter)
_application_limits_default_limits_decorated_limits_blueprint_limits_route_exemptions_blueprint_exemptions_endpoint_hintslogging	getLogger_logger)selfapplication_limitsdefault_limitsdecorated_limitsblueprint_limitsroute_exemptionsblueprint_exemptionss          V/srv/www/ollama/chat-ollama/venv/lib/python3.12/site-packages/flask_limiter/manager.py__init__zLimitManager.__init__   sN     $6 -!1!1!1%9";=((9    c                L    t        t        j                  | j                         S N)list	itertoolschainr   r   s    r#   r   zLimitManager.application_limits"   s    IOOT%=%=>??r%   c                L    t        t        j                  | j                         S r'   )r(   r)   r*   r   r+   s    r#   r   zLimitManager.default_limits&   s    IOOT%9%9:;;r%   c                    || _         y r'   )r   r   limitss     r#   set_application_limitsz#LimitManager.set_application_limits*   s
    #) r%   c                    || _         y r'   )r   r.   s     r#   set_default_limitszLimitManager.set_default_limits-   s
    %r%   c                    |rP|s4| j                   j                  |t                     j                  |       y t        |g      | j                   |<   y y r'   )r   
setdefaultr	   add)r   routelimitoverrides       r#   add_decorated_limitz LimitManager.add_decorated_limit0   sI     &&11%FJJ5Q0:E70C&&u-	 r%   c                p    |r4| j                   j                  |t                     j                  |       y y r'   )r   r4   r	   r5   )r   	blueprintr7   s      r#   add_blueprint_limitz LimitManager.add_blueprint_limit9   s-    ""--iFJJ5Q r%   c                "    || j                   |<   y r'   )r   )r   r6   scopes      r#   add_route_exemptionz LimitManager.add_route_exemption=   s    (-u%r%   c                "    || j                   |<   y r'   )r   )r   r;   r>   s      r#   add_blueprint_exemptionz$LimitManager.add_blueprint_exemption@   s    05""9-r%   c                j    | j                   j                  |t                     j                  |       y r'   )r   r4   r	   r5   )r   endpointcallables      r#   add_endpoint_hintzLimitManager.add_endpoint_hintC   s%    ''*,?CCHMr%   c                J    t        | j                  j                  |            S r'   )boolr   get)r   rC   s     r#   	has_hintszLimitManager.has_hintsF   s    D((,,X677r%   Nc                   |xr |}g }g }	|r|sP|s,|j                   j                  |d       }
|
rt        |
      nd}n|}|j                  | j	                  |             | j
                  j                  |t                     D ]"  }|	j                  | j	                  |             $ |r7|s5|rt        d |D              r!|j                  | j                  ||             | j                  |||      }|r|t        j                  z  s| j                  ng }t        d |D              }t        d |D              }|	rt        d |	D              nd}|s|r|s|t        j                  z  r|r|| j                  z  }||fS )N c              3  6   K   | ]  }|j                      y wr'   override_defaults.0r7   s     r#   	<genexpr>z.LimitManager.resolve_limits.<locals>.<genexpr>d   s     Qu5222Q   c              3  4   K   | ]  }|j                     y wr'   )method_exemptrO   s     r#   rQ   z.LimitManager.resolve_limits.<locals>.<genexpr>o   s     $WUU%8%8$W   c              3  6   K   | ]  }|j                      y wr'   rM   rO   s     r#   rQ   z.LimitManager.resolve_limits.<locals>.<genexpr>t   s       
,1''' 
rR   c              3  6   K   | ]  }|j                      y wr'   rM   rO   s     r#   rQ   z.LimitManager.resolve_limits.<locals>.<genexpr>|   s     GE+++GrR   F)view_functionsrH   r   extendr   r   r	   allr    exemption_scoper   APPLICATIONr   DEFAULTr   )r   apprC   r;   callable_namein_middlewaremarked_for_limitingbefore_request_contextr   hinted_limits	view_funcnamehintr[   
all_limitsexplicit_limits_exemptcombined_defaultshinted_limits_request_defaultss                     r#   resolve_limitszLimitManager.resolve_limitsI   s    "/!F3F $ # 2 2 6 6x FI<E-i82D(D ''(=(=d(CD,,00:<H B$$T%:%:4%@AB )$Q@PQQ ''(=(=c9(MN..sHiH o8R8R&R ## 	 "%$WFV$W!W
    
5E 
 
  GGG 	' $'8+AWAW/W+$---J+++r%   c                   |j                   j                  |xs dd       }|rt        |      nd}| j                  |   }|r|j                  j                  |      nd }|s|S |sJ | j                  ||      \  }}	|t        j                  t        j                  z   z  s|	r|	j                         D ]  }
||
z  }	 ||z  S )NrK   )
rX   rH   r   r   
blueprints_blueprint_exemption_scoper   r]   r\   values)r   r^   rC   r;   rd   re   route_exemption_scopeblueprint_instanceblueprint_exemption_scopeancestor_exemption_scopes	exemptions              r#   r[   zLimitManager.exemption_scope   s     &&**8>r4@	09!),r $ 6 6t <>GS^^//	:T!((9 //Y?)) *"**^-G-GGHI,!:!A!A!C ;I-:-;(+DDDr%   c                   g }| j                   |   s;|| j                  v r-| j                  |   D ]  }	 |D ]  }|j                  |         |S # t        $ r+}| j                  j                  d| d|        Y d }~Od }~ww xY w)Nz&failed to load ratelimit for function : )r   r   append
ValueErrorr   error)r   r_   r/   groupr7   es         r#   r   zLimitManager.decorated_limits   s    %%m4 6 66!33MB E%* 1E"MM%01 	 & **D]OSUVWUXY s   A	B!A>>Bc                6    g }|r|j                   j                  |      nd }|r|j                  }t        |r|j	                  d      ng       } j                  ||      \  }}|t        j                  t        j                  z   z  sR j                  j                  |t                     }	|	rt        d |	D              sc j                  |   t        j                  z  sCt        j                   fd|j!                   j                        j#                  |      D         n|	}
|
r|
D ]  }	 |j%                  |D cg c]  }t'        |j(                  |j*                  |j,                  |j.                  |j0                  |j2                  |j4                  |j6                  |j8                  |j:                  |j<                  |j>                         c}        |S c c}w # t@        $ r+} jB                  jE                  d| d|        Y d }~d }~ww xY w)N.c              3  4   K   | ]  }|j                     y wr'   rM   rO   s     r#   rQ   z0LimitManager.blueprint_limits.<locals>.<genexpr>   s       8=E33 rU   c              3  V   K   | ]   }j                   j                  |g        " y wr'   )r   rH   )rP   memberr   s     r#   rQ   z0LimitManager.blueprint_limits.<locals>.<genexpr>   s,       & !2266vrBs   &)z'failed to load ratelimit for blueprint rv   )#rm   rH   re   setsplitrn   r   r]   r\   r   r	   rZ   r   	ANCESTORSr)   r*   intersection
differencerY   r   r7   key_funcr>   
per_methodmethodserror_messageexempt_whenrN   deduct_when	on_breachcostsharedrx   r   ry   )r   r^   r;   r/   rq   blueprint_nameblueprint_ancestoryself_exemptionancestor_exemptionsblueprint_self_limitsr    limit_groupr7   r{   s   `             r#   r    zLimitManager.blueprint_limits   s    >GS^^//	:T/44N"%iiooc&:R"P262Q2QY3/N/
 >#9#9N<V<V#V!WW(,(>(>(B(B"JL)% .  AV   !66~F$../ OO*=*J*J $ 6 6+(j)<=	  /# !& $'7 "MM  2=!" ). %*(-(-(-(-(8(8(-(-(;(;(-(9(9(-(?(?(-(9(9(-(-

(-%&!"2 -!"$  *  LL.."I.IYY[\][^ _ s+   0G$?BG
G$G$$	H-!HHc                   |j                   |   j                  }| j                  |   t        j                   z  }t        |j                  d            }| j                  j                         D ch c]  \  }}|t        j                  z  r| c}}j                  |      }||D ci c]  }|| j                  |    c}fS c c}}w c c}w )Nr}   )
rm   re   r   r   r   r   r   itemsDESCENDENTSr   )	r   r^   r   re   rt   	ancestorykfancestor_exemptions	            r#   rn   z'LimitManager._blueprint_exemption_scope   s     ~~n-22..t49Q9Q7RR	,,S12	 2288:
1>--- 
 ,y
!	 	 EWX1d88;;XXX
 Ys   2C)C
)r   List[LimitGroup]r   r   r   !Dict[str, OrderedSet[LimitGroup]]r    r   r!   Dict[str, ExemptionScope]r"   r   returnNone)r   List[Limit])r/   r   r   r   )F)r6   strr7   Optional[LimitGroup]r8   rG   r   r   )r;   r   r7   r   r   r   )r6   r   r>   r   r   r   )r;   r   r>   r   r   r   )rC   r   rD   r   r   r   )rC   r   r   rG   )NNNFF)r^   flask.FlaskrC   Optional[str]r;   r   r_   r   r`   rG   ra   rG   r   zTuple[List[Limit], ...])r^   r   rC   r   r;   r   r   r   )r_   r   r   r   )r^   r   r;   r   r   r   )r^   r   r   r   r   z0Tuple[ExemptionScope, Dict[str, ExemptionScope]])__name__
__module____qualname__r$   propertyr   r   r0   r2   r9   r<   r?   rA   rE   rI   rk   r[   r   r    rn    r%   r#   r   r      s|   :,: ): <	:
 <: 4: 8: 
:$ @ @ < <*& INDD!5DAED	DR.6N8 #'#''+#$)>,>,  >, !	>,
 %>, >, ">, 
!>,@EE*7EDQE	E2?BYY03Y	9Yr%   r   )
__future__r   r)   r   typingr   r   r   r   r   flaskordered_setr	   	constantsr   utilr   wrappersr   r   r   r   r%   r#   <module>r      s1    "   8 8  " % $ 'oY oYr%   