ó
¿b›]c           @   sŠ  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 l m
 Z
 d d l m Z e	 r´ d „  Z e Z Z n. e rÐ d	 „  Z e Z Z n e j Z d
 „  Z d „  Z d „  Z d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e d „  ƒ Z d „  Z d e f d „  ƒ  YZ d d d „ Z  d „  Z! d S(   iÿÿÿÿNi   (   t	   decorator(   t   defaultdict(   t   jython(   t   py2k(   t   pypyc          G   s/   t  j ƒ  t j d ƒ t  j ƒ  t  j ƒ  d S(   s    aggressive gc.collect for tests.gš™™™™™¹?i    (   t   gct   collectt   timet   sleep(   t   args(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   jython_gc_collect   s
    


c          G   s   t  j ƒ  t  j ƒ  d  S(   N(   R   R   (   R	   (    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   pypy_gc_collect$   s    
c           C   s   d  S(   N(    (    (    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   lazy_gc-   s    c          #   s¨   t  ƒ  }  t rC y d d  l } |  j | ƒ WqC t k
 r? qC Xn  d d  l } |  j | ƒ xE |  D]= ‰  x4 t d | j ƒ D]  ‰ ˆ  j ‡  ‡ f d †  f Vq| Wqc Wd  S(   Niÿÿÿÿiþÿÿÿc            s   ˆ  j  |  ˆ ƒ S(   N(   t   dumps(   t   d(   t   pickle_t   protocol(    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   <lambda>B   t    (	   t   setR   t   cPicklet   addt   ImportErrort   picklet   ranget   HIGHEST_PROTOCOLt   loads(   t   picklersR   R   (    (   R   R   s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyR   1   s    	c         C   sN   t  |  t ƒ r t |  | ƒ S|  t j d d | ƒ j t j ƒ t d | ƒ S(   Nt   1t   0i
   (   t
   isinstancet   floatt   roundt   decimalt   Decimalt   to_integralt   ROUND_FLOORt   pow(   t   valuet   prec(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   round_decimalE   s
    	t	   RandomSetc           B   s>   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s,   t  t j |  ƒ ƒ } t j | ƒ t | ƒ S(   N(   t   listR   t   __iter__t   randomt   shufflet   iter(   t   selft   l(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyR+   P   s    c         C   sF   t  j d t |  ƒ d ƒ } t t j |  ƒ ƒ | } |  j | ƒ | S(   Ni    i   (   R,   t   randintt   lenR*   R   R+   t   remove(   R/   t   indext   item(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   popU   s    c         C   s   t  t j |  | ƒ ƒ S(   N(   R)   R   t   union(   R/   t   other(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyR7   [   s    c         C   s   t  t j |  | ƒ ƒ S(   N(   R)   R   t
   difference(   R/   R8   (    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyR9   ^   s    c         C   s   t  t j |  | ƒ ƒ S(   N(   R)   R   t   intersection(   R/   R8   (    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyR:   a   s    c         C   s
   t  |  ƒ S(   N(   R)   (   R/   (    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   copyd   s    (   t   __name__t
   __module__R+   R6   R7   R9   R:   R;   (    (    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyR)   O   s   					c         C   s‚   t  t ƒ } x% |  D] \ } } | | j | ƒ q WxG t | ƒ D]5 \ } } x& | | D] } | | | k rX t SqX WqA Wt Sd S(   sA   True if the given sorting conforms to the given partial ordering.N(   R   R   R   t	   enumeratet   Falset   True(   t   tuplest   sorted_elementst   depst   parentt   childt   it   nodet   n(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   conforms_partial_orderingh   s    c            sV   t  t ƒ ‰ x% |  D] \ } } ˆ | j | ƒ q W‡  ‡ f d †  ‰  t ˆ  | ƒ ƒ S(   Nc         3   s†   t  |  ƒ d k r  t |  ƒ Vnb x_ |  D]W } t |  ƒ j | g ƒ } | j ˆ | ƒ s' x# ˆ  | ƒ D] } | g | Vqe Wq' q' Wd  S(   Ni   (   R2   R*   R   R9   R:   (   t   elementst   elemt   subsett   sub_ordering(   t   _all_orderingst   edges(    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyRN   {   s    (   R   R   R   R.   (   RA   RJ   RD   RE   (    (   RN   RO   s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   all_partial_orderingsv   s
    c         C   sL   y | |  _  Wn8 t k
 rG t j |  j |  j | |  j |  j ƒ }  n X|  S(   sc  Return a function with a given __name__.

    Will assign to __name__ and return the original function if possible on
    the Python implementation, otherwise a new function will be constructed.

    This function should be phased out as much as possible
    in favor of @decorator.   Tests that "generate" many named tests
    should be modernized.

    (   R<   t	   TypeErrort   typest   FunctionTypet   __code__t   __globals__t   __defaults__t   __closure__(   t   fnt   name(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   function_named‰   s    %c         O   sr   |  j  ƒ  } y- | | | | Ž } |  j d d d ƒ | SWn2 t j ƒ  } |  j | Œ  } | sf ‚  qn | Sn Xd S(   s  Run the given function under the given contextmanager,
    simulating the behavior of 'with' to support older
    Python versions.

    This is not necessary anymore as we have placed 2.6
    as minimum Python version, however some tests are still using
    this structure.

    N(   t	   __enter__t   __exit__t   Nonet   syst   exc_info(   t   ctxRX   t   argt   kwt   objt   resultR_   t   raise_(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   run_as_contextmanager   s    c         C   s   d „  |  Dƒ S(   sŠ   Converts the results of sql execution into a plain set of column tuples.

    Useful for asserting the results of an unordered query.
    c         S   s   h  |  ] } t  | ƒ ’ q S(    (   t   tuple(   t   .0t   row(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pys	   <setcomp>¼   s   	 (    (   t   results(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   rowset¶   s    c         C   s   t  s t |  ƒ ‚ d  S(   N(   R?   t   AssertionError(   t   msg(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   fail¿   s    c   	      O   sœ   d d l  m } d d l  m } d d l m } | j | j ƒ } | d } t | d d ƒ } | | _	 z |  | | Ž  SWd | j
 | | j ƒ | | _	 Xd S(	   s>   Provide bound MetaData for a single test, dropping afterwards.i   (   t   config(   t   enginesiÿÿÿÿ(   t   schemai    t   metadataN(   R   Ro   Rp   t
   sqlalchemyRq   t   MetaDatat   dbt   getattrR]   Rr   t   drop_all_tables(	   RX   R	   Rb   Ro   Rp   Rq   Rr   R/   t	   prev_meta(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   provide_metadataÃ   s    
	c             s?   d d l  m ‰  d d l m ‰ t ‡  ‡ ‡ f d †  ƒ } | S(   si   Force the given table names to be dropped after test complete,
    isolating for foreign key cycles

    i   (   Ro   iÿÿÿÿ(   t   inspectc            s8   z |  | | Ž  SWd  t  ˆ  j ˆ ˆ  j ƒ d ˆ ƒXd  S(   Nt   include_names(   Rw   Ru   (   RX   R	   Rb   (   Ro   Rz   t   names(    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   goÞ   s    (   R   Ro   Rs   Rz   R    (   R|   R}   (    (   Ro   Rz   R|   s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   force_drop_namesÖ   s    t   adictc           B   s&   e  Z d  Z d „  Z d „  Z e Z RS(   s,   Dict keys available as attributes.  Shadows.c         C   s1   y |  | SWn t  k
 r, t j |  | ƒ SXd  S(   N(   t   KeyErrort   dictt   __getattribute__(   R/   t   key(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyR‚   ì   s    c         G   s!   t  g  | D] } |  | ^ q
 ƒ S(   N(   Rg   (   R/   t   keysRƒ   (    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   __call__ò   s    (   R<   R=   t   __doc__R‚   R…   t   get_all(    (    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyR   é   s   		c         C   s›  d d l  m } m } m } m } m } d d l m }	 m }
 | d  k	 rY t
 | ƒ } n  |  j ƒ  0} x&t | j d | ƒ ƒ D]\ } } | rÙ | d  k	 r± | | k r± q n  | j |	 | | | ƒ  d | ƒƒ ƒ q | r |  j j sñ q n  x™ | D]Ž \ } } | d  k	 r"| | k r"qø n  | | | ƒ  | d | ƒ | d | ƒ d | ƒ} | j |
 | | j j g | j j g d | ƒƒ ƒ qø Wq q WWd  QXd  S(   Niÿÿÿÿ(   t   Columnt   Tablet   IntegerRt   t   ForeignKeyConstraint(   t	   DropTablet   DropConstraintRq   t   xt   yRY   (   Rs   Rˆ   R‰   RŠ   Rt   R‹   t   sqlalchemy.schemaRŒ   R   R]   R   t   connectt   reversedt   get_sorted_table_and_fkc_namest   executet   dialectt   supports_altert   cRŽ   R   (   t   enginet	   inspectorRq   R{   Rˆ   R‰   RŠ   Rt   R‹   RŒ   R   t   connt   tnamet   fkcst   fkct   tb(    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyRw   ø   s8    ("	c            s   t  ‡  f d †  ƒ } | S(   Nc            s#   z |  | | Ž  SWd  ˆ  j  ƒ  Xd  S(   N(   t   _clear(   RX   Ra   Rb   (   t	   event_cls(    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   decorate'  s    (   R    (   R    R¡   (    (   R    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   teardown_events&  s    ("   R!   R   R,   R^   R   RR   t   utilR    R   R   R   R   R
   t
   gc_collectR   R   R   R   R(   R   R)   RI   RP   RZ   Rf   Rk   Rn   Ry   R~   R   R   R]   Rw   R¢   (    (    (    s6   lib/python2.7/site-packages/sqlalchemy/testing/util.pyt   <module>   s@   							
								.