B
    KLc                 @   sd  d Z ddlZddlmZ ddlZddlZddlZddlZddlZddl	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
 ZG dd de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dd!d"ZG d#d$ d$eZd%d& Z dd'd(Z!d)d* Z"dd,d-Z#dd/d0Z$dd1d2Z%dd4d5Z&d6d7 Z'd8d9 Z(dd:d;Z)G d<d= d=eZ*d>d? Z+d@dA Z,ddCdDZ-dEdF Z.ddGdHZ/G dIdJ dJeZ0dKdL Z1G dMdN dNeZ2G dOdP dPeZ3dQdR Z4dSdT Z5dUdV Z6ddWdXZ7dYdZ Z8d[d\ Z9d]d^ Z:dd_d`Z;dadb Z<dcdd Z=G dedf dfe>Z?G dgdh dheZ@G didj djeZAG dkdl dleBZCdmeC_DG dndm dmeZEdaFdodp ZGdqdr ZHddtduZIG dvdw dwejJZKddxdyZLdzd{ ZMdd|d}ZNd~d ZOePdZQePdZReReQfddZSeTdZUdd ZVG dd deTZWdd ZXdd ZYdd ZZdd Z[dd Z\ePdZ]dd Z^dd Z_dd Z`dS )zRoutines to help with the creation, loading and introspection of
modules, classes, hierarchies, attributes, functions, and methods.

    N)update_wrapper   )_collections)compat   )excc             C   s*   t jr| d} t }||  | S )Nzutf-8)r   py3kencodehashlibZmd5updateZ	hexdigest)xm r   :lib/python3.7/site-packages/sqlalchemy/util/langhelpers.pymd5_hex   s
    

r   c               @   s.   e Zd ZdZdZdddZdd Zdd	 Zd
S )safe_reraiseaK  Reraise an exception after invoking some
    handler code.

    Stores the existing exception info before
    invoking so that it is maintained across a potential
    coroutine context switch.

    e.g.::

        try:
            sess.commit()
        except:
            with safe_reraise():
                sess.rollback()

    )	warn_only	_exc_infoFc             C   s
   || _ d S )N)r   )selfr   r   r   r   __init__:   s    zsafe_reraise.__init__c             C   s   t  | _d S )N)sysexc_infor   )r   r   r   r   	__enter__=   s    zsafe_reraise.__enter__c             C   sz   |d kr0| j \}}}d | _ | jsvtj||d nFtjsb| j rb| j d rbtd| j d | j d f  d | _ tj||d d S )N)with_tracebackr   zfAn exception has occurred during handling of a previous exception.  The previous exception is:
 %s %s
r   )r   r   r   Zraise_r   warn)r   type_value	tracebackexc_type	exc_valueZexc_tbr   r   r   __exit__@   s    
zsafe_reraise.__exit__N)F)__name__
__module____qualname____doc__	__slots__r   r   r    r   r   r   r   r   &   s
   
r   c             c   sL   t  }| g}x:|rF| } | |kr&qn
||  ||   | V  qW d S )N)setpopaddextend__subclasses__)clsseenstackr   r   r   walk_subclassesW   s    
r.   c             C   s6   t | tjr| S yt| S  tk
r0   d|  S X d S )Nzunprintable element %r)
isinstancer   string_typesstr	Exception)elementr   r   r   string_or_unprintablee   s    r4   c             C   s   d dd td| jD S )N c             s   s   | ]}|  V  qd S )N)lower).0nr   r   r   	<genexpr>q   s    z(clsname_as_plain_name.<locals>.<genexpr>z([A-Z][a-z]+))joinrefindallr!   )r+   r   r   r   clsname_as_plain_nameo   s    r=   c             C   s.   t | ts| j}n| }|j}t||}||kS )z1Return True if the two class methods don't match.)r/   type	__class__r!   getattr)Zinstance_or_clsZagainst_methodZcurrent_clsmethod_nameZcurrent_methodr   r   r   method_is_overriddenu   s    

rB   c             C   sB   g }x4| j | j| jfD ] }t|dr,| }|| qW t|S )zrdecode a slice object as sent to __getitem__.

    takes into account the 2.5 __index__() method, basically.

    	__index__)startstopstephasattrrC   appendtuple)ZslcZretr   r   r   r   decode_slice   s    
rJ   c          	   '   sp   t | } xb|D ]Z t ft fddtd}x2|D ]}|| kr:| | |V  P q:W td  qW d S )Nc                s    t |  S )N)r1   )i)baser   r   <lambda>       z!_unique_symbols.<locals>.<lambda>i  z&exhausted namespace for symbol base %s)r&   	itertoolschainr   Zitertools_imapranger(   	NameError)ZusedbasesZpoolsymr   )rL   r   _unique_symbols   s    


rU   c             c   s.   x(|r(|| d @ }| |V  ||N }qW dS )z6Call the given function given each nonzero bit from n.r   Nr   )fnr8   br   r   r   map_bits   s    
rX   c                s    fdd}t | S )z'A signature-matching decorator factory.c       	         s   t | st | stdt| }i }t||}t|d |dd  | jf }t	|dd\}}t
||d}|t|dd	 | j|d
< d| }|| || d| ji t||| j}t| d| j|_| |_t|| S )Nznot a decoratable functionr   r      targetrV   )rZ   rV   F)groupednamezDdef %(name)s(%(args)s):
    return %(target)s(%(fn)s, %(apply_kw)s)
r!   __func__)inspect
isfunctionismethodr2   r   inspect_getfullargspec!_update_argspec_defaults_into_envrI   r!   rU   dictr   format_argspec_plusr"   _exec_code_in_envr@   __defaults____wrapped__r   )	rV   specenvnamesZ	targ_namefn_namemetadatacode	decorated)rZ   r   r   decorate   s"    

 
zdecorator.<locals>.decorate)r   )rZ   ro   r   )rZ   r   	decorator   s    rp   c             C   s   | j rxg }d}xJ| j D ]@}t|jdkrLd| }|||< || |d7 }q|| qW t| }t||d< tj| S | S dS )zCgiven a FullArgSpec, convert defaults to be symbol names in an env.r   )builtins__builtin__zx%dr   rY   N)defaultsr>   r"   rH   listrI   r   FullArgSpec)rh   ri   Znew_defaultsrK   argr\   elemr   r   r   rb      s    


