B
    \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   ;lib/python3.7/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 )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 )N)r   r   )r   r   r   r   r   r   p   s    z_LW.__new__c             C   s   t t| | jffS )N)r   r   _real_fields)r   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   r,   pop)r   dr   r   r   r(   y   s    z_LW._asdictN)r   r   r   r   r   r-   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   r6   __delitem____setitem__r&   r   r   r   r   r1      s   r1   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 )N)r.   r   __init__)r   argsnewr   r   r   r      s    
zimmutabledict.__new__c             G   s   d S )Nr   )r   r;   r   r   r   r:      s    zimmutabledict.__init__c             C   s   t t| ffS )N)r9   r.   )r   r   r   r   r-      s    zimmutabledict.__reduce__c             C   s@   |s| S | s$t |tr|S t|S nt| }t|| |S d S )N)
isinstancer9   r.   r   )r   r0   Zd2r   r   r   union   s    

zimmutabledict.unionc             C   s   dt |  S )Nzimmutabledict(%s))r.   __repr__)r   r   r   r   r?      s    zimmutabledict.__repr__N)r   r   r   r1   r6   clearr/   popitem
setdefaultr   r   r:   r-   r>   r?   r   r   r   r   r9      s   r9   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 )NrD   )objectr&   )r   datar   r   r   r:      s    zProperties.__init__c             C   s
   t | jS )N)lenrD   )r   r   r   r   __len__   s    zProperties.__len__c             C   s   t t| j S )N)iterr   rD   values)r   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superrC   rD   r   )r   )r3   r   r   __dir__   s    zProperties.__dir__c             C   s   t | t | S )N)r   )r   otherr   r   r   __add__   s    zProperties.__add__c             C   s   || j |< d S )N)rD   )r   r$   objr   r   r   r8      s    zProperties.__setitem__c             C   s
   | j | S )N)rD   )r   r$   r   r   r   __getitem__   s    zProperties.__getitem__c             C   s   | j |= d S )N)rD   )r   r$   r   r   r   r7      s    zProperties.__delitem__c             C   s   || j |< d S )N)rD   )r   r$   rS   r   r   r   r&      s    zProperties.__setattr__c             C   s
   d| j iS )NrD   )rD   )r   r   r   r   __getstate__   s    zProperties.__getstate__c             C   s   t | d|d  d S )NrD   )rE   r&   )r   stater   r   r   __setstate__   s    zProperties.__setstate__c             C   s,   y
