o
    KK&he1                     @   sz   d dl Z d dlZd dlmZ d dlmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZ G dd	 d	eZG d
d dZdS )    N)SimpleNamespace)warn   )InvalidUsageParameterNameConflicts)	ParamInfo)	Immutableparts_to_pathpath_to_partsc                   @   s   e Zd Zdd ZdS )Requirementsc                 C   s   t t|  S N)hash	frozensetitemsself r   F/var/www/html/venv/lib/python3.10/site-packages/sanic_routing/route.py__hash__      zRequirements.__hash__N)__name__
__module____qualname__r   r   r   r   r   r      s    r   c                   @   s  e Zd ZU dZeed< eed< ejdejf ed< ej	e
 ed< e
ed< eje
df ed< e
ed	< eje
 ed
< eed< eed< eed< eed< eed< 						d>ddde
de
dejdejf dejeje
 ej	e
 f dejeje
ejf  dedededededefddZdd Zde
fddZdefddZd d! Zd"d# Zdefd$ede
de
d%e
d&ejf
d'd(Zd)d* Zd+d, Zd-d. Zd/d0 Ze d1d2 Z!e d3d4 Z"e deje
df fd5d6Z#e d7d8 Z$defd9d:Z%d;e
fd<d=Z&dS )?Route)_params	_raw_pathctxextrahandlerlabelsmethodsname
overloadedparamspartspathpatternpriorityregexrequirementsrouterstaticstrictunquoter   r   .r   r    r!   r$   r%   r&   r(   r)   r+   r,   r-   NFr   )r'   raw_pathr"   r'   c                C   s   || _ || _|| _t|| _t|pi | _|| _t | _	t | _
i | _|| _| |}t|| j j}t|| j jd| _|| _|	| _|
| _|| _d | _|| _|| _d | _|   d S )N)	delimiter)r*   r!   r   r   r    r   r)   r'   r   r   r   r   r   _ingest_pathr
   r/   r	   r%   r$   r+   r(   r"   r&   r,   r-   r   _setup_params)r   r*   r.   r!   r   r    r)   r,   r-   r+   r(   r"   r'   ingested_pathr$   r   r   r   __init__H   s,   

zRoute.__init__c                 C   sX   | j r| j | jkrd| j  d| jp| jj n	d| jp| jj }d| jj d| dS )Nzname=z path=zpath=<z: >)r!   r%   r*   r/   	__class__r   )r   displayr   r   r   __str__x   s   zRoute.__str__returnc                 C   s   t | S r   )strr   r   r   r   __repr__   s   zRoute.__repr__c                 C   s8   t || jsdS t| j| jf|j|jfko| j|j@ S )NF)
isinstancer6   boolsegmentsr)   r    )r   otherr   r   r   __eq__   s   
zRoute.__eq__c                 C   sZ   g }| | jjD ]}|dr d|vr |dd }d| d}|| q	| jj|S )Nr4   :r   z:str>)splitr*   r/   
startswithappendjoin)r   r%   r>   partr!   r   r   r   r0      s   zRoute._ingest_pathc           
   
   C   s   t t| j| jj| jj}| js>t|| jj}t|D ]$\}}|dr=| |dd \}}}}}	| 	|||||||	 qd S d S )Nr4   r   rB   )
r	   r
   r.   r*   r/   r+   	enumeraterD   parse_parameter_stringadd_parameter)
r   key_pathr$   idxrG   r!   label_typer&   param_info_classr   r   r   r1      s6   
zRoute._setup_paramsrL   rM   castc           
   	   C   s   |r t |tr |dsd| }|ds| d}t|}|| jjv}|r*dn
t| jj	 
|}	||||||||	d| j|< d S )N^$r   )r!   r.   rM   rP   r&   r(   r'   )r<   r:   rD   endswithrecompiler*   regex_typeslistkeysindexr   )
r   rL   r!   r.   rM   rP   r&   rO   is_regexr'   r   r   r   rJ      s(   





zRoute.add_parameterc                    s   t  j}tdd | D }dd |D }t|tt|kr)td j | _t t|  fddd _	 j
sRtdd	  j	 D rTtd
 j d S d S )Nc                 S   s   g | ]	\}}|j |fqS r   )r!   ).0rL   paramr   r   r   
