o
    ;hr                     @  sh  d Z ddlmZ ddlZddlZddl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 ddlmZ d	d
lmZ d	dlmZmZ edZedejejB Zedej dej ej dejejB ZG dd deZejG dd dZ edZ!ere	e"e f Z#ne	Z#G dd de#Z$G dd dZ%d/ddZ&d0d"d#Z'd1d&d'Z(d2d)d*Z)d3d-d.Z*dS )4     )annotationsN)UserDict)
ModuleType)TYPE_CHECKING)Version)
NamedTuple   )ConfigurationError)GRANULARITIESRateLimitItemz[,;|]{1}zf
    \s*([0-9]+)
    \s*(/|\s*per\s*)
    \s*([0-9]+)
    *\s*(hour|minute|second|day|month|year)s?\s*^z(:?z)*$c                   @  s"   e Zd ZU dZded< ded< dS )WindowStatsz1
    tuple to describe a rate limited window
    floatZ
reset_timeint	remainingN)__name__
__module____qualname____doc____annotations__ r   r   >/var/www/html/venv/lib/python3.10/site-packages/limits/util.pyr   #   s   
 r   c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	
DependencystrnamezVersion | Noneversion_requiredversion_foundr   moduleN)r   r   r   r   r   r   r   r   r   .   s
   
 r   Missingc                      s   e Zd Zd fddZ  ZS )DependencyDictkeyr   returnr   c                   s   t  |}|jtu r+d|j d}|jr#||jr d|j dnd7 }|d7 }t||jrG|jr7|j|jk rGtd|j d|j d	|j |S )
N'z' prerequisite not available.z A minimum version of z is required. z^ See https://limits.readthedocs.io/en/stable/storage.html#supported-versions for more details.zThe minimum version of z for 'z%' could not be found. Found version: )super__getitem__r   MissingModuler   r   r
   r   )selfr!   
dependencymessage	__class__r   r   r&   @   s2   

zDependencyDict.__getitem__)r!   r   r"   r   )r   r   r   r&   __classcell__r   r   r+   r   r    ?   s    r    c                   @  s8   e Zd ZU dZg Zded< 	 dddZedd	d
ZdS )LazyDependencyz
    Simple utility that provides an :attr:`dependency`
    to the child class to fetch any dependencies
    without having to import them explicitly.
    z%dict[str, Version | None] | list[str]DEPENDENCIESr"   Nonec                 C  s   t  | _d S N)r    _dependencies)r(   r   r   r   __init__i   s   zLazyDependency.__init__r    c                 C  sr   t | dds6t }t| jtrdd | jD }n| j}| D ]\}}t|\}}t||||||< q|| _| jS )z
        Cached mapping of the modules this storage depends on.
        This is done so that the module is only imported lazily
        when the storage is instantiated.

        :meta private:
        r2   Nc                 S  s   i | ]}|d qS r1   r   ).0r)   r   r   r   
<dictcomp>{   s    z/LazyDependency.dependencies.<locals>.<dictcomp>)	getattrr    
isinstancer/   listitemsget_dependencyr   r2   )r(   dependenciesmappingr   minimum_versionr)   versionr   r   r   r;   l   s   

zLazyDependency.dependenciesN)r"   r0   )r"   r    )	r   r   r   r   r/   r   r3   propertyr;   r   r   r   r   r.   \   s   
 
r.   module_pathr   r"   !tuple[ModuleType, Version | None]c                 C  sb   z#| t jvr
t|  | dd }tt j| dd}t j|  t|fW S  ty0   tdf Y S w )z5
    safe function to import a module at runtime
    .r   __version__z0.0.0N)sysmodules
__import__splitr6   r   ImportErrorr'   )r@   rootr>   r   r   r   r:      s   
r:   pathbytesc                 C  s   t jd|  S )Nlimits)	importlib	resourcesfilesjoinpath
read_bytes)rJ   r   r   r   get_package_data   s   rR   limit_stringlist[RateLimitItem]c           	      C  s   t | tr
t| std|  dg }t| D ]%}t|}|r>| \}}}}t	|}|
|t||r:t|p;d q|S )z
    parses rate limits in string notation containing multiple rate limits
    (e.g. ``1/second; 5/minute``)

    :param limit_string: rate limit string using :ref:`ratelimit-string`
    :raise ValueError: if the string notation is invalid.

    z"couldn't parse rate limit string 'r#   N)r7   r   EXPRmatch
ValueError
SEPARATORSrG   SINGLE_EXPRgroupsgranularity_from_stringappendr   )	rS   rL   limitrV   amount_Z	multiplesgranularity_stringgranularityr   r   r   
parse_many   s   

rb   r   c                 C  s   t t| d S )z
    parses a single rate limit in string notation
    (e.g. ``1/second`` or ``1 per second``)

    :param limit_string: rate limit string using :ref:`ratelimit-string`
    :raise ValueError: if the string notation is invalid.

    r   )r8   rb   )rS   r   r   r   parse   s   
rc   r`   type[RateLimitItem]c                 C  s.   t  D ]}|| r|  S qtd|  )z<

    :param granularity_string:
    :raise ValueError:
    zno granularity matched for )r   valuesZcheck_granularity_stringrW   )r`   ra   r   r   r   r[      s
   
r[   )r@   r   r"   rA   )rJ   r   r"   rK   )rS   r   r"   rT   )rS   r   r"   r   )r`   r   r"   rd   )+r   
__future__r   dataclassesimportlib.resourcesrM   rerD   collectionsr   typesr   typingr   Zpackaging.versionr   Zlimits.typingr   errorsr
   rL   r   r   compilerX   
IGNORECASEVERBOSErY   patternrU   r   	dataclassr   r'   r   Z	_UserDictr    r.   r:   rR   rb   rc   r[   r   r   r   r   <module>   sH    



.


