o
    ßý°jz  ã                   @  s”   d dl mZ d dlmZ d dlZd dlmZ ejrd dl	Z
e d¡ZG dd„ dƒZG dd„ dƒZG d	d
„ d
eje ƒZG dd„ dƒZddlmZ dS )é    )ÚannotationsN)ÚdatetimeÚTc                   @  s:   e Zd ZdZdddd„Zddd„Zddd„Zddd„ZdS )ÚIfRangez½Very simple object that represents the `If-Range` header in parsed
    form.  It will either have neither a etag or date or one of either but
    never both.

    .. versionadded:: 0.7
    NÚetagú
str | NoneÚdateúdatetime | Nonec                 C  s   || _ || _d S ©N)r   r   )Úselfr   r   © r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/werkzeug/datastructures/range.pyÚ__init__   s   
zIfRange.__init__ÚreturnÚstrc                 C  s0   | j durt | j ¡S | jdurt | j¡S dS )ú-Converts the object back into an HTTP header.NÚ )r   ÚhttpÚ	http_dater   Ú
quote_etag©r   r   r   r   Ú	to_header   s
   

zIfRange.to_headerc                 C  ó   |   ¡ S r
   ©r   r   r   r   r   Ú__str__$   ó   zIfRange.__str__c                 C  ó   dt | ƒj› dt| ƒ›d�S ©Nú<ú ú>©ÚtypeÚ__name__r   r   r   r   r   Ú__repr__'   ó   zIfRange.__repr__©NN)r   r   r   r	   ©r   r   )r#   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r$   r   r   r   r   r      s    

r   c                   @  sV   e Zd ZdZddd	„Zddd„Zddd„Zddd„Zd dd„Zddd„Z	ddd„Z
dS )!ÚRangeaX  Represents a ``Range`` header. All methods only support only
    bytes as the unit. Stores a list of ranges if given, but the methods
    only work if only one range is provided.

    :raise ValueError: If the ranges provided are invalid.

    .. versionchanged:: 0.15
        The ranges passed in are validated.

    .. versionadded:: 0.7
    Úunitsr   Úrangesú%cabc.Sequence[tuple[int, int | None]]r   ÚNonec                 C  sP   || _ || _|D ]\}}|d u s|d ur%|dk s||kr%t||f› d�ƒ‚qd S )Nr   z is not a valid range.)r,   r-   Ú
ValueError)r   r,   r-   ÚstartÚendr   r   r   r   8   s    €þzRange.__init__Úlengthú
int | Noneútuple[int, int] | Nonec                 C  sn   | j dks|du st| jƒdkrdS | jd \}}|du r'|}|dk r'||7 }t |||¡r5|t||ƒfS dS )z·If the range is for bytes, the length is not None and there is
        exactly one range and it is satisfiable it returns a ``(start, stop)``
        tuple, otherwise `None`.
        ÚbytesNé   r   )r,   Úlenr-   r   Úis_byte_range_validÚmin)r   r3   r1   r2   r   r   r   Úrange_for_lengthE   s    zRange.range_for_lengthúContentRange | Nonec                 C  s.   |   |¡}|durt| j|d |d |ƒS dS )z�Creates a :class:`~werkzeug.datastructures.ContentRange` object
        from the current range and given content length.
        Nr   r7   )r;   ÚContentRanger,   )r   r3   Úrngr   r   r   Úmake_content_rangeU   s   
zRange.make_content_rangec                 C  sl   g }| j D ]%\}}|du r| |dkr|› d�nt|ƒ¡ q| |› d|d › �¡ q| j› dd |¡› �S )r   Nr   ú-r7   ú=ú,)r-   Úappendr   r,   Újoin)r   r-   Úbeginr2   r   r   r   r   ^   s   "zRange.to_headerr   c                 C  s>   |   |¡}|dur| j› d|d › d|d d › d|› �S dS )z\Converts the object into `Content-Range` HTTP header,
        based on given length
        Nr   r   r@   r7   ú/)r;   r,   )r   r3   Úranger   r   r   Úto_content_range_headerh   s   
