U
    x^q                     @   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'dHd)d*Z(G d+d, d,eZ)d-d. Z*dId/d0Z+d1d2 Z,d3d4 Z-d5d6 Z.dJd7d8Z/d9d: Z0G d;d< d<eZ1e1d=Z2d>d? Z3G d@dA dAeZ4G dBdC dCe4Z5dDdE Z6dFdG Z7dS )Kz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   s
   t | jS )zReturn a list of string key names for this :class:`.KeyedTuple`.

        .. seealso::

            :attr:`.KeyedTuple._fields`

        )list_fieldsselfr   r   D/tmp/pip-install-dq5v43_d/SQLAlchemy/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 )zReturn a tuple of string key names for this :class:`.KeyedTuple`.

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

        .. seealso::

            :meth:`.KeyedTuple.keys`

        c                 S   s   g | ]}|d k	r|qS Nr   ).0lr   r   r   
<listcomp>^   s      z&KeyedTuple._fields.<locals>.<listcomp>)r   r   r   r   r   r   r   S   s    zKeyedTuple._fieldsc                 C   s   t d| d S )NzCan't set attribute: %s)AttributeErrorr   keyvaluer   r   r   __setattr__`   s    zKeyedTuple.__setattr__c                    s    fdd   D S )zReturn 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   s      z&KeyedTuple._asdict.<locals>.<dictcomp>)r   r   r   r   r   _asdictc   s    zKeyedTuple._asdict)N)	r   r   r   __doc__r   propertyr   r)   r,   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   s    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   r0   popr   dr   r   r   r,   y   s    z_LW._asdictN)r   r   r   r   r   r1   r,   r   r   r   r   r/   m   s   r/   c                   @   s    e Zd Zdd Ze Z ZZdS )ImmutableContainerc                 O   s   t d| jj d S )Nz%s object is immutable)	TypeError	__class__r   r   argkwr   r   r   
_immutable   s    zImmutableContainer._immutableN)r   r   r   r<   __delitem____setitem__r)   r   r   r   r   r6      s   r6   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|f|  |S r!   )r2   r   __init__)r   argsnewr   r   r   r      s    
zimmutabledict.__new__c                 G   s   d S r!   r   )r   rA   r   r   r   r@      s    zimmutabledict.__init__c                 C   s   t t| ffS r!   )r?   r2   r   r   r   r   r1      s    zimmutabledict.__reduce__c                 C   s@   |s| S | s$t |tr|S t|S nt| }t|| |S d S r!   )
isinstancer?   r2   r   )r   r5   Zd2r   r   r   union   s    

zimmutabledict.unionc                 C   s   dt |  S )Nzimmutabledict(%s))r2   __repr__r   r   r   r   rE      s    zimmutabledict.__repr__N)r   r   r   r6   r<   clearr3   popitem
setdefaultr   r   r@   r1   rD   rE   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 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dd  Zd.d"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Z  ZS )/
Propertiesz8Provide a __getattr__/__setattr__ interface over a dict._datac                 C   s   t | d| d S NrK   objectr)   )r   datar   r   r   r@      s    zProperties.__init__c                 C   s
   t | jS r!   )lenrK   r   r   r   r   __len__   s    zProperties.__len__c                 C   s   t t| j S r!   )iterr   rK   valuesr   r   r   r   __iter__   s    zProperties.__iter__c                    s"   t tt| dd | j D  S )Nc                 S   s   g | ]}t |qS r   )str)r"   kr   r   r   r$      s    z&Properties.__dir__.<locals>.<listcomp>)dirsuperrI   rK   r   r   r8   r   r   __dir__   s    zProperties.__dir__c                 C   s   t | t | S r!   r   r   otherr   r   r   __add__   s    zProperties.__add__c                 C   s   || j |< d S r!   rJ   r   r'   objr   r   r   r>      s    zProperties.__setitem__c                 C   s
   | j | S r!   rJ   r   r'   r   r   r   __getitem__   s    zProperties.__getitem__c                 C   s   | j |= d S r!   rJ   ra   r   r   r   r=      s    zProperties.__delitem__c                 C   s   || j |< d S r!   rJ   r_   r   r   r   r)      s    zProperties.__setattr__c                 C   s
   d| j iS rL   rJ   r   r   r   r   __getstate__   s    zProperties.__getstate__c                 C   s   t | d|d  d S rL   rM   )r   stater   r   r   __setstate__   s    zProperties.__setstate__c                 C   s.   z| j | W S  tk
