o
    wvXjÒk  ã                   @   sL  d Z ddlmZmZ ddlZddlmZ ddlmZ ddl	m
Z
mZmZ ddlmZmZ ddlmZmZmZmZmZmZmZ d	d
lmZmZ d	dlmZ zddlmZmZm Z m!Z! ddlm"Z" W n e#y{   ddlmZmZm Z m!Z! ddlm"Z" Y nw zddl$m%Z& W n e#y�   dZ&Y nw z
ddl'm(Z(m)Z) W n e#y­   G dd„ de*ƒZ(e(Z)Y nw dZ+dZ,dd„ Z-dd„ Z.G dd„ deƒZG dd„ de*ƒZ/G dd„ de0e/ƒZ1G dd„ de*ƒZ2e  3e2¡ G d d!„ d!e ƒZ4eG d"d#„ d#e4e/ƒƒZ5eG d$d%„ d%e*ƒƒZ6e! 3e6¡ G d&d'„ d'e*ƒZ7eG d(d)„ d)e7ƒƒZ8e" 3e8¡ eG d*d+„ d+ee7ƒƒZ9dS ),z8Custom maps, sets, sequences, and other data structures.é    )Úabsolute_importÚunicode_literalsN)ÚOrderedDict)Údeque)ÚheapifyÚheappopÚheappush)ÚchainÚcount)ÚPY3ÚEmptyÚitemsÚkeysÚ	monotonicÚpython_2_unicode_compatibleÚvaluesé   )ÚfirstÚuniq)Ú
match_case)ÚCallableÚMappingÚMutableMappingÚ
MutableSet)ÚSequence)Úreversed_dict)Ú
LazyObjectÚLazySettingsc                   @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__© r!   r!   úU/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/utils/collections.pyr   #   s    r   )ÚAttributeDictMixinÚAttributeDictÚ	BufferMapÚChainMapÚConfigurationViewÚDictAttributeÚ	EvictableÚ
LimitedSetÚMessagebufferr   Úforce_mappingÚlpmergezK<{name}({size}): maxlen={0.maxlen}, expires={0.expires}, minlen={0.minlen}>c                 C   s*   t | ttfƒr
| j} t | tƒst| ƒS | S )z?Wrap object into supporting the mapping interface if necessary.)Ú
isinstancer   r   Ú_wrappedr   r(   ©Úmr!   r!   r"   r,   3   s   r,   c                    s    | j ‰ ‡ fdd„t|ƒD ƒ | S )zpIn place left precedent dictionary merge.

    Keeps values from `L`, if the value in `R` is :const:`None`.
    c                    s"   g | ]\}}|d urˆ ||ƒ‘qS ©Nr!   )Ú.0ÚkÚv©Úsetitemr!   r"   Ú
<listcomp>B   s   " zlpmerge.<locals>.<listcomp>)Ú__setitem__r   )ÚLÚRr!   r6   r"   r-   ;   s   r-   c                   @   s^   e Zd ZdZerdd„ Znerdd„ Zndd„ Zeedƒs-er&ddd	„Z	dS dd
d	„Z	dS dS )r   z#Dict where insertion order matters.c                 C   s   t tt| ƒƒƒS r2   )ÚnextÚiterr   ©Úselfr!   r!   r"   Ú_LRUkeyJ   s   zOrderedDict._LRUkeyc                 C   ó   t |  ¡ ƒS r2   )r<   Úiterkeysr>   r!   r!   r"   r@   Q   ó   c                 C   s   | j d d S )Nr   é   )Ú_OrderedDict__rootr>   r!   r!   r"   r@   V   ó   Úmove_to_endTc                 C   s   |st dƒ‚|  |¡| |< d S )Nzno last=True on PyPy)ÚNotImplementedErrorÚpop)r?   ÚkeyÚlastr!   r!   r"   rG   ]   s   zOrderedDict.move_to_endc                 C   sŒ   | j | }|d }|d }||d< ||d< | j}|r0|d }||d< ||d< | |d< |d< d S |d }||d< ||d< | |d< |d< d S ©Nr   r   )Ú_OrderedDict__maprE   )r?   rJ   rK   ÚlinkÚ	link_prevÚ	link_nextÚrootÚ
first_noder!   r!   r"   rG   h   s   
N)T)
r   r   r    Ú__doc__r   r@   Ú_dict_is_orderedÚhasattrÚ_OrderedDictrG   r!   r!   r!   r"   r   F   s    