rb   c             C   s   t | | || S )N)exec)rm   ri   rk   r   r   r   re      s    
re   c             C   s  t | tr0| j}| }d|r|nd| j |f }n|  }}d| }|dd }t|}|d d= t|dd}||d	< d
| }	|t|j	d}
t
|	|
 |
| }t|dr|j\}}|j}|dkrd| j	| jf }t|d|||f d}||_n|j|_d|ddd  |_	|j	tjkr*td|j	f tjs>t|drb||j_t|jds~||f|j_n||_t|ds~||f|_|S )zProduce a wrapping function for the given cls or classmethod.

    Rationale here is so that the __init__ method of the
    class can serve as documentation for the function.

    zConstruct a new :class:`%s` object. 

This constructor is mirrored as a public API function; see :func:`sqlalchemy%s` for a full usage and argument description.z.%szSThis function is mirrored; see :func:`sqlalchemy%s` for a description of arguments..r   F)r[   r\   z5def %(name)s(%(args)s):
    return cls(%(apply_kw)s)
)r+   symbolr!   
_linked_toNz%s.%sz.. container:: inherited_member

    This documentation is inherited from :func:`sqlalchemy%s`; this constructor, :func:`sqlalchemy%s`,   creates a :class:`sqlalchemy%s` object.  See that class for additional details describing this subclass.r   
sqlalchemyz0public_factory location %s is not in sys.modulesr]   )r/   r>   r   r!   splitr   ra   rd   r{   r"   rx   rG   r|   r$   inject_docstring_textrsplitr   modulesImportErrorpy2kr]   )rZ   locationZclass_locationrV   Z	callable_docZlocation_namerh   rl   rm   ri   rn   Z	linked_toZlinked_to_locationZlinked_to_docr   r   r   public_factory   s\    









r   c               @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )PluginLoaderNc             C   s   || _ i | _|| _d S )N)groupimplsauto_fn)r   r   r   r   r   r   r   @  s    zPluginLoader.__init__c             C   s   | j   d S )N)r   clear)r   r   r   r   r   E  s    zPluginLoader.clearc             C   s   || j kr| j |  S | jr:| |}|r:|| j |< | S x2t| jD ]"}|j|krH|j| j |< | S qHW td| j|f d S )NzCan't load plugin: %s:%s)	r   r   r   Zimportlib_metadata_getr   r\   loadr   ZNoSuchModuleError)r   r\   loaderimplr   r   r   r   H  s    



zPluginLoader.loadc                s    fdd}|| j |< d S )Nc                 s:   t  } x$ ddd  D ]}t| |} qW t| S )Nry   r   )r   import_r~   r@   )modtoken)
modulepathobjnamer   r   r   \  s    
z#PluginLoader.register.<locals>.load)r   )r   r\   r   r   r   r   )r   r   r   register[  s    zPluginLoader.register)N)r!   r"   r#   r   r   r   r   r   r   r   r   r   ?  s   
r   c             C   sj   y
t j}W n. tk
r8   t| }|d t|d fS X | j}|j}t|j	d | t|j
|@ fS d S )Nr   r   )r^   ZCO_VARKEYWORDSAttributeErrorr   ra   bool__code__co_argcountrt   co_varnamesco_flags)rV   Zco_varkeywordsrh   conargsr   r   r   _inspect_func_argse  s    

r   c             C   s   |dk}|rt  }| jdd}|o<t|tjo<t|jtj}|rdt|\}}|	| |sd|sddS |rl|rx| j
D ]}t||dkrtP qtW |d |S )ae  Return the full set of inherited kwargs for the given `cls`.

    Probes a class's __init__ method, collecting all named arguments.  If the
    __init__ defines a \**kwargs catch-all, then the constructor is presumed
    to pass along unrecognized keywords to its base classes, and the
    collection process is repeated recursively on each of the bases.

    Uses a subset of inspect.getfullargspec() to cut down on method overhead,
    as this is used within the Core typing system to create copies of type
    objects which is a performance-sensitive operation.

    No anonymous tuple arguments please !

    Nr   Fr   )r&   __dict__getr/   typesFunctionTyper   CodeTyper   r   	__bases__get_cls_kwargsdiscard)r+   Z_setZtoplevelZctrZhas_initrj   Zhas_kwcr   r   r   r   y  s$    

r   c             C   s   t | d S )zReturn the set of legal kwargs for the given `func`.

    Uses getargspec so is safe to call for methods, functions,
    etc.

    r   )r   ra   )funcr   r   r   get_func_kwargs  s    r   Fc          	   C   sD  t | rtd|  n&t | rn|rb|rbt| }t|jdd |j|j	|j
|j|j|jS t| S nt | r|r|s| jrt| j}t|jdd |j|j	|j
|j|j|jS t| jS ntt | rt| j|ddS t| d rt| jS t| dr4t | jr&t| j|dS td	|  ntd	|  dS )
zReturn the argument signature for any callable.

    All pure-Python callables are accepted, including
    functions, methods, classes, objects with __call__;
    builtins and other edge cases like functools.partial() objects
    raise a TypeError.

    zCan't inspect builtin: %sr   NT)no_self_is_initr]   __call__)r   zCan't inspect callable: %s)r^   Z	isbuiltin	TypeErrorr_   r   ra   ru   argsvarargsvarkwrs   Z
