o
    y¬´\¬m  ã                   @   s"  d Z ddlmZ ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ eƒ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deeƒZG dd„ deƒZG dd„ deƒZG dd„ deeƒZG dd„ deƒZG dd„ deƒZG dd „ d eƒZG d!d"„ d"eƒZG d#d$„ d$eƒZG d%d&„ d&eƒZ eZ!eZ"eZ#e Z$e ej%ƒZ&e d'd(„ ƒZ'dFd)d*„Z(G d+d,„ d,eƒZ)d-d.„ Z*dFd/d0„Z+d1d2„ Z,d3d4„ Z-d5d6„ Z.dFd7d8„Z/d9d:„ Z0G d;d<„ d<eƒZ1e1d=ƒZ2d>d?„ Z3G d@dA„ dAeƒZ4G dBdC„ dCe4ƒZ5dDdE„ Z6dS )GzCollection classes and helpers.é    )Úabsolute_importNé   )Úbinary_types)Úcollections_abc)Úitertools_filterfalse)Úpy2k)Ústring_types)Ú	threadingc                   @   s   e Zd ZdZdd„ ZdS )ÚAbstractKeyedTuple© c                 C   ó
   t | jƒS )z‰Return a list of string key names for this :class:`.KeyedTuple`.

        .. seealso::

            :attr:`.KeyedTuple._fields`

        )ÚlistÚ_fields©Úselfr   r   úN/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/util/_collections.pyÚkeys   s   
	zAbstractKeyedTuple.keysN)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   r   r   r   r
      s    r
   c                   @   s6   e Zd ZdZddd„Zedd„ ƒZdd„ Zd	d
„ ZdS )Ú
KeyedTuplea  ``tuple`` subclass that adds labeled names.

    E.g.::

        >>> k = KeyedTuple([1, 2, 3], labels=["one", "two", "three"])
        >>> k.one
        1
        >>> k.two
        2

    Result rows returned by :class:`.Query` that contain multiple
    ORM entities and/or column expressions make use of this
    class to return rows.

    The :class:`.KeyedTuple` exhibits similar behavior to the
    ``collections.namedtuple()`` construct provided in the Python
    standard library, however is architected very differently.
    Unlike ``collections.namedtuple()``, :class:`.KeyedTuple` is
    does not rely on creation of custom subtypes in order to represent
    a new series of keys, instead each :class:`.KeyedTuple` instance
    receives its list of keys in place.   The subtype approach
    of ``collections.namedtuple()`` introduces significant complexity
    and performance overhead, which is not necessary for the
    :class:`.Query` object's use case.

    .. seealso::

        :ref:`ormtutorial_querying`

    Nc                 C   s6   t  | |¡}|r|j t||ƒ¡ ng }||jd< |S )NÚ_labels)ÚtupleÚ__new__Ú__dict__ÚupdateÚzip)ÚclsÚvalsÚlabelsÚtr   r   r   r   J   s   
zKeyedTuple.__new__c                 C   s   t dd„ | jD ƒƒS )zÖReturn a tuple of string key names for this :class:`.KeyedTuple`.

        This method provides compatibility with ``collections.namedtuple()``.

        .. seealso::

            :meth:`.KeyedTuple.keys`

        c                 S   ó   g | ]}|d ur|‘qS ©Nr   )Ú.0Úlr   r   r   Ú
<listcomp>^   ó    z&KeyedTuple._fields.<locals>.<listcomp>)r   r   r   r   r   r   r   S   s   zKeyedTuple._fieldsc                 C   s   t d| ƒ‚)NzCan't set attribute: %s)ÚAttributeError©r   ÚkeyÚvaluer   r   r   Ú__setattr__`   ó   zKeyedTuple.__setattr__c                    s   ‡ fdd„ˆ   ¡ D ƒS )zæReturn the contents of this :class:`.KeyedTuple` as a dictionary.

        This method provides compatibility with ``collections.namedtuple()``,
        with the exception that the dictionary returned is **not** ordered.

        c                    s   i | ]}|ˆ j | “qS r   )r   ©r$   r*   r   r   r   Ú
<dictcomp>j   r'   z&KeyedTuple._asdict.<locals>.<dictcomp>)r   r   r   r   r   Ú_asdictc   s   zKeyedTuple._asdictr#   )	r   r   r   Ú__doc__r   Úpropertyr   r,   r0   r   r   r   r   r   *   s    
	
r   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú_LWr   c                 C   s   t  | |¡S r#   )r   r   )r   r   r   r   r   r   p   r-   z_LW.__new__c                 C   s   t t| ƒ| jffS r#   )r   r   Ú_real_fieldsr   r   r   r   Ú
__reduce__s   s   z_LW.__reduce__c                 C   s    t t| j| ƒƒ}| dd¡ |S )zAReturn the contents of this :class:`.KeyedTuple` as a dictionary.N)Údictr   r4   Úpop©r   Údr   r   r   r0   y   s   z_LW._asdictN)r   r   r   r   r   r5   r0   r   r   r   r   r3   m   s
    r3   c                   @   s    e Zd Zdd„ Ze Z ZZdS )ÚImmutableContainerc                 O   s   t d| jj ƒ‚)Nz%s object is immutable)Ú	TypeErrorÚ	__class__r   ©r   ÚargÚkwr   r   r   Ú