òr   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r#   z[Mixin for Mapping interface that adds attribute access.

    I.e., `d.key -> d[key]`).
    c                 C   s0   z| | W S  t y   td t| ƒj|¡ƒ‚w )z`d.key -> d[key]`.z#{0!r} object has no attribute {1!r})ÚKeyErrorÚAttributeErrorÚformatÚtyper   )r?   r4   r!   r!   r"   Ú__getattr__‚   s   

ÿÿÿzAttributeDictMixin.__getattr__c                 C   s   || |< dS )z"`d[key] = value -> d.key = value`.Nr!   ©r?   rJ   Úvaluer!   r!   r"   Ú__setattr__Œ   rC   zAttributeDictMixin.__setattr__N)r   r   r    rS   r[   r^   r!   r!   r!   r"   r#   |   s    
r#   c                   @   s   e Zd ZdZdS )r$   z$Dict subclass with attribute access.N)r   r   r    rS   r!   r!   r!   r"   r$   ’   s    r$   c                   @   sº   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd#d	d
„Zd#dd„Z	dd„ Z
dd„ Zdd„ Zdd„ ZeZdd„ Zdd„ ZeZdd„ ZeZejd dkrOeZeZeZdS dd„ Zdd „ Zd!d"„ ZdS )$r(   z[Dict interface to attributes.

    `obj[k] -> obj.k`
    `obj[k] = val -> obj.k = val`
    Nc                 C   s   t  | d|¡ d S )NÚobj)Úobjectr^   )r?   r_   r!   r!   r"   Ú__init__Ÿ   ó   zDictAttribute.__init__c                 C   ó   t | j|ƒS r2   )Úgetattrr_   ©r?   rJ   r!   r!   r"   r[   £   ó   zDictAttribute.__getattr__c                 C   s   t | j||ƒS r2   ©Úsetattrr_   r\   r!   r!   r"   r^   §   rF   zDictAttribute.__setattr__c                 C   ó"   z| | W S  t y   | Y S w r2   ©rW   ©r?   rJ   Údefaultr!   r!   r"   Úget«   ó
   
ÿzDictAttribute.getc                 C   s   || vr
|| |< d S d S r2   r!   rk   r!   r!   r"   Ú
setdefault²   s   ÿzDictAttribute.setdefaultc                 C   s&   zt | j|ƒW S  ty   t|ƒ‚w r2   )rd   r_   rX   rW   re   r!   r!   r"   Ú__getitem__·   s
   ÿzDictAttribute.__getitem__c                 C   s   t | j||ƒ d S r2   rg   r\   r!   r!   r"   r9   ¾   rb   zDictAttribute.__setitem__c                 C   rc   r2   )rU   r_   re   r!   r!   r"   Ú__contains__Â   rf   zDictAttribute.__contains__c                 C   s   t t| jƒƒS r2   )r=   Údirr_   r>   r!   r!   r"   Ú_iterate_keysÆ   rF   zDictAttribute._iterate_keysc                 C   ó   |   ¡ S r2   ©rs   r>   r!   r!   r"   Ú__iter__Ë   ó   zDictAttribute.__iter__c                 c   s&   � |   ¡ D ]}|t| j|ƒfV  qd S r2   ©rs   rd   r_   re   r!   r!   r"   Ú_iterate_itemsÏ   s   €ÿzDictAttribute._iterate_itemsc                 c   s"   � |   ¡ D ]	}t| j|ƒV  qd S r2   rx   re   r!   r!   r"   Ú_iterate_valuesÕ   s   €ÿzDictAttribute._iterate_valuesr   é   c                 C   ó   t | ƒS r2   )Úlistr>   r!   r!   r"   r   á   rw   zDictAttribute.keysc                 C   rA   r2   ©r}   ry   r>   r!   r!   r"   r   å   rf   zDictAttribute.itemsc                 C   rA   r2   ©r}   rz   r>   r!   r!   r"   r   é   rf   zDictAttribute.valuesr2   )r   r   r    rS   r_   ra   r[   r^   rm   ro   rp   r9   rq   rs   rB   rv   ry   Ú	iteritemsrz   Ú
itervaluesÚsysÚversion_infor   r   r   r!   r!   r!   r"   r(   –   s2    

r(   c                   @   s6  e Zd ZdZdZdZdZdZg 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„ Zdd„ Zdd„ ZeZd;dd „Zd!d"„ Zd#d$„ Zed%d&„ ƒZd'd(„ ZeZd)d*„ Zd+d,„ Z e Z!d-d.„ Z"e"Z#d/d0„ Z$e$Z%d1d2„ Z&e'j(d3 d4kr�e Z)e"Z*e$Z+dS d5d6„ Z)d7d8„ Z*d9d:„ Z+dS )<r&   z!Key lookup on a sequence of maps.Nc                 O   s8   t |pi gƒ}| jj| d¡||d |dd … d� d S )NÚkey_tr   r   )r„   ÚmapsÚchangesÚdefaults)r}   Ú__dict__Úupdaterm   )r?   r…   Úkwargsr!   r!   r"   ra   ú   s   

