U
    r\j+T                     @   sr  d Z ddlmZ ddlZddladdlZddlZdZtdZ	ej
dkZer\d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 Z0d#d$ Z1d%d& Z2e1d'd( Z3e1d)d* Z4e1d+d, Z5e1d-d. Z6e2d/d0 Z7e1d1d2 Z8e2d3d4 Z9e2d5d6 Z:d7d8 Z;e2d9d: Z<e2d;d< Z=e2d=d> Z>e2d?d@ Z?dAdB Z@dCdD ZAdEdF ZBdGdH ZCdIdJ ZDdKdL ZEdMdN ZFdOdP ZGdQdR ZHdSdT ZIdUdV ZJdWdX ZKdcdYdZZLd[d\ ZMd]d^ ZNG d_d` d`eZOdaPdadb ZQdS )dzTesting 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_importNFzsqlalchemy.testing.plugin_base)   r   c                   @   s   e Zd ZejZdS )ABCN)__name__
__module____qualname__abcABCMetaZ__metaclass__ r
   r
   \/root/pica-gateway/venv/lib/python3.8/site-packages/sqlalchemy/testing/plugin/plugin_base.pyr   )   s   r   c                 C   s  | ddt tdd | ddt tdd | ddt d	d
d | ddtdd | ddt 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&t d'd(d)d* | d+t d,d-d. | d/t d0d1 | d2dd3d4d | d5t d6d7d. | d8dd9d:d;d< | d=dt td>d | d?dd@d:dAd< | dBdtt dCdD | dEdtt dFdD | dGddHd:dId< | dJddKd:dLd< | dMt dNdOd. | dPt dg dQdRdS d S )TNz
--log-infocallbackz,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
--dbdriverdbdriverz|Additional database drivers to include in tests.  These are linked to the existing database URLs by the provisioning system.z--dropfirst
store_true	dropfirstz,Drop all tables in the target database first)r   r   r   z--disable-asyncioz8disable test / fixtures / provisoning running in asyncio)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--notimingintensivenotimingintensivez Don't run timing intensive testsz--profile-sortZ
cumulativeprofilesortz*Type of sort for profiling standard output)r   defaultr   r   z--profile-dumpprofiledumpz2Filename where a single profile run will be dumped)r   r   r   z--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 usedz--reversetop
reversetopFzTUse a random-ordering set implementation in the ORM (helps reveal dependency issues))r   r   r   r   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.z--dump-pyannotateZdump_pyannotatez/Run pyannotate and dump json info to given filez--mypy-extra-test-pathZmypy_extra_test_pathszlAdditional test directories to add to the mypy tests. This is used only when running mypy tests. Multiple OK)r   r   r   r   r   )str_log	_list_dbs_requirements_opt_include_tag_exclude_tag)make_optionr
   r
   r   setup_optionsA   sF   	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_configNr.   Zdict_r
   r
   r   !memoize_important_follower_config   s    r3   c                 C   s(   t | d d  t| d d  dS )zfRestore important configuration needed by a follower.

    This invokes in the follower process.

    r1   r/   r0   N)r/   updater0   r2   r
   r
   r   !restore_important_follower_config  s    r5   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    r:   c                 C   s   | a tD ]}|t t qdS )z7things to set up early, before coverage might be setup.N)optionspre_configurer8   )optfnr
   r
   r   	pre_begin  s    r?   c                 C   s
   | t _d S N)r;   Zhas_coverage)valuer
   r
   r   set_coverage_flag%  s    rB   c                  C   sp   t D ]} | tt q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_configurer;   r8   
sqlalchemyrD   r+   rE   rF   rG   rH   rI   rJ   rK   r*   rL   Zsetup_filtersr>   r
   r
   r   
post_begin)  s    rP   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_strrA   parserr
   r
   r   r"   ;  s    

r"   c                  G   sB   t d ttdD ]}t d|td|f  qtd d S )Nz0Available --db options (use --dburi to override)r   z%20s	%sr   )printsortedr8   r;   getsysexit)argsmacror
   r
   r   r#   H  s    r#   c                 C   s   t | d S r@   )_setup_requirementsrX   r
   r
   r   r$   O  s    r$   c                 C   s   t |dd d S N-_)r0   addreplacerX   r
   r
   r   r&   S  s    r&   c                 C   s   t |dd d S rc   )r/   rf   rg   rX   r
   r
   r   r%   W  s    r%   c                 C   s   t |  | S r@   )r<   r   rO   r
   r
   r   pre_  s    
rh   c                 C   s   t |  | S r@   )rM   r   rO   r
   r
   r   postd  s    
