o
    ŠågJT  ã                   @  sv  U d dl mZ d dlZd dlmZ d dlZd dlad dlZd dlm	Z	 d dl
Z
d dlZd dlmZ d dlmZ 	 dZt d¡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ƒ Z eƒ Z!da"d	e#d
< 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$„ Z0d%d&„ Z1d'd(„ Z2g Z3g Z4d)d*„ Z5d+d,„ Z6e5d-d.„ ƒZ7e5d/d0„ ƒZ8e6d1d2„ ƒZ9e6d3d4„ ƒZ:e5d5d6„ ƒZ;e6d7d8„ ƒZ<e6d9d:„ ƒZ=d;d<„ Z>e6d=d>„ ƒZ?e6d?d@„ ƒZ@e6dAdB„ ƒZAdCdD„ ZBdEdF„ ZCdGdH„ ZDdIdJ„ ZEdKdL„ ZFdMdN„ ZGdOdP„ ZHdQdR„ ZIdSdT„ ZJdUdV„ ZKdWdX„ ZLdYdZ„ ZMded[d\„ZNd]d^„ ZOd_d`„ ZPG dadb„ dbejQƒZRdaSdcdd„ ZTdS )fé    )ÚannotationsN)Ú	Namespace)ÚPath)ÚAny)ÚasyncioFzsqlalchemy.testing.plugin_baser   Úoptionsc                 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tdƒdd� | d dtd!ƒd"d� | d#dtd$ƒd%d� | d&dtd'ƒd(d� | d)t d*d+d,d-� | d.t d/d0d1� | d2dd3d4d� | d5t d6d7d1� | d8dt td9d� | d:dtt d;d<� | d=dtt d>d<� | d?dd@dAdBdC� | dDddEdAdFdC� | dGt dHdId1� | dJt dg dKdLdM� | dNt dOdP� | dQddRd� d S )SNz
--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	   Ú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Úbackendz}Run only tests marked with __backend__ or __sparse_backend__; this is now equivalent to the pytest -m backend mark expressionz
--nomemoryÚmemory_intensivezpDon't run memory profiling tests; this is now equivalent to the pytest -m 'not memory_intensive' mark expressionz--notimingintensiveÚtiming_intensivezpDon't run timing intensive tests; this is now equivalent to the pytest -m 'not timing_intensive' mark expressionz--nomypyÚmypyz_Don't run mypy typing tests; this is now equivalent to the pytest -m 'not mypy' mark expressionz--profile-sortÚ
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--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--requirementsz3requirements class for testing, overrides setup.cfgz--include-tagzAInclude tests with tag <tag>; legacy, use pytest -m 'tag' instead)r	   r   r
   r   z--exclude-tagzEExclude tests with tag <tag>; legacy, use pytest -m 'not tag' insteadz--write-profilesÚwrite_profilesFz$Write/update failing profiling data.)r	   r   r   r   z--force-write-profilesÚforce_write_profilesz,Unconditionally write/update profiling data.z--dump-pyannotateÚdump_pyannotatez/Run pyannotate and dump json info to given filez--mypy-extra-test-pathÚ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   z--postgresql-templatedbz^name of template database to use for PostgreSQL CREATE DATABASE (defaults to current database))r
   r   z--oracledb-thick-modez:enables the 'thick mode' when testing with oracle+oracledb)ÚstrÚ_logÚ	_list_dbsÚ_set_tag_includeÚ_set_tag_excludeÚ_requirements_optÚ_include_tagÚ_exclude_tag)Úmake_option© r+   úa/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/testing/plugin/plugin_base.pyÚsetup_options;   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   
