o
    KK&h                     @  sf   d dl mZ d dlmZmZmZmZmZ d dlm	Z	m
Z
 d dlmZ ddlmZmZ G dd dZd	S )
    )annotations)	FrozenSetListOptionalSequenceTuple)RequirementsRoute)	Immutable   )InvalidUsageRouteExistsc                   @  s   e Zd ZU ded< dZded< ded< ded	< d
ed< d
ed< ded< ded< ded< d9ddZdd Zd:ddZdd Zdd Z	dd Z
dd Zd9d d!Zd"d# Z	$d;d<d(d)Zed=d+d,Zed>d-d.Zed?d0d1Zed@d3d4ZedAd6d7Zd8S )B
RouteGroupr
   methods_index)labelsparamspartspathpatternraw_pathregexroutersegmentsstrictunquoteuristrr   zOptional[str]r   boolr   zTuple[str, ...]r   r   r   r   r   returnNonec                   s`   t tdd  D dkrtdt fdd D r tdt }|   | _d| _d S )Nc                 s  s    | ]}|j V  qd S N)r   .0route r$   F/var/www/html/venv/lib/python3.10/site-packages/sanic_routing/group.py	<genexpr><   s    z&RouteGroup.__init__.<locals>.<genexpr>r   z(Cannot group routes with differing pathsc                 3  s     | ]} d  j |j kV  qdS )N)r   r!   routesr$   r%   r&   ?   s    z-Cannot group routes with differing strictnessr   )lensetr   anylistpop_routespattern_idx)selfr)   
route_listr$   r(   r%   __init__;   s   
zRouteGroup.__init__c                 C  s6   d| j p| jj dt| j }d| jj d| dS )Nzpath=z len=<z: >)r   r   	delimiterr*   r)   	__class____name__)r1   displayr$   r$   r%   __str__H   s   zRouteGroup.__str__c                 C  s   t | S r    )r   r1   r$   r$   r%   __repr__N   s   zRouteGroup.__repr__c                 C  s
   t | jS r    )iterr)   r;   r$   r$   r%   __iter__Q      
zRouteGroup.__iter__c                 C  s
   | j | S r    r(   )r1   keyr$   r$   r%   __getitem__T   r?   zRouteGroup.__getitem__c                 C  s8   || j v rt| d |}t| || |S td| d)Nr   zRouteGroup has no 'z' attribute)passthru_propertiesgetattrsetattrAttributeError)r1   r@   valuer$   r$   r%   __getattr__W   s
   
zRouteGroup.__getattr__c                 C  s   t dd | jD | _d S )Nc                 S  s   i | ]}|j D ]}||qqS r$   methodsr"   r#   methodr$   r$   r%   
<dictcomp>d   s    z'RouteGroup.finalize.<locals>.<dictcomp>)r
   r/   r   r;   r$   r$   r%   finalizeb   s
   
zRouteGroup.finalizec                 C  s   t t| jdd d| _dS )z;
        Sorts the routes in the group by priority
        c                 S     | j S r    priorityr#   r$   r$   r%   <lambda>p       z.RouteGroup.prioritize_routes.<locals>.<lambda>)r@   N)tuplesortedr/   r;   r$   r$   r%   prioritize_routesk   s   
zRouteGroup.prioritize_routesc                 C  s   t | j| _d S r    )dictr   r;   r$   r$   r%   resets   s   zRouteGroup.resetFgroup	overwriteappendc              	   C  s   t | j}|jD ]:}| D ]5}||ks|jr|jr|js3|jr3|s3|s2td| j dd| j dq|| |j	dd dd qqt
|| _d	S )
a  
        The purpose of merge is to group routes with the same path, but
        declarared individually. In other words to group these:

        .. code-block:: python

            @app.get("/path/to")
            def handler1(...):
                ...

            @app.post("/path/to")
            def handler2(...):
                ...

        The other main purpose is to look for conflicts and
        raise ``RouteExists``

        A duplicate route is when:
        1. They have the same path and any overlapping methods; AND
        2. If they have requirements, they are the same

        :param group: Incoming route group
        :type group: RouteGroup
        :param overwrite: whether to allow an otherwise duplicate route group
            to overwrite the existing, if ``True`` will not raise exception
            on duplicates, defaults to False
        :type overwrite: bool, optional
        :param append: whether to allow an otherwise duplicate route group to
            append its routes to the existing route group, defaults to False
        :type append: bool, optional
        :raises RouteExists: Raised when there is a duplicate
        zRoute already registered: z [,]c                 S  rN   r    rO   rQ   r$   r$   r%   rR      rS   z"RouteGroup.merge.<locals>.<lambda>T)r@   reverseN)r-   r/   r)   requirementsr   r   joinrI   r[   sortrT   )r1   rY   rZ   r[   r/   other_routecurrent_router$   r$   r%   mergev   s6   
#
	



zRouteGroup.mergeintc                 C  s   t | d jS )z9
        The number of parts in :py:attr:`parts`
        r   )r*   r   r;   r$   r$   r%   depth   s   zRouteGroup.depthc                 C  s   t dd | j D S )Nc                 s  s$    | ]}|j d kpd|j v V  qdS )r   /N)label)r"   paramr$   r$   r%   r&      s
    
z*RouteGroup.dynamic_path.<locals>.<genexpr>)r,   r   valuesr;   r$   r$   r%   dynamic_path   s   zRouteGroup.dynamic_pathFrozenSet[str]c                 C  s   t dd | D S ) c                 S  s   g | ]
}|j D ]}|qqS r$   rH   rJ   r$   r$   r%   
<listcomp>   s    z&RouteGroup.methods.<locals>.<listcomp>)	frozensetr;   r$   r$   r%   rI      s   zRouteGroup.methodsSequence[Route]c                 C  rN   r    )r/   r;   r$   r$   r%   r)      s   zRouteGroup.routesList[Requirements]c                 C  s   dd | D S )Nc                 S  s   g | ]}|j r|j qS r$   )r_   r!   r$   r$   r%   rn      s    z+RouteGroup.requirements.<locals>.<listcomp>r$   r;   r$   r$   r%   r_      s   zRouteGroup.requirementsN)r   r   )r   r   )FF)rY   r   rZ   r   r[   r   r   r   )r   re   )r   r   )r   rl   )r   rp   )r   rq   )r8   
__module____qualname____annotations__rB   r3   r:   r<   r>   rA   rG   rM   rV   rX   rd   propertyrf   rk   rI   r)   r_   r$   r$   r$   r%   r      s@   
 


	=r   N)
__future__r   typingr   r   r   r   r   sanic_routing.router   r	   sanic_routing.utilsr
   
exceptionsr   r   r   r$   r$   r$   r%   <module>   s    