ri   c                 C   s   | a d S r@   r;   r=   r8   r
   r
   r   _setup_optionsi  s    rl   c                 C   s   | j rtd d S )NZmemory_intensive)r   r0   rf   rk   r
   r
   r   _set_nomemoryo  s    rm   c                 C   s   | j rtd d S )NZtiming_intensive)r   r0   rf   rk   r
   r
   r   _set_notimingintensiveu  s    rn   c                 C   s   | j rdd l }|tjd< d S )Nr   decimal)r    r^   modules)r;   r8   r    r
   r
   r   _monkeypatch_cdecimal{  s    rq   c                 C   s   ddl m} t |_d S Nr   rK   )r+   rK   _fixture_fn_classZ_fixture_functions)r;   r8   rK   r
   r
   r   _init_symbols  s    ru   c                 C   s    | j s
tsddlm} d|_d S )Nr   )asyncioF)Zdisable_asynciopy3kr+   rv   ZENABLE_ASYNCIO)r=   r8   rv   r
   r
   r   _set_disable_asyncio  s    
rx   c              
   C   s@  ddl m} ddlm} ddlm} | jr6t| j}ng }| jpBg }| jr| jD ]D}t	
d|D ]2}||dkrtd| q`||d| q`qP|s||dd d |_t|||}	|	D ]t}
td	|
 | jr|jrt| jd
}||jd |
 d  W 5 Q R X ||
| ||j}|js||| qd S )Nr   rC   rs   r)   z[,\s]+r   z:Unknown URI specifier '%s'.  Specify --dbs for known uris.r   zAdding database URL: %sa 
)rN   rD   r+   rK   r*   r   listr   r   resplitr;   RuntimeErrorr   r]   _currentZgenerate_db_urlsloginfor   r,   openwriteZsetup_configZset_as_current)r;   r8   rD   rK   r*   Zdb_urlsZextra_driversZdb_tokenr   Zexpanded_urlsZdb_urlfile_cfgr
   r
   r   _engine_uri  sD    

"   r   c                 C   s   | dd}t| d S )Nsqla_testingrequirement_cls)r]   rb   )r;   r8   r   r
   r
   r   _requirements  s    r   c                 C   s   ddl m} ddlm} |jd k	r&d S | d\}}t|}|ddd  D ]}t||}qNt||}|  |_|_t	|_	d S )Nr   rs   rC   :.   )
r+   rK   rN   rD   requirementsr~   
__import__getattrrequiresbootstrapped_as_sqlalchemy)argumentrK   rD   modnameZclsnamemod	componentZreq_clsr
   r
   r   rb     s    

rb   c                 C   s@   ddl m} | jr<ddl m} |j D ]}|||j q(d S )Nr   rs   r)   )r+   rK   r   r*   Configall_configsZdrop_all_schema_objectsr   )r;   r8   rK   r*   r   r
   r
   r   _prep_testing_database  s
    r   c                 C   s   | j rddlm} |  d S )Nr   )randomize_unitofwork)r   Zsqlalchemy.orm.utilr   )r;   r8   r   r
   r
   r   _reverse_topological  s    r   c                 C   s   ddl m} t|_||_d S rr   )r+   rK   r;   r8   )r=   r8   rK   r
   r
   r   _post_setup_options  s    r   c                 C   s.   ddl m} |j|dd| j| jd|_d S )Nr   )rJ   r   Zprofile_file)sortdump)r+   rJ   ZProfileStatsFiler]   r   r   Z_profile_stats)r;   r8   rJ   r
   r
   r   _setup_profiling  s    
r   c                 C   sV   t |tjsdS | drdS tjjrNt|ddsNt|ddsNt|ddsNdS dS d S )NFre   __backend____sparse_backend____only_on__T)
issubclassrE   ZTestBase
startswithrK   r;   r   r   )name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/   hasattrrG   tagsr   Zinclude_testr0   r   )r   r>   r
   r
   r   want_method  s2    

 
  r   c                 c   s   t | ddst | ddrt | dd}t| |dD ]\}| j}tdd|j}tdd|}d	| j|f }t|| f||d
}t||| |V  q0n| V  d S )Nr   Fr   )sparsez
[_\[\]\.]+re   z_+$ z%s_%s)_sa_orig_cls_name__only_on_config__)r   _possible_configs_for_clsr   r}   subr   r   setattr)r   moduler   r   	orig_nameZ
alpha_namer   subclsr
   r
   r   generate_sub_tests-  s&      
r   c                 C   s   t |  t|  d S r@   )	_do_skips_setup_enginer   r
   r
   r   !start_test_class_outside_fixturesG  s    r   c                 C   s   t |  tj  d S r@   )rE   Zstop_test_class_inside_fixturesrF   testing_reaperr   r
   r
   r   stop_test_classL  s    
r   c                 C   s:   t j  tttj|  ztjs*t	
  W 5 t  X d S r@   )rF   r    stop_test_class_outside_fixturesr*   rK   r   _restore_enginer;   r   rH   global_cleanup_assertionsr   r
   r
   r   r   U  s    
