U
    M}g%                     @  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 )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
    Nc                 C  s   || _ || _d S N)etagdate)selfr   r    r   A/tmp/pip-unpacked-wheel-s46b54kd/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 )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   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 )zCreates 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;