U
    /v¶hÙ  ã                   @  s‚   d dl mZ d dlmZ ddlmZ dd„ ZG dd„ dƒZG d	d
„ d
ƒZG dd„ deƒZ	G dd„ dƒZ
dd„ ZG dd„ deƒZdS )é    )Úannotations)Úrepeaté   )Ú_missingc                 C  s   t t| ƒj›d�ƒ‚d S )Nz objects are immutable)Ú	TypeErrorÚtypeÚ__name__©Úself© r   úB/tmp/pip-unpacked-wheel-c3xdgso7/werkzeug/datastructures/mixins.pyÚis_immutable   s    r   c                   @  s€   e Zd 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d„ Zdd„ Zdd„ Zddd„Zdd„ Zd dd„ZdS )!ÚImmutableListMixinzOMakes a :class:`list` immutable.

    .. versionadded:: 0.5

    :private:
    Nc                 C  s&   | j d k	r| j S tt| ƒƒ }| _ |S ©N)Ú_hash_cacheÚhashÚtuple©r
   Úrvr   r   r   Ú__hash__   s    
zImmutableListMixin.__hash__c                 C  s   t | ƒt| ƒffS r   )r   Úlist©r
   Úprotocolr   r   r   Ú__reduce_ex__   s    z ImmutableListMixin.__reduce_ex__c                 C  s   t | ƒ d S r   ©r   ©r
   Úkeyr   r   r   Ú__delitem__   s    zImmutableListMixin.__delitem__c                 C  s   t | ƒ d S r   r   ©r
   Úotherr   r   r   Ú__iadd__"   s    zImmutableListMixin.__iadd__c                 C  s   t | ƒ d S r   r   r   r   r   r   Ú__imul__%   s    zImmutableListMixin.__imul__c                 C  s   t | ƒ d S r   r   ©r
   r   Úvaluer   r   r   Ú__setitem__(   s    zImmutableListMixin.__setitem__c                 C  s   t | ƒ d S r   r   ©r
   Úitemr   r   r   Úappend+   s    zImmutableListMixin.appendc                 C  s   t | ƒ d S r   r   r%   r   r   r   Úremove.   s    zImmutableListMixin.removec                 C  s   t | ƒ d S r   r   )r
   Úiterabler   r   r   Úextend1   s    zImmutableListMixin.extendc                 C  s   t | ƒ d S r   r   ©r
   Úposr#   r   r   r   Úinsert4   s    zImmutableListMixin.insertéÿÿÿÿc                 C  s   t | ƒ d S r   r   )r
   Úindexr   r   r   Úpop7   s    zImmutableListMixin.popc                 C  s   t | ƒ d S r   r   r	   r   r   r   Úreverse:   s    zImmutableListMixin.reverseFc                 C  s   t | ƒ d S r   r   )r
   r   r1   r   r   r   Úsort=   s    zImmutableListMixin.sort)r.   )NF)r   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r    r!   r$   r'   r(   r*   r-   r0   r1   r2   r   r   r   r   r      s   
r   c                      s~   e Zd ZdZdZed‡ fdd„	ƒZdd„ Zdd„ Zd	d
„ Z	ddd„Z
dd„ Zddd„Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚImmutableDictMixinzOMakes a :class:`dict` immutable.

    .. versionadded:: 0.5

    :private:
    Nc                   s$   t ƒ  | ¡}| t|t|ƒƒ¡ |S r   )ÚsuperÚ__new__Ú__init__Úzipr   )ÚclsÚkeysr#   Úinstance©Ú	__class__r   r   ÚfromkeysK   s    zImmutableDictMixin.fromkeysc                 C  s   t | ƒt| ƒffS r   )r   Údictr   r   r   r   r   Q   s    z ImmutableDictMixin.__reduce_ex__c                 C  s   |   ¡ S r   ©Úitemsr	   r   r   r   Ú_iter_hashitemsT   s    z"ImmutableDictMixin._iter_hashitemsc                 C  s*   | j d k	r| j S tt|  ¡ ƒƒ }| _ |S r   )r   r   Ú	frozensetrD   r   r   r   r   r   W   s    
zImmutableDictMixin.__hash__c                 C  s   t | ƒ d S r   r   ©r
   r   Údefaultr   r   r   Ú