| j | S  tk
r&   t|Y nX d S )N)rD   KeyErrorr#   )r   r$   r   r   r   __getattr__   s    
zProperties.__getattr__c             C   s
   || j kS )N)rD   )r   r$   r   r   r   __contains__   s    zProperties.__contains__c             C   s
   t | jS )z8Return an immutable proxy for this :class:`.Properties`.)ImmutablePropertiesrD   )r   r   r   r   as_immutable   s    zProperties.as_immutablec             C   s   | j | d S )N)rD   r   )r   r%   r   r   r   r      s    zProperties.updateNc             C   s   || kr| | S |S d S )Nr   )r   r$   defaultr   r   r   get   s    zProperties.getc             C   s
   t | jS )N)r   rD   )r   r   r   r   r      s    zProperties.keysc             C   s   t | j S )N)r   rD   rJ   )r   r   r   r   rJ      s    zProperties.valuesc             C   s   t | j S )N)r   rD   items)r   r   r   r   r_      s    zProperties.itemsc             C   s
   || j kS )N)rD   )r   r$   r   r   r   has_key   s    zProperties.has_keyc             C   s   | j   d S )N)rD   r@   )r   r   r   r   r@      s    zProperties.clear)N)r   r   r   r)   r   r:   rH   rK   rP   rR   r8   rT   r7   r&   rU   rW   rY   rZ   r\   r   r^   r   rJ   r_   r`   r@   __classcell__r   r   )r3   r   rC      s.   
rC   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 )N)rC   r:   OrderedDict)r   r   r   r   r:      s    zOrderedProperties.__init__N)r   r   r   r)   r   r:   r   r   r   r   rb      s   rb   c               @   s   e Zd ZdZdZdS )r[   zDProvide immutable dict/object attribute to an underlying dictionary.r   N)r   r   r   r)   r   r   r   r   r   r[     s   r[   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 ),rc   zCA dict that returns keys/values/items in the order they were added.)_listc             C   s   t |  ffS )N)rc   r_   )r   r   r   r   r-     s    zOrderedDict.__reduce__Nc             K   s2   g | _ |d kr |r.| jf | n| j|f| d S )N)rd   r   )r   _OrderedDict____sequencekwargsr   r   r   r:     s
    zOrderedDict.__init__c             C   s   g | _ t|  d S )N)rd   r.   r@   )r   r   r   r   r@     s    zOrderedDict.clearc             C   s   |   S )N)__copy__)r   r   r   r   copy  s    zOrderedDict.copyc             C   s   t | S )N)rc   )r   r   r   r   rg     s    zOrderedDict.__copy__c             O   s   | j j|| d S )N)rd   sort)r   r4   r5   r   r   r   ri   !  s    zOrderedDict.sortc             K   sb   |d k	rPt |dr6x<| D ]}| |||  qW nx|D ]\}}|| |< q<W |r^| | d S )Nr   )hasattrr   r8   r   )r   re   rf   r$   r%   r   r   r   r   $  s    
zOrderedDict.updatec             C   s&   || kr|  || |S | |S d S )N)r8   rT   )r   r$   r%   r   r   r   rB   /  s    zOrderedDict.setdefaultc             C   s
   t | jS )N)rI   rd   )r   r   r   r   rK   6  s    zOrderedDict.__iter__c             C   s   t | S )N)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   r"   =  s    z&OrderedDict.values.<locals>.<listcomp>)rd   )r   r   )r   r   rJ   <  s    zOrderedDict.valuesc                s    fdd j D S )Nc                s   g | ]}| | fqS r   r   )r    r$   )r   r   r   r"   @  s    z%OrderedDict.items.<locals>.<listcomp>)rd   )r   r   )r   r   r_   ?  s    zOrderedDict.itemsc             C   s   t |  S )N)rI   rJ   )r   r   r   r   
itervaluesD  s    zOrderedDict.itervaluesc             C   s   t | S )N)rI   )r   r   r   r   iterkeysG  s    zOrderedDict.iterkeysc             C   s   t |  S )N)rI   r_   )r   r   r   r   	iteritemsJ  s    zOrderedDict.iteritemsc             C   sH   || kr6y| j | W n tk
r4   |g| _ Y nX t| || d S )N)rd   appendr#   r.   r8   )r   r$   rS   r   r   r   r8   M  s    zOrderedDict.__setitem__c             C   s   t | | | j| d S )N)r.   r7   rd   remove)r   r$   r   r   r   r7   W  s    zOrderedDict.__delitem__c             G   s.   || k}t j| |f| }|r*| j| |S )N)r.   r/   rd   ro   )r   r$   r]   Zpresentr%   r   r   r   r/   [  s
    zOrderedDict.popc             C   s   t | }| j|d  |S )Nr   )r.   rA   rd   ro   )r   itemr   r   r   rA   b  s    
zOrderedDict.popitem)N)N)r   r   r   r)   r   r-   r:   r@   rh   rg   ri   r   rB   rK   r   rJ   r_   r   rk   rl   rm   r8   r7   r/   rA   r   r   r   r   rc     s,   


rc   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 )N)setr:   rd   unique_listr   )r   r0   r   r   r   r:   i  s    

zOrderedSet.__init__c             C   s$   || kr| j | t| | d S )N)rd   rn   rr   add)r   elementr   r   r   rt   r  s    zOrderedSet.addc             C   s   t | | | j| d S )N)rr   ro   rd   )r   ru   r   r   r   ro   w  s    zOrderedSet.removec             C   s&   || kr| j || t| | d S )N)rd   insertrr   rt   )r   posru   r   r   r   rv   {  s    zOrderedSet.insertc             C   s$   || kr | j | t| | d S )N)rd   ro   rr   )r   ru   r   r   r   discard  s    zOrderedSet.discardc             C   s   t |  g | _d S )N)rr   r@   rd   )r   r   r   r   r@     s    
zOrderedSet.clearc             C   s
   | j | S )N)rd   )r   r$   r   r   r   rT     s    zOrderedSet.__getitem__c             C   s
   t | jS )N)rI   rd   )r   r   r   r   rK     s    zOrderedSet.__iter__c             C   s
   |  |S )N)r>   )r   rQ   r   r   r   rR     s    zOrderedSet.__add__c             C   s   d| j j| jf S )Nz%s(%r))r3   r   rd   )r   r   r   r   r?     s    zOrderedSet.__repr__c             C   s2   x,|D ]$}|| kr| j | t| | qW | S )N)rd   rn   rr   rt   )r   iterableer   r   r   r     s
    
zOrderedSet.updatec             C   s   |  | }|| |S )N)r3   r   )r   rQ   resultr   r   r   r>     s    

zOrderedSet.unionc                s    t   |  fdd| D S )Nc             3   s   | ]}| kr|V  qd S )Nr   )r    a)rQ   r   r   	<genexpr>  s    z*OrderedSet.intersection.<locals>.<genexpr>)rr   r3   )r   rQ   r   )rQ   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 )Nr   )r    r|   )rQ   r   r   r}     s    z2OrderedSet.symmetric_difference.<locals>.<genexpr>c             3   s   | ]}| kr|V  qd S )Nr   )r    r|   )r   r   r   r}     s    )rr   r3   r   )r   rQ   r{   r   )rQ   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 )Nr   )r    r|   )rQ   r   r   r}     s    z(OrderedSet.difference.<locals>.<genexpr>)rr   r3   )r   rQ   r   )rQ   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|   )rQ   r   r   r"     s    z2OrderedSet.intersection_update.<locals>.<listcomp>)rr   intersection_updaterd   )r   rQ   r   )rQ   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   r"     s    z:OrderedSet.symmetric_difference_update.<locals>.<listcomp>c                s   g | ]}| kr|qS r   r   )r    r|   )r   r   r   r"     s    )rr   symmetric_difference_updaterd   )r   rQ   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   r"     s    z0OrderedSet.difference_update.<locals>.<listcomp>)rr   difference_updaterd   )r   rQ   r   )r   r   r     s    zOrderedSet.difference_update)N)r   r   r   r:   rt   ro   rv   rx   r@   rT   rK   rR   r?   __str__r   __ior__r>   __or__r~   __and__r   __xor__r   __sub__r   __iand__r   __ixor__r   __isub__r   r   r   r   rq   h  s6   
	rq   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$x|D ]}| | qW d S )N)r.   _membersrt   )r   ry   or   r   r   r:     s    
zIdentitySet.__init__c             C   s   || j t|< d S )N)r   id)r   r%   r   r   r   rt     s    zIdentitySet.addc             C   s   t || jkS )N)r   r   )r   r%   r   r   r   rZ     s    zIdentitySet.__contains__c             C   s   | j t|= d S )N)r   r   )r   r%   r   r   r   ro     s    zIdentitySet.removec             C   s(   y|  | W n tk
r"   Y nX d S )N)ro   rX   )r   r%   r   r   r   rx     s    zIdentitySet.discardc             C   s4   y| j  }|d S  tk
r.   tdY nX d S )Nr   zpop from an empty set)r   rA   rX   )r   Zpairr   r   r   r/     s
    
zIdentitySet.popc             C   s   | j   d S )N)r   r@   )r   r   r   r   r@     s    zIdentitySet.clearc             C   s   t dd S )Nzcannot compare sets using cmp())r2   )r   rQ   r   r   r   __cmp__  s    zIdentitySet.__cmp__c             C   s   t |tr| j|jkS dS d S )NF)r=   r   r   )r   rQ   r   r   r   __eq__  s    
zIdentitySet.__eq__c             C   s   t |tr| j|jkS dS d S )NT)r=   r   r   )r   rQ   r   r   r   __ne__  s    
zIdentitySet.__ne__c             C   sH   t | |}t| t|kr dS x"t|jjt| j D ]}dS W dS )NFT)typerG   r   r   rZ   rI   r   )r   ry   rQ   mr   r   r   issubset  s    zIdentitySet.issubsetc             C   s   t |tstS | |S )N)r=   r   NotImplementedr   )r   rQ   r   r   r   __le__  s    
zIdentitySet.__le__c             C   s(   t |tstS t| t|k o&| |S )N)r=   r   r   rG   r   )r   rQ   r   r   r   __lt__  s    
zIdentitySet.__lt__c             C   sH   t | |}t| t|k r dS x"t| jjt|j D ]}dS W dS )NFT)r   rG   r   r   rZ   rI   r   )r   ry   rQ   r   r   r   r   
issuperset   s    zIdentitySet.issupersetc             C   s   t |tstS | |S )N)r=   r   r   r   )r   rQ   r   r   r   __ge__,  s    
zIdentitySet.__ge__c             C   s(   t |tstS t| t|ko&| |S )N)r=   r   r   rG   r   )r   rQ   r   r   r   __gt__1  s    
zIdentitySet.__gt__c             C   s6   t |  }|  }t|}|j| || |S )N)r   _member_id_tuples_iter_idr   r   _working_setr>   )r   ry   r{   membersrQ   r   r   r   r>   6  s
    
zIdentitySet.unionc             C   s   t |tstS | |S )N)r=   r   r   r>   )r   rQ   r   r   r   r   >  s    
zIdentitySet.__or__c             C   s   |  |j| _d S )N)r>   r   )r   ry   r   r   r   r   C  s    zIdentitySet.updatec             C   s   t |tstS | | | S )N)r=   r   r   r   )r   rQ   r   r   r   r   F  s    

zIdentitySet.__ior__c             C   s6   t |  }|  }t|}|j| || |S )N)r   r   r   r   r   r   r   )r   ry   r{   r   rQ   r   r   r   r   L  s
    
zIdentitySet.differencec             C   s   t |tstS | |S )N)r=   r   r   r   )r   rQ   r   r   r   r   T  s    
zIdentitySet.__sub__c             C   s   |  |j| _d S )N)r   r   )r   ry   r   r   r   r   Y  s    zIdentitySet.difference_updatec             C   s   t |tstS | | | S )N)r=   r   r   r   )r   rQ   r   r   r   r   \  s    

zIdentitySet.__isub__c             C   s6   t |  }|  }t|}|j| || |S )N)r   r   r   r   r   r   r~   )r   ry   r{   r   rQ   r   r   r   r~   b  s
    
zIdentitySet.intersectionc             C   s   t |tstS | |S )N)r=   r   r   r~   )r   rQ   r   r   r   r   j  s    
zIdentitySet.__and__c             C   s   |  |j| _d S )N)r~   r   )r   ry   r   r   r   r   o  s    zIdentitySet.intersection_updatec             C   s   t |tstS | | | S )N)r=   r   r   r   )r   rQ   r   r   r   r   r  s    

zIdentitySet.__iand__c             C   s6   t |  }|  }t|}|j| || |S )N)r   r   r   r   r   r   r   )r   ry   r{   r   rQ   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 )N)r   )r    vr   r   r   r}     s    z0IdentitySet._member_id_tuples.<locals>.<genexpr>)r   rJ   )r   r   r   r   r     s    zIdentitySet._member_id_tuplesc             C   s   t |tstS | |S )N)r=   r   r   r   )r   rQ   r   r   r   r     s    
zIdentitySet.__xor__c             C   s   |  |j| _d S )N)r   r   )r   ry   r   r   r   r     s    z'IdentitySet.symmetric_difference_updatec             C   s   t |tstS | | | S )N)r=   r   r   r   )r   rQ   r   r   r   r     s    

zIdentitySet.__ixor__c             C   s   t | t| j S )N)r   rI   r   rJ   )r   r   r   r   rh     s    zIdentitySet.copyc             C   s
   t | jS )N)rG   r   )r   r   r   r   rH     s    zIdentitySet.__len__c             C   s   t | j S )N)rI   r   rJ   )r   r   r   r   rK     s    zIdentitySet.__iter__c             C   s   t dd S )Nzset objects are unhashable)r2   )r   r   r   r   __hash__  s    zIdentitySet.__hash__c             C   s   dt | jt| j f S )Nz%s(%r))r   r   r   r   rJ   )r   r   r   r   r?     s    zIdentitySet.__repr__)N)-r   r   r   r)   rr   r   r:   rt   rZ   ro   rx   r/   r@   r   r   r   r   r   r   r   r   r   r>   r   r   r   r   r   r   r   r~   r   r   r   r   r   r   r   r   rh   rg   rH   rK   r   r?   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    ru   )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 )N)r   rn   r   r   r   )r   rp   r   r   r   rn     s    zWeakSequence.appendc             C   s   | j | d S )N)r   ro   )r   r   r   r   r   r     s    zWeakSequence._removec             C   s
   t | jS )N)rG   r   )r   r   r   r   rH     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 )Nr   )r    rS   r   r   r   r}     s    z(WeakSequence.__iter__.<locals>.<genexpr>c             s   s   | ]}| V  qd S )Nr   )r    r   r   r   r   r}     s    )r   )r   r   r   r   rK     s    zWeakSequence.__iter__c             C   s:   y| j | }W n  tk
r.   td| Y nX | S d S )NzIndex %s out of range)r   rX   
IndexError)r   indexrS   r   r   r   rT     s
    zWeakSequence.__getitem__N)r   )	r   r   r   r:   rn   r   rH   rK   rT   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   s2   t |  t | _|r.x|D ]}| | qW d S )N)r   r:   rc   r   rt   )r   ry   r   r   r   r   r:     s
    

zOrderedIdentitySet.__init__)N)r   r   r   rq   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 )N)creator)r   r   r   r   r   r:     s    zPopulateDict.__init__c             C   s   |  | | |< }|S )N)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 )N)r*   operator
itemgetter)idxr   r   r   <lambda>  s    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    r   )hashfuncr   r   r   r   r"     s   )rr   rt   )seqr   r   )r   r   r   r   rs     s    rs   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 )Nrn   rt   )rF   _uniquegetattr_data_appenderrj   rn   rt   )r   rF   Zviar   r   r   r:     s    


zUniqueAppender.__init__c             C   s*   t |}|| jkr&| | d| j|< d S )NT)r   r   r   )r   rp   Zid_r   r   r   rn     s    

zUniqueAppender.appendc             C   s
   t | jS )N)rI   rF   )r   r   r   r   rK     s    zUniqueAppender.__iter__)N)r   r   r   r)   r:   rn   rK   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   )rG   r=   typesGeneratorTyper   )r4   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 )N)r=   r   Iterabler   r   r   )r   r]   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~   )Zset_ry   r   r   r   has_intersection/  s    r   c             C   s,   | d krt  S t| t s$t t| S | S d S )N)rr   r=   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 )N)
column_setr=   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.)rh   r   )r0   Z_newr5   r   r   r   update_copyL  s
    
r   c             c   sF   x@| D ]8}t |ts8t|dr8xt|D ]
}|V  q(W q|V  qW dS )zGiven an iterator of which further sub-elements may also be
    iterators, flatten the sub-elements into a single iterator.

    rK   N)r=   rL   rj   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 )Nr   )r   r   r   r   r	   Z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   )r.   r^   r   )r   r$   r]   rp   r   r   r   r^   z  s
    zLRUCache.getc             C   s    t | |}|  |d< |d S )Nr   r   )r.   rT   r   )r   r$   rp   r   r   r   rT     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"     s    z#LRUCache.values.<locals>.<listcomp>)r.   rJ   )r   r   r   r   rJ     s    zLRUCache.valuesc             C   s    || kr| | S || |< |S d S )Nr   )r   r$   r%   r   r   r   rB     s    zLRUCache.setdefaultc             C   sF   t | |}|d kr2|||  g}t | || n||d< |   d S )Nr   )r.   r^   r   r8   _manage_size)r   r$   r%   rp   r   r   r   r8     s    zLRUCache.__setitem__c             C   s   | j | j | j  S )N)r   r   )r   r   r   r   size_threshold  s    zLRUCache.size_thresholdc          	   C   s   | j dsd S zt| j}xt| | j| j| j  kr|rJd}| |  tt	| t
ddd}x<|| jd  D ]*}y| |d = W qt tk
r   wtY qtX qtW qW W d | j   X d S )NFr   T)r$   reverser   )r   acquirer   r   rG   r   r   sortedr.   rJ   r   r   rX   release)r   r   Z
by_counterrp   r   r   r   r     s     

zLRUCache._manage_size)r   r   N)N)r   r   r   r)   r   r:   r   r^   rT   rJ   rB   r8   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 )N)_property_getters)r    r   Zfieldr   r   r   r"     s   z+lightweight_named_tuple.<locals>.<listcomp>)r   r   c             S   s   g | ]}|d k	r|qS )Nr   )r    fr   r   r   r"     s    )	r   
_lw_tuplesr^   r   r+   r.   	enumerater,   r   )nameZ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:   |   }y
| j| S  tk
r4   | j||  S X d S )N)r   r   rX   rB   r   )r   r$   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   rS   r   r   r   rr     s    zScopedRegistry.setc             C   s*   y| j |  = W n tk
r$   Y nX dS )z Clear the current scope, if any.N)r   r   rX   )r   r   r   r   r@      s    zScopedRegistry.clearN)	r   r   r   r)   r:   r   r   rr   r@   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 )N)r   r	   Zlocalr   )r   r   r   r   r   r:     s    zThreadLocalRegistry.__init__c             C   s2   y| j jS  tk
r,   |   }| j _|S X d S )N)r   r%   r#   r   )r   r   r   r   r   r     s
    zThreadLocalRegistry.__call__c             C   s   t | jdS )Nr%   )rj   r   )r   r   r   r   r     s    zThreadLocalRegistry.hasc             C   s   || j _d S )N)r   r%   )r   rS   r   r   r   rr     s    zThreadLocalRegistry.setc             C   s$   y
| j `W n tk
r   Y nX d S )N)r   r%   r#   )r   r   r   r   r@      s    
zThreadLocalRegistry.clearN)	r   r   r   r)   r:   r   r   rr   r@   r   r   r   r   r   	  s   r   c             c   s    x| D ]}t ||fV  qW dS )z*Generator: ((id(o), o) for o in iterable).N)r   )ry   rp   r   r   r   r   '  s    
r   c             C   s2   d}x(| D ] }||kr
|d7 }|dkr
dS q
W 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   )Zsequencetargetcrp   r   r   r   	has_dupes.  s    

r   )N)N)N)8r)   Z
__future__r   r   r   r   compatr   r   r   r   r   r	   	frozensetZ	EMPTY_SETr   r
   r   r+   rE   r1   r.   r9   rC   rb   r[   rc   rr   rq   r   r   r   r   r   Zcolumn_dictZordered_column_setZpopulate_column_dictr   Z_gettersr   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sb   C O
ak S



		

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