_immutable‚   ó   zImmutableContainer._immutableN)r   r   r   r@   Ú__delitem__Ú__setitem__r,   r   r   r   r   r:   �   s    r:   c                   @   sJ   e Zd Zej Z Z Z ZZ	dd„ Z
dd„ Zdd„ Zdd„ Zd	d
„ ZdS )Úimmutabledictc                 G   s    t  | ¡}t j|g|¢R Ž  |S r#   )r6   r   Ú__init__)r   ÚargsÚnewr   r   r   r   Œ   s   
zimmutabledict.__new__c                 G   s   d S r#   r   )r   rF   r   r   r   rE   ‘   s   zimmutabledict.__init__c                 C   s   t t| ƒffS r#   )rD   r6   r   r   r   r   r5   ”   ó   zimmutabledict.__reduce__c                 C   s:   |s| S | st |tƒr|S t|ƒS t| ƒ}t ||¡ |S r#   )Ú
isinstancerD   r6   r   )r   r9   Úd2r   r   r   Úunion—   s   
zimmutabledict.unionc                 C   s   dt  | ¡ S )Nzimmutabledict(%s))r6   Ú__repr__r   r   r   r   rL   ¤   rH   zimmutabledict.__repr__N)r   r   r   r:   r@   Úclearr7   ÚpopitemÚ
setdefaultr   r   rE   r5   rK   rL   r   r   r   r   rD   ˆ   s    rD   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„ 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d*d+„ ZdS )-Ú
Propertiesz8Provide a __getattr__/__setattr__ interface over a dict.©Ú_datac                 C   s   t  | d|¡ d S ©NrR   ©Úobjectr,   )r   Údatar   r   r   rE   ­   ó   zProperties.__init__c                 C   r   r#   )ÚlenrR   r   r   r   r   Ú__len__°   ó   
zProperties.__len__c                 C   s   t t| j ¡ ƒƒS r#   )Úiterr   rR   Úvaluesr   r   r   r   Ú__iter__³   rW   zProperties.__iter__c                 C   s   t | ƒt |ƒ S r#   ©r   ©r   Úotherr   r   r   Ú__add__¶   rA   zProperties.__add__c                 C   ó   || j |< d S r#   rQ   ©r   r*   Úobjr   r   r   rC   ¹   rH   zProperties.__setitem__c                 C   ó
   | j | S r#   rQ   ©r   r*   r   r   r   Ú__getitem__¼   rZ   zProperties.__getitem__c                 C   s   | j |= d S r#   rQ   rf   r   r   r   rB   ¿   r-   zProperties.__delitem__c                 C   rb   r#   rQ   rc   r   r   r   r,   Â   rH   zProperties.__setattr__c                 C   s
   d| j iS rS   rQ   r   r   r   r   Ú__getstate__Å   rZ   zProperties.__getstate__c                 C   s   t  | d|d ¡ d S rS   rT   )r   Ústater   r   r   Ú__setstate__È   ó   zProperties.__setstate__c                 C   s$   z| j | W S  ty   t|ƒ‚w r#   )rR   ÚKeyErrorr(   rf   r   r   r   Ú__getattr__Ë   s
   ÿzProperties.__getattr__c                 C   ó
   || j v S r#   rQ   rf   r   r   r   Ú__contains__Ñ   rZ   zProperties.__contains__c                 C   r   )z8Return an immutable proxy for this :class:`.Properties`.)ÚImmutablePropertiesrR   r   r   r   r   Úas_immutableÔ   s   
