a
    é´«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                   @  sL   e Zd ZdZddddœdd„Zdd	œd
d„Zdd	œdd„Zd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ú
str | Nonezdatetime | None©ÚetagÚdatec                 C  s   || _ || _d S ©Nr   )Úselfr   r	   © r   ú\/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/werkzeug/datastructures/range.pyÚ__init__   s    zIfRange.__init__Ústr©Úreturnc                 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	   ÚhttpZ	http_dater   Z
quote_etag©r   r   r   r   Ú	to_header   s
    

zIfRange.to_headerc                 C  s   |   ¡ S r
   ©r   r   r   r   r   Ú__str__$   s    zIfRange.__str__c                 C  s   dt | ƒj› dt| ƒ›d�S ©Nú<ú ú>©ÚtypeÚ__name__r   r   r   r   r   Ú__repr__'   s    zIfRange.__repr__)NN)r   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r    r   r   r   r   r      s
   r   c                   @  s|   e Zd ZdZddddœdd„Zdd	d
œdd„Zddd
œdd„Zddœdd„Zddd
œdd„Zddœdd„Z	d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
    r   z%cabc.Sequence[tuple[int, int | None]]ÚNone)ÚunitsÚrangesr   c                 C  sP   || _ || _|D ]:\}}|d u s8|d ur|dk s8||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__ú
int | Noneztuple[int, int] | None)Úlengthr   c                 C  sn   | j dks |du s t| jƒdkr$dS | jd \}}|du rN|}|dk rN||7 }t |||¡rj|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   r,   r)   r*   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   r.   )r2   ÚContentRanger&   )r   r,   Úrngr   r   r   Úmake_content_rangeU   s    
zRange.make_content_ranger   c                 C  sl   g }| j D ]J\}}|du r<| |dkr0|› d�nt|ƒ¡ q
| |› d|d › �¡ q
| j› dd |¡› �S )r   Nr   ú-r.   ú=ú,)r'   Úappendr   r&   Újoin)r   r'   Úbeginr*   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   r7   r.   ú/)r2   r&   )r   r,   Úranger   r   r   Úto_content_range_headerh   s    
(zRange.to_content_range_headerc                 C  s   |   ¡ S r
   r   r   r   r   r   r   q   s    zRange.__str__c                 C  s   dt | ƒj› dt| ƒ›d�S r   r   r   r   r   r   r    t   s    zRange.__repr__N)r   r!   r"   r#   r   r2   r6   r   r?   r   r    r   r   r   r   r$   +   s   	
	r$   c                   @  sr   e Zd Zddddœdd„Zejddddœd	d
„ƒZejddddœdd
„ƒZddddœdd
„Zddddœdd„ZdS )Ú_CallbackPropertyztype[ContentRange]r   r%   )ÚownerÚnamer   c                 C  s   d|› �| _ d S )NÚ_)Úattr)r   rA   rB   r   r   r   Ú__set_name__y   s    z_CallbackProperty.__set_name__zte.Self)ÚinstancerA   r   c                 C  s   d S r
   r   ©r   rF   rA   r   r   r   Ú__get__|   s    z_CallbackProperty.__get__r4   r   c                 C  s   d S r
   r   rG   r   r   r   rH   ~   s    r3   ztype[ContentRange] | Nonezte.Self | Tc                 C  s   |d u r| S |j | j S r
   )Ú__dict__rD   rG   r   r   r   rH   €   s    )rF   Úvaluer   c                 C  s$   ||j | j< |jd ur | |¡ d S r
   )rI   rD   Ú	on_update)r   rF   rJ   r   r   r   Ú__set__ˆ   s    
z_CallbackProperty.__set__N)r   r!   r"   rE   ÚtÚoverloadrH   rL   r   r   r   r   r@   x   s   r@   c                   @  sÂ   e Zd ZU dZdddddd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dddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„ZdS )!r4   zDRepresents the content range header.

    .. versionadded:: 0.7
    Nr   r+   z*cabc.Callable[[ContentRange], None] | Noner%   )r&   r)   Ústopr,   rK   r   c                 C  s   || _ |  ||||¡ d S r
   )rK   Úset)r   r&   r)   rO   r,   rK   r   r   r   r   •   s    zContentRange.__init__r&   r)   rO   r,   r-   )r)   rO   r,   r&   r   c                 C  sF   t  |||¡sJ dƒ‚|| _|| _|| _|| _| jdurB|  | ¡ dS )z#Simple method to update the ranges.zBad range providedN)r   r0   Ú_unitsÚ_startÚ_stopÚ_lengthrK   )r   r)   rO   r,   r&   r   r   r   rP   ª   s    
zContentRange.setr   c                 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&   )rP   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   r7   r.   r=   )rQ   rT   rR   rS   )r   r,   r   r   r   r   À   s    


zContentRange.to_headerÚboolc                 C  s
   | j d uS r
   )rQ   r   r   r   r   Ú__bool__Ë   s    zContentRange.__bool__c                 C  s   |   ¡ S r
   r   r   r   r   r   r   Î   s    zContentRange.__str__c                 C  s   dt | ƒj› dt| ƒ›d�S r   r   r   r   r   r   r    Ñ   s    zContentRange.__repr__)NN)Nr-   )r   r!   r"   r#   r   r@   r&   Ú__annotations__r)   rO   r,   rP   rU   r   rX   r   r    r   r   r   r   r4   �   s    

  ú  ûr4   é   )r   )Ú
__future__r   Úcollections.abcÚabcZcabcÚtypingrM   r   ÚTYPE_CHECKINGZtyping_extensionsÚteÚTypeVarr   r   r$   ÚGenericr@   r4   r   r   r   r   r   r   Ú<module>   s   
MG