ó
¿b›]c           @   ss  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z e j dA k Z e j dB k Z e j dC k Z	 e j dD k Z
 e j dE k Z e j dF k  Z e j dG k Z e j j d ƒ Z e e d	 ƒ Z e j j d
 ƒ Z e oé e Z e j Z e j Z e j Z e Z e j d d d d d d d d g ƒ Z y d d l Z Wn e k
 rcd d l Z n Xe rvd „  Z n e Z d „  Z  e r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 l$ m, Z, d d l- m. Z. m/ Z/ m0 Z0 m1 Z1 m2 Z2 e f Z3 e4 f Z5 e4 Z6 e Z7 e8 f Z9 e: Z; e$ j< Z= e> Z? e@ ZA eB e" d ƒ ZC eB e" d ƒ ZD eB e" d ƒ ZE d „  ZF d „  ZG d „  ZH d  „  ZI d! „  ZJ d d d" „ ZL d# „  ZM d$ „  ZN e
 rûeO ZO q d% „  ZO n™d d l! Z! d d lP Z# d d l$ Z$ d d l+ m+ Z+ d d lQ m+ Z* d d& l$ mR Z, d d' lS m1 Z1 d d( lS m. Z. d d) lS m2 Z2 d d* lS m/ Z/ d d+ lT m0 Z0 y d d lU Z% Wn e k
 rÚd d l% Z% n XeV f Z3 e4 f Z5 e Z6 eW Z7 e8 eX f Z9 eO ZO eJ ZJ e' Z' e! jH ZH e! jG ZG e$ jY Z= e$ jZ Z? e$ j[ ZA d, „  ZF d d- „ ZC d. „  Z; d/ „  ZD d0 „  ZE d1 „  ZM d2 „  ZN d3 „  ZI d4 „  Z\ d5 d Ue	 ròd d6 l m] Z] d d d dH i  i  e d7 „  d8 „  d9 „  d: „  e] d; „ Z^ n2 e rd d< l m_ Z` d= „  Z^ n d d< l m_ Z^ e r<d d la jb Zc n d d l Zc e j d> „  ƒ Zd d d? „ Ze d@ „  Zf d S(I   s1   Handle Python version/platform incompatibilities.iÿÿÿÿNi   i   i   i   i    t   javat   pypy_version_infot   wint   FullArgSpect   argst   varargst   varkwt   defaultst
   kwonlyargst   kwonlydefaultst   annotationsc         C   s   |  S(   N(    (   t   arg(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   <lambda>7   t    c   	      C   s]  t  j |  ƒ r |  j }  n  t  j |  ƒ sB t d j |  ƒ ƒ ‚ n  |  j } t  j | ƒ sr t d j | ƒ ƒ ‚ n  | j } | j	 } t
 r“ | j n d } t | |  ƒ } t | | | | !ƒ } | | 7} d } | j t  j @rú | j	 | } | d } n  d } | j t  j @r | j	 | } n  t | | | |  j | t
 rD|  j n d t
 rV|  j n i  ƒ S(   s9   Fully vendored version of getfullargspec from Python 3.3.s   {!r} is not a Python functions   {!r} is not a code objecti    i   N(   t   inspectt   ismethodt   __func__t
   isfunctiont	   TypeErrort   formatt   __code__t   iscodet   co_argcountt   co_varnamest   py3kt   co_kwonlyargcountt   listt   Nonet   co_flagst
   CO_VARARGSt   CO_VARKEYWORDSR   t   __defaults__t   __kwdefaults__t   __annotations__(	   t   funct   cot   nargst   namest   nkwargsR   R   R   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   inspect_getfullargspec<   s8    			
(   t   reduce(   t   BytesIO(   t   StringIO(   t   zip_longest(   t
   quote_plust   unquote_plust	   parse_qslt   quotet   unquotet   exect
   __import__t   printc         C   s   |  j  d ƒ S(   Ns   latin-1(   t   encode(   t   s(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   b„   s    c         C   s   t  j |  j d ƒ ƒ S(   Nt   ascii(   t   base64t	   b64decodeR4   (   t   x(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyR9   ‡   s    c         C   s   t  j |  ƒ j d ƒ S(   NR7   (   R8   t	   b64encodet   decode(   R:   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyR;   Š   s    c         C   s   |  j  | d d ƒS(   Nt   errorst   backslashreplace(   R<   (   t   textt   encoding(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   decode_backslashreplace   s    c         C   s   |  | k |  | k  S(   N(    (   t   aR6   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   cmp   s    c         C   s[   | d  k	 r0 | | k	 s$ t d ƒ ‚ | | _ n  | j | k	 rQ | j | ƒ ‚ n  | ‚ d  S(   Ns   Same cause emitted(   R   t   AssertionErrort	   __cause__t   __traceback__t   with_traceback(   t   tpt   valuet   tbt   cause(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   reraise“   s    c         C   s   |  S(   N(    (   R5   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   u›   s    c         C   s   |  S(   N(    (   R5   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   uež   s    c         C   s   t  |  d ƒ S(   Nt   __call__(   t   hasattr(   t   fn(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   callable¥   s    (   t   izip_longest(   R/   (   R,   (   R0   (   R-   (   R.   c         C   s   |  S(   N(    (   R5   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyR6   Í   s    c         B   s#   | d  k r d d  Un d d  Ud  S(   Ns   exec func_text in globals_s   exec func_text in globals_, lcl(   R   (   t	   func_textt   globals_t   lcl(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   exec_Ð   s    c         C   s   d „  |  Dƒ S(   Nc         s   s   |  ] } t  | ƒ Vq d  S(   N(   t   ord(   t   .0t   byte(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pys	   <genexpr>×   s    (    (   t   buf(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt	   iterbytesÖ   s    c          G   sP   t  |  ƒ d k rF |  d d !g  |  d D] } t | ƒ ^ q' f }  n  t |  Œ  S(   Ni   i    i   (   t   lent   strR2   (   R   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   import_Ù   s    4c          O   sk   | j  d t j ƒ } | d  k r% d  Sx? t |  ƒ D]1 } t | t ƒ sV t | ƒ } n  | j | ƒ q2 Wd  S(   Nt   file(	   t   popt   syst   stdoutR   t	   enumeratet
   isinstancet
   basestringR^   t   write(   R   t   kwargst   fpR   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   print_Þ   s    c         C   s   t  |  d ƒ S(   Ns   utf-8(   t   unicode(   R5   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyRM   ç   s    c         C   s   t  |  d ƒ S(   Nt   unicode_escape(   Rk   (   R5   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyRN   î   s    c         C   s=   y |  j  | ƒ SWn% t k
 r8 t |  ƒ d d !j  ƒ  SXd  S(   Ni   iÿÿÿÿ(   R<   t   UnicodeDecodeErrort   repr(   R?   R@   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyRA   ñ   s    c         C   sR   t  |  t ƒ s( t |  ƒ j d d d ƒSt  |  t ƒ rJ |  j d d d ƒS|  Sd  S(   NR7   R=   R>   (   Re   t   string_typesRk   R4   (   R?   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   safe_bytestringú   s
    s—   def reraise(tp, value, tb=None, cause=None):
    if cause is not None:
        assert cause is not value, 'Same cause emitted'
    raise tp, value, tb
(   t   formatannotationc         C   s   d |  S(   Nt   *(    (   t   name(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyR     R   c         C   s   d |  S(   Ns   **(    (   Rs   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyR     R   c         C   s   d t  |  ƒ S(   Nt   =(   Rn   (   RI   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyR     R   c         C   s   d |  S(   Ns    -> (    (   R?   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyR     R   c            s£  ‡  ‡ ‡ f d †  } g  } | r: t  |  ƒ t  | ƒ } n  x` t |  ƒ D]R \ } } | | ƒ } | rŒ | | k rŒ | |
 | | | ƒ } n  | j | ƒ qG W| d k	 rÅ | j | | | ƒ ƒ ƒ n | rÛ | j d ƒ n  | r7xS | D]H } | | ƒ } | r#| | k r#| |
 | | ƒ 7} n  | j | ƒ qè Wn  | d k	 r_| j |	 | | ƒ ƒ ƒ n  d d j | ƒ d } d ˆ  k rŸ| | ˆ ˆ  d ƒ ƒ 7} n  | S(   sa  Copy formatargspec from python 3.7 standard library.

        Python 3 has deprecated formatargspec and requested that Signature
        be used instead, however this requires a full reimplementation
        of formatargspec() in terms of creating Parameter objects and such.
        Instead of introducing all the object-creation overhead and having
        to reinvent from scratch, just copy their compatibility routine.

        Utimately we would need to rewrite our "decorator" routine completely
        which is not really worth it right now, until all Python 2.x support
        is dropped.

        c            s7   ˆ |  ƒ } |  ˆ  k r3 | d ˆ ˆ  |  ƒ 7} n  | S(   Ns   : (    (   R   t   result(   R
   Rq   t	   formatarg(    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   formatargandannotation-  s    Rr   t   (s   , t   )t   returnN(   R]   Rd   t   appendR   t   join(   R   R   R   R   R   R	   R
   Rv   t   formatvarargst   formatvarkwt   formatvaluet   formatreturnsRq   Rw   t   specst   firstdefaultt   iR   t   spect	   kwonlyargRu   (    (   R
   Rq   Rv   s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   inspect_formatargspec  s2    (   t   formatargspecc          O   s   t  |  d d !| Ž  S(   Ni    i   (   t   _inspect_formatargspec(   R„   t   kw(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyR†   U  s    c          g   sð   g  } g  } d } zc yI x= |  D]5 } | j } | j } | j | ƒ  ƒ | j | ƒ q W| VWn t j ƒ  } n XWd xE | r¿ | j ƒ  } y | | Œ  r¥ d } n  Wq{ t j ƒ  } q{ Xq{ W| d k rë t | d | d | d ƒ n  Xd S(   sô   Implement contextlib.nested, mostly for unit tests.

    As tests still need to run on py2.6 we can't use multiple-with yet.

    Function is removed in py3k but also emits deprecation warning in 2.7
    so just roll it here for everyone.

    Ni    i   i   (   NNN(   NNN(   NNN(   R   t   __exit__t	   __enter__R{   Rb   t   exc_infoRa   RL   (   t   managerst   exitst   vars_t   exct   mgrt   exit_t   enter(    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   nestedf  s,     				c         C   se   | d  k r t j ƒ  } n  | \ } } } | |  k	 r< | n d  } t t |  ƒ |  d | d | ƒd  S(   NRJ   RK   (   R   Rb   RŒ   RL   t   type(   t	   exceptionRŒ   t   exc_typet	   exc_valuet   exc_tbRK   (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   raise_from_cause‰  s
    c            s/   d ˆ f ‡  ‡ f d †  ƒ  Y} | d d i  ƒ S(   s    Create a base class with a metaclass.

    Drops the middle class upon creation.

    Source: http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/

    t	   metaclassc              s,   e  Z e j Z e j Z ‡  ‡ f d  †  Z RS(   c            s2   | d  k r" t j |  | d | ƒ Sˆ | ˆ  | ƒ S(   N(    (   R   R•   t   __new__(   t   clsRs   t
   this_basest   d(   t   basest   meta(    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyRœ   ž  s    (   t   __name__t
   __module__R•   RO   t   __init__Rœ   (    (   R    R¡   (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyR›   š  s   		t   temporary_classN(   R   (   R¡   R    R›   (    (   R    R¡   s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   with_metaclass‘  s    		(   i   i   (   i   i   (   i   i   (   i   i   (   i   i    (   i   i    (   i   i   i   (    (g   t   __doc__t   collectionst
   contextlibR   t   operatorRb   t   version_infot   py36t   py33t   py35t   py32R   t   py2kt   py265t   platformt
   startswitht   jythonRP   t   pypyt   win32t   cpythont   contextmanagert
   attrgettert   dottedgettert
   namedtuplet   nextR   t	   threadingt   ImportErrort   dummy_threadingt
   safe_kwargR^   R'   R8   t   builtinst   configparsert	   itertoolst   picklet	   functoolsR(   t   ioR)   t   byte_bufferR*   R+   t   urllib.parseR,   R-   R.   R/   R0   Ro   t   bytest   binary_typest   binary_typet	   text_typet   intt	   int_typest   iterR\   t   filterfalset   itertools_filterfalset   filtert   itertools_filtert   mapt   itertools_imapt   getattrRW   R_   Rj   R6   R9   R;   RA   RC   R   RL   RM   RN   RR   t   ConfigParsert	   cStringIORS   t   urllibt   urlparset   cPickleRf   Rk   t   longt   ifilterfalset   ifiltert   imapRp   Rq   R†   R‡   Rˆ   t   collections.abct   abct   collections_abcR”   Rš   R¦   (    (    (    s5   lib/python2.7/site-packages/sqlalchemy/util/compat.pyt   <module>   s
  				&(																													5#