
    9i(                        d dl mZ d dlZd dlZd dlmZ d dlmZ d dlZd dl	m
Z
 ddlmZmZ ddlmZ dd	lmZ erdd
lmZ  G d d      Zy)    )annotationsN)Iterable)TYPE_CHECKING)
OrderedSet   )ApplicationLimitRuntimeLimit)ExemptionScope)get_qualified_name)Limitc                      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          I/var/www/html/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_limits1   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_limit4   sG    &&11%FJJ5Q0:E70C&&u-	 r#   c                p    |r4| j                   j                  |t                     j                  |       y y r%   )r   r2   r   r3   )r   	blueprintr5   s      r!   add_blueprint_limitz LimitManager.add_blueprint_limit;   s-    ""--iFJJ5Q r#   c                "    || j                   |<   y r%   )r   )r   r4   scopes      r!   add_route_exemptionz LimitManager.add_route_exemption?   s    (-u%r#   c                "    || j                   |<   y r%   )r   )r   r9   r<   s      r!   add_blueprint_exemptionz$LimitManager.add_blueprint_exemptionB   s    05""9-r#   c                j    | j                   j                  |t                     j                  |       y r%   )r   r2   r   r3   )r   endpointcallables      r!   add_endpoint_hintzLimitManager.add_endpoint_hintE   s%    ''*,?CCHMr#   c                J    t        | j                  j                  |            S r%   )boolr   get)r   rA   s     r!   	has_hintszLimitManager.has_hintsH   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.0r5   s     r!   	<genexpr>z.LimitManager.resolve_limits.<locals>.<genexpr>f   s     Qu5222Q   c              3  4   K   | ]  }|j                     y wr%   )method_exemptrM   s     r!   rO   z.LimitManager.resolve_limits.<locals>.<genexpr>q   s     $WUU%8%8$W   c              3  6   K   | ]  }|j                      y wr%   rK   rM   s     r!   rO   z.LimitManager.resolve_limits.<locals>.<genexpr>v   s     ZE$;$; ;ZrP   c              3  6   K   | ]  }|j                      y wr%   rK   rM   s     r!   rO   z.LimitManager.resolve_limits.<locals>.<genexpr>|   s     GE+++GrP   F)view_functionsrF   r   extendr   r   r   allr   exemption_scoper
   APPLICATIONr   DEFAULTr   )r   apprA   r9   callable_namein_middlewaremarked_for_limitingbefore_request_contextr   hinted_limits	view_funcnamehintrY   
all_limitsexplicit_limits_exemptcombined_defaultshinted_limits_request_defaultss                     r!   resolve_limitszLimitManager.resolve_limitsK   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
  ZIYZZ LYCGGG^c 	' $'8,.BXBX0X+$---J+++r#   c                   |j                   j                  |xs dd       }|rt        |      nd}| j                  j                  |t        j
                        }|r|j                  j                  |      nd }|s|S |sJ | j                  ||      \  }}	|t        j                  t        j                  z   z  s|	r|	j                         D ]  }
||
z  }	 ||z  S )NrI   )rV   rF   r   r   r
   NONE
blueprints_blueprint_exemption_scoper[   rZ   values)r   r\   rA   r9   rb   rc   route_exemption_scopeblueprint_instanceblueprint_exemption_scopeancestor_exemption_scopes	exemptions              r!   rY   zLimitManager.exemption_scope   s     &&**8>r4@	09!),r $ 6 6 : :4ATAT U>GS^^//	:T!((9 //Y?)) *n.D.D~GaGa.a,bb,!:!A!A!C ;I-:-;(+DDDr#   c                B   g }| j                   j                  |t        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   rF   r
   rk   r   append
