a
    0hl                     @  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 )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
str | Nonezdatetime | Noneetagdatec                 C  s   || _ || _d S Nr   )selfr   r	    r   K/var/www/auris/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 )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   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 )zCreates 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