r(   t|Y nX d S r!   )rK   KeyErrorr%   ra   r   r   r   __getattr__   s    zProperties.__getattr__c                 C   s
   || j kS r!   rJ   ra   r   r   r   __contains__   s    zProperties.__contains__c                 C   s
   t | jS )z8Return an immutable proxy for this :class:`.Properties`.)ImmutablePropertiesrK   r   r   r   r   as_immutable   s    zProperties.as_immutablec                 C   s   | j | d S r!   )rK   r   r   r(   r   r   r   r      s    zProperties.updateNc                 C   s   || kr| | S |S d S r!   r   )r   r'   defaultr   r   r   get   s    zProperties.getc                 C   s
   t | jS r!   )r   rK   r   r   r   r   r      s    zProperties.keysc                 C   s   t | j S r!   )r   rK   rS   r   r   r   r   rS      s    zProperties.valuesc                 C   s   t | j S r!   )r   rK   itemsr   r   r   r   rn      s    zProperties.itemsc                 C   s
   || j kS r!   rJ   ra   r   r   r   has_key   s    zProperties.has_keyc                 C   s   | j   d S r!   )rK   rF   r   r   r   r   rF      s    zProperties.clear)N)r   r   r   r-   r   r@   rQ   rT   rZ   r^   r>   rb   r=   r)   rc   re   rg   rh   rj   r   rm   r   rS   rn   ro   rF   __classcell__r   r   rY   r   rI      s.   
rI   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!   )rI   r@   OrderedDictr   r   r   r   r@      s    zOrderedProperties.__init__N)r   r   r   r-   r   r@   r   r   r   r   rq      s   rq   c                   @   s   e Zd ZdZdZdS )ri   zDProvide immutable dict/object attribute to an underlying dictionary.r   N)r   r   r   r-   r   r   r   r   r   ri     s   ri   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rdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) ZdS ),rr   zCA dict that returns keys/values/items in the order they were added._listc                 C   s   t |  ffS r!   )rr   rn   r   r   r   r   r1     s    zOrderedDict.__reduce__Nc                 K   s2   g | _ |d kr |r.| jf | n| j|f| d S r!   )rt   r   )r   _OrderedDict____sequencekwargsr   r   r   r@     s
    zOrderedDict.__init__c                 C   s   g | _ t|  d S r!   )rt   r2   rF   r   r   r   r   rF     s    zOrderedDict.clearc                 C   s   |   S r!   )__copy__r   r   r   r   copy  s    zOrderedDict.copyc                 C   s   t | S r!   )rr   r   r   r   r   rw     s    zOrderedDict.__copy__c                 O   s   | j j|| d S r!   )rt   sortr9   r   r   r   ry   !  s    zOrderedDict.sortc                 K   sZ   |d k	rHt |dr2| D ]}| |||  qn|D ]\}}|| |< q6|rV| | d S )Nr   )hasattrr   r>   r   )r   ru   rv   r'   r(   r   r   r   r   $  s    