zProperties.as_immutablec                 C   ó   | j  |¡ d S r#   )rR   r   ©r   r+   r   r   r   r   Ù   rA   zProperties.updateNc                 C   s   || v r| | S |S r#   r   )r   r*   Údefaultr   r   r   ÚgetÜ   s   zProperties.getc                 C   r   r#   )r   rR   r   r   r   r   r   â   rZ   zProperties.keysc                 C   ó   t | j ¡ ƒS r#   )r   rR   r\   r   r   r   r   r\   å   rH   zProperties.valuesc                 C   rv   r#   )r   rR   Úitemsr   r   r   r   rw   è   rH   zProperties.itemsc                 C   rn   r#   rQ   rf   r   r   r   Úhas_keyë   rZ   zProperties.has_keyc                 C   ó   | j  ¡  d S r#   )rR   rM   r   r   r   r   rM   î   rH   zProperties.clearr#   )r   r   r   r1   r   rE   rY   r]   ra   rC   rg   rB   r,   rh   rj   rm   ro   rq   r   ru   r   r\   rw   rx   rM   r   r   r   r   rP   ¨   s.    
rP   c                   @   s   e Zd ZdZdZdd„ ZdS )ÚOrderedPropertieszUProvide a __getattr__/__setattr__ interface with an OrderedDict
    as backing store.r   c                 C   s   t  | tƒ ¡ d S r#   )rP   rE   ÚOrderedDictr   r   r   r   rE   ø   rW   zOrderedProperties.__init__N)r   r   r   r1   r   rE   r   r   r   r   rz   ò   s    rz   c                   @   s   e Zd ZdZdZdS )rp   zDProvide immutable dict/object attribute to an underlying dictionary.r   N)r   r   r   r1   r   r   r   r   r   rp   ü   s    rp   c                   @   s´   e Zd ZdZdZdd„ Zd*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dd„ ZerHdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ ZdS )+r{   zCA dict that returns keys/values/items in the order they were added.©Ú_listc                 C   s   t |  ¡ ffS r#   )r{   rw   r   r   r   r   r5     rH   zOrderedDict.__reduce__Nc                 K   s@   g | _ |d u r|r| jdi |¤Ž d S d S | j|fi |¤Ž d S )Nr   )r}   r   )r   Ú_OrderedDict____sequenceÚkwargsr   r   r   rE   
  s   ÿzOrderedDict.__init__c                 C   s   g | _ t | ¡ d S r#   )r}   r6   rM   r   r   r   r   rM     ó   zOrderedDict.clearc                 C   s   |   ¡ S r#   )Ú__copy__r   r   r   r   Úcopy  ó   zOrderedDict.copyc                 C   ó   t | ƒS r#   )r{   r   r   r   r   r�     rƒ   zOrderedDict.__copy__c                 O   s   | j j|i |¤Ž d S r#   )r}   Úsortr=   r   r   r   r…     rk   zOrderedDict.sortc                 K   s^   |d ur$t |dƒr| ¡ D ]
}|  ||| ¡ qn|D ]\}}|| |< q|r-|  |¡ d S d S )Nr   )Úhasattrr   rC   r   )r   r~   r   r*   r+   r   r   r   r     s   
ÿ
ÿzOrderedDict.updatec                 C   s"   || vr|   ||¡ |S |  |¡S r#   )rC   rg   r)   r   r   r   rO   *  s   
zOrderedDict.setdefaultc                 C   r   r#   ©r[   r}   r   r   r   r   r]   1  rZ   zOrderedDict.__iter__c                 C   r„   r#   r^   r   r   r   r   r   4  rƒ   zOrderedDict.keysc                    ó   ‡ fdd„ˆ j D ƒS )Nc                    s   g | ]}ˆ | ‘qS r   r   r.   r   r   r   r&   8  ó    z&OrderedDict.values.<locals>.<listcomp>r|   r   r   r   r   r\   7  ó   zOrderedDict.valuesc                    rˆ   )Nc                    s   g | ]}|ˆ | f‘qS r   r   r.   r   r   r   r&   ;  r'   z%OrderedDict.items.<locals>.<listcomp>r|   r   r   r   r   rw   :  rŠ   zOrderedDict.itemsc                 C   ó   t |  ¡ ƒS r#   )r[   r\   r   r   r   r   Ú
itervalues?  r-   zOrderedDict.itervaluesc                 C   r„   r#   )r[   r   r   r   r   ÚiterkeysB  rƒ   zOrderedDict.iterkeysc                 C   r‹   r#   )r[   rw   r   r   r   r   Ú	iteritemsE  r-   zOrderedDict.iteritemsc                 C   sF   || vrz| j  |¡ W n ty   |g| _ Y nw t | ||¡ d S r#   )r}   Úappendr(   r6   rC   rc   r   r   r   rC   H  s   ýzOrderedDict.__setitem__c                 C   s   t  | |¡ | j |¡ d S r#   )r6   rB   r}   Úremoverf   r   r   r   rB   R  ó   zOrderedDict.__delitem__c                 G   s0   || v }t j| |g|¢R Ž }|r| j |¡ |S r#   )r6   r7   r}   r�   )r   r*   rt   Úpresentr+   r   r   r   r7   V  s
   zOrderedDict.popc                 C   s   t  | ¡}| j |d ¡ |S ©Nr   )r6   rN   r}   r�   ©r   Úitemr   r   r   rN   ]  s   
zOrderedDict.popitemr#   )r   r   r   r1   r   r5   rE   rM   r‚   r�   r…   r   rO   r]   r   r\   rw   r   rŒ   r�   rŽ   rC   rB   r7   rN   r   r   r   r   r{     s.    


