U
    Zf                     @   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eedddZeedddZeee dddZeedddZdd ZdddZdeeee  edddZdS )     N)Callable)List)Optionalz_template_fragment_cache_%s%sz_. c                 c   s   | ]}|t kr|V  qd S N)valid_chars).0c r
   7/tmp/pip-unpacked-wheel-0x57cbey/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   Z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   Z	parameterr
   r
   r   
<listcomp>!   s   z!get_arg_names.<locals>.<listcomp>)r   r   r
   r
   r   get_arg_names   s    r#   )r   positionc                 C   s&   t | | }|j}|tjjkr"|S d S r   )r   defaultr   	Parameterempty)r   r$   argZarg_defr
   r
   r   get_arg_default(   s    r)   c                 C   s   t | dt| S )NZ__caching_id__)getattrrepr)objr
   r
   r   get_id.   s    r-   c           
      C   sR  t | }d}t| dd}|r2t|s2t| j}n |rR|d dkrR|rRt|d }| j}|r~|d dkr~t|d s~tdt| dr| j	}nt| dd}|rt|s|j
}|st| dd}|s|r|r|d dkr|d j
}n|d dkr|d }|r|jd	 | j }n| j}d	||fjt }|rFd	|||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__Zim_class.)r#   r*   r   isclassr-   r.   
__module__
ValueErrorhasattrr1   	__class____name__join	translatenull_control)
r   r   Zm_argsZinstance_tokenZinstance_selfmoduler!   klassnsZinsr
   r
   r   function_namespace2   sD    
r?   )fragment_namevary_onr   c                 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_TEMPLATEr9   )r@   rA   r
   r
   r   make_template_fragment_keyj   s    
rD   )N)N)r   stringtypingr   r   r   rC   setascii_lettersdigitsr   r9   mapchrrangeZ	del_charsr;   r   r   r   strr#   intr)   r-   r?   rD   r
   r
   r
   r   <module>   s(   
9  