üzChainMap.__init__c                 C   s(   t |ƒ}| j d|¡ | j d|¡ d S rL   )r,   r‡   Úinsertr…   )r?   Údr!   r!   r"   Úadd_defaults  s   zChainMap.add_defaultsc                 G   s8   z| j d j|g|¢R Ž W S  ty   td |¡ƒ‚w )Nr   z(Key not found in the first mapping: {!r})r…   rI   rW   rY   rk   r!   r!   r"   rI   
  s   ÿÿzChainMap.popc                 C   s   t |ƒ‚r2   rj   re   r!   r!   r"   Ú__missing__  rw   zChainMap.__missing__c                 C   s   | j d ur
|   |¡S |S r2   )r„   re   r!   r!   r"   Ú_key  ó   zChainMap._keyc              	   C   s@   |   |¡}| jD ]}z|| W   S  ty   Y qw |  |¡S r2   )r�   r…   rW   rŽ   )r?   rJ   r�   Úmappingr!   r!   r"   rp     s   

ÿ
zChainMap.__getitem__c                 C   ó   || j |  |¡< d S r2   ©r†   r�   r\   r!   r!   r"   r9   $  ó   zChainMap.__setitem__c                 C   s2   z
| j |  |¡= W d S  ty   td |¡ƒ‚w )Nz%Key not found in first mapping: {0!r})r†   r�   rW   rY   re   r!   r!   r"   Ú__delitem__(  s
   ÿzChainMap.__delitem__c                 C   s   | j  ¡  d S r2   ©r†   Úclearr>   r!   r!   r"   r—   /  rF   zChainMap.clearc                 C   s(   z| |   |¡ W S  ty   | Y S w r2   )r�   rW   rk   r!   r!   r"   rm   3  s
   ÿzChainMap.getc                 C   s   t tƒ j| jŽ ƒS r2   )ÚlenÚsetÚunionr…   r>   r!   r!   r"   Ú__len__:  rb   zChainMap.__len__c                 C   rt   r2   ru   r>   r!   r!   r"   rv   >  s   zChainMap.__iter__c                    s"   |   ˆ ¡‰ t‡ fdd„| jD ƒƒS )Nc                 3   s   � | ]}ˆ |v V  qd S r2   r!   )r3   r1   ©rJ   r!   r"   Ú	<genexpr>D  ó   € z(ChainMap.__contains__.<locals>.<genexpr>)r�   Úanyr…   re   r!   rœ   r"   rq   A  ó   
zChainMap.__contains__c                 C   ó
   t | jƒS r2   )rŸ   r…   r>   r!   r!   r"   Ú__bool__F  ó   