r{   c                   @   sÂ   e Z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dd„ ZeZdd„ ZeZdd„ ZeZdd„ ZeZdd„ ZeZd d!„ ZeZd"d#„ ZeZd$d%„ ZeZdS )'Ú
OrderedSetNc                 C   s>   t  | ¡ g | _|d urt|ƒ| _t  | | j¡ d S g | _d S r#   )ÚsetrE   r}   Úunique_listr   r8   r   r   r   rE   d  s   


zOrderedSet.__init__c                 C   s$   || vr
| j  |¡ t | |¡ d S r#   ©r}   r�   r—   Úadd©r   Úelementr   r   r   rš   m  s   zOrderedSet.addc                 C   s   t  | |¡ | j |¡ d S r#   )r—   r�   r}   r›   r   r   r   r�   r  r‘   zOrderedSet.removec                 C   s&   || vr| j  ||¡ t | |¡ d S r#   )r}   Úinsertr—   rš   )r   Úposrœ   r   r   r   r�   v  s   zOrderedSet.insertc                 C   s(   || v r| j  |¡ t | |¡ d S d S r#   )r}   r�   r—   r›   r   r   r   Údiscard{  s   þzOrderedSet.discardc                 C   s   t  | ¡ g | _d S r#   )r—   rM   r}   r   r   r   r   rM   €  s   

zOrderedSet.clearc                 C   re   r#   r|   rf   r   r   r   rg   „  rZ   zOrderedSet.__getitem__c                 C   r   r#   r‡   r   r   r   r   r]   ‡  rZ   zOrderedSet.__iter__c                 C   s
   |   |¡S r#   )rK   r_   r   r   r   ra   Š  rZ   zOrderedSet.__add__c                 C   s   d| j j| jf S ©Nz%s(%r))r<   r   r}   r   r   r   r   rL   �  rW   zOrderedSet.__repr__c                 C   s.   |D ]}|| vr| j  |¡ t | |¡ q| S r#   r™   )r   ÚiterableÚer   r   r   r   ’  s   €zOrderedSet.updatec                 C   s   |   | ¡}| |¡ |S r#   )r<   r   ©r   r`   Úresultr   r   r   rK   ›  s   

zOrderedSet.unionc                    ó    t ˆ ƒ‰ |  ‡ fdd„| D ƒ¡S )Nc                 3   s   � | ]	}|ˆ v r|V  qd S r#   r   ©r$   Úa©r`   r   r   Ú	<genexpr>¤  ó   € z*OrderedSet.intersection.<locals>.<genexpr>©r—   r<   r_   r   r¨   r   Úintersection¢  ó   zOrderedSet.intersectionc                    s<   t ˆ ƒ‰ ˆ ‡ fdd„ˆD ƒ¡}| ‡fdd„ˆ D ƒ¡ |S )Nc                 3   ó   � | ]	}|ˆ vr|V  qd S r#   r   r¦   r¨   r   r   r©   ª  rª   z2OrderedSet.symmetric_difference.<locals>.<genexpr>c                 3   r®   r#   r   r¦   r   r   r   r©   «  rª   )r—   r<   r   r£   r   )r`   r   r   Úsymmetric_difference¨  s   zOrderedSet.symmetric_differencec                    r¥   )Nc                 3   r®   r#   r   r¦   r¨   r   r   r©   ²  rª   z(OrderedSet.difference.<locals>.<genexpr>r«   r_   r   r¨   r   Ú
difference°  r­   zOrderedSet.differencec                    s.   t ˆ ƒ‰ t  | ˆ ¡ ‡ fdd„| jD ƒ| _| S )Nc                    ó   g | ]}|ˆ v r|‘qS r   r   r¦   r¨   r   r   r&   ¹  r'   z2OrderedSet.intersection_update.<locals>.<listcomp>)r—   Úintersection_updater}   r_   r   r¨   r   r²   ¶  s   zOrderedSet.intersection_updatec                    sD   t  ˆ |¡ ‡ fdd„ˆ jD ƒˆ _ˆ  j‡ fdd„|jD ƒ7  _ˆ S )Nc                    r±   r   r   r¦   r   r   r   r&   À  r'   z:OrderedSet.symmetric_difference_update.<locals>.<listcomp>c                    r±   r   r   r¦   r   r   r   r&   Á  r'   )r—   Úsymmetric_difference_updater}   r_   r   r   r   r³   ¾  s   z&OrderedSet.symmetric_difference_updatec                    s&   t  ˆ |¡ ‡ fdd„ˆ jD ƒˆ _ˆ S )Nc                    r±   r   r   r¦   r   r   r   r&   È  r'   z0OrderedSet.difference_update.<locals>.<listcomp>)r—   Údifference_updater}   r_   r   r   r   r´   Æ  s   zOrderedSet.difference_updater#   )r   r   r   rE   rš   r�   r�   rŸ   rM   rg   r]   ra   rL   Ú__str__r   Ú__ior__rK   Ú__or__r¬   Ú__and__r¯   Ú__xor__r°   Ú__sub__r²   Ú__iand__r³   Ú__ixor__r´   Ú__isub__r   r   r   r   r–   c  s8    
	r–   c                   @   sJ  e Zd ZdZeZdOd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„ 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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z d9d:„ Z!d;d<„ Z"d=d>„ Z#d?d@„ Z$dAdB„ Z%dCdD„ Z&dEdF„ Z'e'Z(dGdH„ Z)dIdJ„ Z*dKdL„ Z+dMdN„ Z,dS )PÚIdentitySetzÏA set that considers only object id() for uniqueness.

    This strategy has edge cases for builtin types- it's possible to have
    two 'foo' strings in one of these sets, for example.  Use sparingly.

    Nc                 C   s(   t ƒ | _|r|D ]	}|  |¡ qd S d S r#   )r6   Ú_membersrš   ©r   r¡   Úor   r   r   rE   Ø  s   þzIdentitySet.__init__c                 C   s   || j t|ƒ< d S r#   ©r¿   Úidrs   r   r   r   rš   Þ  rW   zIdentitySet.addc                 C   s   t |ƒ| jv S r#   )rÃ   r¿   rs   r   r   r   ro   á  rH   zIdentitySet.__contains__c                 C   s   | j t|ƒ= d S r#   rÂ   rs   r   r   r   r�   ä  rA   zIdentitySet.removec                 C   s&   z|   |¡ W d S  ty   Y d S w r#   )r�   rl   rs   r   r   r   rŸ   ç  s
   ÿzIdentitySet.discardc                 C   s,   z
