o
    'hl                     @  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 )IfRangezVery 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   Y/var/www/html/olx_land/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 )zIf 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 )zCreates 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