r3   c                 C  ó   dS )z¯Store important configuration we will need to send to a follower.

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

    Hook is currently not used.

    Nr+   ©Údict_r+   r+   r,   Ú!memoize_important_follower_configü   ó    r7   c                 C  r4   )z‡Restore important configuration needed by a follower.

    This invokes in the follower process.

    Hook is currently not used.

    Nr+   r5   r+   r+   r,   Ú!restore_important_follower_config  r8   r9   c                 C  s*   t  ¡ at t| d ƒt| d ƒg¡ d S )Nz	setup.cfgztest.cfg)ÚconfigparserÚConfigParserÚfile_configÚreadr"   )Ú	root_pathr+   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)r   Úpre_configurer<   )ÚoptÚfnr+   r+   r,   Ú	pre_begin  s   ÿrC   c                 C  s
   | t _d S ©N)r   Úhas_coverage)Úvaluer+   r+   r,   Úset_coverage_flag   s   
rG   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   r<   Ú
sqlalchemyrI   r0   rJ   rK   rL   rM   rN   rO   rP   r/   rQ   Úsetup_filters©rB   r+   r+   r,   Ú
post_begin$  s   rV   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_strrF   Úparserr+   r+   r,   r#   6  s   

ÿr#   c                  G  sV   t d u r
tt ¡ ƒ 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   )
r<   r?   r   ÚcwdÚprintÚsortedr   ÚgetÚsysÚexit)ÚargsÚmacror+   r+   r,   r$   C  s   r$   c                 C  s   t |ƒ d S rD   )Ú_setup_requirementsr^   r+   r+   r,   r'   N  s   r'   c                   ó   ‡ fdd„}|S )Nc                   ó   t | ˆ |ƒ d S rD   )r(   r^   ©Útagr+   r,   Ú_do_include_tagS  ó   z)_set_tag_include.<locals>._do_include_tagr+   )rm   rn   r+   rl   r,   r%   R  ó   r%   c                   rj   )Nc                   rk   rD   )r)   r^   rl   r+   r,   Ú_do_exclude_tagZ  ro   z)_set_tag_exclude.<locals>._do_exclude_tagr+   )rm   rq   r+   rl   r,   r&   Y  rp   r&   c                 C  ó   t  | dd¡¡ d S ©Nú-Ú_)Úexclude_tagsÚaddÚreplacer^   r+   r+   r,   r)   `  ó   r)   c                 C  rr   rs   )Úinclude_tagsrw   rx   r^   r+   r+   r,   r(   d  ry   r(   c                 C  ó   t  | ¡ | S rD   )r@   r   rU   r+   r+   r,   Úprel  ó   
r|   c                 C  r{   rD   )rR   r   rU   r+   r+   r,   Úpostq  r}   r~   c                 C  ó   | a d S rD   ©r   ©rA   r<   r+   r+   r,   Ú_setup_optionsv  s   r‚   c                 C  s,   ddl m} | ddd¡ | ddd¡ d S )Nr   )Úregistryzsqlite.pysqlite_numericz#sqlalchemy.dialects.sqlite.pysqliteÚ_SQLiteDialect_pysqlite_numericzsqlite.pysqlite_dollarÚ_SQLiteDialect_pysqlite_dollar)Úsqlalchemy.dialectsrƒ   Úregister)rA   r<   rƒ   r+   r+   r,   Ú _register_sqlite_numeric_dialect|  s   ýýrˆ   c              
   C  sV   t j dd¡dkr)ddlm} z|dd� W d S  ty( } ztdƒ|‚d }~ww d S )	NÚREQUIRE_SQLALCHEMY_CEXTÚ0Ú1r   )Úhas_compiled_extT)Úraise_zEREQUIRE_SQLALCHEMY_CEXT is set but can't import the cython extensions)ÚosÚenvironrd   Úsqlalchemy.utilrŒ   ÚImportErrorÚAssertionError)rA   r<   rŒ   Úerrr+   r+   r,   Ú__ensure_cextŒ  s   ÿý€ÿûr”   c                 C  s   ddl m} tƒ |_d S ©Nr   ©rP   )r0   rP   Ú_fixture_fn_classÚ_fixture_functions)r   r<   rP   r+   r+   r,   Ú_init_symbolsš  s   r™   c                 C  s   | j rdt_d S d S ©NF)Údisable_asyncior   ÚENABLE_ASYNCIOr�   r+   r+   r,   Ú_set_disable_asyncio¡  s   
ÿr�   c              	     sz  ddl m} ddlm} ddlm} ddlm‰  | jr!t| jƒ}ng }| j	p'g }| j
rP| j
D ]!}t d|¡D ]}|| d¡vrEtd| ƒ‚| | d|¡¡ q6q.|s[| | dd	¡¡ d |_| jr–|jr–‡ fd
d„|D ƒD ](}	t| jdƒ�}
|
 |j› d|	jdd�› d�¡ W d   ƒ n1 s�w   Y  qmt| ||¡ƒ}|D ]}	t d|	¡ | |	| ||j¡}|jsº| ||¡ q d S )Nr   rH   r–   r.   )Úurlz[,\s]+r   z:Unknown URI specifier '%s'.  Specify --dbs for known uris.r   c                   s   g | ]}ˆ   |¡‘qS r+   )Úmake_url)Ú.0Údb_url©Úsa_urlr+   r,   Ú
<listcomp>Æ  s    z_engine_uri.<locals>.<listcomp>Úaú F)Úhide_passwordÚ
zAdding database URL: %s)rS   rI   r0   rP   r/   Úsqlalchemy.enginerž   r   Úlistr   r   ÚreÚsplitr   ÚRuntimeErrorr   rd   Ú_currentr   r1   ÚopenÚwriteÚrender_as_stringÚgenerate_db_urlsÚlogÚinfoÚsetup_configÚset_as_current)r   r<   rI   rP   r/   Údb_urlsÚextra_driversÚdb_tokenr   r¡   Úfile_Úexpanded_urlsÚcfgr+   r¢   r,   Ú_engine_uri§  sT   

ÿÿù	
ÿÿÿ€
ÿ€ùr½   c                 C  s   |  dd¡}t|ƒ d S )NÚsqla_testingÚrequirement_cls)rd   ri   )r   r<   r¿   r+   r+   r,   Ú_requirementsÙ  s   rÀ   c                 C  sr   ddl m} ddlm} |  d¡\}}t|ƒ}| d¡dd … D ]}t||ƒ}q t||ƒ}|ƒ  |_|_t	|_	d S )Nr   r–   rH   ú:Ú.é   )
r0   rP   rS   rI   r¬   Ú
__import__ÚgetattrÚrequirementsÚrequiresÚbootstrapped_as_sqlalchemy)ÚargumentrP   rI   ÚmodnameÚclsnameÚmodÚ	componentÚreq_clsr+   r+   r,   ri   ß  s   

ri   c                 C  sD   ddl m} | jrddl m} |j ¡ D ]}| ||j¡ qd S d S )Nr   r–   r.   )r0   rP   r   r/   ÚConfigÚall_configsÚdrop_all_schema_objectsr   )r   r<   rP   r/   r¼   r+   r+   r,   Ú_prep_testing_databaseñ  s   ürÒ   c                 C  s   ddl m} t|_||_d S r•   )r0   rP   r   r<   )rA   r<   rP   r+   r+   r,   Ú_post_setup_optionsü  s   
rÓ   c                 C  s.   ddl m} |j| dd¡| j| jd�|_d S )Nr   )rO   r¾   Úprofile_file)ÚsortÚdump)r0   rO   ÚProfileStatsFilerd   r   r   Ú_profile_stats)r   r<   rO   r+   r+   r,   Ú_setup_profiling  s   
ýrÙ   c                 C  s"   t |tjƒsdS |  d¡rdS dS )NFru   T)Ú
issubclassrJ   ÚTestBaseÚ
startswith)ÚnameÚclsr+   r+   r,   Ú
want_class  ó
   
rß   c                 C  s"   |j  d¡sdS |jd u rdS dS )NÚtest_FT)Ú__name__rÜ   Ú
__module__)rÞ   rB   r+   r+   r,   Úwant_method  rà   rä   c           	      c  s’   � d|v s	d|v rDd|v }t | |d�D ].}| j}t dd|j¡}t dd|¡}d| j|f }t|| f||d	œƒ}t|||ƒ |V  qd S | V  d S )
Nr   Úsparse_backend)Úsparsez
[_\[\]\.]+ru   z_+$Ú z%s_%s)Ú_sa_orig_cls_nameÚ__only_on_config__)Ú_possible_configs_for_clsrâ   r«   ÚsubrÝ   r
   Úsetattr)	rÞ   ÚmoduleÚmarkersræ   r¼   Ú	orig_nameÚ
alpha_namerÝ   Úsubclsr+   r+   r,   Úgenerate_sub_tests!  s"   €ýð
rò   c                 C  s   t | ƒ t| ƒ d S rD   )Ú	_do_skipsÚ_setup_engine©rÞ   r+   r+   r,   Ú!start_test_class_outside_fixtures9  s   rö   c                 C  s   t  | ¡ tj ¡  d S rD   )rJ   Ústop_test_class_inside_fixturesrK   Útesting_reaperrõ   r+   r+   r,   Ústop_test_class>  s   
rù   c                 C  sJ   t j ¡  t ttj| ¡ ztjst 	¡  W t
ƒ  d S W t
ƒ  d S t
ƒ  w rD   )rK   rø   Ú stop_test_class_outside_fixturesr/   rP   r   r   r   rM   Úglobal_cleanup_assertionsÚ_restore_enginerõ   r+   r+   r,   rú   G  s   


ýrú   c                   C  s   t jrt j t¡ d S d S rD   )rP   r®   ÚresetrI   r+   r+   r+   r,   rü   Q  s   ÿrü   c                   C  s   t j ¡  t ¡  tƒ  d S rD   )rK   rø   Úfinal_cleanuprM   rû   rü   r+   r+   r+   r,   Úfinal_process_cleanupV  s   

rÿ   c                 C  s@   t | dd ƒrt| jƒ}d|d< tj|d�}tj |t¡ d S d S )NÚ__engine_options__ÚclassÚscoper€   )	rÅ   Údictr   rK   Útesting_enginerP   r®   Úpush_enginerI   )rÞ   ÚoptsÚengr+   r+   r,   rô   \  s   
ürô   c                 C  s*   t |d|jƒ}d|||f }t |¡ d S )Nrè   z%s.%s.%s)rÅ   râ   rO   Ú_start_current_test)ÚtestÚtest_module_nameÚ
test_classÚ	test_namerÝ   Úid_r+   r+   r,   Úbefore_testd  s   r  c                 C  s   t  ¡  tj ¡  d S rD   )rJ   Ú
after_testrK   rø   ©r	  r+   r+   r,   r  o  s   r  c                 C  s   t j | ¡ d S rD   )rK   rø   Úafter_test_outside_fixturesr  r+   r+   r,   Úafter_test_fixturest  ro   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®| |
¡ |rÏi }tt|dd„ d�ƒD ]}|jj}||vrÊ|||< q¼| ¡ S |S )NÚ__only_on__ré   Ú__requires__Ú__prefer_requires__c                 S  s   | j j| j j| j jjfS rD   )r   rÝ   ÚdriverÚdialectÚserver_version_info)r¼   r+   r+   r,   Ú<lambda>«  s   ýz+_possible_configs_for_cls.<locals>.<lambda>)Úkey)ÚsetrP   rÏ   rÐ   Ú__unsupported_on__rL   Údb_specrª   ÚremoverÅ   rQ   Úto_listr  Úintersection_updateré   ÚhasattrrÆ   r  Úmatching_config_reasonsÚextendr  Úenabled_for_configrw   Ú
differenceÚdifference_updateÚreversedrc   r   rÝ   Úvalues)rÞ   Úreasonsræ   rÐ   ÚspecÚ
config_objrÆ   ÚrequirementÚcheckÚskip_reasonsÚnon_preferredÚper_dialectr¼   r   r+   r+   r,   rê   x  sl   
€
€





ü€




€ü

þÿ
€rê   c                 C  sø   g }t | |ƒ}t| ddƒr#t| dƒD ]}|ƒ r"t d| j|jf ¡ q|sCd| j| jd dd„ tj ¡ D ƒ¡d |¡f }t |¡ n)t	| dƒrlt
ƒ }tjt | j¡Ž }|D ]}||ƒsa| |¡ qV| |¡rl| |¡ tj|vrzt| ¡ | ƒ d S d S )	NÚ__skip_if__Fz'%s' skipped by %sz1'%s.%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 rD   )r"   )r    Údigr+   r+   r,   Ú	<genexpr>Í  s
   € ÿ
ÿz&_do_skips.<locals>.<genexpr>.<genexpr>N)r   rÝ   ÚjoinrL   Ú_server_versionr  )r    r+  r+   r+   r,   r3  É  s   € 
÷

þúÿ
ÿz_do_skips.<locals>.<genexpr>Ú__prefer_backends__)rê   rÅ   rP   Ú	skip_testrâ   rã   r4  rÏ   rÐ   r!  r  rL   r  rQ   r  r6  rw   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 rD   )rP   r®   ÚpushrI   )r+  Úctxr+   r+   r,   r8  å  s   r8  c                   @  sj   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d„ƒZ
ejdd„ ƒZdS )ÚFixtureFunctionsc                 O  ó   t ƒ ‚rD   ©ÚNotImplementedError©ÚselfÚargÚkwr+   r+   r,   Úskip_test_exceptionê  ó   z$FixtureFunctions.skip_test_exceptionc                 O  r?  rD   r@  ©rC  rg   rE  r+   r+   r,   Úcombinationsî  rG  zFixtureFunctions.combinationsc                 O  r?  rD   r@  rH  r+   r+   r,   Úparam_identò  rG  zFixtureFunctions.param_identc                 O  r?  rD   r@  rB  r+   r+   r,   Úfixtureö  rG  zFixtureFunctions.fixturec                 C  r?  rD   r@  ©rC  r+   r+   r,   Úget_current_test_nameú  s   z&FixtureFunctions.get_current_test_nameÚreturnr   c                 C  r?  rD   r@  rL  r+   r+   r,   Úmark_base_test_classý  rG  z%FixtureFunctions.mark_base_test_classc                 C  r?  rD   r@  rL  r+   r+   r,   Úadd_to_marker  rG  zFixtureFunctions.add_to_markerN)rN  r   )râ   rã   Ú__qualname__ÚabcÚabstractmethodrF  rI  rJ  rK  rM  rO  ÚabstractpropertyrP  r+   r+   r+   r,   r>  é  s    



r>  c                 C  r   rD   )r—   )Úfixture_fn_classr+   r+   r,   Úset_fixture_functions	  s   rV  rš   )UÚ
__future__r   rR  Úargparser   r:   rW   rŽ   Úpathlibr   r«   re   Útypingr   r0   r   rÈ   rZ   r³   rJ   rK   rL   rN   rO   r/   rM   rÆ   rP   rI   rQ   r<   r  rz   rv   r   Ú__annotations__r-   r3   r7   r9   r?   rC   rG   rV   r#   r$   r'   r%   r&   r)   r(   r@   rR   r|   r~   r‚   rˆ   r”   r™   r�   r½   rÀ   ri   rÒ   rÓ   rÙ   rß   rä   rò   rö   rù   rú   rü   rÿ   rô   r  r  r  rê   ró   r8  ÚABCr>  r—   rV  r+   r+   r+   r,   Ú<module>   s²   	
 6







1





			

B+