| j  ¡ }|d W S  ty   tdƒ‚w )Nr   zpop from an empty set)r¿   rN   rl   )r   Úpairr   r   r   r7   í  s   

ÿzIdentitySet.popc                 C   ry   r#   )r¿   rM   r   r   r   r   rM   ô  rH   zIdentitySet.clearc                 C   ó   t dƒ‚)Nzcannot compare sets using cmp()©r;   r_   r   r   r   Ú__cmp__÷  rƒ   zIdentitySet.__cmp__c                 C   s   t |tƒr| j|jkS dS )NF©rI   r¾   r¿   r_   r   r   r   Ú__eq__ú  ó   
zIdentitySet.__eq__c                 C   s   t |tƒr| j|jkS dS ©NTrÈ   r_   r   r   r   Ú__ne__   rÊ   zIdentitySet.__ne__c                 C   sF   t | ƒ|ƒ}t| ƒt|ƒkrdS t|jjt| j ¡ ƒƒD ]} dS dS ©NFT©ÚtyperX   r   r¿   ro   r[   r   ©r   r¡   r`   Úmr   r   r   Úissubset  s   ÿzIdentitySet.issubsetc                 C   ó   t |tƒstS |  |¡S r#   )rI   r¾   ÚNotImplementedrÒ   r_   r   r   r   Ú__le__  ó   

zIdentitySet.__le__c                 C   s(   t |tƒstS t| ƒt|ƒk o|  |¡S r#   )rI   r¾   rÔ   rX   rÒ   r_   r   r   r   Ú__lt__  ó   
zIdentitySet.__lt__c                 C   sF   t | ƒ|ƒ}t| ƒt|ƒk rdS t| jjt|j ¡ ƒƒD ]} dS dS rÍ   rÎ   rÐ   r   r   r   Ú
issuperset  s   ÿzIdentitySet.issupersetc                 C   rÓ   r#   )rI   r¾   rÔ   rÙ   r_   r   r   r   Ú__ge__'  rÖ   zIdentitySet.__ge__c                 C   s(   t |tƒstS t| ƒt|ƒko|  |¡S r#   )rI   r¾   rÔ   rX   rÙ   r_   r   r   r   Ú__gt__,  rØ   zIdentitySet.__gt__c                 C   ó6   t | ƒƒ }|  ¡ }t|ƒ}|j |  |¡ |¡¡ |S r#   )rÏ   Ú_member_id_tuplesÚ_iter_idr¿   r   Ú_working_setrK   ©r   r¡   r¤   Úmembersr`   r   r   r   rK   1  ó
   
zIdentitySet.unionc                 C   rÓ   r#   )rI   r¾   rÔ   rK   r_   r   r   r   r·   9  rÖ   zIdentitySet.__or__c                 C   ó   |   |¡j| _d S r#   )rK   r¿   ©r   r¡   r   r   r   r   >  rW   zIdentitySet.updatec                 C   ó   t |tƒstS |  |¡ | S r#   )rI   r¾   rÔ   r   r_   r   r   r   r¶   A  ó   

zIdentitySet.__ior__c                 C   rÜ   r#   )rÏ   rÝ   rÞ   r¿   r   rß   r°   rà   r   r   r   r°   G  râ   zIdentitySet.differencec                 C   rÓ   r#   )rI   r¾   rÔ   r°   r_   r   r   r   rº   O  rÖ   zIdentitySet.__sub__c                 C   rã   r#   )r°   r¿   rä   r   r   r   r´   T  rW   zIdentitySet.difference_updatec                 C   rå   r#   )rI   r¾   rÔ   r´   r_   r   r   r   r½   W  ræ   zIdentitySet.__isub__c                 C   rÜ   r#   )rÏ   rÝ   rÞ   r¿   r   rß   r¬   rà   r   r   r   r¬   ]  râ   zIdentitySet.intersectionc                 C   rÓ   r#   )rI   r¾   rÔ   r¬   r_   r   r   r   r¸   e  rÖ   zIdentitySet.__and__c                 C   rã   r#   )r¬   r¿   rä   r   r   r   r²   j  rW   zIdentitySet.intersection_updatec                 C   rå   r#   )rI   r¾   rÔ   r²   r_   r   r   r   r»   m  ræ   zIdentitySet.__iand__c                 C   rÜ   r#   )rÏ   rÝ   rÞ   r¿   r   rß   r¯   rà   r   r   r   r¯   s  s   
ÿz IdentitySet.symmetric_differencec                 C   s   dd„ | j  ¡ D ƒS )Nc                 s   s   � | ]	}t |ƒ|fV  qd S r#   ©rÃ   )r$   Úvr   r   r   r©   ~  rª   z0IdentitySet._member_id_tuples.<locals>.<genexpr>)r¿   r\   r   r   r   r   rÝ   }  rŠ   zIdentitySet._member_id_tuplesc                 C   rÓ   r#   ©rI   r¾   rÔ   r¯   r_   r   r   r   r¹   €  rÖ   zIdentitySet.__xor__c                 C   rã   r#   )r¯   r¿   rä   r   r   r   r³   …  rW   z'IdentitySet.symmetric_difference_updatec                 C   rå   r#   ré   r_   r   r   r   r¼   ˆ  ræ   zIdentitySet.__ixor__c                 C   s   t | ƒt| j ¡ ƒƒS r#   )rÏ   r[   r¿   r\   r   r   r   r   r‚   Ž  rk   zIdentitySet.copyc                 C   r   r#   )rX   r¿   r   r   r   r   rY   “  rZ   zIdentitySet.__len__c                 C   rv   r#   )r[   r¿   r\   r   r   r   r   r]   –  rH   zIdentitySet.__iter__c                 C   rÅ   )Nzset objects are unhashablerÆ   r   r   r   r   Ú__hash__™  rƒ   zIdentitySet.__hash__c                 C   s   dt | ƒjt| j ¡ ƒf S r    )rÏ   r   r   r¿   r\   r   r   r   r   rL   œ  s   zIdentitySet.__repr__r#   )-r   r   r   r1   r—   rß   rE   rš   ro   r�   rŸ   r7   rM   rÇ   rÉ   rÌ   rÒ   rÕ   r×   rÙ   rÚ   rÛ   rK   r·   r   r¶   r°   rº   r´   r½   r¬   r¸   r²   r»   r¯   rÝ   r¹   r³   r¼   r‚   r�   rY   r]   rê   rL   r   r   r   r   r¾   Î  sT    