<listcomp>   s    z*Route._finalize_params.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r   )r[   itemr   r   r   r]      s    zDuplicate named parameters in: c                    s     | d S )Nr   )_sorting)r\   r   r   r   <lambda>   s    z(Route._finalize_params.<locals>.<lambda>)keyc                 s   s    | ]}d |j v V  qdS )rA   N)rM   )r[   r\   r   r   r   	<genexpr>   s    

z)Route._finalize_params.<locals>.<genexpr>zInvalid parameter declaration: )dictr   setr   lenr   r   r   sortedr#   r(   anyvaluesr   r.   )r   r#   label_pairsr   r   r   r   _finalize_params   s$   


zRoute._finalize_paramsc           
      C   sB  g }| j D ]}|dr| |^}}}}t|ts!|jd}t|}|j	dkrt|j
rMt|j
d |krGtdt|j
d  d| d|| q|ddkr_td	| d
| d|d\}}	|| d| d|	  q|j	dkrtd| |d| d| d q|| q| jj| jj| | _d S )Nr4   z^$r   r   zNamed group (z#) must match your named parameter ()(zCould not compile pattern z(. Try using a named group instead: '(?P<z>your_matching_group)'z(?P<r5   zInvalid matching pattern )r$   rD   rI   r<   r:   r&   striprT   rU   groups
groupindexrW   r   rE   countrC   r*   r/   rF   )
r   
componentsrG   r!   _r&   __compiled	beginningendr   r   r   _compile_regex   s>   





zRoute._compile_regexc                 C   s&   |    | jr|   t| j| _d S r   )rj   r(   rw   r   r)   r   r   r   r   finalize  s   zRoute.finalizec                 C   s   t | j| _d S r   )rc   r)   r   r   r   r   reset   r   zRoute.resetc                 C      | j S r   )r   r   r   r   r   defined_params#  s   zRoute.defined_paramsc                 C   rz   )z8
        The raw path from the route definition
        )r   r   r   r   r   r.   '  s   zRoute.raw_pathc                    s   t  fddt jD S )z
        Same as :py:attr:`~sanic_routing.route.Route.parts` except
        generalized so that any dynamic parts do not
        include param keys since they have no impact on routing.
        c                 3   s6    | ]\}}| j v rd  j | j dn|V  qdS )z<__dynamic__:r5   N)r   rM   )r[   rL   segmentr   r   r   rb   5  s    

z!Route.segments.<locals>.<genexpr>)tuplerH   r$   r   r   r   r   r>   .  s   zRoute.segmentsc                 C   s   | j j | j S )z
        Since :py:attr:`~sanic_routing.route.Route.path` does NOT
        include a preceding '/', this adds it back.
        )r*   r/   r%   r   r   r   r   uri<  s   z	Route.uric                 C   sB   zt | jj |jW S  ty    tt | jj  Y S w r   )rW   r*   rV   rX   rY   rM   
ValueErrorre   )r   r^   r   r   r   r_   D  s
   zRoute._sortingparameter_stringc           
      C   s   | d}|}d}d|v rQ|dd\}}d|v r!|dd\}}d|v r-|dd\}}|s6td| |dkrDtd| d	t n|d
krQtd| dt t|tf}| jj	||}|\}}}	|||||	fS )a  Parse a parameter string into its constituent name, type, and
        pattern

        For example:

        ```text
        parse_parameter_string('<param_one:[A-z]>')` -> ('param_one', '[A-z]', <class 'str'>, '[A-z]')
        ```

        :param parameter_string: String to parse
        :return: tuple containing
            (parameter_name, parameter_type, parameter_pattern)
        z<>r:   rA   r   =zInvalid parameter syntax: stringzjUse of 'string' as a path parameter type is deprected, and will be removed in Sanic v21.12. Instead, use <z:str>.numberzjUse of 'number' as a path parameter type is deprected, and will be removed in Sanic v21.12. Instead, use <z:float>.)
rm   rC   r   r   DeprecationWarningr:   r   r*   rV   get)
r   r   r!   rM   rr   defaultfoundrN   r&   rO   r   r   r   rI   J  s>   


zRoute.parse_parameter_string)NFFFFF)'r   r   r   	__slots__r   __annotations__tCallableAny	FrozenSetr:   TupleOptionalr=   r   UnionSequenceDictintr3   r8   r;   r@   r0   r1   r   TyperJ   rj   rw   rx   ry   propertyr{   r.   r>   r~   r_   rI   r   r   r   r   r      s   
 		

0	"
"&


r   )rT   typingr   typesr   warningsr   
exceptionsr   r   patternsr   utilsr   r	   r
   r   r   r   r   r   r   <module>   s    