zChainMap.__bool__c                 C   s"   |   |¡}|| vr|| |< d S d S r2   )r�   rk   r!   r!   r"   ro   K  s   
ÿzChainMap.setdefaultc                 O   s0   | j j|i |¤Ž}| jD ]	}||i |¤Ž q|S r2   )r†   r‰   Ú
_observers)r?   ÚargsrŠ   ÚresultÚcallbackr!   r!   r"   r‰   Q  s   
zChainMap.updatec                 C   s   d  | d tt| jƒ¡¡S )Nz{0.__class__.__name__}({1})z, )rY   ÚjoinÚmapÚreprr…   r>   r!   r!   r"   Ú__repr__X  ó   ÿzChainMap.__repr__c                 G   s   | t j|g|¢R Ž ƒS )z?Create a ChainMap with a single dict created from the iterable.)ÚdictÚfromkeys)ÚclsÚiterabler¥   r!   r!   r"   r®   ]  s   zChainMap.fromkeysc                 C   s&   | j | jd  ¡ g| jdd … ¢R Ž S rL   )Ú	__class__r…   Úcopyr>   r!   r!   r"   r²   c  s   &zChainMap.copyc                    s   t ‡ fdd„t| jƒD ƒŽ S )Nc                    s   g | ]}ˆ |ƒ‘qS r!   r!   )r3   rŒ   ©Úopr!   r"   r8   n  ó    z"ChainMap._iter.<locals>.<listcomp>)r	   Úreversedr…   )r?   r´   r!   r³   r"   Ú_iterh  s   zChainMap._iterc                 C   s   t |  dd„ ¡ƒS )Nc                 S   rt   r2   ©r   )rŒ   r!   r!   r"   Ú<lambda>r  s    z(ChainMap._iterate_keys.<locals>.<lambda>)r   r·   r>   r!   r!   r"   rs   p  rb   zChainMap._iterate_keysc                    ó   ‡ fdd„ˆ D ƒS )Nc                 3   s   � | ]	}|ˆ | fV  qd S r2   r!   ©r3   rJ   r>   r!   r"   r�   w  s   € z*ChainMap._iterate_items.<locals>.<genexpr>r!   r>   r!   r>   r"   ry   u  rb   zChainMap._iterate_itemsc                    rº   )Nc                 3   s   � | ]}ˆ | V  qd S r2   r!   r»   r>   r!   r"   r�   |  rž   z+ChainMap._iterate_values.<locals>.<genexpr>r!   r>   r!   r>   r"   rz   z  rb   zChainMap._iterate_valuesc                 C   s   | j  |¡ d S r2   )r¤   Úappend)r?   r§   r!   r!   r"   Úbind_to  s   zChainMap.bind_tor   r{   c                 C   rA   r2   )r}   rs   r>   r!   r!   r"   r   ˆ  rf   zChainMap.keysc                 C   rA   r2   r~   r>   r!   r!   r"   r   Œ  rf   zChainMap.itemsc                 C   rA   r2   r   r>   r!   r!   r"   r   �  rf   zChainMap.valuesr2   ),r   r   r    rS   r„   r†   r‡   r…   r¤   ra   r�   rI   rŽ   r�   rp   r9   r•   r—   rm   r›   rv   rq   r¢   Ú__nonzero__ro   r‰   r«   Úclassmethodr®   r²   Ú__copy__r·   rs   rB   ry   r€   rz   r�   r½   r‚   rƒ   r   r   r   r!   r!   r!   r"   r&   ñ   sX    




r&   c                       sh   e Zd ZdZd‡ fdd„	Zdd„ Z‡ fdd„Zd	d
„ Zdd„ Zddd„Z	dd„ Z
dd„ Zdd„ Z‡  ZS )r'   a�  A view over an applications configuration dictionaries.

    Custom (but older) version of :class:`collections.ChainMap`.

    If the key does not exist in ``changes``, the ``defaults``
    dictionaries are consulted.

    Arguments:
        changes (Mapping): Map of configuration changes.
        defaults (List[Mapping]): List of dictionaries containing
            the default configuration.
    Nc                    sN   |d u rg n|}t t| ƒj|g|¢R Ž  | jj|r | d¡d n||d� d S )NÚ_)ÚprefixÚ_keys)Úsuperr'   ra   rˆ   r‰   Úrstrip)r?   r†   r‡   r   rÂ   ©r±   r!   r"   ra   ¤  s   
þzConfigurationView.__init__c                 C   s4   | j }|r| |¡s|| n|}t||ƒ|fS |fS r2   )rÂ   Ú
startswithr   )r?   rJ   rÂ   Úpkeyr!   r!   r"   Ú_to_keys­  s
   zConfigurationView._to_keysc              	      sš   |   ˆ ¡}tt| ƒj}|| jrt‡ fdd„| jD ƒƒnd D ]}z||ƒW   S  ty0   Y qw z|  ˆ ¡W S  tyL   t|ƒdkrKtdj	|Ž ƒ‚‚ w )Nc                 3   s   � | ]}|ˆ ƒV  qd S r2   r!   )r3   Úfrœ   r!   r"   r�   º  rž   z0ConfigurationView.__getitem__.<locals>.<genexpr>r!   r   z)Key not found: {0!r} (with prefix: {0!r}))