r¾   c                   @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚWeakSequencer   c                    s   ‡ fdd„|D ƒˆ _ d S )Nc                    s   g | ]	}t  |ˆ j¡‘qS r   )ÚweakrefÚrefÚ_remove)r$   rœ   r   r   r   r&   ¢  s    ÿz)WeakSequence.__init__.<locals>.<listcomp>©Ú_storage)r   Ú_WeakSequence__elementsr   r   r   rE   ¡  s   
ÿzWeakSequence.__init__c                 C   s   | j  t || j¡¡ d S r#   )rð   r�   rì   rí   rî   r”   r   r   r   r�   ¦  s   zWeakSequence.appendc                 C   rr   r#   )rð   r�   )r   rí   r   r   r   rî   ©  rA   zWeakSequence._removec                 C   r   r#   )rX   rð   r   r   r   r   rY   ¬  rZ   zWeakSequence.__len__c                 C   s   dd„ dd„ | j D ƒD ƒS )Nc                 s   s   � | ]	}|d ur|V  qd S r#   r   )r$   rd   r   r   r   r©   °  s   € ÿz(WeakSequence.__iter__.<locals>.<genexpr>c                 s   s   � | ]}|ƒ V  qd S r#   r   )r$   rí   r   r   r   r©   ±  s   € rï   r   r   r   r   r]   ¯  s   ÿzWeakSequence.__iter__c                 C   s.   z	| j | }W |ƒ S  ty   td| ƒ‚w )NzIndex %s out of range)rð   rl   Ú
IndexError)r   Úindexrd   r   r   r   rg   ´  s   ýÿzWeakSequence.__getitem__N)r   )	r   r   r   rE   r�   rî   rY   r]   rg   r   r   r   r   rë      s    
rë   c                   @   s&   e Zd ZG dd„ deƒZddd„ZdS )ÚOrderedIdentitySetc                   @   s   e Zd ZdZdS )zOrderedIdentitySet._working_setTN)r   r   r   Ú__sa_hash_exempt__r   r   r   r   rß   ¾  s    rß   Nc                 C   s2   t  | ¡ tƒ | _|r|D ]	}|  |¡ qd S d S r#   )r¾   rE   r{   r¿   rš   rÀ   r   r   r   rE   Å  s   
þzOrderedIdentitySet.__init__r#   )r   r   r   r–   rß   rE   r   r   r   r   rô   ½  s    rô   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚPopulateDictz•A dict which populates missing values via a creation function.

    Note the creation function takes a key, unlike
    collections.defaultdict.

    c                 C   s
   || _ d S r#   ©Úcreator)r   rø   r   r   r   rE   Õ  rZ   zPopulateDict.__init__c                 C   s   |   |¡ | |< }|S r#   r÷   )r   r*   Úvalr   r   r   Ú__missing__Ø  s   zPopulateDict.__missing__N)r   r   r   r1   rE   rú   r   r   r   r   rö   Í  s    rö   c                 C   s   t t | ¡ƒS r#   )r2   ÚoperatorÚ
itemgetter)Úidxr   r   r   Ú<lambda>ê  s    rþ   c                    s:   t ƒ ‰ˆj‰ˆ s‡‡fdd„| D ƒS ‡ ‡‡fdd„| D ƒS )Nc                    s    g | ]}|ˆ vrˆ|ƒs|‘qS r   r   ©r$   Úx)ÚseenÚseen_addr   r   r&   ò  s     zunique_list.<locals>.<listcomp>c                    s(   g | ]}ˆ |ƒˆvrˆˆ |ƒƒs|‘qS r   r   rÿ   ©Úhashfuncr  r  r   r   r&   ô  s
    þ)r—   rš   )Úseqr  r   r  r   r˜   î  s   þr˜   c                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
