o
    ]f                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ dZeejej	 d Z
ddd	 eeed
D Zdd eD fZdedefddZdedefddZdedee fddZdedefddZdd Zd ddZ	d dedeee  defddZdS )!    N)Callable)List)Optionalz_template_fragment_cache_%s%sz_. c                 c   s    | ]	}|t vr|V  qd S N)valid_chars).0c r
   L/home/ubuntu/webapp/venv/lib/python3.10/site-packages/flask_caching/utils.py	<genexpr>
   s    r      c                 C   s   i | ]}|d qS r   r
   )r   kr
   r
   r   
<dictcomp>   s    r   freturnc                 C   s    t | }t|jp|jp|jS )z)Check if the function wants any arguments)inspectgetfullargspecboolargsvarargsvarkw)r   arg_specr
   r
   r   
wants_args   s   
r   c                 C   s   t t| j S )zQGet function parameters
    :param f
    :return: Parameter list of function
    )listr   	signature
parametersvaluesr   r
   r
   r   get_function_parameters   s   r   c                 C   s   dd t | D S )zUReturn arguments of function
    :param f:
    :return: String list of arguments
    c                 S   s   g | ]}|j |jkr|jqS r
   )kindPOSITIONAL_OR_KEYWORDname)r   	parameterr
   r
   r   
<listcomp>!   s
    z!get_arg_names.<locals>.<listcomp>)r   r   r
   r
   r   get_arg_names   s   r%   positionc                 C   s&   t | | }|j}|tjjkr|S d S r   )r   defaultr   	Parameterempty)r   r&   argarg_defr
   r
   r   get_arg_default(   s   r,   c                 C   s   t | dt| S )N__caching_id__)getattrrepr)objr
   r
   r   get_id.   s   r1   c           
      C   sN  t | }d}t| dd}|rt|st| j}n|r)|d dkr)|r)t|d }| j}|r?|d dkr?t|d s?tdt| drH| j	}nBt| dd}|rXt|sX|j
}|s`t| dd}|s||r||r||d dkrr|d j
}n
|d dkr||d }|r|jd	 | j }n| j}d	||fjt }|rd	|||fjt nd}	||	fS )
z1Attempts to returns unique namespace for functionN__self__r   selfclszaWhen using `delete_memoized` on a `@classmethod` you must provide the class as the first argument__qualname__im_class.)r%   r.   r   isclassr1   r2   
__module__
ValueErrorhasattrr5   	__class____name__join	translatenull_control)
r   r   m_argsinstance_tokeninstance_selfmoduler"   klassnsinsr
   r
   r   function_namespace2   sD   
rH   fragment_namevary_onc                 C   s$   |rd|  } ng }t | d|f S )z.Make a cache key for a specific fragment name.z%s__)TEMPLATE_FRAGMENT_KEY_TEMPLATEr>   )rI   rJ   r
   r
   r   make_template_fragment_keyj   s   
rM   r   )r   stringtypingr   r   r   rL   setascii_lettersdigitsr   r>   mapchrrange	del_charsr@   r   r   r   strr%   intr,   r1   rH   rM   r
   r
   r
   r   <module>   s.    
9