kwonlyargsZkwonlydefaultsZannotationsr`   __self__r]   Zisclassget_callable_argspecr   rG   r   )rV   r   r   rh   r   r   r   r     sH    	




r   Tc          	   C   s  t | rt | }n| }t j| }t |d |d |d d|d }|d r|d d }t |d dd |d |d d|d }n"|d rd|d  }|}nd}|}d}|d r|t|d 7 }|d r|t|d 7 }|d |d  }|r|d| d }	nd}	t j||d |d |	d	d
 d}
|d r\t j|dd |d |d |	dd
 d}n|
}|rzt||||
||dS t|dd ||dd |
dd |dd |dd dS dS )a   Returns a dictionary of formatted, introspected function arguments.

    A enhanced variant of inspect.formatargspec to support code generation.

    fn
       An inspectable callable or tuple of inspect getargspec() results.
    grouped
      Defaults to True; include (parens, around, argument) lists

    Returns:

    args
      Full inspect.formatargspec for fn
    self_arg
      The name of the first positional argument, varargs[0], or None
      if the function defines no positional arguments.
    apply_pos
      args, re-written in calling rather than receiving syntax.  Arguments are
      passed positionally.
    apply_kw
      Like apply_pos, except keyword-ish args are passed as keywords.
    apply_pos_proxied
      Like apply_pos but omits the self/cls argument

    Example::

      >>> format_argspec_plus(lambda self, a, b, c=3, **d: 123)
      {'args': '(self, a, b, c=3, **d)',
       'self_arg': 'self',
       'apply_kw': '(self, a, b, c=c, **d)',
       'apply_pos': '(self, a, b, c, **d)'}

    r   r   r   N   z%s[0]rY   r   c             S   s   d|  S )N=r   )r   r   r   r   rM   3  rN   z%format_argspec_plus.<locals>.<lambda>)Zformatvaluec             S   s   d|  S )Nr   r   )r   r   r   r   rM   <  rN   )r   self_arg	apply_posapply_kwapply_pos_proxiedapply_kw_proxiedrz   )r   callablera   inspect_formatargspeclenrc   )rV   r[   rh   r   r   r   r   Znum_defaultsZ	name_argsZdefaulted_valsr   r   r   r   r   rd     sj    "

(





rd   c             C   sr   | t jkr$|rdnd}|rdnd}n:yt| |dS  tk
r\   |rHdnd}|rTdnd	}Y nX td|||||d
S )a  format_argspec_plus with considerations for typical __init__ methods

    Wraps format_argspec_plus with error handling strategies for typical
    __init__ cases::

      object.__init__ -> (self)
      other unreflectable (usually C) -> (self, *args, **kwargs)

    z(self)r   z() )r[   z(self, *args, **kwargs)zself, *args, **kwargsz(*args, **kwargs)z*args, **kwargs)r   r   r   r   r   r   )objectr   rd   r   rc   )methodr[   r   Zproxiedr   r   r   format_argspec_initU  s     

r   r   c                s    fdd}|S )zA class decorator that will copy attributes to a proxy class.

    The class to be instrumented must define a single accessor "_proxied".

    c                s   d	fdd	}fdd}x6D ].}t | |rFtd| |f t| ||| q(W x6 D ].}t | |r~td| |f t| ||| q`W x:D ]2}t | |rtd| |f t| |||dd qW | S )
NFc       	         s   t | }t|}d|ji}t||}t|dd}|j|d |d |d |d d}|rld	| }|d
< nd| }t|||j}t |d|j|_t	|j
d f d|_
|rt|}|S )Nr!   F)r[   r   r   r   r   )r\   r   r   r   r   zLdef %(name)s(%(args)s):
    return target_cls.%(name)s(%(apply_kw_proxied)s)
target_clszWdef %(name)s(%(args)s):
    return %(self_arg)s._proxied.%(name)s(%(apply_kw_proxied)s)r]   zS.. container:: class_bases

    Proxied for the %s class on behalf of the %s class.r   )r@   r   ra   r"   rb   rd   r!   re   rf   r   r$   classmethod)	r\   clslevelrV   rh   ri   Zcaller_argspecrl   rm   Zproxy_fn)proxy_cls_sphinx_namer   target_cls_sphinx_namer   r   
instrument  s4    




z:create_proxy_methods.<locals>.decorate.<locals>.instrumentc                sR   j | d }|d k	r.t|jd f d}nd }dd| i }t|d|id}|S )NzS.. container:: class_bases

    Proxied for the %s class on behalf of the %s class.r   zdef set_(self, attr):
    self._proxied.%(name)s = attr
def get(self):
    return self._proxied.%(name)s
get.__doc__ = doc
getset = property(get, set_)r\   r   getset)r   r   r   r$   re   )r\   attrr   rm   r   )r   r   r   r   r   makeprop  s    
z8create_proxy_methods.<locals>.decorate.<locals>.makepropz class %s already has a method %sT)r   )F)rG   r   setattr)r+   r   r   methZprop)
attributesclassmethodsmethodsr   r   r   r   r   ro     s$    -





z&create_proxy_methods.<locals>.decorater   )r   r   r   r   r   r   ro   r   )r   r   r   r   r   r   r   create_proxy_methodsv  s    cr   c             C   sJ   y
t | S  tk
rD   | tjkr2dgdddfS dgdddfS Y nX dS )zinspect.getargspec with considerations for typical __init__ methods

    Wraps inspect.getargspec with error handling for typical __init__ cases::

      object.__init__ -> (self)
      other unreflectable (usually C) -> (self, *args, **kwargs)

    r   Nr   kwargs)r   ra   r   r   r   )r   r   r   r   getargspec_init  s    	

r   c             C   s    t | tjr| js| jS | S dS )zSAdjust the incoming callable such that a 'self' argument is not
    required.

    N)r/   r   
MethodTyper   r]   )Zfunc_or_clsr   r   r   unbound_method_to_callable  s    r   c          	      sV  |dkrg}n
t |}t  g }t  }d}xt|D ]\}}yt|j}	W n tk
rh   w:Y q:X |	j	rzt
|	j	p|d}
|dkr|	jr|	j}|
r||	jd|
   q||	jdd  n$| fdd|	jd|
  D  |
r:|dd t|	j|
 d |	j	D  q:W g }|fdd|D  |dk	rdt|rd|d	d t|D  xr| D ]f\}}||krqny6t| }| k	r||kr|d