ÚUniqueAppenderz½Appends items to a collection ensuring uniqueness.

    Additional appends() of the same object are ignored.  Membership is
    determined by identity (``is a``) not equality (``==``).
    Nc                 C   sP   || _ i | _|rt||ƒ| _d S t|dƒr|j| _d S t|dƒr&|j| _d S d S )Nr�   rš   )rV   Ú_uniqueÚgetattrÚ_data_appenderr†   r�   rš   )r   rV   Úviar   r   r   rE     s   

ÿzUniqueAppender.__init__c                 C   s.   t |ƒ}|| jvr|  |¡ d| j|< d S d S rË   )rÃ   r  r	  )r   r•   Úid_r   r   r   r�     s
   

þzUniqueAppender.appendc                 C   r   r#   )r[   rV   r   r   r   r   r]     rZ   zUniqueAppender.__iter__r#   )r   r   r   r1   rE   r�   r]   r   r   r   r   r  û  s
    

r  c                 C   s,   t | ƒdkrt| d tjƒrt| d ƒS | S )Nr   r   )rX   rI   ÚtypesÚGeneratorTyper   )r>   r   r   r   Úcoerce_generator_arg  s   r  c                 C   sB   | d u r|S t | tjƒrt | tt ƒr| gS t | tƒr| S t| ƒS r#   )rI   r   ÚIterabler   r   r   )r   rt   r   r   r   Úto_list  s   ÿ
r  c                 C   s   t |  dd„ |D ƒ¡ƒS )z²return True if any items of set\_ are present in iterable.

    Goes through special effort to ensure __hash__ is not called
    on items in iterable that don't support it.

    c                 S   s   g | ]}|j r|‘qS r   )rê   ©r$   Úir   r   r   r&   2  s    z$has_intersection.<locals>.<listcomp>)Úboolr¬   )Úset_r¡   r   r   r   Úhas_intersection*  s   r  c                 C   ó(   | d u rt ƒ S t| t ƒst t| ƒƒS | S r#   )r—   rI   r  ©r   r   r   r   Úto_set5  ó
   
r  c                 C   r  r#   )Ú
column_setrI   r  r  r   r   r   Úto_column_set>  r  r  c                 K   s*   |   ¡ } |r|  |¡ | jdi |¤Ž | S )z5Copy the given dict and update with the given values.Nr   )r‚   r   )r9   Ú_newr?   r   r   r   Úupdate_copyG  s
   
r  c                 c   s@   � | D ]}t |tƒst|dƒrt|ƒD ]}|V  qq|V  qdS )z�Given an iterator of which further sub-elements may also be
    iterators, flatten the sub-elements into a single iterator.

    r]   N)rI   Ústrr†   Úflatten_iterator)r   ÚelemÚyr   r   r   r  Q  s   €ÿûr  c                   @   sd   e Zd ZdZ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edd„ ƒZdd„ ZdS )ÚLRUCachezóDictionary with 'squishy' removal of least
    recently used items.

    Note that either get() or [] should be used here, but
    generally its not safe to do an "in" check first as the dictionary
    can change subsequent to that call.

    )ÚcapacityÚ	thresholdÚ
size_alertÚ_counterÚ_mutexéd   ç      à?Nc                 C   s&   || _ || _|| _d| _t ¡ | _d S r“   )r#  r$  r%  r&  r	   ÚLockr'  )r   r#  r$  r%  r   r   r   rE   j  s
   zLRUCache.__init__c                 C   s   |  j d7  _ | j S ©Nr   )r&  r   r   r   r   Ú_inc_counterq  s   zLRUCache._inc_counterc                 C   s.   t  | ||¡}||ur|  ¡ |d< |d S |S ©Né   r   )r6   ru   r,  )r   r*   rt   r•   r   r   r   ru   u  s
   zLRUCache.getc                 C   s    t  | |¡}|  ¡ |d< |d S r-  )r6   rg   r,  )r   r*   r•   r   r   r   rg   }  s   zLRUCache.__getitem__c                 C   s   dd„ t  | ¡D ƒS )Nc                 S   s   g | ]}|d  ‘qS )r   r   r  r   r   r   r&   ƒ  r‰   z#LRUCache.values.<locals>.<listcomp>)r6   r\   r   r   r   r   r\   ‚  rŠ   zLRUCache.valuesc                 C   s   || v r| | S || |< |S r#   r   r)   r   r   r   rO   …  s   zLRUCache.setdefaultc                 C   sF   t  | |¡}|d u r|||  ¡ g}t  | ||¡ n||d< |  ¡  d S r+  )r6   ru   r,  rC   Ú_manage_size)r   r*   r+   r•   r   r   r   rC   Œ  s   zLRUCache.__setitem__c                 C   s   | j | j | j  S r#   )r#  r$  r   r   r   r   Úsize_threshold•  s   zLRUCache.size_thresholdc              	   C   sÜ   | j  d¡sd S z_t| jƒ}t| ƒ| j| j| j  kr`|r$d}|  | ¡ tt 	| ¡t
 d¡dd�}|| jd … D ]}z| |d = W q8 tyJ   Y q8w t| ƒ| j| j| j  ksW | j  ¡  d S W | j  ¡  d S | j  ¡  w )NFr.  T)r*   Úreverser   )r'  Úacquirer  r%  rX   r#  r$  Úsortedr6   r\   rû   rü   rl   Úrelease)r   r%  Ú
