o
    y¬´\¯I  ã                   @   sú  d Z ddlmZ ddlZddlZejdkZer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d„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zda 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&„ ƒZ,e*d'd(„ ƒZ-e*d)d*„ ƒZ.e+d+d,„ ƒZ/e+d-d.„ ƒZ0e+d/d0„ ƒZ1d1d2„ Z2e+d3d4„ ƒZ3e+d5d6„ ƒZ4e+d7d8„ ƒZ5e+d9d:„ ƒZ6d;d<„ Z7d=d>„ Z8d?d@„ Z9dAdB„ Z:dCdD„ Z;dEdF„ Z<dGdH„ Z=dIdJ„ Z>dKdL„ Z?dMdN„ Z@dUdOdP„ZAdQdR„ ZBdSdT„ ZCdS )Vz¼Testing extensions.

this module is designed to work as a testing-framework-agnostic library,
so that we can continue to support nose and also begin adding new
functionality via py.test.

é    )Úabsolute_importN)é   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   Ú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__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-profilesÚwrite_profilesz$Write/update failing profiling data.z--force-write-profilesÚforce_write_profilesz,Unconditionally write/update profiling data.)Ú_logÚ	_list_dbsÚ_requirements_optÚ_include_tagÚ_exclude_tag)Úmake_option© r   úW/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/testing/plugin/plugin_base.pyÚsetup_options0   sì   ûûûüûüüüýüüûûûûûû
û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)Úfollower_identr#   r   r   r    Úconfigure_follower¯   s   
r'   c                 C   s   t tdœ| d< dS )aT  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.

    ©Úinclude_tagsÚexclude_tagsÚmemoized_configNr(   ©Ú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 tD ]}|t tƒ q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   Úhas_coverage)Úvaluer   r   r    Úset_coverage_flagä   s   
