U
    /v¶h%  ã                   @  sN   d dl mZ G dd„ dƒZG dd„ dƒZdd„ ZG dd	„ d	ƒZd
dlmZ dS )é    )Úannotationsc                   @  s2   e Zd ZdZddd„Zdd„ Zdd„ Z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
    Nc                 C  s   || _ || _d S ©N)ÚetagÚdate)Úselfr   r   © r   úA/tmp/pip-unpacked-wheel-c3xdgso7/werkzeug/datastructures/range.pyÚ__init__   s    zIfRange.__init__c                 C  s0   | j dk	rt | j ¡S | jdk	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__Ústrr   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                   @  sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	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
    c                 C  sP   || _ || _|D ]:\}}|d ks8|d k	r|dk s8||krt||f› d�ƒ‚qd S )Nr   z is not a valid range.)ÚunitsÚrangesÚ
ValueError)r   r   r    ÚstartÚendr   r   r	   r
   /   s
     zRange.__init__c                 C  sn   | j dks |dks t| jƒdkr$dS | jd \}}|dk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   Úlengthr"   r#   r   r   r	   Úrange_for_length:   s     zRange.range_for_lengthc                 C  s.   |   |¡}|dk	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%   )r*   ÚContentRanger   )r   r)   Úrngr   r   r	   Úmake_content_rangeJ   s    
zRange.make_content_rangec                 C  sl   g }| j D ]J\}}|dk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   s    "zRange.to_headerc                 C  s>   |   |¡}|dk	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.   r%   ú/)r*   r   )r   r)   Úranger   r   r	   Úto_content_range_header]   s    
(zRange.to_content_range_headerc                 C  s   |   ¡ S r   r   r   r   r   r	   r   f   s    zRange.__str__c                 C  s   dt | ƒj› dt| ƒ›d�S r   r   r   r   r   r	   r   i   s    zRange.__repr__N)r   r   r   r   r
   r*   r-   r   r6   r   r   r   r   r   r	   r   "   s   	
	r   c                   s"   ‡ fdd„}‡ fdd„}t ||ƒS )Nc                   s
   t | ˆ ƒS r   )Úgetattrr   ©Únamer   r	   Úfgetn   s    z _callback_property.<locals>.fgetc                   s$   t | ˆ |ƒ | jd k	r |  | ¡ d S r   )ÚsetattrÚ	on_update)r   Úvaluer8   r   r	   Úfsetq   s    
z _callback_property.<locals>.fset)Úproperty)r9   r:   r>   r   r8   r	   Ú_callback_propertym   s    r@   c                   @  sl   e Zd ZdZddd„ZedƒZedƒZedƒZedƒZ	dd
d„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r+   zDRepresents the content range header.

    .. versionadded:: 0.7
    Nc                 C  s0   t  |||¡stdƒ‚|| _|  ||||¡ d S )NúBad range provided)r   r'   ÚAssertionErrorr<   Úset)r   r   r"   Ústopr)   r<   r   r   r	   r
      s    zContentRange.__init__Ú_unitsÚ_startÚ_stopÚ_lengthr$   c                 C  sF   t  |||¡stdƒ‚|| _|| _|| _|| _| jdk	rB|  | ¡ dS )z#Simple method to update the ranges.rA   N)r   r'   rB   rE   rF   rG   rH   r<   )r   r"   rD   r)   r   r   r   r	   rC   Ž   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   )rC   r   r   r   r	   Úunset˜   s    zContentRange.unsetc                 C  sb   | j d krdS | jd krd}n| j}| jd kr>| j › d|› �S | j › d| j› d| jd › d|› �S )Nr   Ú*z */r   r.   r%   r4   )r   r)   r"   rD   )r   r)   r   r   r	   r   ž   s    


zContentRange.to_headerc                 C  s
   | j d k	S r   rI   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   r"   rD   r)   rC   rJ   r   rL   r   r   r   r   r   r	   r+   y   s   


r+   é   )r   N)Ú
__future__r   r   r   r@   r+   r   r   r   r   r   r	   Ú<module>   s
   K;