ValueErrorr   error)r   r]   r-   groupr5   es         r!   r   zLimitManager.decorated_limits   s    %%))-9L9LM 6 66!33MB E%* 1E"MM%01 	 & **D]OSUVWUXY s   A**	B3!BBc                l    g }|r|j                   j                  |      nd }|r|j                  }t        |r|j	                  d      ng       } j                  ||      \  }}|t        j                  t        j                  z   z  sm j                  j                  |t                     }	|	rt        d |	D              s~ j                  j                  |t        j                        t        j                  z  sCt        j                    fd|j#                   j                        j%                  |      D         n|	}
|
r|
D ]  }	 |j'                  |D cg c]  }t)        |j*                  |j,                  |j.                  |j0                  |j2                  |j4                  |j6                  |j8                  |j:                  |j<                  |j>                  |j@                         c}        |S c c}w # tB        $ r+} jD                  jG                  d| d|        Y d }~d }~ww xY w)N.c              3  4   K   | ]  }|j                     y wr%   rK   rM   s     r!   rO   z0LimitManager.blueprint_limits.<locals>.<genexpr>   s     [E 7 7[rS   c              3  V   K   | ]   }j                   j                  |g        " y wr%   )r   rF   )rN   memberr   s     r!   rO   z0LimitManager.blueprint_limits.<locals>.<genexpr>   s,       & !2266vrBs   &)z'failed to load ratelimit for blueprint ru   )$rl   rF   rc   setsplitrm   r
   r[   rZ   r   r   rX   r   rk   	ANCESTORSr'   r(   intersection
differencerW   r	   r5   key_funcr<   
per_methodmethodserror_messageexempt_whenrL   deduct_when	on_breachcostsharedrw   r   rx   )r   r\   r9   r-   rp   blueprint_nameblueprint_ancestoryself_exemptionancestor_exemptionsblueprint_self_limitsr   limit_groupr5   rz   s   `             r!   r   zLimitManager.blueprint_limits   s   %'>GS^^//	:T/44N"%iiooc&:R"P262Q2QRUW`2a/N/"~'='=@Z@Z'Z%[[(,(>(>(B(B>S]S_(`% .[EZ[[ 66::>>K^K^_$../ OO*=*J*J $ 6 6+(j)<=	 / !" $'7 "MM  2=!" ). %1(-(-(-(-(8(8(-(-(;(;(-(9(9(-(?(?(-(9(9(-(-

(-%&!"2 -!"$  *  LL.."I.IYY[\][^ _ s+   G?BG:
/G?:G??	H3!H..H3c           	        |j                   |   j                  }| j                  j                  |t        j
                        t        j                   z  }t        |j                  d            }| j                  j                         D ch c]  \  }}|t        j                  z  s| c}}j                  |      }||D ci c]-  }|| j                  j                  |t        j
                        / c}fS c c}}w c c}w )Nr|   )rl   rc   r   rF   r
   rk   r   r   r   itemsDESCENDENTSr   )	r   r\   r   rc   rs   	ancestorykfancestor_exemptions	            r!   rm   z'LimitManager._blueprint_exemption_scope   s     ~~n-22..2249L9LM$$Q
 
	 ,,S12	44::<
!QND^D^@^A

,y
! 	 Oa
JKAt))--a1D1DEE
 
 	
	

s   C;)C;2D)r   list[ApplicationLimit]r   list[Limit]r   dict[str, OrderedSet[Limit]]r   r   r   dict[str, ExemptionScope]r    r   returnNone)r   list[RuntimeLimit])r-   r   r   r   )r-   r   r   r   )F)r4   strr5   Limit | Noner6   rE   r   r   )r9   r   r5   r   r   r   )r4   r   r<   r
   r   r   )r9   r   r<   r
   r   r   )rA   r   rB   r   r   r   )rA   r   r   rE   )NNNFF)r\   flask.FlaskrA   
str | Noner9   r   r]   r   r^   rE   r_   rE   r   ztuple[list[RuntimeLimit], ...])r\   r   rA   r   r9   r   r   r
   )r]   r   r   r   )r\   r   r9   r   r   r   )r\   r   r   r   r   z0tuple[ExemptionScope, dict[str, ExemptionScope]])__name__
__module____qualname__r"   propertyr   r   r.   r0   r7   r:   r=   r?   rC   rG   ri   rY   r   r   rm    r#   r!   r   r      sM   :2: $: 7	:
 7: 4: 8: 
:$ @ @ < <*&DR.6N8  $ $$(#$)8,8, 8, 	8,
 "8, 8, "8, 
(8,tEE*4EAKE	E07r

03
	9
r#   r   )
__future__r   r'   r   collections.abcr   typingr   flaskordered_setr   _limitsr   r	   	constantsr
   utilr   rI   r   r   r   r#   r!   <module>r      s5    "   $    " 3 % $`
 `
r#   