||f  W n tk
r   Y nX qnW |r@x`|D ]X\}}y6t| }| k	r ||kr |d
||f  W n tk
r8   Y nX qW djjd|f S )z}Produce a __repr__() based on direct association of the __init__()
    specification vs. same-named attributes present.

    Nr   r   c                s   g | ]}| fqS r   r   )r7   rv   )missingr   r   
<listcomp>'  s    z generic_repr.<locals>.<listcomp>c             S   s   g | ]\}}||fqS r   r   )r7   rv   defaultr   r   r   r   -  s   c             3   s   | ]}t t |d V  qd S )N)reprr@   )r7   rv   )objr   r   r9   5  s    zgeneric_repr.<locals>.<genexpr>c             S   s   g | ]}t |qS r   )r   )r7   valr   r   r   r   8  s    z%s=%rz%s(%s)z, )r   to_listr   OrderedDict	enumerater   ra   r   r   rs   r   r   r)   r   r   ziprG   r@   itemsrH   r2   r?   r!   r:   )r   Zadditional_kwZ
to_inspectZ
omit_kwargZpos_argsZkw_argsZvargsrK   Zinsprh   Zdefault_lenoutputrv   Zdefvalr   r   )r   r   r   generic_repr  s`    
  
r   c               @   s6   e Zd ZdZdZdd Zdd Zddd	Zd
d ZdS )portable_instancemethodz_Turn an instancemethod into a (parent, name) pair
    to produce a serializable callable.

    )rZ   r\   r   __weakref__c             C   s   | j | j| jdS )N)rZ   r\   r   )rZ   r\   r   )r   r   r   r   __getstate__X  s    z$portable_instancemethod.__getstate__c             C   s&   |d | _ |d | _|dd| _d S )NrZ   r\   r   r   )rZ   r\   r   r   )r   stater   r   r   __setstate___  s    

z$portable_instancemethod.__setstate__r   c             C   s   |j | _|j| _|| _d S )N)r   rZ   r!   r\   r   )r   r   r   r   r   r   r   d  s    z portable_instancemethod.__init__c             O   s    | | j t| j| j||S )N)r   r   r@   rZ   r\   )r   rv   kwr   r   r   r   i  s    z portable_instancemethod.__call__N)r   )	r!   r"   r#   r$   r%   r   r   r   r   r   r   r   r   r   P  s   
r   c                s  t jrt| tjrt S | h t| j}x|r| }t jrbt|tjrLq* fdd|jD }n fdd|jD }x |D ]}|	|  
| q|W t jr|jdks*t|dsq*n|jdks*t|dsq*x2 fdd| D D ]}|	|  
| qW q*W t S )	a  Return an unordered sequence of all classes related to cls.

    Traverses diamond hierarchies.

    Fibs slightly: subclasses of builtin types are not returned.  Thus
    class_hierarchy(class A(object)) returns (A, object), not A plus every
    class systemwide that derives from object.

    Old-style classes are discarded and hierarchies rooted on them
    will not be descended.

    c             3   s&   | ]}| krt |tjs|V  qd S )N)r/   r   	ClassType)r7   _)hierr   r   r9     s   z"class_hierarchy.<locals>.<genexpr>c             3   s   | ]}| kr|V  qd S )Nr   )r7   r   )r   r   r   r9     s    rq   r*   rr   c                s   g | ]}| kr|qS r   r   )r7   r   )r   r   r   r     s    z#class_hierarchy.<locals>.<listcomp>)r   r   r/   r   r   rt   __mro__r'   r   rH   r(   r   r"   rG   r*   )r+   Zprocessr   rS   rW   sr   )r   r   class_hierarchyn  s4    




r   c             c   sF   t | }x8|D ]0}x*| jD ] }||jkr||j| fV  P qW qW dS )ziterate all the keys and attributes associated
    with a class, without using getattr().

    Does not use getattr() so that class-sensitive
    descriptors (i.e. property.__get__()) are not called.

    N)dirr   r   )r+   keyskeyr   r   r   r   iterate_attributes  s    

r   
self.proxyc          	      s0  |r
|}n$dkrd fddt |D }x|D ]}y&t||}t|dsPw4t|d|}W n tk
rt   w4Y nX y2t|}	t|	d }
t|	d dd }W n tk
r   d	}
d
}Y nX dt  }|dk	r||ipi }t	|| y|j
|| _
W n tk
r   Y nX t |||  q4W dS )z9Automates delegation of __specials__ for a proxying type.N)r%   __del____getattribute__Z__metaclass__r   r   c                s6   g | ].}| d r|d rt |s|kr|qS )__)
startswithendswithrG   )r7   r   )into_clsskipr   r   r     s
   


z0monkeypatch_proxied_specials.<locals>.<listcomp>r   r]   r   r   z(self, *args, **kw)z(*args, **kw)z?def %(method)s%(fn_args)s: return %(name)s.%(method)s%(d_args)s)r   r@   rG   r   r   ra   r   r   localsZexec_rf   r   )r   Zfrom_clsr   Zonlyr\   Zfrom_instanceZdundersr   rV   rh   Zfn_argsZd_argspyri   r   )r   r   r   monkeypatch_proxied_specials  s<    
	




