U
    d                     @  s   U 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 ej	rLddl
mZ G dd deZG dd	 d	ZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZeeeeeeedZded< dS )    )annotationsN)quote   )Mapc                   @  s   e Zd ZdZdS )ValidationErrorzValidation error.  If a rule converter raises this exception the rule
    does not match the current URL and the next URL is tried.
    N)__name__
__module____qualname____doc__ r   r   ?/tmp/pip-unpacked-wheel-m99gisyz/werkzeug/routing/converters.pyr      s   r   c                      sh   e Zd ZdZdZdZdZddd fdd	Zd
ddddddZdddddZ	dddddZ
  ZS )BaseConverterzBase class for all converters.

    .. versionchanged:: 2.3
        ``part_isolating`` defaults to ``False`` if ``regex`` contains a ``/``.
    z[^/]+d   Tt.AnyNone)kwargsreturnc                   s2   t  jf | d| jkr.d| jkr.d| jk| _d S )Nregexpart_isolating/)super__init_subclass____dict__r   r   )clsr   	__class__r   r   r      s    zBaseConverter.__init_subclass__r   )mapargsr   r   c                 O  s
   || _ d S N)r   )selfr   r   r   r   r   r   __init__&   s    zBaseConverter.__init__strvaluer   c                 C  s   |S r   r   r   r#   r   r   r   	to_python)   s    zBaseConverter.to_pythonc                 C  s@   t |ttfr*tjdtdd t|ddS tt|| jj	ddS )NzUPassing bytes as a URL value is deprecated and will not be supported in Werkzeug 3.0.   )
stacklevelz!$&'()*+,/:;=@)safe)encodingr(   )

isinstancebytes	bytearraywarningswarnDeprecationWarningr   r!   r   charsetr$   r   r   r   to_url,   s    zBaseConverter.to_url)r   r   r	   r
   r   weightr   r   r    r%   r1   __classcell__r   r   r   r   r      s   r   c                      s0   e Zd ZdZddddddd fd	d
Z  ZS )UnicodeConvertera  This converter is the default converter and accepts any string but
    only one path segment.  Thus the string can not include a slash.

    This is the default validator.

    Example::

        Rule('/pages/<page>'),
        Rule('/<string(length=2):lang_code>')

    :param map: the :class:`Map`.
    :param minlength: the minimum length of the string.  Must be greater
                      or equal 1.
    :param maxlength: the maximum length of the string.
    :param length: the exact length of the string.
    r   Nr   int
int | Noner   )r   	minlength	maxlengthlengthr   c                   sf   t  | |d k	r&dt| d}n0|d kr4d}ntt|}dt| d| d}d| | _d S )N{} ,z[^/])r   r    r5   r!   r   )r   r   r7   r8   r9   Zlength_regexZmaxlength_valuer   r   r   r    L   s    zUnicodeConverter.__init__)r   NN)r   r   r	   r
   r    r3   r   r   r   r   r4   :   s
      r4   c                      s:   e Zd ZdZdddd fddZddd	d
dZ  ZS )AnyConvertera  Matches one of the items provided.  Items can either be Python
    identifiers or strings::

        Rule('/<any(about, help, imprint, class, "foo,bar"):page_name>')

    :param map: the :class:`Map`.
    :param items: this function accepts the possible items as positional
                  arguments.

    .. versionchanged:: 2.2
        Value is validated when building a URL.
    r   r!   r   )r   itemsr   c                   s8   t  | t|| _dddd |D  d| _d S )Nz(?:|c                 S  s   g | ]}t |qS r   )reescape).0xr   r   r   
<listcomp>p   s     z)AnyConverter.__init__.<locals>.<listcomp>))r   r    setr?   joinr   )r   r   r?   r   r   r   r    m   s    
zAnyConverter.__init__r   r"   c                 C  sD   || j krt|S ddd t| j D }td| d| d S )Nz, c                 s  s   | ]}d | d V  qdS )'Nr   )rC   itemr   r   r   	<genexpr>v   s     z&AnyConverter.to_url.<locals>.<genexpr>rI   z' is not one of )r?   r!   rH   sorted
ValueError)r   r#   Zvalid_valuesr   r   r   r1   r   s    
zAnyConverter.to_url)r   r   r	   r
   r    r1   r3   r   r   r   r   r>   _   s   r>   c                   @  s   e Zd ZdZdZdZdS )PathConverterzLike the default :class:`UnicodeConverter`, but it also matches
    slashes.  This is useful for wikis and similar applications::

        Rule('/<path:wikipage>')
        Rule('/<path:wikipage>/edit')

    :param map: the :class:`Map`.
    z[^/].*?   N)r   r   r	   r
   r   r2   r   r   r   r   rN   z   s   	rN   c                      sv   e Zd ZU dZdZeZded< ddd	d