zOrderedDict.updatec                 C   s&   || kr|  || |S | |S d S r!   )r>   rb   r&   r   r   r   rH   /  s    zOrderedDict.setdefaultc                 C   s
   t | jS r!   rR   rt   r   r   r   r   rT   6  s    zOrderedDict.__iter__c                 C   s   t | S r!   r[   r   r   r   r   r   9  s    zOrderedDict.keysc                    s    fdd j D S )Nc                    s   g | ]} | qS r   r   r*   r   r   r   r$   =  s     z&OrderedDict.values.<locals>.<listcomp>rs   r   r   r   r   rS   <  s    zOrderedDict.valuesc                    s    fdd j D S )Nc                    s   g | ]}| | fqS r   r   r*   r   r   r   r$   @  s     z%OrderedDict.items.<locals>.<listcomp>rs   r   r   r   r   rn   ?  s    zOrderedDict.itemsc                 C   s   t |  S r!   )rR   rS   r   r   r   r   
itervaluesD  s    zOrderedDict.itervaluesc                 C   s   t | S r!   )rR   r   r   r   r   iterkeysG  s    zOrderedDict.iterkeysc                 C   s   t |  S r!   )rR   rn   r   r   r   r   	iteritemsJ  s    zOrderedDict.iteritemsc                 C   sH   || kr6z| j | W n tk
r4   |g| _ Y nX t| || d S r!   )rt   appendr%   r2   r>   r_   r   r   r   r>   M  s    zOrderedDict.__setitem__c                 C   s   t | | | j| d S r!   )r2   r=   rt   removera   r   r   r   r=   W  s    zOrderedDict.__delitem__c                 G   s.   || k}t j| |f| }|r*| j| |S r!   )r2   r3   rt   r   )r   r'   rl   Zpresentr(   r   r   r   r3   [  s
    zOrderedDict.popc                 C   s   t | }| j|d  |S Nr   )r2   rG   rt   r   r   itemr   r   r   rG   b  s    
zOrderedDict.popitem)N)N)r   r   r   r-   r   r1   r@   rF   rx   rw   ry   r   rH   rT   r   rS   rn   r   r|   r}   r~   r>   r=   r3   rG   r   r   r   r   rr     s,   


rr   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 k	r2t|| _t | | j ng | _d S r!   )setr@   rt   unique_listr   r4   r   r   r   r@   i  s    

zOrderedSet.__init__c                 C   s$   || kr| j | t| | d S r!   rt   r   r   addr   elementr   r   r   r   r  s    zOrderedSet.addc                 C   s   t | | | j| d S r!   )r   r   rt   r   r   r   r   r   w  s    zOrderedSet.removec                 C   s&   || kr| j || t| | d S r!   )rt   insertr   r   )r   posr   r   r   r   r   {  s    zOrderedSet.insertc                 C   s$   || kr | j | t| | d S r!   )rt   r   r   r   r   r   r   discard  s    zOrderedSet.discardc                 C   s   t |  g | _d S r!   )r   rF   rt   r   r   r   r   rF     s    
zOrderedSet.clearc                 C   s
   | j | S r!   rs   ra   r   r   r   rb     s    zOrderedSet.__getitem__c                 C   s
   t | jS r!   r{   r   r   r   r   rT     s    zOrderedSet.__iter__c                 C   s
   |  |S r!   )rD   r\   r   r   r   r^     s    zOrderedSet.__add__c                 C   s   d| j j| jf S Nz%s(%r))r8   r   rt   r   r   r   r   rE     s    zOrderedSet.__repr__c                 C   s.   |D ]$}|| kr| j | t| | q| S r!   r   )r   iterableer   r   r   r     s
    zOrderedSet.updatec                 C   s   |  | }|| |S r!   )r8   r   r   r]   resultr   r   r   rD     s    