r   c             C   s   t | d| t |d|kS )z;Return True if the two methods are the same implementation.r]   )r@   )Zmeth1Zmeth2r   r   r   methods_equivalent  s    r   c             C   sx  |s|st dt|tr(t| |r(| S t|p>dd t|D }tt| }tj}t|trd|}n|svt }tj}nt|}||||r| S t| t	s|tjkrdpd}t d| |d
|f G dd	 d	t}|rd
|j |_t }	x`t| D ]T\}
}|
|krt d|
 t|s0t d|
|f t||
t| |	|
 qW ||	|r^|S t dd
||	  dS )a  Ensure basic interface compliance for an instance or dict of callables.

    Checks that ``obj`` implements public methods of ``cls`` or has members
    listed in ``methods``. If ``required`` is not supplied, implementing at
    least one interface method is sufficient. Methods present on ``obj`` that
    are not in the interface are ignored.

    If ``obj`` is a dict and ``dict`` does not meet the interface
    requirements, the keys of the dictionary are inspected. Keys present in
    ``obj`` that are not in the interface will raise TypeErrors.

    Raises TypeError if ``obj`` does not meet the interface criteria.

    In all passing cases, an object with callable members is returned.  In the
    simple case, ``obj`` is returned as-is; if dict processing kicks in then
    an anonymous class is returned.

    obj
      A type, instance, or dictionary of callables.
    cls
      Optional, a type.  All public methods of cls are considered the
      interface.  An ``obj`` instance of cls will always pass, ignoring
      ``required``..
    methods
      Optional, a sequence of method names to consider as the interface.
    required
      Optional, a sequence of mandatory implementations. If omitted, an
      ``obj`` that provides at least one interface method is considered
      sufficient.  As a convenience, required may be a type, in which case
      all public methods of the type are required.

    z2a class or collection of method names are requiredc             S   s   g | ]}| d s|qS )r   )r   )r7   r   r   r   r   r     s    z as_interface.<locals>.<listcomp>zany ofzall ofz%r does not implement %s: %sz, c               @   s   e Zd ZdZdS )z(as_interface.<locals>.AnonymousInterfacezA callable-holding shell.N)r!   r"   r#   r$   r   r   r   r   AnonymousInterface6  s   r   Z	Anonymousz%r: unknown in this interfacez%r=%r is not callablez,dictionary does not contain required keys %sN)r   r/   r>   r&   r   operatorgegtintersectionrc   r:   r   r!   dictlike_iteritemsr   r   r   staticmethodr(   )r   r+   r   ZrequiredZ	interfaceZimplementedZcompliesZ	qualifierr   foundr   r   r   r   r   as_interface  sH    !


r  c               @   s6   e Zd ZdZdddZdd Zdd Zed	d
 ZdS )memoized_propertyz2A read-only @property that is only evaluated once.Nc             C   s   || _ |p|j| _|j| _d S )N)fgetr$   r!   )r   r  r   r   r   r   r   Q  s    zmemoized_property.__init__c             C   s&   |d kr| S |  | |j| j< }|S )N)r  r   r!   )r   r   r+   resultr   r   r   __get__V  s    zmemoized_property.__get__c             C   s   t || j d S )N)r  resetr!   )r   r   r   r   r   _reset\  s    zmemoized_property._resetc             C   s   |j |d  d S )N)r   r'   )r+   r   r\   r   r   r   r	  _  s    zmemoized_property.reset)N)	r!   r"   r#   r$   r   r  r
  r   r	  r   r   r   r   r  N  s
   
r  c                s    fdd}t | S )zDecorate a method memoize its return value.

    Best applied to no-arg methods: memoization is not sensitive to
    argument values, and will always return the same value even when
    called with different arguments.

    c                s<   | f||  fdd}j |_ j|_|| jj <  S )Nc                 s    S )Nr   )ar   )r  r   r   memop  s    z6memoized_instancemethod.<locals>.oneshot.<locals>.memo)r!   r$   r   )r   r   r   r  )rV   )r  r   oneshotm  s    z(memoized_instancemethod.<locals>.oneshot)r   )rV   r  r   )rV   r   memoized_instancemethodd  s    	r  c               @   sN   e Zd ZdZdZe Zdd Zdd Zdd Z	G d	d
 d
e
Zedd ZdS )HasMemoizedzyA class that maintains the names of memoized elements in a
    collection for easy cache clearing, generative, etc.

    r   c             C   s"   x| j D ]}| j|d  qW d S )N)_memoized_keysr   r'   )r   rw   r   r   r   _reset_memoizations  s    zHasMemoized._reset_memoizationsc             C   s"   x| j D ]}|| jkstqW d S )N)r  r   AssertionError)r   rw   r   r   r   _assert_no_memoizations  s    z#HasMemoized._assert_no_memoizationsc             C   s   || j |< |  j|hO  _d S )N)r   r  )r   r   r   r   r   r   _set_memoized_attribute  s    
z#HasMemoized._set_memoized_attributec               @   s"   e Zd ZdZdddZdd ZdS )zHasMemoized.memoized_attributezTA read-only @property that is only evaluated once.

        :meta private:

        Nc             C   s   || _ |p|j| _|j| _d S )N)r  r$   r!   )r   r  r   r   r   r   r     s    z'HasMemoized.memoized_attribute.__init__c             C   s8   |d kr| S |  | |j| j< }| j| jhO  _|S )N)r  r   r!   r  )r   r   r+   r  r   r   r   r    s
    z&HasMemoized.memoized_attribute.__get__)N)r!   r"   r#   r$   r   r  r   r   r   r   memoized_attribute  s   
r  c                s    fdd}t | S )z+Decorate a method memoize its return value.c                sN   | f||  fdd}j |_ j|_|| jj < |  jj hO  _ S )Nc                 s    S )Nr   )r  r   )r  r   r   r    s    zBHasMemoized.memoized_instancemethod.<locals>.oneshot.<locals>.memo)r!   r$   r   r  )r   r   r   r  )rV   )r  r   r    s    z4HasMemoized.memoized_instancemethod.<locals>.oneshot)r   )r+   rV   r  r   )rV   r   r    s    z#HasMemoized.memoized_instancemethodN)r!   r"   r#   r$   r%   	frozensetr  r  r  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 ZdS )MemoizedSlotszApply memoized items to an object using a __getattr__ scheme.

    This allows the functionality of memoized_property and
    memoized_instancemethod to be available to a class using __slots__.

    r   c             C   s   t |d S )N)r   )r   r   r   r   r   _fallback_getattr  s    zMemoizedSlots._fallback_getattrc                s    drtnptd rBtd  }t| |S td rztd   fdd} j|_|S S d S )NZ	_memoizedz_memoized_attr_%sz_memoized_method_%sc                 s6   | |  fdd}j |_ j|_t|  S )Nc                 s    S )Nr   )r  r   )r  r   r   r    s    z8MemoizedSlots.__getattr__.<locals>.oneshot.<locals>.memo)r!   r$   r   )r   r   r  )rV   r   r   )r  r   r    s    
z*MemoizedSlots.__getattr__.<locals>.oneshot)r   r   rG   r@   r   r$   r  )r   r   r   r  r   )rV   r   r   r   __getattr__  s    

zMemoizedSlots.__getattr__N)r!   r"   r#   r$   r%   r  r  r   r   r   r   r    s   r  c             C   sD   t | tjr<|   } | dkr$dS | dkr0dS td|  t| S )N)trueZyesZonyt1T)ZfalseZnoZoffr8   f0FzString is not true/false: %r)r/   r   r0   stripr6   
ValueErrorr   )r   r   r   r   asbool  s    r"  c                 s    fdd}|S )zqReturn a callable that will evaluate a string as
    boolean, or one of a set of "alternate" string values.

    c                s   |  kr| S t | S d S )N)r"  )r   )textr   r   bool_or_value  s    z"bool_or_str.<locals>.bool_or_valuer   )r#  r$  r   )r#  r   bool_or_str  s    r%  c             C   s   | dkr| S t | S )zCoerce to integer.N)int)r   r   r   r   asint  s    r'  c             C   sj   |dkr| }|| krft |tr,t | | |sf| | dk	rf|tkrV|rVt| | ||< n|| | ||< dS )zIf 'key' is present in dict 'kw', coerce its value to type 'type\_' if
    necessary.  If 'flexi_bool' is True, the string '0' is considered false
    when coercing to boolean.
    N)r/   r>   r   r"  )r   r   r   Z
flexi_booldestr   r   r   coerce_kw_type  s    r)  c                s$   t |}|ft fdd|D  S )zbProduce a tuple structure that is cacheable using the __dict__ of
    obj to retrieve values

    c             3   s&   | ]}| j kr| j | fV  qd S )N)r   )r7   k)r   r   r   r9     s    z"constructor_key.<locals>.<genexpr>)r   rI   )r   r+   rj   r   )r   r   constructor_key  s    r+  c                s0   t |}| fdd||D  |||S )zInstantiate cls using the __dict__ of obj as constructor arguments.

    Uses inspect to match the named arguments of ``cls``.

    c             3   s&   | ]}| j kr| j | fV  qd S )N)r   )r7   r*  )r   r   r   r9   +  s    z#constructor_copy.<locals>.<genexpr>)r   r   
difference)r   r+   r   r   rj   r   )r   r   constructor_copy"  s    r-  c                 s&   t j td  fdd} | S )z%Return a threadsafe counter function.r   c            	      s   
 t  S Q R X d S )N)nextr   )counterlockr   r   _next7  s    zcounter.<locals>._next)r   	threadingLockrO   count)r1  r   )r/  r0  r   r/  0  s    

r/  c             C   s   t | dr*| jdk	r$t| jtr$tS | jS t| tr8tp:t}|| trJtS || trXtS || trftS t | drttS t | drtS t | drtS |S dS )zGiven an instance or class, guess if it is or is acting as one of
    the basic collection types: list, set and dict.  If the __emulates__
    property is present, return that preferentially.
    __emulates__NrH   r(   r&   )rG   r5  
issubclassr&   r/   r>   rt   rc   )Zspecimenr   Zisar   r   r   duck_type_collection>  s&    







r7  c             C   s^   t | |r| S t |trBtd|ddd |D t| f ntd||t| f d S )Nz8Argument '%s' is expected to be one of type %s, got '%s'z or c             s   s   | ]}d | V  qdS )z'%s'Nr   )r7   r  r   r   r   r9   f  s    z"assert_arg_type.<locals>.<genexpr>z6Argument '%s' is expected to be of type '%s', got '%s')r/   rI   r   ArgumentErrorr:   r>   )rv   Zargtyper\   r   r   r   assert_arg_type_  s    

$r9  c                s   t jrt drFt  S n(t dr0  S t drFt  S t dt dddkrntd  t dr fdd	}| S t d
rtfdd 	 D S td  dS )z?Return a (key, value) iterator for almost any dict-like object.r   	iteritems__getitem__r   NzObject '%r' is not dict-likeiterkeysc              3   s$   x   D ]} | | fV  q
W d S )N)r<  )r   )dictlikegetterr   r   iterator  s    z$dictlike_iteritems.<locals>.iteratorr   c             3   s   | ]}| |fV  qd S )Nr   )r7   r   )r>  r   r   r9     s    z%dictlike_iteritems.<locals>.<genexpr>)
r   r   rG   rt   r   r:  iterr@   r   r   )r=  r?  r   )r=  r>  r   r  o  s     




r  c                   s(   e Zd ZdZ fddZdd Z  ZS )classpropertyaA  A decorator that behaves like @property except that operates
    on classes rather than instances.

    The decorator is currently special when using the declarative
    module, but note that the
    :class:`~.sqlalchemy.ext.declarative.declared_attr`
    decorator should be used for this purpose with declarative.

    c                s$   t t| j|f|| |j| _d S )N)superrA  r   r$   )r   r  rv   r   )r?   r   r   r     s    zclassproperty.__init__c             C   s
   |  |S )N)r  )Zdescr   r+   r   r   r   r    s    zclassproperty.__get__)r!   r"   r#   r$   r   r  __classcell__r   r   )r?   r   rA    s   	rA  c               @   s$   e Zd Zdd Zdd Zdd ZdS )hybridpropertyc             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r     s    zhybridproperty.__init__c             C   s$   |d kr|  |}|S | |S d S )N)r   r   )r   instanceownerZclsvalr   r   r   r    s    
zhybridproperty.__get__c             C   s
   || _ | S )N)r   )r   r   r   r   r   
classlevel  s    zhybridproperty.classlevelN)r!   r"   r#   r   r  rG  r   r   r   r   rD    s   rD  c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	hybridmethodz/Decorate a function as cls- or instance- level.c             C   s   | | _ | _|| _d S )N)r   r]   r   )r   r   r   r   r   r     s    zhybridmethod.__init__c             C   s*   |d kr| j ||jS | j||S d S )N)r   r  r?   r   )r   rE  rF  r   r   r   r    s    zhybridmethod.__get__c             C   s
   || _ | S )N)r   )r   r   r   r   r   rG    s    zhybridmethod.classlevelN)r!   r"   r#   r$   r   r  rG  r   r   r   r   rH    s   rH  c               @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )_symbolNc             C   s@   t |tjst|dkr t|}tt|}||_|r<||_	|S )zConstruct a new named symbol.N)
r/   r   r0   r  hashr&  __new__rI  r\   r$   )r   r\   r   	canonicalvr   r   r   rK    s    z_symbol.__new__c             C   s   t | jdt| ffS )Nr   )r{   r\   r&  )r   r   r   r   
__reduce__  s    z_symbol.__reduce__c             C   s   t | S )N)r   )r   r   r   r   __str__  s    z_symbol.__str__c             C   s
   d| j  S )Nz
symbol(%r))r\   )r   r   r   r   __repr__  s    z_symbol.__repr__)NN)r!   r"   r#   rK  rN  rO  rP  r   r   r   r   rI    s   
rI  r{   c               @   s6   e Zd ZdZi Zej ZdddZ	e
d	ddZdS )
r{   a  A constant symbol.

    >>> symbol('foo') is symbol('foo')
    True
    >>> symbol('foo')
    <symbol 'foo>

    A slight refinement of the MAGICCOOKIE=object() pattern.  The primary
    advantage of symbol() is its repr().  They are also singletons.

    Repeated calls of symbol('name') will all return the same instance.

    The optional ``doc`` argument assigns to ``__doc__``.  This
    is strictly so that Sphinx autoattr picks up the docstring we want
    (it doesn't appear to pick up the in-module docstring if the datamember
    is in a different module - autoattribute also blows up completely).
    If Sphinx fixes/improves this then we would no longer need
    ``doc`` here.

    Nc          	   C   s@   | j 0 | j|}|d kr2t||| | j|< }|S Q R X d S )N)_locksymbolsr   rI  )r+   r\   r   rL  rT   r   r   r   rK    s
    zsymbol.__new__Fc             C   sb   x>|  D ]2\}}||kr|S |r0||jkr0|S ||kr
|S q
W |dkrLdS td||f dS )a  Given a user parameter, parse the parameter into a chosen symbol.

        The user argument can be a string name that matches the name of a
        symbol, or the symbol object itself, or any number of alternate choices
        such as True/False/ None etc.

        :param arg: the user argument.
        :param choices: dictionary of symbol object to list of possible
         entries.
        :param name: name of the argument.   Used in an :class:`.ArgumentError`
         that is raised if the parameter doesn't match any available argument.
        :param resolve_symbol_names: include the name of each symbol as a valid
         entry.

        NzInvalid value for '%s': %r)r   r\   r   r8  )r+   rv   choicesr\   Zresolve_symbol_namesrT   Zchoicer   r   r   parse_user_argument  s    zsymbol.parse_user_argument)NN)F)r!   r"   r#   r$   rR  r   r2  r3  rQ  rK  r   rT  r   r   r   r   r{     s   

c             C   s   t | _ t d7 a dS )zAssign a '_creation_order' sequence to the given instance.

    This allows multiple instances to be sorted in order of creation
    (typically within a single thread; the counter is not particularly
    threadsafe).

    r   N)_creation_order)rE  r   r   r   set_creation_order"  s    	rV  c             O   s<   y
| ||S  t k
r6   tdt dd   Y nX dS )zXexecutes the given function, catches all exceptions and converts to
    a warning.

    z%s('%s') ignoredr   r   N)r2   r   r   r   )r   r   r   r   r   r   warn_exception/  s    
rW     c             C   s>   y$t | |krd| d|  S | S W n tk
r8   | S X d S )Nz%s...r   )r   r   )r   Zlen_r   r   r   ellipses_string:  s    rY  c                   s0   e Zd ZdZ fddZdd Zdd Z  ZS )_hash_limit_stringa/  A string subclass that can only be hashed on a maximum amount
    of unique values.

    This is used for warnings so that we can send out parameterized warnings
    without the __warningregistry__ of the module,  or the non-overridable
    "once" registry within warnings.py, overloading memory,


    c                s@   || d|  }t t| | |}td|t|| f |_|S )Nz6 (this warning may be suppressed after %d occurrences)z%s_%d)rB  rZ  rK  rJ  _hash)r+   r   numr   Zinterpolatedr   )r?   r   r   rK  O  s
    
z_hash_limit_string.__new__c             C   s   | j S )N)r[  )r   r   r   r   __hash__W  s    z_hash_limit_string.__hash__c             C   s   t | t |kS )N)rJ  )r   otherr   r   r   __eq__Z  s    z_hash_limit_string.__eq__)r!   r"   r#   r$   rK  r]  r_  rC  r   r   )r?   r   rZ  D  s   	rZ  c             C   s(   |rt tj| |d nt | tj dS )zdIssue a warning.

    If msg is a string, :class:`.exc.SAWarning` is used as
    the category.

    )rm   N)_warnings_warnr   	SAWarning)msgrm   r   r   r   r   ^  s    r   c             C   s    |rt | d|} t| tj dS )z\Issue a warning with a parameterized string, limiting the number
    of registrations.

    
   N)rZ  r`  r   ra  )rb  r   r   r   r   warn_limitedk  s    rd  c             C   s   yt |}W n& tk
