
b]c           @@  s~  d  Z  d d l m Z d d l Z d d l Z e j d- k Z e rR d d l Z n d d l Z d a
 d a d a d a d a d a d Z d a d a d a d a d a e   a e   a d a d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z  d a! d   Z" d   Z# d   Z$ d   Z% d   Z& d   Z' d   Z( g  Z) g  Z* d   Z+ d   Z, e+ d    Z- e+ d    Z. e+ d    Z/ e, d    Z0 e, d    Z1 e, d    Z2 d   Z3 e, d    Z4 e, d    Z5 e, d    Z6 e, d    Z7 d    Z8 d!   Z9 d"   Z: d#   Z; d$   Z< d%   Z= d&   Z> d'   Z? d(   Z@ d)   ZA d eB d*  ZC d+   ZD d,   ZE d S(.   s   Testing extensions.

this module is designed to work as a testing-framework-agnostic library,
created so that multiple test frameworks can be supported at once
(mostly so that we can migrate to new ones). The current target
is py.test.

i    (   t   absolute_importNi   c      
   C@  s8  |  d d d d d d t  d d |  d d d d d d t  d d	 |  d
 d d d d d d d d |  d d d d t d d |  d d d d d d d d d |  d d d d d d d |  d d d d d d d |  d d d d d d d |  d d d d d  |  d! d d d d" d d# |  d$ d d d d% d d& |  d' d d d d( d) t d d* |  d+ d d d d d t d d, |  d- d d d d. d) t d d/ |  d0 d d d t d d d d1 |  d2 d d d t d d d d3 |  d4 d d d d5 d) t d d6 |  d7 d d d d8 d) t d d9 d  S(:   Ns
   --log-infot   actiont   callbackt   typet   stringt   helps,   turn on info logging for <LOG> (multiple OK)s   --log-debugs-   turn on debug logging for <LOG> (multiple OK)s   --dbt   appendt   destt   dbsB   Use prefab database uri. Multiple OK, first one is run by default.s   --dbst   zeroarg_callbacks   List available prefab dbss   --dburit   dburis8   Database uri.  Multiple OK, first one is run by default.s   --dropfirstt
   store_truet	   dropfirsts,   Drop all tables in the target database firsts   --backend-onlyt   backend_onlys<   Run only tests marked with __backend__ or __sparse_backend__s
   --nomemoryt   nomemorys    Don't run memory profiling testss   --postgresql-templatedbs^   name of template database to use for PostgreSQL CREATE DATABASE (defaults to current database)s   --low-connectionst   low_connectionss>   Use a low number of distinct connections - i.e. for Oracle TNSs   --write-identst   write_identssC   write out generated follower idents to <file>, when -n<num> is useds   --reversetopt
   reversetopt   defaultsT   Use a random-ordering set implementation in the ORM (helps reveal dependency issues)s   --requirementss3   requirements class for testing, overrides setup.cfgs   --with-cdecimalt   cdecimalsD   Monkeypatch the cdecimal library into Python 'decimal' for all testss   --include-tags   Include tests with tag <tag>s   --exclude-tags   Exclude tests with tag <tag>s   --write-profilest   write_profiless$   Write/update failing profiling data.s   --force-write-profilest   force_write_profiless,   Unconditionally write/update profiling data.(   t   _logt	   _list_dbst   Falset   _requirements_optt   _include_tagt   _exclude_tag(   t   make_option(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   setup_options2   s    c         C@  s   d d l  m } |  | _ d S(   s   Configure required state for a follower.

    This invokes in the parent process and typically includes
    database creation.

    i    (   t	   provisionN(   t   sqlalchemy.testingR   t   FOLLOWER_IDENT(   t   follower_identR   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   configure_follower   s    c         C@  s   i t  d 6t d 6|  d <d S(   sT  Store important configuration we will need to send to a follower.

    This invokes in the parent process after normal config is set up.

    This is necessary as py.test seems to not be using forking, so we
    start with nothing in memory, *but* it isn't running our argparse
    callables, so we have to just copy all of that over.

    t   include_tagst   exclude_tagst   memoized_configN(   R#   R$   (   t   dict_(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt!   memoize_important_follower_config   s    
c         C@  s.   t  j |  d d  t j |  d d  d S(   sf   Restore important configuration needed by a follower.

    This invokes in the follower process.

    R%   R#   R$   N(   R#   t   updateR$   (   R&   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt!   restore_important_follower_config   s    c           C@  s#   t  j   a t j d d g  d  S(   Ns	   setup.cfgs   test.cfg(   t   configparsert   ConfigParsert   file_configt   read(    (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   read_config   s    c         C@  s(   |  a  x t D] } | t  t  q Wd S(   s7   things to set up early, before coverage might be setup.N(   t   optionst   pre_configureR,   (   t   optt   fn(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt	   pre_begin   s    c         C@  s   |  t  _ d  S(   N(   R/   t   has_coverage(   t   value(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   set_coverage_flag   s    c         C@  s
   |  a  d  S(   N(   t   _skip_test_exception(   t   exc(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   set_skip_test   s    c          C@  s   x t  D] }  |  t t  q Wd d l m a d d l m a m a m a d d l m	 a	 m
 a
 m a d d l m a d d l m a t
 j   d S(   s9   things to set up later, once we know coverage is running.i    (   t   testing(   t   fixturest   enginest
   exclusions(   t
   assertionst   warningst	   profiling(   t   config(   t   utilN(   t   post_configureR/   R,   t
   sqlalchemyR:   R   R;   R<   R=   R>   R?   R@   RA   RB   t   setup_filters(   R2   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt
   post_begin   s    c         C@  sy   t  s d d  l  a  t  j   n  |  j d  rJ t  j |  j t  j  n+ |  j d  ru t  j |  j t  j  n  d  S(   Ni    s   -infos   -debug(   t   loggingt   basicConfigt   endswitht	   getLoggert   setLevelt   INFOt   DEBUG(   t   opt_strR5   t   parser(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR     s    c          G@  sQ   d GHx8 t  t j d   D]! } d | t j d |  f GHq Wt j d  d  S(   Ns0   Available --db options (use --dburi to override)R   s   %20s	%si    (   t   sortedR,   R/   t   gett   syst   exit(   t   argst   macro(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR     s    c         C@  s   t  |  d  S(   N(   t   _setup_requirements(   RN   R5   RO   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR     s    c         C@  s   t  j | j d d   d  S(   Nt   -t   _(   R$   t   addt   replace(   RN   R5   RO   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR     s    c         C@  s   t  j | j d d   d  S(   NRW   RX   (   R#   RY   RZ   (   RN   R5   RO   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR      s    c         C@  s   t  j |   |  S(   N(   R0   R   (   R2   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   pre(  s    c         C@  s   t  j |   |  S(   N(   RC   R   (   R2   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   post-  s    c         C@  s
   |  a  d  S(   N(   R/   (   R1   R,   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   _setup_options2  s    c         C@  s   |  j  r t j d  n  d  S(   Nt   memory_intensive(   R   R$   RY   (   R1   R,   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   _set_nomemory8  s    	c         C@  s)   |  j  r% d d  l  } | t j d <n  d  S(   Ni    t   decimal(   R   RR   t   modules(   R/   R,   R   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   _monkeypatch_cdecimal>  s    	c         C@  s   d d l  m } t | _ d  S(   Ni    (   RA   (   R   RA   R7   (   R/   R,   RA   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   _init_skiptestF  s    c         C@  s  d d l  m } d d l m } d d l  m } |  j rK t |  j  } n g  } |  j r xr |  j D]d } x[ t j	 d |  D]G } | | j
 d  k r t d |   q} | j | j d |   q} Wqd Wn  | s | j | j d d   n  d  | _ x | D] } |  j rS| j rSt |  j d	  # }	 |	 j | j d
 | d  Wd  QXn  | j | |  | | j  }
 | j s|
 j |
 |  qqWd  S(   Ni    (   RA   (   R:   (   R   s   [,\s]+R   s:   Unknown URI specifier '%s'.  Specify --dbs for known uris.R   t   at    s   
(   R   RA   RD   R:   R   R
   t   listR   t   ret   splitR/   t   RuntimeErrorR   RQ   t   Nonet   _currentR   R    t   opent   writet   setup_configt   set_as_current(   R/   R,   RA   R:   R   t   db_urlst   db_tokenR   t   db_urlt   file_t   cfg(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   _engine_uriM  s2    		$	%	c         C@  s    | j  d d  } t |  d  S(   Nt   sqla_testingt   requirement_cls(   RQ   RV   (   R/   R,   Rw   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   _requirementsu  s    c         C@  s   d d l  m } d d l m } | j d  k	 r3 d  S|  j d  \ } } t |  } x* | j d  d D] } t | |  } qh Wt | |  } |   | _ | _	 d  S(   Ni    (   RA   (   R:   t   :t   .i   (
   R   RA   RD   R:   t   requirementsRj   Rh   t
   __import__t   getattrt   requires(   t   argumentRA   R:   t   modnamet   clsnamet   modt	   componentt   req_cls(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyRV   |  s    c      
   C@  s  d d l  m } m } d d l m } d d l m } m } |  j rx| j	 j
   D]} | j } | |  }	 y |	 j   }
 Wn t k
 r n: Xx6 |
 D]. } | j | j | j | | j      q W| j j j |  rNy |	 j d d  }
 Wn t k
 rqNXx? |
 D]4 } | j | j | j | | j   d d   qWn  | j | |	  | j j j |  r| j | |	 d | j n  | | d  rU d d l m } xJ |	 j d	  D]6 } | j | j | j d
 | d
 d | d    qWqU qU Wn  d  S(   Ni    (   RA   RB   (   t   against(   t   schemat   inspectR   t   test_schemat
   postgresql(   R   t   *t   name(   R   RA   RB   t   sqlalchemy.testing.exclusionsR   RD   R   R   R   t   Configt   all_configsR   t   get_view_namest   NotImplementedErrort   executet	   _DropViewt   Tablet   MetaDataR{   t   schemast   enabled_for_configt   drop_all_tablesR   t   sqlalchemy.dialectsR   t	   get_enumst   DropEnumTypet   ENUM(   R/   R,   RA   RB   R   R   R   Rt   t   et	   inspectort
   view_namest   vnameR   t   enum(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   _prep_testing_database  sJ    		 	c         C@  s'   |  j  r# d d l m } |   n  d  S(   Ni    (   t   randomize_unitofwork(   R   t   sqlalchemy.orm.utilR   (   R/   R,   R   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   _reverse_topological  s    	c         C@  s&   d d l  m } t | _ | | _ d  S(   Ni    (   RA   (   R   RA   R/   R,   (   R1   R,   RA   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   _post_setup_options  s    	c         C@  s2   d d l  m } | j | j d d   | _ d  S(   Ni    (   R@   Rv   t   profile_file(   R   R@   t   ProfileStatsFileRQ   t   _profile_stats(   R/   R,   R@   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   _setup_profiling  s    c         C@  sj   t  |  t j  s t S|  j j d  r, t St j j rb t	 |  d t  rb t	 |  d t  rb t St
 Sd  S(   NRX   t   __backend__t   __sparse_backend__(   t
   issubclassR;   t   TestBaseR   t   __name__t
   startswithRA   R/   R   R}   t   True(   t   cls(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt
   want_class  s    c         C@  s   | j  j d  s t S| j d  k r) t St r~ t |  d  r\ t j |  j	  j
 t t  p} t | d  o} | j j
 t t  St r t |  d  r t j |  j	  j
 t t  St r t | d  r | j j
 t t  St Sd  S(   Nt   test_t   __tags__t   _sa_exclusion_extend(   R   R   R   t
   __module__Rj   R#   t   hasattrR=   t   tagsR   t   include_testR$   R   R   (   R   R2   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   want_method  s"    	

c         c@  s   t  |  d t  s$ t  |  d t  r t  |  d t  } x t |  d | D] } |  j } t j d d | j  } t j d d |  } d |  j | f } t | |  f i | d	 6| d
 6 } t | | |  | VqI Wn |  Vd  S(   NR   R   t   sparses
   [_\[\]\.]+RX   s   _+$t    s   %s_%st   _sa_orig_cls_namet   __only_on_config__(	   R}   R   t   _possible_configs_for_clsR   Rg   t   subR   R   t   setattr(   R   t   moduleR   Rt   t	   orig_namet
   alpha_nameR   t   subcls(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   generate_sub_tests  s    	c         C@  s   t  |   t |   d  S(   N(   t	   _do_skipst   _setup_engine(   R   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   start_test_class%  s    
c         C@  s6   t  j j   z t j s& t j   n  Wd  t   Xd  S(   N(   R<   t   testing_reapert   _stop_test_ctxR/   R   R>   t   global_cleanup_assertionst   _restore_engine(   R   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   stop_test_class*  s
    	c           C@  s   t  j j t  d  S(   N(   RA   Rk   t   resetR:   (    (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR   5  s    c           C@  s"   t  j j   t j   t   d  S(   N(   R<   R   t   _stop_test_ctx_aggressiveR>   R   R   (    (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   final_process_cleanup9  s    
c         C@  sA   t  |  d d   r= t j d |  j  } t j j | t  n  d  S(   Nt   __engine_options__R/   (	   R}   Rj   R<   t   testing_engineR   RA   Rk   t   push_engineR:   (   R   t   eng(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR   ?  s    c         C@  s5   t  | d | j  } d | | | f } | t _ d  S(   NR   s   %s.%s.%s(   R}   R   R@   t   _current_test(   t   testt   test_module_namet
   test_classt	   test_nameR   t   id_(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   before_testE  s    c         C@  s   t  j j   d  S(   N(   R<   R   t   _after_test_ctx(   R   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt
   after_testQ  s    c         C@  s  t  t j j    } |  j rf t j |  j   } x3 t |  D]" } | |  r= | j |  q= q= Wn  t	 |  d d   r t j t j |  j    } x3 t |  D]" } | |  s | j |  q q Wn  t	 |  d d   r | j |  j g  n  t |  d  rt j } x| t |  D]k } xb |  j D]W } t	 | |  } | j |  }	 |	 r&| j |  | d  k	 ry| j |	  n  Pq&q&WqWn  t |  d  r$t    }
 t j } xV t |  D]H } x? |  j D]4 } t	 | |  } | j |  s|
 j |  qqWqW| j |
  r$| j |
  q$n  | ri  } xH t t | d d    D]+ } | j j } | | k rL| | | <qLqLW| j   S| S(   Nt   __only_on__R   t   __requires__t   __prefer_requires__t   keyc         S@  s   |  j  j |  j  j j f S(   N(   R   R   t   dialectt   server_version_info(   Rt   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   <lambda>  s    	(   t   setRA   R   R   t   __unsupported_on__R=   t   db_specRf   t   removeR}   Rj   RB   t   to_listR   t   intersection_updateR   R   R{   R   t   matching_config_reasonst   extendR   R   RY   t
   differencet   difference_updatet   reversedRP   R   R   t   values(   R   t   reasonsR   R   t   spect
   config_objR{   t   requirementt   checkt   skip_reasonst   non_preferredt   per_dialectRt   R   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR   U  sZ    				
c         C@  si  g  } t  |  |  } t |  d t  rm xC t |  d  D]/ } |   r7 t j d |  j | j f  q7 q7 Wn  | s d |  j d j d   t j j   D  d j |  f } t j |  n t	 |  d  r@t
   } t j t j |  j    } x* | D]" } | |  s | j |  q q W| j |  r@| j |  q@n  t j | k ret | j   |   n  d  S(   Nt   __skip_if__s   '%s' skipped by %ss.   '%s' unsupported on any DB implementation %s%ss   , c         s@  sM   |  ]C } d  | j  j d j d   t j | j   D  | j  j f Vq d S(   s   '%s(%s)+%s'Rz   c         s@  s   |  ] } t  |  Vq d  S(   N(   t   str(   t   .0t   dig(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pys	   <genexpr>  s   N(   R   R   t   joinR=   t   _server_versiont   driver(   R   R   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pys	   <genexpr>  s   	t   __prefer_backends__(   R   R}   R   RA   t	   skip_testR   R   R   R   R   R   R=   R   RB   R   R  RY   R   R   Rk   t   _setup_configt   pop(   R   R   R   t   ct   msgR   R   R   (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR     s2    	!		c         C@  s   t  j j |  t  d  S(   N(   RA   Rk   t   pushR:   (   R   t   ctx(    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyR    s    (   i   i    (F   t   __doc__t
   __future__R    Rg   RR   t   version_infot   py3kR*   R+   Rj   R;   R<   R=   R?   R@   R>   R{   RA   R:   RB   R,   RG   R   R#   R$   R/   R   R"   R'   R)   R.   R3   R6   R7   R9   RF   R   R   R   R   R   R0   RC   R[   R\   R]   R_   Rb   Rc   Ru   Rx   RV   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R  (    (    (    sD   lib/python2.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyt   <module>   s   																		(	9											A	*