r   c                   C   s   t jrt jt d S r@   )rK   r   resetrD   r
   r
   r
   r   r   _  s    r   c                   C   s   t j  t  t  d S r@   )rF   r   Zfinal_cleanuprH   r   r   r
   r
   r
   r   final_process_cleanupd  s    
r   c                 C   s<   t | dd r8t| j}d|d< tj|d}tj|t d S )N__engine_options__classscoperj   )	r   dictr   rF   Ztesting_enginerK   r   Zpush_enginerD   )r   optsZengr
   r
   r   r   j  s
    
r   c                 C   s*   t |d|j}d|||f }t| d S )Nr   z%s.%s.%s)r   r   rJ   Z_start_current_test)testZtest_module_nameZ
test_classZ	test_namer   Zid_r
   r
   r   before_testr  s    r   c                 C   s   t   tj  d S r@   )rE   
after_testrF   r   r   r
   r
   r   r   ~  s    r   c                 C   s   t j|  d S r@   )rF   r   Zafter_test_outside_fixturesr   r
   r
   r   after_test_fixtures  s    r   c                 C   s  t tj }| jr@tj| j }t|D ]}||r(|| q(t	| dd r~tjt
| j }t|D ]}||sf|| qft	| dd r|| jg t| drtj}t|D ]H}| jD ]<}t	||}||}	|	r|| |d k	r||	  qqqt| drft  }
tj}t|D ]4}| jD ]&}t	||}||s$|
| q$q||
rf||
 |ri }tt|dd dD ] }|jj}||kr|||< q| S |S )Nr   r   __requires____prefer_requires__c                 S   s   | j j| j j| j jjfS r@   )r   r   driverdialectZserver_version_info)r   r
   r
   r   <lambda>  s    z+_possible_configs_for_cls.<locals>.<lambda>)key)setrK   r   r   Z__unsupported_on__rG   db_specr|   remover   rL   to_listr   intersection_updater   r   r   r   Zmatching_config_reasonsextendr   Zenabled_for_configrf   
differencedifference_updatereversedr\   r   r   values)r   reasonsr   r   spec
config_objr   requirementcheckZskip_reasonsnon_preferredZper_dialectr   r   r
   r
   r   r     s^    










r   c                 C   s   g }t | |}t| ddrFt| dD ] }| r$td| j|jf  q$|sd| jddd tj D d|f }t| nRt| drt	 }t
jt| j }|D ]}||s|| q||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'r   c                 s   s   | ]}t |V  qd S r@   )r!   ).0digr
   r
   r   	<genexpr>  s   z&_do_skips.<locals>.<genexpr>.<genexpr>N)r   r   joinrG   Z_server_versionr   )r   r   r
   r
   r   r     s   


z_do_skips.<locals>.<genexpr>__prefer_backends__)r   r   rK   Z	skip_testr   r   r   r   r   r   rG   r   rL   r   r   rf   r   r   r   _setup_configpop)r   r   r   cmsgr   r   r   r
   r
   r   r     s6    






r   c                 C   s   t j| t d S r@   )rK   r   pushrD   )r   ctxr
   r
   r   r     s    r   c                   @   sZ   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	ejdd Z
dS )FixtureFunctionsc                 O   s
   t  d S r@   NotImplementedErrorselfargkwr
   r
   r   skip_test_exception  s    z$FixtureFunctions.skip_test_exceptionc                 O   s
   t  d S r@   r   r   r`   r   r
   r
   r   combinations  s    zFixtureFunctions.combinationsc                 O   s
   t  d S r@   r   r   r
   r
   r   param_ident   s    zFixtureFunctions.param_identc                 O   s
   t  d S r@   r   r   r
   r
   r   fixture  s    zFixtureFunctions.fixturec                 C   s
   t  d S r@   r   r   r
   r
   r   get_current_test_name  s    z&FixtureFunctions.get_current_test_namec                 C   s
   t  d S r@   r   r   r
   r
   r   mark_base_test_class  s    z%FixtureFunctions.mark_base_test_classN)r   r   r   r   abstractmethodr   r   r   r   r   r   r
   r
   r
   r   r     s   



r   c                 C   s   | a d S r@   )rt   )Zfixture_fn_classr
   r
   r   set_fixture_functions  s    r   )NF)R__doc__
__future__r   r   rQ   r}   r^   r   rT   r   version_inforw   r6   r   r7   collectionscollections_abcobjectrE   rF   rG   rI   rJ   r*   rH   r   rK   rD   rL   r8   r   r/   r0   r;   r(   r-   r3   r5   r:   r?   rB   rP   r"   r#   r$   r&   r%   r<   rM   rh   ri   rl   rm   rn   rq   ru   rx   r   r   rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rt   r   r
   r
   r
   r   <module>   s   	

 0






-






	

B*