B
    .`O                 @   s4  d Z ddlmZ ddlZddlZddlZejdkZerFddlZej	Z	n ddl
ZddlZG dd deZ	da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d Zd	d
 Z dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'dd Z(dd Z)dd Z*dd  Z+g Z,g Z-d!d" Z.d#d$ Z/e.d%d& Z0e.d'd( Z1e.d)d* Z2e/d+d, Z3e/d-d. Z4e/d/d0 Z5d1d2 Z6e/d3d4 Z7e/d5d6 Z8e/d7d8 Z9e/d9d: Z:d;d< Z;d=d> Z<d?d@ Z=dAdB Z>dCdD Z?dEdF Z@dGdH ZAdIdJ ZBdKdL ZCdMdN ZDdZdPdQZEdRdS ZFdTdU ZGG dVdW dWe	ZHdaIdXdY ZJdS )[zTesting 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 pytest.

    )absolute_importN)   r   c               @   s   e Zd ZejZdS )ABCN)__name__
__module____qualname__abcABCMeta__metaclass__ r   r   T/home/dcms/DCMS/lib/python3.7/site-packages/sqlalchemy/testing/plugin/plugin_base.pyr   "   s   r   c             C   s8  | dddt dd | dddt 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td.d | d/dd0d*d1d, | d2dtdd3d4 | d5dtdd6d4 | d7dd8d*d9d, | d:dd;d*d<d, d S )=Nz
--log-infocallbackstringz,turn on info logging for <LOG> (multiple OK))actiontyper   helpz--log-debugz-turn on debug logging for <LOG> (multiple OK)z--dbappenddbzBUse prefab database uri. Multiple OK, first one is run by default.)r   r   destr   z--dbszList available prefab dbs)r   Zzeroarg_callbackr   z--dburidburiz8Database uri.  Multiple OK, first one is run by default.z--dropfirst
store_true	dropfirstz,Drop all tables in the target database first)r   r   r   z--backend-onlybackend_onlyz<Run only tests marked with __backend__ or __sparse_backend__z
--nomemorynomemoryz Don't run memory profiling testsz--postgresql-templatedbz^name of template database to use for PostgreSQL CREATE DATABASE (defaults to current database))r   r   z--low-connectionslow_connectionsz>Use a low number of distinct connections - i.e. for Oracle TNSz--write-identswrite_identszCwrite out generated follower idents to <file>, when -n<num> is used)r   r   r   z--reversetop
reversetopFzTUse a random-ordering set implementation in the ORM (helps reveal dependency issues))r   r   defaultr   z--requirementsz3requirements class for testing, overrides setup.cfgz--with-cdecimalcdecimalzDMonkeypatch the cdecimal library into Python 'decimal' for all testsz--include-tagzInclude tests with tag <tag>)r   r   r   r   z--exclude-tagzExclude tests with tag <tag>z--write-profilesZwrite_profilesz$Write/update failing profiling data.z--force-write-profilesZforce_write_profilesz,Unconditionally write/update profiling data.)_log	_list_dbs_requirements_opt_include_tag_exclude_tag)make_optionr   r   r   setup_options;   s    r%   c             C   s   ddl m} | |_dS )zConfigure required state for a follower.

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

    r   )	provisionN)sqlalchemy.testingr&   FOLLOWER_IDENT)Zfollower_identr&   r   r   r   configure_follower   s    r)   c             C   s   t td| d< dS )aS  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 pytest 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.

    )include_tagsexclude_tagsmemoized_configN)r*   r+   )dict_r   r   r   !memoize_important_follower_config   s    r.   c             C   s(   t | d d  t| d d  dS )zfRestore important configuration needed by a follower.

    This invokes in the follower process.

    r,   r*   r+   N)r*   updater+   )r-   r   r   r   !restore_important_follower_config   s    r0   c               C   s   t  atddg d S )Nz	setup.cfgztest.cfg)configparserConfigParserfile_configreadr   r   r   r   read_config   s    r5   c             C   s    | a xtD ]}|t t q
W dS )z7things to set up early, before coverage might be setup.N)optionspre_configurer3   )optfnr   r   r   	pre_begin   s    
r:   c             C   s
   | t _d S )N)r6   Zhas_coverage)valuer   r   r   set_coverage_flag   s    r<   c              C   st   xt D ]} | tt qW d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ma ddlma t
  dS )z9things to set up later, once we know coverage is running.r   )testing)fixturesengines
exclusions)
assertionswarnings	profiling)configr&   )utilN)post_configurer6   r3   
sqlalchemyr=   r'   r>   r?   r@   rA   rB   rC   rD   r&   rE   Zsetup_filters)r9   r   r   r   
post_begin   s    
rH   c             C   sR   t sdd l a t   | dr2t |t j n| drNt |t j d S )Nr   z-infoz-debug)loggingbasicConfigendswith	getLoggersetLevelINFODEBUG)opt_strr;   parserr   r   r   r     s    

r   c              G   sF   t d x.ttdD ]}t d|td|f  qW td d S )Nz0Available --db options (use --dburi to override)r   z%20s	%sr   )printsortedr3   r6   getsysexit)argsmacror   r   r   r      s    r    c             C   s   t | d S )N)_setup_requirements)rP   r;   rQ   r   r   r   r!     s    r!   c             C   s   t |dd d S )N-_)r+   addreplace)rP   r;   rQ   r   r   r   r#     s    r#   c             C   s   t |dd d S )NrZ   r[   )r*   r\   r]   )rP   r;   rQ   r   r   r   r"   !  s    r"   c             C   s   t |  | S )N)r7   r   )r9   r   r   r   pre)  s    
r^   c             C   s   t |  | S )N)rF   r   )r9   r   r   r   post.  s    
r_   c             C   s   | a d S )N)r6   )r8   r3   r   r   r   _setup_options3  s    r`   c             C   s   | j rtd d S )NZmemory_intensive)r   r+   r\   )r8   r3   r   r   r   _set_nomemory9  s    ra   c             C   s   | j rdd l }|tjd< d S )Nr   decimal)r   rU   modules)r6   r3   r   r   r   r   _monkeypatch_cdecimal?  s    rd   c             C   s   ddl m} t |_d S )Nr   )rD   )r'   rD   _fixture_fn_classZ_fixture_functions)r6   r3   rD   r   r   r   _init_symbolsG  s    rf   c          
   C   s"  ddl m} ddlm} ddl m} | jr6t| j}ng }| jrxR| jD ]H}xBt	d|D ]2}||