rÉ   rÄ   r'   rp   rÃ   ÚtuplerW   rŽ   r˜   rY   )r?   rJ   r   Úgetitemr4   rÆ   rœ   r"   rp   µ  s&   
 ÿÿÿüzConfigurationView.__getitem__c                 C   r’   r2   r“   r\   r!   r!   r"   r9   È  r”   zConfigurationView.__setitem__c                    s   t d ‡ fdd„|D ƒƒS )Nc                 3   s   � | ]}ˆ   |¡V  qd S r2   )rm   r»   r>   r!   r"   r�   Î  s   € z*ConfigurationView.first.<locals>.<genexpr>)r   )r?   r   r!   r>   r"   r   Ì  r�   zConfigurationView.firstc                 C   ri   r2   rj   rk   r!   r!   r"   rm   Ð  rn   zConfigurationView.getc                 C   s   | j  ¡  dS )z&Remove all changes, but keep defaults.Nr–   r>   r!   r!   r"   r—   ×  s   zConfigurationView.clearc                    s"   |   |¡‰ t‡ fdd„| jD ƒƒS )Nc                 3   s&   � | ]‰ t ‡ fd d„ˆD ƒƒV  qdS )c                 3   s   � | ]}|ˆ v V  qd S r2   r!   )r3   r4   r0   r!   r"   r�   ß  rž   z;ConfigurationView.__contains__.<locals>.<genexpr>.<genexpr>N)rŸ   )r3   r¸   r0   r"   r�   ß  s   €$ z1ConfigurationView.__contains__.<locals>.<genexpr>)rÉ   rŸ   r…   re   r!   r¸   r"   rq   Ü  r    zConfigurationView.__contains__c                 C   s@   |j d }|j d }| j j|||j d |j d |g| d� d S )Nr†   r‡   r„   rÂ   )r†   r‡   r„   rÂ   r…   )rˆ   r‰   )r?   Úotherr†   r‡   r!   r!   r"   Ú	swap_withá  s   


ûzConfigurationView.swap_with)NNNr2   )r   r   r    rS   ra   rÉ   rp   r9   r   rm   r—   rq   rÎ   Ú__classcell__r!   r!   rÆ   r"   r'   •  s    	
r'   c                   @   sÀ   e Zd ZdZdZd+dd„Zdd„ Zd	d
„ Zdd„ Zd,dd„Z	dd„ Z
dd„ ZeZd,dd„Zd,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eZed)d*„ ƒZdS )-r*   a*  Kind-of Set (or priority queue) with limitations.

    Good for when you need to test for membership (`a in set`),
    but the set should not grow unbounded.

    ``maxlen`` is enforced at all times, so if the limit is reached
    we'll also remove non-expired items.

    You can also configure ``minlen``: this is the minimal residual size
    of the set.

    All arguments are optional, and no limits are enabled by default.

    Arguments:
        maxlen (int): Optional max number of items.
            Adding more items than ``maxlen`` will result in immediate
            removal of items sorted by oldest insertion time.

        expires (float): TTL for all items.
            Expired items are purged as keys are inserted.

        minlen (int): Minimal residual size of this set.
            .. versionadded:: 4.0

            Value must be less than ``maxlen`` if both are configured.

            Older expired items will be deleted, only after the set
            exceeds ``minlen`` number of items.

        data (Sequence): Initial data to initialize set with.
            Can be an iterable of ``(key, value)`` pairs,
            a dict (``{key: insertion_time}``), or another instance
            of :class:`LimitedSet`.

    Example:
        >>> s = LimitedSet(maxlen=50000, expires=3600, minlen=4000)
        >>> for i in range(60000):
        ...     s.add(i)
        ...     s.add(str(i))
        ...
        >>> 57000 in s  # last 50k inserted values are kept
        True
        >>> '10' in s  # '10' did expire and was purged from set.
        False
        >>> len(s)  # maxlen is reached
        50000
        >>> s.purge(now=monotonic() + 7200)  # clock + 2 hours
        >>> len(s)  # now only minlen items are cached
        4000
        >>>> 57000 in s  # even this item is gone now
        False
    é   r   Nc                 C   sŽ   |d u rdn|| _ |d u rdn|| _|d u rdn|| _i | _g | _|r(|  |¡ | j | j  kr7dks<tdƒ‚ tdƒ‚| jdk rEtdƒ‚d S )Nr   z:minlen must be a positive number, less or equal to maxlen.zexpires cannot be negative!)ÚmaxlenÚminlenÚexpiresÚ_dataÚ_heapr‰   Ú