d
ddd fddZdddddZ	dddddZ
eddddZ  ZS )NumberConverterzKBaseclass for `IntegerConverter` and `FloatConverter`.

    :internal:
    2   z
t.Callablenum_convertr   NFr   r5   r6   boolr   )r   fixed_digitsminmaxsignedr   c                   s4   |r| j | _t | || _|| _|| _|| _d S r   )signed_regexr   r   r    rT   rU   rV   rW   )r   r   rT   rU   rV   rW   r   r   r   r       s    zNumberConverter.__init__r!   r   r"   c                 C  sV   | j rt|| j krt | |}| jd k	r8|| jk sL| jd k	rR|| jkrRt |S r   )rT   lenr   rR   rU   rV   r$   r   r   r   r%      s    
zNumberConverter.to_pythonc                 C  s$   t | |}| jr || j}|S r   )r!   rR   rT   zfillr$   r   r   r   r1      s    zNumberConverter.to_url)r   c                 C  s   d| j  S )Nz-?)r   )r   r   r   r   rX      s    zNumberConverter.signed_regex)r   NNF)r   r   r	   r
   r2   r5   rR   __annotations__r    r%   r1   propertyrX   r3   r   r   r   r   rP      s   
    
rP   c                   @  s   e Zd ZdZdZdS )IntegerConvertera  This converter only accepts integer values::

        Rule("/page/<int:page>")

    By default it only accepts unsigned, positive values. The ``signed``
    parameter will enable signed, negative values. ::

        Rule("/page/<int(signed=True):page>")

    :param map: The :class:`Map`.
    :param fixed_digits: The number of fixed digits in the URL. If you
        set this to ``4`` for example, the rule will only match if the
        URL looks like ``/0001/``. The default is variable length.
    :param min: The minimal value.
    :param max: The maximal value.
    :param signed: Allow signed (negative) values.

    .. versionadded:: 0.15
        The ``signed`` parameter.
    z\d+N)r   r   r	   r
   r   r   r   r   r   r]      s   r]   c                      s8   e Zd ZdZdZeZddddddd	 fd
dZ  ZS )FloatConvertera  This converter only accepts floating point values::

        Rule("/probability/<float:probability>")

    By default it only accepts unsigned, positive values. The ``signed``
    parameter will enable signed, negative values. ::

        Rule("/offset/<float(signed=True):offset>")

    :param map: The :class:`Map`.
    :param min: The minimal value.
    :param max: The maximal value.
    :param signed: Allow signed (negative) values.

    .. versionadded:: 0.15
        The ``signed`` parameter.
    z\d+\.\d+NFr   zfloat | NonerS   r   )r   rU   rV   rW   r   c                   s   t  j||||d d S )N)rU   rV   rW   )r   r    )r   r   rU   rV   rW   r   r   r   r       s    zFloatConverter.__init__)NNF)	r   r   r	   r
   r   floatrR   r    r3   r   r   r   r   r^      s      r^   c                   @  s4   e Zd ZdZdZdddddZddddd	Zd
S )UUIDConverterzThis converter only accepts UUID strings::

        Rule('/object/<uuid:identifier>')

    .. versionadded:: 0.10

    :param map: the :class:`Map`.
    zK[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}r!   z	uuid.UUIDr"   c                 C  s
   t |S r   )uuidUUIDr$   r   r   r   r%      s    zUUIDConverter.to_pythonc                 C  s   t |S r   )r!   r$   r   r   r   r1     s    zUUIDConverter.to_urlN)r   r   r	   r
   r   r%   r1   r   r   r   r   r`      s
   
r`   )defaultstringanypathr5   r_   ra   z#t.Mapping[str, type[BaseConverter]]DEFAULT_CONVERTERS)
__future__r   rA   typingtra   r-   urllib.parser   TYPE_CHECKINGr   r   rM   r   r   r4   r>   rN   rP   r]   r^   r`   rg   r[   r   r   r   r   <module>   s2    '%. 