dkrztd| qZ||d| qZW qHW |s||dd d |_xl|D ]d}| jr|jrt| jd	}	|	|jd
 | d  W d Q R X ||| ||j}
|js|
|
| qW d S )Nr   )rD   )r=   )r&   z[,\s]+r   z:Unknown URI specifier '%s'.  Specify --dbs for known uris.r   a 
)r'   rD   rG   r=   r&   r   listr   resplitr6   RuntimeErrorr   rT   _currentr   r(   openwriteZsetup_configZset_as_current)r6   r3   rD   r=   r&   Zdb_urlsZdb_tokenr   Zdb_urlfile_cfgr   r   r   _engine_uriN  s2    

"rs   c             C   s   | dd}t| d S )Nsqla_testingrequirement_cls)rT   rY   )r6   r3   ru   r   r   r   _requirementsv  s    rv   c             C   s~   ddl m} ddlm} |jd k	r&d S | d\}}t|}x$|ddd  D ]}t||}qPW t||}|  |_|_d S )Nr   )rD   )r=   :.   )	r'   rD   rG   r=   requirementsrl   
__import__getattrrequires)argumentrD   r=   modnameZclsnamemod	componentZreq_clsr   r   r   rY   }  s    

rY   c             C   s  ddl m}m} ddlm} ddlm}m} | jrxN|j	
 D ]>}|j}||}	y|	 }