ValueError)r?   rÑ   rÓ   ÚdatarÒ   r!   r!   r"   ra   '  s$   
ÿÿÿ
ÿzLimitedSet.__init__c                 C   s,   dd„ t | jƒD ƒ| jdd…< t| jƒ dS )z=Time consuming recreating of heap.  Don't run this too often.c                 S   s   g | ]}|‘qS r!   r!   )r3   Úentryr!   r!   r"   r8   <  s    z,LimitedSet._refresh_heap.<locals>.<listcomp>N)r   rÔ   rÕ   r   r>   r!   r!   r"   Ú_refresh_heap9  s   zLimitedSet._refresh_heapc                 C   s   | j | jkr|  ¡  d S d S r2   )Ú_heap_overloadÚmax_heap_percent_overloadrÙ   r>   r!   r!   r"   Ú_maybe_refresh_heap?  s   ÿzLimitedSet._maybe_refresh_heapc                 C   s   | j  ¡  g | jdd…< dS )z)Clear all data, start from scratch again.N)rÔ   r—   rÕ   r>   r!   r!   r"   r—   D  s   
zLimitedSet.clearc                 C   sf   |pt ƒ }|| jv r|  |¡ ||f}|| j|< t| j|ƒ | jr/t| jƒ| jkr1|  ¡  dS dS dS )z=Add a new item, or reset the expiry time of an existing item.N)r   rÔ   Údiscardr   rÕ   rÑ   r˜   Úpurge)r?   ÚitemÚnowrØ   r!   r!   r"   ÚaddJ  s   



ÿzLimitedSet.addc                 C   s¬   |sdS t |tƒr| j |j¡ |  ¡  |  ¡  dS t |tƒrJt|ƒD ]$\}}t |tt	fƒr2|d }t |t
ƒsAtd t|ƒ|¡ƒ‚|  ||¡ q#dS |D ]}|  |¡ qLdS )z8Update this set from other LimitedSet, dict or iterable.Nr   z9Expecting float timestamp, got type {0!r} with value: {1})r.   r*   rÔ   r‰   rÙ   rÞ   r­   r   rË   r}   ÚfloatrÖ   rY   rZ   rá   )r?   rÍ   rJ   Úinsertedr_   r!   r!   r"   r‰   V  s,   


ÿþ÷ÿzLimitedSet.updatec                 C   s   | j  |d ¡ |  ¡  d S r2   )rÔ   rI   rÜ   ©r?   rß   r!   r!   r"   rÝ   q  s   zLimitedSet.discardc                 C   sÈ   |pt ƒ }t|tƒr|ƒ n|}| jr&t| jƒ| jkr&|  ¡  t| jƒ| jks| jr`t| jƒ| j  kr7dkrbn dS | j	d \}}|| j |krJdS |  ¡  t| jƒ| j  kr]dks:dS  dS dS dS )zÁCheck oldest items and remove them if needed.

        Arguments:
            now (float): Time of purging -- by default right now.
                This can be useful for unit testing.
        r   N)
r   r.   r   rÑ   r˜   rÔ   rI   rÓ   rÒ   rÕ   )r?   rà   Úinserted_timerÁ   r!   r!   r"   rÞ   x  s   
ÿ"$üÿzLimitedSet.purgec                 C   sD   | j r t| j ƒ\}}z	| j |¡ W |S  ty   Y nw | j s|S )z?Remove and return the oldest item, or :const:`None` when empty.)rÕ   r   rÔ   rI   rW   )r?   rl   rÁ   rß   r!   r!   r"   rI   �  s   ýÿüzLimitedSet.popc                 C   s   dd„ t | jƒD ƒS )a6  Whole set as serializable dictionary.

        Example:
            >>> s = LimitedSet(maxlen=200)
            >>> r = LimitedSet(maxlen=200)
            >>> for i in range(500):
            ...     s.add(i)
            ...
            >>> r.update(s.as_dict())
            >>> r == s
            True
        c                 S   s   i | ]\}}||“qS r!   r!   )r3   rã   rJ   r!   r!   r"   Ú
<dictcomp>¨  s    z&LimitedSet.as_dict.<locals>.<dictcomp>)r   rÔ   r>   r!   r!   r"   Úas_dictš  s   zLimitedSet.as_dictc                 C   s   | j |j kS r2   ©rÔ   ©r?   rÍ   r!   r!   r"   Ú__eq__ª  rf   zLimitedSet.__eq__c                 C   s   |   |¡ S r2   )rê   ré   r!   r!   r"   Ú__ne__®  rf   zLimitedSet.__ne__c                 C   s   t j| t| ƒjt| ƒd�S )N)ÚnameÚsize)ÚREPR_LIMITED_SETrY   rZ   r   r˜   r>   r!   r!   r"   r«   ²  s   ÿzLimitedSet.__repr__c                 C   s   dd„ t t| jƒƒD ƒS )Nc                 s   s   � | ]\}}|V  qd S r2   r!   )r3   rÁ   Úir!   r!   r"   r�   º  rž   z&LimitedSet.__iter__.<locals>.<genexpr>)Úsortedr   rÔ   r>   r!   r!   r"   rv   ¸  r�   zLimitedSet.__iter__c                 C   r¡   r2   )r˜   rÔ   r>   r!   r!   r"   r›   ¼  r£   zLimitedSet.__len__c                 C   ó
   || j v S r2   rè   re   r!   r!   r"   rq   À  r£   zLimitedSet.__contains__c                 C   s   | j | j| j|  ¡ | jffS r2   )r±   rÑ   rÓ   rç   rÒ   r>   r!   r!   r"   Ú