zOrderedSet.unionc                    s    t   |  fdd| D S )Nc                 3   s   | ]}| kr|V  qd S r!   r   r"   ar]   r   r   	<genexpr>  s      z*OrderedSet.intersection.<locals>.<genexpr>r   r8   r\   r   r   r   intersection  s    zOrderedSet.intersectionc                    s<   t    fddD }|fdd D  |S )Nc                 3   s   | ]}| kr|V  qd S r!   r   r   r   r   r   r     s      z2OrderedSet.symmetric_difference.<locals>.<genexpr>c                 3   s   | ]}| kr|V  qd S r!   r   r   r   r   r   r     s      )r   r8   r   r   r   )r]   r   r   symmetric_difference  s    zOrderedSet.symmetric_differencec                    s    t   |  fdd| D S )Nc                 3   s   | ]}| kr|V  qd S r!   r   r   r   r   r   r     s      z(OrderedSet.difference.<locals>.<genexpr>r   r\   r   r   r   
difference  s    zOrderedSet.differencec                    s.   t   t |    fdd| jD | _| S )Nc                    s   g | ]}| kr|qS r   r   r   r   r   r   r$     s      z2OrderedSet.intersection_update.<locals>.<listcomp>)r   intersection_updatert   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                    s   g | ]}| kr|qS r   r   r   r   r   r   r$     s      z:OrderedSet.symmetric_difference_update.<locals>.<listcomp>c                    s   g | ]}| kr|qS r   r   r   r   r   r   r$     s      )r   symmetric_difference_updatert   r\   r   r   r   r     s    z&OrderedSet.symmetric_difference_updatec                    s&   t  |  fdd jD  _ S )Nc                    s   g | ]}| kr|qS r   r   r   r   r   r   r$     s      z0OrderedSet.difference_update.<locals>.<listcomp>)r   difference_updatert   r\   r   r   r   r     s    zOrderedSet.difference_update)N)r   r   r   r@   r   r   r   r   rF   rb   rT   r^   rE   __str__r   __ior__rD   __or__r   __and__r   __xor__r   __sub__r   __iand__r   __ixor__r   __isub__r   r   r   r   r   h  s6   
	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IdentitySetzA 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 r!   )r2   _membersr   r   r   or   r   r   r@     s    zIdentitySet.__init__c                 C   s   || j t|< d S r!   r   idrk   r   r   r   r     s    zIdentitySet.addc                 C   s   t || jkS r!   )r   r   rk   r   r   r   rh     s    zIdentitySet.__contains__c                 C   s   | j t|= d S r!   r   rk   r   r   r   r     s    zIdentitySet.removec                 C   s(   z|  | W n tk
r"   Y nX d S r!   )r   rf   rk   r   r   r   r     s    zIdentitySet.discardc                 C   s6   z| j  }|d W S  tk
r0   tdY nX d S )Nr   zpop from an empty set)r   rG   rf   )r   pairr   r   r   r3     s
    

zIdentitySet.popc                 C   s   | j   d S r!   )r   rF   r   r   r   r   rF     s    zIdentitySet.clearc                 C   s   t dd S )Nzcannot compare sets using cmp()r7   r\   r   r   r   __cmp__  s    zIdentitySet.__cmp__c                 C   s   t |tr| j|jkS dS d S )NFrC   r   r   r\   r   r   r   __eq__  s    
zIdentitySet.__eq__c                 C   s   t |tr| j|jkS dS d S NTr   r\   r   r   r   __ne__  s    
zIdentitySet.__ne__c                 C   sF   t | |}t| t|kr dS t|jjt| j D ]} dS dS NFTtyperP   r   r   rh   rR   r   r   r   r]   mr   r   r   issubset  s     zIdentitySet.issubsetc                 C   s   t |tstS | |S r!   )rC   r   NotImplementedr   r\   r   r   r   __le__  s    
zIdentitySet.__le__c                 C   s(   t |tstS t| t|k o&| |S r!   )rC   r   r   rP   r   r\   r   r   r   __lt__  s    
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   s   t |tstS | |S r!   )rC   r   r   r   r\   r   r   r   __ge__,  s    
zIdentitySet.__ge__c                 C   s(   t |tstS t| t|ko&| |S r!   )rC   r   r   rP   r   r\   r   r   r   __gt__1  s    
zIdentitySet.__gt__c                 C   s6   t |  }|  }t|}|j| || |S r!   )r   _member_id_tuples_iter_idr   r   _working_setrD   r   r   r   membersr]   r   r   r   rD   6  s
    