W n tk
rv   Y n,X x(|
D ] }|||||  q~W |jj|ry|	jdd}
W n tk
r   Y n0X x,|
D ]$}|||j|| dd qW |||	 |jj|r4|j||	|jd ||drBddlm} x6|	d	D ](}|||j|d
 |d d qVW qBW d S )Nr   )rD   rE   )against)schemainspecttest_schema)r   
postgresql)r   *namer   )r   r   )r'   rD   rE   Zsqlalchemy.testing.exclusionsr   rG   r   r   r   Configall_configsr   Zget_view_namesNotImplementedErrorexecuteZ	_DropViewZTableZMetaDatarz   Zschemasenabled_for_configZdrop_all_tablesr   Zsqlalchemy.dialectsr   Z	get_enumsZDropEnumTypeZENUM)r6   r3   rD   rE   r   r   r   rr   eZ	inspectorZ
view_namesZvnamer   enumr   r   r   _prep_testing_database  sJ    


r   c             C   s   | j rddlm} |  d S )Nr   )randomize_unitofwork)r   Zsqlalchemy.orm.utilr   )r6   r3   r   r   r   r   _reverse_topological  s    r   c             C   s   ddl m} t|_||_d S )Nr   )rD   )r'   rD   r6   r3   )r8   r3   rD   r   r   r   _post_setup_options  s    r   c             C   s$   ddl m} ||dd|_d S )Nr   )rC   rt   Zprofile_file)r'   rC   ZProfileStatsFilerT   Z_profile_stats)r6   r3   rC   r   r   r   _setup_profiling  s    r   c             C   sJ   t |tjsdS | drdS tjjrBt|ddsBt|ddsBdS dS d S )NFr[   __backend____sparse_backend__T)
issubclassr>   ZTestBase
startswithrD   r6   r   r|   )r   clsr   r   r   
want_class  s    
r   c             C   s   |j dsdS |jd krdS trXt| dr@t| jtt	pVt|doV|j
tt	S t	rzt| drzt| jtt	S t	rt|dr|j
tt	S dS d S )NZtest_F__tags___sa_exclusion_extendT)r   r   r   r*   hasattrr@   tagsr   Zinclude_testr+   r   )r   r9   r   r   r   want_method  s"    


r   c             c   s   t | ddst | ddrt | dd}xtt| |dD ]\}| j}tdd|j}tdd|}d	| j|f }t|| f||d
}t||| |V  q2W n| V  d S )Nr   Fr   )sparsez
[_\[\]\.]+r[   z_+$ z%s_%s)_sa_orig_cls_name__only_on_config__)r|   _possible_configs_for_clsr   rk   subr   r   setattr)r   moduler   rr   	orig_nameZ
alpha_namer   subclsr   r   r   generate_sub_tests  s    
r   c             C   s   t |  t|  d S )N)	_do_skips_setup_engine)r   r   r   r   start_test_class&  s    r   c             C   s:   t ttj|  tj  ztjs*t	
  W d t  X d S )N)r&   stop_test_classrD   r   r?   testing_reaperZ_stop_test_ctxr6   r   rA   global_cleanup_assertions_restore_engine)r   r   r   r   r   +  s    