__reduce__Ä  s   ÿzLimitedSet.__reduce__c                 C   r¡   r2   )ÚboolrÔ   r>   r!   r!   r"   r¢   É  r£   zLimitedSet.__bool__c                 C   s"   t | jƒd tt | jƒdƒ d S )z5Compute how much is heap bigger than data [percents].éd   r   )r˜   rÕ   ÚmaxrÔ   r>   r!   r!   r"   rÚ   Î  s   "zLimitedSet._heap_overload)r   r   Nr   r2   )r   r   r    rS   rÛ   ra   rÙ   rÜ   r—   rá   r‰   rÝ   Ú	pop_valuerÞ   rI   rç   rê   rë   r«   rv   r›   rq   rò   r¢   r¾   ÚpropertyrÚ   r!   r!   r!   r"   r*   î  s2    5



r*   c                   @   s2   e Zd ZdZeZdd„ Zdefdd„Zdd„ Zd	S )
r)   z2Mixin for classes supporting the ``evict`` method.c                 C   s   | j td� dS )z&Force evict until maxsize is enforced.)ÚrangeN)Ú_evictr
   r>   r!   r!   r"   ÚevictÝ  s   zEvictable.evictrô   c                    s2   z‡ fdd„||ƒD ƒ W d S  t y   Y d S w )Nc                    s   g | ]}ˆ   ¡ ‘qS r!   )Ú_evict1)r3   rÁ   r>   r!   r"   r8   å  rµ   z$Evictable._evict.<locals>.<listcomp>)Ú
IndexError)r?   Úlimitrø   r!   r>   r"   rù   â  s
   ÿzEvictable._evictc                 C   s8   | j | jkr	tƒ ‚z|  ¡  W d S  | jy   tƒ ‚w r2   )Ú_evictcountÚmaxsizerü   Ú_pop_to_evictr   r>   r!   r!   r"   rû   é  s   ÿzEvictable._evict1N)	r   r   r    rS   r   rú   rø   rù   rû   r!   r!   r!   r"   r)   Ø  s    r)   c                   @   s~   e Zd ZdZeZdef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„ Zedd„ ƒZdS )r+   zA buffer of pending messages.Nc                 C   s@   || _ ||pg ƒ| _| jj| _| jj| _| jj| _| jj| _	d S r2   )
rÿ   r×   r¼   Ú_appendÚpopleftÚ_popr›   Ú_lenÚextendÚ_extend)r?   rÿ   r°   r   r!   r!   r"   ra   ù  s   


zMessagebuffer.__init__c                 C   ó"   |   |¡ | jo|  ¡  d S  d S r2   )r  rÿ   rù   rä   r!   r!   r"   Úput  r    zMessagebuffer.putc                 C   r  r2   )r  rÿ   rù   )r?   Úitr!   r!   r"   r    r    zMessagebuffer.extendc                 G   s2   z|   ¡ W S  ty   |r|d  Y S |  ¡ ‚w )Nr   )r  rü   r   ©r?   rl   r!   r!   r"   Útake  s   
ýzMessagebuffer.takec                 C   rt   r2   )r  r>   r!   r!   r"   r     rw   zMessagebuffer._pop_to_evictc                 C   s   d  t| ƒjt| ƒ| j¡S ©Nz<{0}: {1}/{2}>)rY   rZ   r   r˜   rÿ   r>   r!   r!   r"   r«     r¬   zMessagebuffer.__repr__c                 c   s*   � 	 z|   ¡ V  W n
 ty   Y d S w qr2   )r  rü   r>   r!   r!   r"   rv     s   €ÿýzMessagebuffer.__iter__c                 C   rt   r2   )r  r>   r!   r!   r"   r›   '  rw   zMessagebuffer.__len__c                 C   rñ   r2   ©r×   rä   r!   r!   r"   rq   +  r£   zMessagebuffer.__contains__c                 C   r¡   r2   )r¶   r×   r>   r!   r!   r"   Ú__reversed__/  r£   zMessagebuffer.__reversed__c                 C   s
   | j | S r2   r  )r?   Úindexr!   r!   r"   rp   3  r£   zMessagebuffer.__getitem__c                 C   r|   r2   ©r˜   r>   r!   r!   r"   rþ   7  s   zMessagebuffer._evictcount)r   r   r    rS   r   r   ra   r  r  r  r   r«   rv   r›   rq   r  rp   r÷   rþ   r!   r!   r!   r"   r+   ó  s     		r+   c                       s‚   e Zd ZdZeZeZdZdZdZ	d‡ f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edd„ ƒZ‡  ZS )r%   zMap of buffers.Nr   éè  c                    sD   t t| ƒ ¡  || _d| _|r|  |¡ tdd„ t| ƒD ƒƒ| _d S )Nr  c                 s   s   � | ]}t |ƒV  qd S r2   r  )r3   Úbufr!   r!   r"   r�   R  rž   z%BufferMap.__init__.<locals>.<genexpr>)	rÄ   r%   ra   rÿ   Ú