zIdentitySet.unionc                 C   s   t |tstS | |S r!   )rC   r   r   rD   r\   r   r   r   r   >  s    
zIdentitySet.__or__c                 C   s   |  |j| _d S r!   )rD   r   r   r   r   r   r   r   C  s    zIdentitySet.updatec                 C   s   t |tstS | | | S r!   )rC   r   r   r   r\   r   r   r   r   F  s    

zIdentitySet.__ior__c                 C   s6   t |  }|  }t|}|j| || |S r!   )r   r   r   r   r   r   r   r   r   r   r   r   L  s
    
zIdentitySet.differencec                 C   s   t |tstS | |S r!   )rC   r   r   r   r\   r   r   r   r   T  s    
zIdentitySet.__sub__c                 C   s   |  |j| _d S r!   )r   r   r   r   r   r   r   Y  s    zIdentitySet.difference_updatec                 C   s   t |tstS | | | S r!   )rC   r   r   r   r\   r   r   r   r   \  s    

zIdentitySet.__isub__c                 C   s6   t |  }|  }t|}|j| || |S r!   )r   r   r   r   r   r   r   r   r   r   r   r   b  s
    
zIdentitySet.intersectionc                 C   s   t |tstS | |S r!   )rC   r   r   r   r\   r   r   r   r   j  s    
zIdentitySet.__and__c                 C   s   |  |j| _d S r!   )r   r   r   r   r   r   r   o  s    zIdentitySet.intersection_updatec                 C   s   t |tstS | | | S r!   )rC   r   r   r   r\   r   r   r   r   r  s    

zIdentitySet.__iand__c                 C   s6   t |  }|  }t|}|j| || |S r!   )r   r   r   r   r   r   r   r   r   r   r   r   x  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     s     z0IdentitySet._member_id_tuples.<locals>.<genexpr>)r   rS   r   r   r   r   r     s    zIdentitySet._member_id_tuplesc                 C   s   t |tstS | |S r!   rC   r   r   r   r\   r   r   r   r     s    
zIdentitySet.__xor__c                 C   s   |  |j| _d S r!   )r   r   r   r   r   r   r     s    z'IdentitySet.symmetric_difference_updatec                 C   s   t |tstS | | | S r!   r   r\   r   r   r   r     s    

zIdentitySet.__ixor__c                 C   s   t | t| j S r!   )r   rR   r   rS   r   r   r   r   rx     s    zIdentitySet.copyc                 C   s
   t | jS r!   )rP   r   r   r   r   r   rQ     s    zIdentitySet.__len__c                 C   s   t | j S r!   )rR   r   rS   r   r   r   r   rT     s    zIdentitySet.__iter__c                 C   s   t dd S )Nzset objects are unhashabler   r   r   r   r   __hash__  s    zIdentitySet.__hash__c                 C   s   dt | jt| j f S r   )r   r   r   r   rS   r   r   r   r   rE     s    zIdentitySet.__repr__)N)-r   r   r   r-   r   r   r@   r   rh   r   r   r3   rF   r   r   r   r   r   r   r   r   r   rD   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rx   rw   rQ   rT   r   rE   r   r   r   r   r     sR   

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   Z_WeakSequence__elementsr   r   r   r@     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   s   | j | d S r!   )r   r   )r   r   r   r   r   r     s    zWeakSequence._removec                 C   s
   t | jS r!   )rP   r   r   r   r   r   rQ     s    zWeakSequence.__len__c                 C   s   dd dd | j D D S )Nc                 s   s   | ]}|d k	r|V  qd S r!   r   )r"   r`   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   rT     s    zWeakSequence.__iter__c                 C   s:   z| j | }W n  tk