setdefault]   s    zImmutableDictMixin.setdefaultc                 O  s   t | ƒ d S r   r   ©r
   ÚargsÚkwargsr   r   r   Úupdate`   s    zImmutableDictMixin.updatec                 C  s   t | ƒ d S r   r   rF   r   r   r   r0   c   s    zImmutableDictMixin.popc                 C  s   t | ƒ d S r   r   r	   r   r   r   Úpopitemf   s    zImmutableDictMixin.popitemc                 C  s   t | ƒ d S r   r   r"   r   r   r   r$   i   s    zImmutableDictMixin.__setitem__c                 C  s   t | ƒ d S r   r   r   r   r   r   r   l   s    zImmutableDictMixin.__delitem__c                 C  s   t | ƒ d S r   r   r	   r   r   r   Úclearo   s    zImmutableDictMixin.clear)N)N)N)r   r3   r4   r5   r   Úclassmethodr@   r   rD   r   rH   rL   r0   rM   r$   r   rN   Ú__classcell__r   r   r>   r   r6   A   s   

r6   c                   @  sJ   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d„Z
dS )ÚImmutableMultiDictMixinzTMakes a :class:`MultiDict` immutable.

    .. versionadded:: 0.5

    :private:
    c                 C  s   t | ƒt| jdd�ƒffS ©NT)Zmulti)r   r   rC   r   r   r   r   r   {   s    z%ImmutableMultiDictMixin.__reduce_ex__c                 C  s   | j dd�S rR   rB   r	   r   r   r   rD   ~   s    z'ImmutableMultiDictMixin._iter_hashitemsc                 C  s   t | ƒ d S r   r   r"   r   r   r   Úadd�   s    zImmutableMultiDictMixin.addc                 C  s   t | ƒ d S r   r   r	   r   r   r   Úpopitemlist„   s    z#ImmutableMultiDictMixin.popitemlistc                 C  s   t | ƒ d S r   r   r   r   r   r   Úpoplist‡   s    zImmutableMultiDictMixin.poplistc                 C  s   t | ƒ d S r   r   )r
   r   Znew_listr   r   r   ÚsetlistŠ   s    zImmutableMultiDictMixin.setlistNc                 C  s   t | ƒ d S r   r   )r
   r   Zdefault_listr   r   r   Úsetlistdefault�   s    z&ImmutableMultiDictMixin.setlistdefault)N)r   r3   r4   r5   r   rD   rS   rT   rU   rV   rW   r   r   r   r   rQ   s   s   rQ   c                   @  s†   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d„ Zdd„ Zdd„ Zdefdd„Zdd„ Zdd„ Zdd„ ZdS )ÚImmutableHeadersMixinzÞMakes a :class:`Headers` immutable.  We do not mark them as
    hashable though since the only usecase for this datastructure
    in Werkzeug is a view on a mutable structure.

    .. versionadded:: 0.5

    :private:
    c                 K  s   t | ƒ d S r   r   )r
   r   rK   r   r   r   r   ›   s    z!ImmutableHeadersMixin.__delitem__c                 C  s   t | ƒ d S r   r   r"   r   r   r   r$   ž   s    z!ImmutableHeadersMixin.__setitem__c                 K  s   t | ƒ d S r   r   ©r
   Ú_keyÚ_valuerK   r   r   r   Úset¡   s    zImmutableHeadersMixin.setc                 C  s   t | ƒ d S r   r   )r
   r   Úvaluesr   r   r   rV   ¤   s    zImmutableHeadersMixin.setlistc                 K  s   t | ƒ d S r   r   rY   r   r   r   rS   §   s    zImmutableHeadersMixin.addc                 K  s   t | ƒ d S r   r   )r
   rZ   r[   Ú_kwargsr   r   r   Ú
add_headerª   s    z ImmutableHeadersMixin.add_headerc                 C  s   t | ƒ d S r   r   r   r   r   r   r(   ­   s    zImmutableHeadersMixin.removec                 O  s   t | ƒ d S r   r   rI   r   r   r   r*   °   s    zImmutableHeadersMixin.extendc                 O  s   t | ƒ d S r   r   rI   r   r   r   rL   ³   s    zImmutableHeadersMixin.updatec                 C  s   t | ƒ d S r   r   r+   r   r   r   r-   ¶   s    zImmutableHeadersMixin.insertNc                 C  s   t | ƒ d S r   r   rF   r   r   r   r0   ¹   s    zImmutableHeadersMixin.popc                 C  s   t | ƒ d S r   r   r	   r   r   r   rM   ¼   s    zImmutableHeadersMixin.popitemc                 C  s   t | ƒ d S r   r   rF   r   r   r   rH   ¿   s    z ImmutableHeadersMixin.setdefaultc                 C  s   t | ƒ d S r   r   rF   r   r   r   rW   Â   s    z$ImmutableHeadersMixin.setlistdefault)r   r3   r4   r5   r   r$   r\   rV   rS   r_   r(   r*   rL   r-   r   r0   rM   rH   rW   r   r   r   r   rX   ‘   s   	rX   c                   s   ‡ fdd„}ˆ |_ |S )Nc                   s.   t tt| ƒˆ ƒ||Ž}| jd k	r*|  | ¡ |S r   )Úgetattrr7   ÚUpdateDictMixinÚ	on_update)r
   rJ   Úkwr   ©Únamer   r   ÚoncallÇ   s    

z_calls_update.<locals>.oncall)r   )re   rf   r   rd   r   Ú_calls_updateÆ   s    rg   c                      s^   e Zd ZdZdZd‡ fdd„	Zef‡ fdd„	ZedƒZ	edƒZ
ed	ƒZed
ƒZedƒZ‡  ZS )ra   zbMakes dicts call `self.on_update` on modifications.

    .. versionadded:: 0.5

    :private:
    Nc                   s2   || k}t ƒ  ||¡}|r.| jd k	r.|  | ¡ |S r   )r7   rH   rb   ©r
   r   rG   Úmodifiedr   r>   r   r   rH   Ý   s
    
zUpdateDictMixin.setdefaultc                   sH   || k}|t krtƒ  |¡}ntƒ  ||¡}|rD| jd k	rD|  | ¡ |S r   )r   r7   r0   rb   rh   r>   r   r   r0   ä   s    
zUpdateDictMixin.popr$   r   rN   rM   rL   )N)r   r3   r4   r5   rb   rH   r   r0   rg   r$   r   rN   rM   rL   rP   r   r   r>   r   ra   Ó   s   
ra   N)Ú
__future__r   Ú	itertoolsr   Ú	_internalr   r   r   r6   rQ   rX   rg   rA   ra   r   r   r   r   Ú<module>   s   525