(zRange.to_content_range_headerc                 C  r   r
   r   r   r   r   r   r   q   r   zRange.__str__c                 C  r   r   r!   r   r   r   r   r$   t   r%   zRange.__repr__N)r,   r   r-   r.   r   r/   )r3   r4   r   r5   )r3   r4   r   r<   r'   )r3   r4   r   r   )r#   r(   r)   r*   r   r;   r?   r   rH   r   r$   r   r   r   r   r+   +   s    



	


	r+   c                   @  sJ   e Zd Zddd„Zejddd„ƒZejddd„ƒZddd„Zddd„ZdS )Ú_CallbackPropertyÚownerútype[ContentRange]Únamer   r   r/   c                 C  s   d|› �| _ d S )NÚ_)Úattr)r   rJ   rL   r   r   r   Ú__set_name__y   s   z_CallbackProperty.__set_name__Úinstanceúte.Selfc                 C  ó   d S r
   r   ©r   rP   rJ   r   r   r   Ú__get__|   ó   z_CallbackProperty.__get__r=   r   c                 C  rR   r
   r   rS   r   r   r   rT   ~   rU   r<   útype[ContentRange] | Noneúte.Self | Tc                 C  s   |d u r| S |j | j S r
   )Ú__dict__rN   rS   r   r   r   rT   €   s   Úvaluec                 C  s(   ||j | j< |jd ur| |¡ d S d S r
   )rX   rN   Ú	on_update)r   rP   rY   r   r   r   Ú__set__ˆ   s   
ÿz_CallbackProperty.__set__N)rJ   rK   rL   r   r   r/   )rP   r/   rJ   r/   r   rQ   )rP   r=   rJ   rK   r   r   )rP   r<   rJ   rV   r   rW   )rP   r=   rY   r   r   r/   )r#   r(   r)   rO   ÚtÚoverloadrT   r[   r   r   r   r   rI   x   s    

rI   c                   @  sœ   e Zd ZU dZ		dddd„Zeƒ Zded< eƒ Zded< eƒ Z	ded< eƒ Z
ded< 		d d!dd„Zd"dd„Zd#dd„Zd$dd„Zd#dd„Zd#dd„ZdS )%r=   zDRepresents the content range header.

    .. versionadded:: 0.7
    Nr,   r   r1   r4   Ústopr3   rZ   ú*cabc.Callable[[ContentRange], None] | Noner   r/   c                 C  s   || _ |  ||||¡ d S r
   )rZ   Úset)r   r,   r1   r^   r3   rZ   r   r   r   r   •   s   zContentRange.__init__r6   c                 C  sJ   t  |||¡sJ dƒ‚|| _|| _|| _|| _| jdur#|  | ¡ dS dS )z#Simple method to update the ranges.zBad range providedN)r   r9   Ú_unitsÚ_startÚ_stopÚ_lengthrZ   )r   r1   r^   r3   r,   r   r   r   r`   ª   s   
ÿzContentRange.setc                 C  s   | j dddd� dS )zcSets the units to `None` which indicates that the header should
        no longer be used.
        N)r,   )r`   r   r   r   r   Úunsetº   s   zContentRange.unsetr   c                 C  sb   | j d u rdS | jd u rd}n| j}| jd u r| j › d|› �S | j › d| j› d| jd › d|› �S )Nr   Ú*z */r   r@   r7   rF   )ra   rd   rb   rc   )r   r3   r   r   r   r   À   s   


$zContentRange.to_headerÚboolc                 C  s
   | j d uS r
   )ra   r   r   r   r   Ú__bool__Ë   s   
zContentRange.__bool__c                 C  r   r
   r   r   r   r   r   r   Î   r   zContentRange.__str__c                 C  r   r   r!   r   r   r   r   r$   Ñ   r%   zContentRange.__repr__r&   )r,   r   r1   r4   r^   r4   r3   r4   rZ   r_   r   r/   )Nr6   )
r1   r4   r^   r4   r3   r4   r,   r   r   r/   )r   r/   r'   )r   rg   )r#   r(   r)   r*   r   rI   r,   Ú__annotations__r1   r^   r3   r`   re   r   rh   r   r$   r   r   r   r   r=   �   s"   
 
úû



r=   é   )r   )Ú
__future__r   Úcollections.abcÚabcÚcabcÚtypingr\   r   ÚTYPE_CHECKINGÚtyping_extensionsÚteÚTypeVarr   r   r+   ÚGenericrI   r=   r   r   r   r   r   r   Ú<module>   s    
MG