r.   td| Y nX | S d S )NzIndex %s out of range)r   rf   
IndexError)r   indexr`   r   r   r   rb     s
    zWeakSequence.__getitem__N)r   )	r   r   r   r@   r   r   rQ   rT   rb   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   Z__sa_hash_exempt__r   r   r   r   r     s   r   Nc                 C   s.   t |  t | _|r*|D ]}| | qd S r!   )r   r@   rr   r   r   r   r   r   r   r@     s
    
zOrderedIdentitySet.__init__)N)r   r   r   r   r   r@   r   r   r   r   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )PopulateDictzA 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   r@     s    zPopulateDict.__init__c                 C   s   |  | | |< }|S r!   r   )r   r'   valr   r   r   __missing__  s    zPopulateDict.__missing__N)r   r   r   r-   r@   r   r   r   r   r   r     s   r   c                 C   s   t t| S r!   )r.   operator
itemgetter)idxr   r   r   <lambda>      r   c                    s>   t  j s$fdd| D S  fdd| D S d S )Nc                    s    g | ]}| kr|s|qS r   r   r"   x)seenseen_addr   r   r$     s       zunique_list.<locals>.<listcomp>c                    s(   g | ] } |k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 )
UniqueAppenderzAppends 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   sH   || _ i | _|rt||| _n&t|dr2|j| _nt|drD|j| _d S )Nr   r   )rO   _uniquegetattr_data_appenderrz   r   r   )r   rO   Zviar   r   r   r@     s    


zUniqueAppender.__init__c                 C   s*   t |}|| jkr&| | d| j|< d S r   )r   r   r   )r   r   Zid_r   r   r   r     s    

zUniqueAppender.appendc                 C   s
   t | jS r!   )rR   rO   r   r   r   r   rT     s    zUniqueAppender.__iter__)N)r   r   r   r-   r@   r   rT   r   r   r   r   r      s   

r   c                 C   s0   t | dkr(t| d tjr(t| d S | S d S )Nr   r   )rP   rC   typesGeneratorTyper   )r:   r   r   r   coerce_generator_arg  s    r   c                 C   sF   | d kr|S t | tjr&t | tt r,| gS t | tr:| S t| S d S r!   )rC   r   Iterabler   r   r   )r   rl   r   r   r   to_list"  s     
r   c                 C   s   t | dd |D S )zreturn 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$   7  s      z$has_intersection.<locals>.<listcomp>)boolr   )set_r   r   r   r   has_intersection/  s    r   c                 C   s,   | d krt  S t| t s$t t| S | S d S r!   )r   rC   r   r   r   r   r   to_set:  s
    
r   c                 C   s,   | d krt  S t| t s$t t| S | S d S r!   )
column_setrC   r   r   r   r   r   to_column_setC  s
    
r   c                 K   s&   |   } |r| | | jf | | S )z5Copy the given dict and update with the given values.)rx   r   )r5   Z_newr;   r   r   r   update_copyL  s
    
r   c                 c   s>   | D ]4}t |ts2t|dr2t|D ]
}|V  q$q|V  qdS )zGiven an iterator of which further sub-elements may also be
    iterators, flatten the sub-elements into a single iterator.

    rT   N)rC   rU   rz   flatten_iterator)r   elemyr   r   r   r   V  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 )LRUCachezDictionary 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_mutexd         ?Nc                 C   s&   || _ || _|| _d| _t | _d S r   )r   r   r   r   r	   Lockr   )r   r   r   r   r   r   r   r@   o  s
    zLRUCache.__init__c                 C   s   |  j d7  _ | j S Nr   )r   r   r   r   r   _inc_counterv  s    zLRUCache._inc_counterc                 C   s2   t | ||}||k	r*|  |d< |d S |S d S N   r   )r2   rm   r  )r   r'   rl   r   r   r   r   rm   z  s
    zLRUCache.getc                 C   s    t | |}|  |d< |d S r  )r2   rb   r  )r   r'   r   r   r   r   rb     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$     s     z#LRUCache.values.<locals>.<listcomp>)r2   rS   r   r   r   r   rS     s    zLRUCache.valuesc                 C   s    || kr| | S || |< |S d S r!   r   r&   r   r   r   rH     s    zLRUCache.setdefaultc                 C   sF   t | |}|d kr2|||  g}t | || n||d< |   d S r  )r2   rm   r  r>   _manage_size)r   r'   r(   r   r   r   r   r>     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 zt| j}t| | j| j| j  kr|rHd}| |  tt	
| tddd}|| jd  D ],}z| |d = W qp tk
r   Y qpY qpX qpqW 5 | j   X d S )NFr  T)r'   reverser   )r   acquirereleaser   r   rP   r   r   sortedr2   rS   r   r   rf   )r   r   Z
by_counterr   r   r   r   r    s&    

  zLRUCache._manage_size)r   r  N)N)r   r   r   r-   r   r@   r  rm   rb   rS   rH   r>   r.   r  r  r   r   r   r   r   c  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 k	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   s   g | ]}|d k	r|qS r!   r   )r"   fr   r   r   r$     s      )	r   
_lw_tuplesrm   r   r/   r2   	enumerater0   r   )namefieldsZhash_Ztp_clsr   r   r   lightweight_named_tuple  s&    
r  c                   @   s8   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   r  r  r   r   r   r@     s    zScopedRegistry.__init__c                 C   s@   |   }z| j| W S  tk
r:   | j||   Y S X d S r!   )r  r  rf   rH   r  ra   r   r   r   __call__  s
    zScopedRegistry.__call__c                 C   s   |   | jkS )z9Return True if an object is present in the current scope.)r  r  r   r   r   r   has  s    zScopedRegistry.hasc                 C   s   || j |  < dS )z$Set the value for the current scope.N)r  r  r   r`   r   r   r   r     s    zScopedRegistry.setc                 C   s*   z| j |  = W n tk
