U
    ÌZj$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„ ƒZ7e2d1d2„ ƒ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 )dzì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 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
   úh/var/www/html/TRUCKING_PROJECT/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 )z„Configure 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r€t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Æ| ||¡ qÆd 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	r–t|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ƒr�t | 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ƒrútj}t|ƒD ]H}| jD ]<}t	||ƒ}| |¡}	|	rº| |¡ |d k	rò| |	¡  q°qºq°t| dƒ�rft ƒ }
tj}t|ƒD ]4}| jD ]&}t	||ƒ}| |¡�s$|
 |¡ �q$�q| |
¡�rf| |
¡ |�r®i }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$|s‚d| jd dd„ tj ¡ D ƒ¡d |¡f }t |¡ nRt| dƒrÔt	ƒ }t
jt | j¡Ž }|D ]}||ƒs¨| |¡ q¨| |¡rÔ| |¡ tj|krìt| ¡ | ƒ 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*