bufmaxsizer‰   Úsumr   Útotal)r?   rÿ   r°   r  rÆ   r!   r"   ra   K  s   
zBufferMap.__init__c                 C   s@   |   |¡ |¡ |  jd7  _|  |¡ | jo|  ¡  d S  d S )Nr   )Ú_get_or_create_bufferr  r  rG   rÿ   rù   )r?   rJ   rß   r!   r!   r"   r  T  s   
zBufferMap.putc                 C   s:   |   |¡ |¡ |  jt|ƒ7  _| jo|  ¡  d S  d S r2   )r  r  r  r˜   rÿ   rù   )r?   rJ   r	  r!   r!   r"   r  [  s   zBufferMap.extendc                 G   s†   d\}}z| | }W n t y   d}Y n w z| ¡ }|  jd8  _W n | jy/   d}Y nw |  |¡ |rA|r=|d S |  ¡ ‚|S )N)NFTr   r   )rW   r  r  r   rG   )r?   rJ   rl   rß   Úthrowr  r!   r!   r"   r  a  s$   ÿÿ
zBufferMap.takec                 C   s2   z| | W S  t y   |  ¡  }| |< | Y S w r2   )rW   Ú_new_buffer)r?   rJ   r  r!   r!   r"   r  w  s   
þzBufferMap._get_or_create_bufferc                 C   s   | j | jd�S )N)rÿ   )ÚBufferr  r>   r!   r!   r"   r    rF   zBufferMap._new_bufferc                 G   s   | |   ¡  j|Ž S r2   )r@   r  r
  r!   r!   r"   Ú_LRUpopƒ  rb   zBufferMap._LRUpopc              
   C   s†   t dƒD ]<}|  ¡ }| | }z| ¡  W n t| jfy%   |  |¡ Y qw |  jd8  _t|ƒs9|  |¡  d S |  |¡  d S d S )Nrô   r   )	rø   r@   r  rü   r   rI   r  r˜   rG   )r?   rÁ   rJ   r  r!   r!   r"   r   ‡  s   þ

ÿïzBufferMap._pop_to_evictc                 C   s   d  t| ƒj| j| j¡S r  )rY   rZ   r   r  rÿ   r>   r!   r!   r"   r«   œ  s   ÿzBufferMap.__repr__c                 C   s   | j S r2   )r  r>   r!   r!   r"   rþ   ¢  s   zBufferMap._evictcount)Nr  )r   r   r    rS   r+   r  r   rÿ   r  r  ra   r  r  r  r  r  r  r   r«   r÷   rþ   rÏ   r!   r!   rÆ   r"   r%   @  s$    	r%   ):rS   Ú
__future__r   r   r‚   Úcollectionsr   rV   r   Úheapqr   r   r   Ú	itertoolsr	   r
   Úcelery.fiver   r   r   r   r   r   r   Ú
functionalr   r   Útextr   Úcollections.abcr   r   r   r   r   ÚImportErrorÚ__pypy__r   rT   Údjango.utils.functionalr   r   r`   Ú__all__rî   r,   r-   r#   r­   r$   r(   Úregisterr&   r'   r*   r)   r+   r%   r!   r!   r!   r"   Ú<module>   sf   $ýÿý6
X %X 
g
I