r&   d}Y nB   d}Y n4X x0|d k	rftd|jddrf|j}|d7 }q8W |d k	rtj	| ||d d ntj	| |d d d S )Nr   z^(?:sqlalchemy\.|alembic\.)r!   r   r   )
stacklevel)
r   	_getframer!  r;   match	f_globalsr   f_backwarningsr   )messagecategoryre  framer   r   r   r`  u  s    
r`  c                s    g fdd}|S )zNDecorate the given function to be a no-op after it is called exactly
    once.c                 s>    }r:  }y
|| |S    r2d|  Y nX d S )Nr   )r'   insert)rv   r   Z	strong_fnZonce_fn)rV   onceretry_on_exceptionr   r   go  s    
zonly_once.<locals>.gor   )rV   rp  rq  r   )rV   ro  rp  r   	only_once  s    rr  z%sqlalchemy/([a-z_]+/){0,2}[a-z_]+\.pyzunit(?:2|test2?/)c             C   sh   d}t | d }x"||kr2|| | r2|d7 }qW x"||krV|| | rV|d8 }q6W | ||d  S )at  Chop extraneous lines off beginning and end of a traceback.

    :param tb:
      a list of traceback lines as returned by ``traceback.format_stack()``

    :param exclude_prefix:
      a regular expression object matching lines to skip at beginning of
      ``tb``

    :param exclude_suffix:
      a regular expression object matching lines to skip at end of ``tb``
    r   r   )r   search)tbZexclude_prefixZexclude_suffixrD   endr   r   r   chop_traceback  s    rv  c             C   s$   d|  }t   }t|| |d S )Nz&def set(obj, value):    obj.%s = valuer&   )r   copyrx   )Zattrnamerm   ri   r   r   r   