r   c               C   s   t jt d S )N)rD   rn   resetr=   r   r   r   r   r   8  s    r   c               C   s   t j  t  t  d S )N)r?   r   Z_stop_test_ctx_aggressiverA   r   r   r   r   r   r   final_process_cleanup<  s    
r   c             C   s,   t | dd r(tj| jd}tj|t d S )N__engine_options__)r6   )r|   r?   Ztesting_enginer   rD   rn   Zpush_enginer=   )r   Zengr   r   r   r   B  s    r   c             C   s&   t |d|j}d|||f }|t_d S )Nr   z%s.%s.%s)r|   r   rC   Z_current_test)testZtest_module_nameZ
test_classZ	test_namer   Zid_r   r   r   before_testH  s    r   c             C   s   t j  d S )N)r?   r   Z_after_test_ctx)r   r   r   r   
after_testT  s    r   Fc             C   s  t tj }| jrDtj| j }x"t|D ]}||r*|| q*W t	| dd rtjt
| j }x"t|D ]}||sl|| qlW t	| dd r|| jg t| drtj}xXt|D ]L}xF| jD ]<}t	||}||}	|	r|| |d k	r||	 P qW qW t| drt  }
tj}xDt|D ]8}x0| jD ]&}t	||}||s:|
| q:W q.W ||
r||
 |ri }x8tt|dd dD ] }|jj}||kr|||< qW | S |S )N__only_on__r   __requires____prefer_requires__c             S   s   | j j| j jjfS )N)r   r   dialectZserver_version_info)rr   r   r   r   <lambda>  s    z+_possible_configs_for_cls.<locals>.<lambda>)key)setrD   r   r   Z__unsupported_on__r@   db_specrj   remover|   rE   to_listr   intersection_updater   r   rz   r   Zmatching_config_reasonsextendr   r   r\   
differencedifference_updatereversedrS   r   r   values)r   reasonsr   r   spec
config_objrz   requirementcheckZskip_reasonsnon_preferredZper_dialectrr   r   r   r   r   r   X  sZ    








r   c             C   s   g }t | |}t| ddrJx.t| dD ] }| r&td| j|jf  q&W |sd| jddd tj D d|f }t| nVt| drt	 }t
jt| j }x|D ]}||s|| qW ||r|| tj|krt| |  d S )	NZ__skip_if__Fz'%s' skipped by %sz.'%s' unsupported on any DB implementation %s%sz, c          	   s   s<   | ]4}d |j jddd t|j D |j jf V  qdS )z'%s(%s)+%s'rx   c             s   s   | ]}t |V  qd S )N)str).0digr   r   r   	<genexpr>  s   z&_do_skips.<locals>.<genexpr>.<genexpr>N)r   r   joinr@   Z_server_versionZdriver)r   r   r   r   r   r     s   	z_do_skips.<locals>.<genexpr>__prefer_backends__)r   r|   rD   Z	skip_testr   r   r   r   r   r   r@   r   rE   r   r   r\   r   r   rn   _setup_configpop)r   r   r   cmsgr   r   r   r   r   r   r     s2    
	




r   c             C   s   t j| t d S )N)rD   rn   pushr=   )r   ctxr   r   r   r     s    r   c               @   sL   e Zd Zejdd Zejdd Zejdd Zejdd Zd	d
 Z	dS )FixtureFunctionsc             O   s
   t  d S )N)r   )selfargkwr   r   r   skip_test_exception  s    z$FixtureFunctions.skip_test_exceptionc             O   s
   t  d S )N)r   )r   rW   r   r   r   r   combinations  s    zFixtureFunctions.combinationsc             O   s
   t  d S )N)r   )r   rW   r   r   r   r   param_ident  s    zFixtureFunctions.param_identc             O   s
   t  d S )N)r   )r   r   r   r   r   r   fixture  s    zFixtureFunctions.fixturec             C   s
   t  d S )N)r   )r   r   r   r   get_current_test_name  s    z&FixtureFunctions.get_current_test_nameN)
r   r   r   r   abstractmethodr   r   r   r   r   r   r   r   r   r     s
   r   c             C   s   | a d S )N)re   )Zfixture_fn_classr   r   r   set_fixture_functions  s    r   )NF)K__doc__
__future__r   r   rk   rU   version_infoZpy3kr1   r   r2   collectionscollections_abcobjectr>   r?   r@   rB   rC   r&   rA   rz   rD   r=   rE   r3   rI   r   r*   r+   r6   r%   r)   r.   r0   r5   r:   r<   rH   r   r    r!   r#   r"   r7   rF   r^   r_   r`   ra   rd   rf   rs   rv   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   re   r   r   r   r   r   <module>   s   
(9	
A*