r$   Y nX dS )z Clear the current scope, if any.N)r  r  rf   r   r   r   r   rF      s    zScopedRegistry.clearN	r   r   r   r-   r@   r  r  r   rF   r   r   r   r   r    s   r  c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )ThreadLocalRegistryz\A :class:`.ScopedRegistry` that uses a ``threading.local()``
    variable for storage.

    c                 C   s   || _ t | _d S r!   )r  r	   localr  )r   r  r   r   r   r@     s    zThreadLocalRegistry.__init__c                 C   s8   z
| j jW S  tk
r2   |   }| j _| Y S X d S r!   )r  r(   r%   r  )r   r   r   r   r   r    s
    
zThreadLocalRegistry.__call__c                 C   s   t | jdS )Nr(   )rz   r  r   r   r   r   r    s    zThreadLocalRegistry.hasc                 C   s   || j _d S r!   )r  r(   r  r   r   r   r     s    zThreadLocalRegistry.setc                 C   s$   z
| j `W n tk
r   Y nX d S r!   )r  r(   r%   r   r   r   r   rF      s    
zThreadLocalRegistry.clearNr  r   r   r   r   r  	  s   r  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   c                 C   s0   d}| D ]"}||kr|d7 }|dkr dS qdS )zrGiven a sequence and search object, return True if there's more
    than one, False if zero or one of them.


    r   r   TFr   )sequencetargetcr   r   r   r   	has_dupes.  s    
r"  )N)N)N)8r-   
__future__r   r   r   r   compatr   r   r   r   r   r	   	frozenset	EMPTY_SETr   r
   r   r/   rN   r6   r2   r?   rI   rq   ri   rr   r   r   r   r   r   r   r   Zcolumn_dictZordered_column_setZpopulate_column_dictr   Z_gettersr  r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r"  r   r   r   r   <module>   sd   C O
ak S


		

Q8