attrsetter  s    

rx  c                   s(   e Zd ZdZ fddZdd Z  ZS )EnsureKWArgTypezYApply translation of functions to accept \**kw arguments if they
    don't already.

    c       
         sv   | j }|r^xR|D ]J}t||}|r|| }t|}|js| | ||< }	t| ||	 qW tt	| 
||| d S )N)Zensure_kwargr;   rg  r   ra   r   
_wrap_w_kwr   rB  ry  r   )
r+   ZclsnamerS   ZclsdictZfn_regr   r   rV   rh   wrapped)r?   r   r   r     s    

zEnsureKWArgType.__init__c                s    fdd}t | S )Nc                 s    |  S )Nr   )rv   r   )rV   r   r   wrap  s    z(EnsureKWArgType._wrap_w_kw.<locals>.wrap)r   )r   rV   r|  r   )rV   r   rz    s    zEnsureKWArgType._wrap_w_kw)r!   r"   r#   r$   r   rz  rC  r   r   )r?   r   ry    s   ry  c             C   sj   t |drt| |S | }|jj|_t |dr4|j|_t |jdrT|jjrT|jj|_n|jrb|j|_|S dS )zAugment functools.update_wrapper() to work with objects with
    a ``__call__()`` method.

    :param fn:
      object with __call__ method

    r!   r"   r$   N)rG   r   r?   r!   r"   r   r$   )wrapperrV   Z_fr   r   r   wrap_callable  s    