r>   c                 C   ó   | a d S r;   )Ú_skip_test_exception)Úexcr   r   r    Úset_skip_testë   s   rB   c                  C   sl   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 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©Úconfig)ÚutilN)Úpost_configurer6   r3   Ú
sqlalchemyrD   r$   rE   rF   rG   rH   rI   rJ   rL   rM   Úsetup_filters©r9   r   r   r    Ú
post_beginð   s   rR   c                 C   sX   t s
dd l a t  ¡  |  d¡rt  |¡ t j¡ d S |  d¡r*t  |¡ t j¡ d S d S )Nr   z-infoz-debug)ÚloggingÚbasicConfigÚendswithÚ	getLoggerÚsetLevelÚINFOÚDEBUG©Úopt_strr=   Ú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Úsortedr3   r6   ÚgetÚsysÚexit)ÚargsÚmacror   r   r    r     s   r   c                 C   s   t |ƒ d S r;   )Ú_setup_requirementsrZ   r   r   r    r     s   r   c                 C   ó   t  | dd¡¡ d S ©Nú-Ú_)r*   ÚaddÚreplacerZ   r   r   r    r     ó   r   c                 C   re   rf   )r)   ri   rj   rZ   r   r   r    r     rk   r   c                 C   ó   t  | ¡ | S r;   )r7   r	   rQ   r   r   r    Úpre'  ó   
rm   c                 C   rl   r;   )rN   r	   rQ   r   r   r    Úpost,  rn   ro   c                 C   r?   r;   ©r6   ©r8   r3   r   r   r    Ú_setup_options1  s   rr   c                 C   s   | j r
t d¡ d S d S )NÚmemory_intensive)r   r*   ri   rq   r   r   r    Ú_set_nomemory7  s   ÿrt   c                 C   s    | j rdd l }|tjd< d S d S )Nr   Údecimal)r   r`   Úmodules)r6   r3   r   r   r   r    Ú_monkeypatch_cdecimal=  s   ýrw   c                 C   s   ddl m} t|_d S ©Nr   rK   )r$   rL   r@   )r6   r3   rL   r   r   r    Ú_init_skiptestE  s   
ry   c              	   C   s(  ddl m} ddlm} ddl m} | jrt| jƒ}ng }| jrE| jD ]!}t 	d|¡D ]}|| 
d¡vr:td| ƒ‚| | d|¡¡ q+q#|sP| | dd¡¡ d |_|D ]<}| jr|jrt| jd	ƒ�}	|	 |jd
 | d ¡ W d   ƒ n1 szw   Y  | || ||j¡}
|js‘|
 |
|¡ qUd S )Nr   rK   rC   r"   z[,\s]+r
   z:Unknown URI specifier '%s'.  Specify --dbs for known uris.r   Úaú Ú
)r$   rL   rO   rD   r#   r   Úlistr
   ÚreÚsplitr6   ÚRuntimeErrorr	   r_   Ú_currentr   r%   ÚopenÚwriteÚsetup_configÚset_as_current)r6   r3   rL   rD   r#   Údb_urlsÚdb_tokenr
   Údb_urlÚfile_Úcfgr   r   r    Ú_engine_uriL  s@   
ÿÿù	ÿ
ÿ€õr‹   c                 C   s   |  dd¡}t|ƒ d S )NÚsqla_testingÚrequirement_cls)r_   rd   )r6   r3   r�   r   r   r    Ú_requirementst  s   rŽ   c                 C   sz   ddl m} ddlm} |jd urd S |  d¡\}}t|ƒ}| d¡dd … D ]}t||ƒ}q't||ƒ}|ƒ  |_|_d S )Nr   rK   rC   ú:Ú.é   )	r$   rL   rO   rD   Úrequirementsr   Ú
__import__ÚgetattrÚrequires)ÚargumentrL   rD   ÚmodnameÚclsnameÚmodÚ	componentÚreq_clsr   r   r    rd   {  s   

rd   c                 C   sn  ddl m}m} ddlm} ddlm}m} | jr³|j	 
¡ D ]–}|j}||ƒ}	z|	 ¡ }
W n	 ty6   Y nw |
D ]}| | | || ¡ ¡¡¡ q9|jj |¡rxz|	jdd�}
W n	 tyb   Y nw |
D ]}| | |j|| ¡ dd�¡¡ qe| ||	¡ |jj |¡rŽ|j||	|jd� ||dƒr²ddlm} |	 d	¡D ]}| | |j|d
 |d d�¡¡ qžqd S d S )Nr   )rL   rM   )Úagainst)ÚschemaÚinspectÚtest_schema)r�   Ú
postgresql)r    Ú*Únamer�   )r¢   r�   )r$   rL   rM   Úsqlalchemy.testing.exclusionsrœ   rO   r�   rž   r   ÚConfigÚall_configsr
   Úget_view_namesÚNotImplementedErrorÚexecuteÚ	_DropViewÚTableÚMetaDatar’   ÚschemasÚenabled_for_configÚdrop_all_tablesrŸ   Úsqlalchemy.dialectsr    Ú	get_enumsÚDropEnumTypeÚENUM)r6   r3   rL   rM   rœ   r�   rž   rŠ   ÚeÚ	inspectorÚ
view_namesÚvnamer    Úenumr   r   r    Ú_prep_testing_databaseŽ  sd   ÿÿÿÿýÿÿ

ÿÿÿ€Ör¸   c                 C   s    | j rddlm} |ƒ  d S d S )Nr   )Úrandomize_unitofwork)r   Úsqlalchemy.orm.utilr¹   )r6   r3   r¹   r   r   r    Ú_reverse_topologicalÇ  s   
ýr»   c                 C   s   ddl m} t|_||_d S rx   )r$   rL   r6   r3   )r8   r3   rL   r   r   r    Ú_post_setup_optionsÏ  s   
r¼   c                 C   s$   ddl m} | | dd¡¡|_d S )Nr   )rJ   rŒ   Úprofile_file)r$   rJ   ÚProfileStatsFiler_   Ú_profile_stats)r6   r3   rJ   r   r   r    Ú_setup_profiling×  s   

ÿrÀ   c                 C   s<   t | tjƒsdS | j d¡rdS tjjrt| ddƒsdS dS )NFrh   Ú__backend__T)	Ú
issubclassrE   ÚTestBaseÚ__name__Ú
startswithrL   r6   r   r”   ©Úclsr   r   r    Ú
want_classà  s   
ÿrÈ   c                 C   sš   |j  d¡sdS |jd u rdS tr,t| dƒot | j¡ tt	¡p+t|dƒo+|j
 tt	¡S t	r=t| dƒr=t | j¡ tt	¡S t	rKt|dƒrK|j
 tt	¡S dS )NÚtest_FÚ__tags__Ú_sa_exclusion_extendT)rÄ   rÅ   Ú
__module__r)   ÚhasattrrG   ÚtagsrÊ   Úinclude_testr*   rË   )rÇ   r9   r   r   r    Úwant_methodí  s,   

ÿþ
ÿùÿrÐ   c                 c   s‚   � t | ddƒr<t| ƒD ].}| j}t dd|j¡}t dd|¡}d| j|f }t|| f||dœƒ}t|||ƒ |V  qd S | V  d S )	NrÁ   Fz
[_\[\]\.]+rh   z_+$Ú z%s_%s)Ú_sa_orig_cls_nameÚ__only_on_config__)r”   Ú_possible_configs_for_clsrÄ   r~   Úsubr¢   r   Úsetattr)rÇ   ÚmodulerŠ   Ú	orig_nameÚ
alpha_namer¢   Úsubclsr   r   r    Úgenerate_sub_tests  s    €ýð
rÛ   c                 C   s   t | ƒ t| ƒ d S r;   )Ú	_do_skipsÚ_setup_enginerÆ   r   r   r    Ústart_test_class  s   rÞ   c                 C   s:   t j ¡  ztjst ¡  W tƒ  d S W tƒ  d S tƒ  w r;   )rF   Útesting_reaperÚ_stop_test_ctxr6   r   rH   Úglobal_cleanup_assertionsÚ_restore_enginerÆ   r   r   r    Ústop_test_class$  s   


ýrã   c                   C   s   t j t¡ d S r;   )rL   r�   ÚresetrD   r   r   r   r    râ   /  s   râ   c                   C   s   t j ¡  t ¡  tƒ  d S r;   )rF   rß   Ú_stop_test_ctx_aggressiverH   rá   râ   r   r   r   r    Úfinal_process_cleanup3  s   

ræ   c                 C   s0   t | dd ƒrtj| jd�}tj |t¡ d S d S )NÚ__engine_options__rp   )r”   rF   Útesting_enginerç   rL   r�   Úpush_enginerD   )rÇ   Úengr   r   r    rÝ   9  s   þrÝ   c                 C   s&   t |d|jƒ}d|||f }|t_d S )NrÒ   z%s.%s.%s)r”   rÄ   rJ   Ú_current_test)ÚtestÚtest_module_nameÚ
test_classÚ	test_namer¢   Úid_r   r   r    Úbefore_test?  s   
rñ   c                 C   s   t j ¡  d S r;   )rF   rß   Ú_after_test_ctx)rì   r   r   r    Ú
after_testK  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 ]}||ƒs>| |¡ q3t	| dd ƒrL| | jg¡ t| dƒr}tj}t|ƒD ]$}| jD ]}t	||ƒ}| |¡}|r{| |¡ |d ury| |¡  nq]qXt| dƒr®t ƒ }	tj}t|ƒD ]}| jD ]}t	||ƒ}| |¡s¢|	 |¡ q‘qŒ| |	¡r®| |	¡ |S )NÚ__only_on__rÓ   Ú__requires__Ú__prefer_requires__)ÚsetrL   r¤   r¥   Ú__unsupported_on__rG   Údb_specr}   Úremover”   rM   Úto_listrô   Úintersection_updaterÓ   rÍ   r’   rõ   Úmatching_config_reasonsÚextendrö   r­   ri   Ú
differenceÚdifference_update)
rÇ   Úreasonsr¥   ÚspecÚ
config_objr’   ÚrequirementÚcheckÚskip_reasonsÚnon_preferredr   r   r    rÔ   O  sR   
€
€





ü€




€ü

rÔ   c                 C   sô   g }t | |ƒ}t| ddƒr#t| dƒD ]}|ƒ r"t d| j|jf ¡ q|sAd| jd dd„ tj ¡ D ƒ¡d |¡f }t |¡ n)t| dƒrjt	ƒ }t
jt | j¡Ž }|D ]}||ƒs_| |¡ qT| |¡rj| |¡ tj|vrxt| ¡ | ƒ d S d S )	NÚ__skip_if__Fz'%s' skipped by %sz.'%s' unsupported on any DB implementation %s%sz, c              	   s   s>   � | ]}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;   )Ústr)Ú.0Údigr   r   r    Ú	<genexpr>�  s
   € ÿ
ÿz&_do_skips.<locals>.<genexpr>.<genexpr>N)r
   r¢   ÚjoinrG   Ú_server_versionÚdriver)r
  r  r   r   r    r  ‹  s   € 
÷

þúÿ
ÿz_do_skips.<locals>.<genexpr>Ú__prefer_backends__)rÔ   r”   rL   Ú	skip_testrÄ   r  r¤   r¥   rÍ   r÷   rG   rù   rM   rû   r  ri   rÿ   r   r�   Ú_setup_configÚpop)rÇ   r  r¥   ÚcÚmsgr  r  r  r   r   r    rÜ   }  s<   
ÿ€

öò

€


ÿrÜ   c                 C   s   t j | t¡ d S r;   )rL   r�   ÚpushrD   )r  Úctxr   r   r    r  §  s   r  r;   )DÚ__doc__Ú
__future__r   r~   r`   Úversion_infoÚpy3kr1   r2   rE   rF   rG   rI   rJ   rH   r’   rL   rD   rM   r3   rS   r÷   r)   r*   r6   r!   r'   r.   r0   r5   r:   r>   r@   rB   rR   r   r   r   r   r   r7   rN   rm   ro   rr   rt   rw   ry   r‹   rŽ   rd   r¸   r»   r¼   rÀ   rÈ   rÐ   rÛ   rÞ   rã   râ   ræ   rÝ   rñ   ró   rÔ   rÜ   r  r   r   r   r    Ú<module>   s˜   






'

8



.*