by_counterr•   r   r   r   r/  ™  s*   

ÿþöòzLRUCache._manage_size)r(  r)  Nr#   )r   r   r   r1   r   rE   r,  ru   rg   r\   rO   rC   r2   r0  r/  r   r   r   r   r"  ^  s    	

	
r"  r(  c                 C   sl   | ft |ƒ }t |¡}|r|S t| tftdd„ t|ƒD ƒdg ƒƒ}||_t dd„ |D ƒƒ|_|t|< |S )Nc                 S   s$   g | ]\}}|d ur|t | f‘qS r#   )Ú_property_getters)r$   rý   Úfieldr   r   r   r&   ¼  s
    
þz+lightweight_named_tuple.<locals>.<listcomp>)r   r   c                 S   r"   r#   r   )r$   Úfr   r   r   r&   Æ  r'   )	r   Ú
_lw_tuplesru   rÏ   r3   r6   Ú	enumerater4   r   )ÚnameÚfieldsÚhash_Útp_clsr   r   r   Úlightweight_named_tuple²  s&   
þûÿýr?  c                   @   ó8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚScopedRegistryaÆ  A Registry that can store one or multiple instances of a single
    class on the basis of a "scope" function.

    The object implements ``__call__`` as the "getter", so by
    calling ``myregistry()`` the contained object is returned
    for the current scope.

    :param createfunc:
      a callable that returns a new object to be placed in the registry

    :param scopefunc:
      a callable that will return a key to store/retrieve an object.
    c                 C   s   || _ || _i | _dS )aV  Construct a new :class:`.ScopedRegistry`.

        :param createfunc:  A creation function that will generate
          a new value for the current scope, if none is present.

        :param scopefunc:  A function that returns a hashable
          token representing the current scope (such as, current
          thread identifier).

        N)Ú
createfuncÚ	scopefuncÚregistry)r   rB  rC  r   r   r   rE   Û  s   
zScopedRegistry.__init__c                 C   s:   |   ¡ }z| j| W S  ty   | j ||  ¡ ¡ Y S w r#   )rC  rD  rl   rO   rB  rf   r   r   r   Ú__call__ê  s   ÿzScopedRegistry.__call__c                 C   s   |   ¡ | jv S )z9Return True if an object is present in the current scope.)rC  rD  r   r   r   r   Úhasñ  s   zScopedRegistry.hasc                 C   s   || j |  ¡ < dS )z$Set the value for the current scope.N)rD  rC  ©r   rd   r   r   r   r—   ö  s   zScopedRegistry.setc                 C   s(   z	| j |  ¡ = W dS  ty   Y dS w )z Clear the current scope, if any.N)rD  rC  rl   r   r   r   r   rM   û  s
   ÿzScopedRegistry.clearN©	r   r   r   r1   rE   rE  rF  r—   rM   r   r   r   r   rA  Ì  s    rA  c                   @   r@  )ÚThreadLocalRegistryz\A :class:`.ScopedRegistry` that uses a ``threading.local()``
    variable for storage.

    c                 C   s   || _ t ¡ | _d S r#   )rB  r	   ÚlocalrD  )r   rB  r   r   r   rE   
  r€   zThreadLocalRegistry.__init__c                 C   s2   z| j jW S  ty   |  ¡  }| j _| Y S w r#   )rD  r+   r(   rB  )r   rù   r   r   r   rE    s   
þzThreadLocalRegistry.__call__c                 C   s   t | jdƒS )Nr+   )r†   rD  r   r   r   r   rF    r-   zThreadLocalRegistry.hasc                 C   s   || j _d S r#   )rD  r+   rG  r   r   r   r—     r-   zThreadLocalRegistry.setc                 C   s"   z| j `W d S  ty   Y d S w r#   )rD  r+   r(   r   r   r   r   rM     s
   ÿzThreadLocalRegistry.clearNrH  r   r   r   r   rI    s    rI  c                 c   s   � | D ]	}t |ƒ|fV  qdS )z*Generator: ((id(o), o) for o in iterable).Nrç   )r¡   r•   r   r   r   rÞ   "  s   €ÿrÞ   r#   )7r1   Ú
__future__r   rû   r  rì   Úcompatr   r   r   r   r   r	   Ú	frozensetÚ	EMPTY_SETr   r
   r   r3   rU   r:   r6   rD   rP   rz   rp   r{   r—   r–   r¾   rë   rô   rö   r  Úcolumn_dictÚordered_column_setÚpopulate_column_dictrü   Ú_gettersr6  r˜   r  r  r  r  r  r  r  r  r"  r9  r?  rA  rI  rÞ   r   r   r   r   Ú<module>   sd   C J
ak S
ÿ

	
	
Q8