r~  c             C   s   d| kr|  dS d}g g}d}t| }x||k r| | }|dkr|dkr~||d k r~| |d  dkr~|d d |d7 }q|dN }n*|dkr|dkr|g  n|d | |d7 }q*W dd |D S )a  Parse a dotted identifier with accommodation for quoted names.

    Includes support for SQL-style double quotes as a literal character.

    E.g.::

        >>> quoted_token_parser("name")
        ["name"]
        >>> quoted_token_parser("schema.name")
        ["schema", "name"]
        >>> quoted_token_parser('"Schema"."Name"')
        ['Schema', 'Name']
        >>> quoted_token_parser('"Schema"."Name""Foo"')
        ['Schema', 'Name""Foo']

    "ry   r   r   rz   c             S   s   g | ]}d  |qS )r   )r:   )r7   r   r   r   r   r   '  s    z'quoted_token_parser.<locals>.<listcomp>)r~   r   rH   )r   r   r  idxZlvcharr   r   r   quoted_token_parser  s$    

$

r  c                s   t    fdd}|S )Nc                s:   | j d k	r| j pd}|r0t|fdd D }|| _ | S )Nr   c                s   i | ]
} |qS r   r   )r7   param)r#  r   r   
<dictcomp>0  s    z8add_parameter_text.<locals>.decorate.<locals>.<dictcomp>)r$   inject_param_text)rV   r   )paramsr#  r   r   ro   -  s
    z$add_parameter_text.<locals>.decorate)r   r   )r  r#  ro   r   )r  r#  r   add_parameter_text*  s    
r  c             C   sN   |  dd}t|dkr| S |\}}|ds@|d t| S t| S d S )N
r   r5   )r~   r   r   textwrapdedent)r#  Z
split_text	firstlineZ	remainingr   r   r   _dedent_docstring7  s    
r  c             C   s   t | pd} | d}t|dkr,|d t|d}|d rP|dd dd t|D }|dd |t|t|d  }|d| | ||d   }d	|S )Nr   r  r   r   c             S   s   g | ]\}}|  s|qS r   )r   )r7   r\  liner   r   r   r   L  s    z)inject_docstring_text.<locals>.<listcomp>)
r  r~   r   rH   r  r  rn  r   minr:   )doctextZ
injecttextposlinesZinjectlinesZblanksZ
inject_posr   r   r   r   C  s    

r   z(\s+):param (.+?):c       
      C   s  t |  }g }d }x|r| }t|}|d kr|r|dd}||krdt|d d }|rt	d|d }	|	rdt|	d }|||  }nV|r|
d|dg d }n<| s|
||dg d }n|dr|
|| g q|| qW d|S )	Nr   *r5   r   z(\s+)\Sr   r  z::)collectionsdeque
splitlinespopleft
_param_regrg  r   lstripr   r;   r)   rstripr   rH   r:   )
r  Zinject_paramsZdoclinesr  Z	to_injectr  r   r  indentZm2r   r   r   r  X  s6    

r  c             C   s   t | dkrdS t | dk}|r,| dd n| dd | dd  } dd | D }|r`d|S d	d|dd |d f S dS )
zTrims a list of strings from the middle and return a string of up to
    four elements. Strings greater than 11 characters will be truncatedr   Nr   rY   rz   c             S   s,   g | ]$}t |d kr$d|dd   n|qS )   z%s..N)r   )r7   r\   r   r   r   r     s    z$repr_tuple_names.<locals>.<listcomp>z, z%s, ..., %s)r   r:   )rj   flagZresr   r   r   repr_tuple_names  s    (
r  c              C   sB   y(ddl m}  ddl m} ddl m} dS  tk
r<   dS X d S )Nr   )cimmutabledict)cprocessors)cresultproxyTF)r}   r  r  r  r   )r  r  r  r   r   r   has_compiled_ext  s    r  )N)N)FF)T)T)r   r   r   )r   Nr   )NNr   N)NNN)TN)N)rX  )N)Nr   )ar$   r  	functoolsr   r
   r^   rO   r   r;   r   r  r   rj  r   r   r   r   r   r   r   r.   r4   r=   rB   rJ   rU   rX   rp   rb   re   r   r   r   r   r   r   rd   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r"  r%  r'  r)  r+  r-  r/  r7  r9  r  propertyrA  rD  rH  r&  rI  r!   r{   rU  rV  rW  rY  Z	text_typerZ  r   rd  r`  rr  compileZ_SQLA_REZ_UNITTEST_RErv  r>   ZNoneTyperx  ry  r~  r  r  r  r   r  r  r  r  r   r   r   r   <module>   s   1
	#
W&
+
6
p
%  
n
H3   
9
V<)

!D






,
+