
    [hJT                       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          j        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 Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2g Z3g Z4d Z5d Z6e5d             Z7e5d             Z8e6d             Z9e6d             Z:e5d              Z;e6d!             Z<e6d"             Z=d# Z>e6d$             Z?e6d%             Z@e6d&             ZAd' ZBd( ZCd) ZDd* ZEd+ ZFd, ZGd- ZHd. ZId/ ZJd0 ZKd1 ZLd2 ZMd9d3ZNd4 ZOd5 ZP G d6 d7ejQ                  ZRdaSd8 ZTdS ):    )annotationsN)	Namespace)Path)Any)asyncioFzsqlalchemy.testing.plugin_baser   optionsc                8    | ddt           t          d            | ddt           t          d            | ddt           d	d
            | ddt          d            | ddt           dd            | ddt           dd            | dddd            | ddd            | ddt          d          d            | d dt	          d!          d"            | d#dt	          d$          d%            | d&dt	          d'          d(            | d)t           d*d+d,-            | d.t           d/d01            | d2dd3d4            | d5t           d6d71            | d8dt           t
          d9            | d:dt          t           d;<            | d=dt          t           d><            | d?dd@dAdBC            | dDddEdAdFC            | dGt           dHdI1            | dJt           dg dKdLM            | dNt           dOP            | dQddR           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_options    t/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/sqlalchemy/testing/plugin/plugin_base.pysetup_optionsr.   ;   s4   K;    K<    K'    K"(	    KG    K    K;	    KG   
 K))44N    K)*<==	    K)*<==	    K)&11M	    K9    KA	    K	    K	    K"B    K.    K2    K3    K #;    K>	    K $A    K!9    KI         c                     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.testingr2   FOLLOWER_IDENT)follower_identr2   s     r-   configure_followerr6      s$     -,,,,,-Ir/   c                    dS )zStore 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.

    N dict_s    r-   !memoize_important_follower_configr;            r/   c                    dS )zRestore important configuration needed by a follower.

    This invokes in the follower process.

    Hook is currently not used.

    Nr8   r9   s    r-   !restore_important_follower_configr>     r<   r/   c                    t          j                    at                              t	          | dz            t	          | dz            g           d S )Nz	setup.cfgztest.cfg)configparserConfigParserfile_configreadr$   )	root_paths    r-   read_configrE     sT    +--K	Y$	%	%s9z+A'B'BC    r/   c                J    | a t          D ]} |t           t                     dS )z7things to set up early, before coverage might be setup.N)r   pre_configurerB   )optfns     r-   	pre_beginrJ     s7     G ! !
7K    ! !r/   c                    | t           _        d S N)r   has_coverage)values    r-   set_coverage_flagrO      s     Gr/   c                     t           D ]}  | t          t                     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)configr2   )utilN)post_configurer   rB   
sqlalchemyrR   r3   rS   rT   rU   rV   rW   rX   rY   r2   rZ   setup_filtersrI   s    r-   
post_beginr_   $  s      ! !
7K    
 #"""""@@@@@@@@@@BBBBBBBBBB44444444r/   c                b   t           sdd l a t          j                     |                     d          r3t          j        |                              t           j                   d S |                     d          r3t          j        |                              t           j                   d S d S )Nr   z-infoz-debug)loggingbasicConfigendswith	getLoggersetLevelINFODEBUGopt_strrN   parsers      r-   r%   r%   6  s        9%  ))',77777			(	#	# 9%  ))'-888889 9r/   c            	     J   t            t          t          j                               t	          d           t          t                               d                    D ]0}t	          |ddt                               d|                     1t          j	        d           d S )Nz0Available --db options (use --dburi to override)r   z>20	r   )
rB   rE   r   cwdprintsortedr   getsysexit)argsmacros     r-   r&   r&   C  s     	DHJJ	
<===++D1122 B BEEEE;??4#?#?#?@AAAAHQKKKKKr/   c                $    t          |           d S rL   )_setup_requirementsrh   s      r-   r)   r)   N  s    r/   c                      fd}|S )Nc                *    t          | |           d S rL   )r*   ri   rN   rj   tags      r-   _do_include_tagz)_set_tag_include.<locals>._do_include_tagS      Wc6*****r/   r8   )rz   r{   s   ` r-   r'   r'   R  $    + + + + + r/   c                      fd}|S )Nc                *    t          | |           d S rL   )r+   ry   s      r-   _do_exclude_tagz)_set_tag_exclude.<locals>._do_exclude_tagZ  r|   r/   r8   )rz   r   s   ` r-   r(   r(   Y  r}   r/   c                b    t                               |                    dd                     d S N-_)exclude_tagsaddreplacerh   s      r-   r+   r+   `  *    U]]3,,-----r/   c                b    t                               |                    dd                     d S r   )include_tagsr   r   rh   s      r-   r*   r*   d  r   r/   c                :    t                               |            | S rL   )rG   r   r^   s    r-   prer   l  s    Ir/   c                :    t                               |            | S rL   )r[   r   r^   s    r-   postr   q  s    "Ir/   c                
    | a d S rL   r   rH   rB   s     r-   _setup_optionsr   v  s     GGGr/   c                n    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)rH   rB   r   s      r-    _register_sqlite_numeric_dialectr   |  sb    ,,,,,,!-)  
  -(    r/   c                    t           j                            dd          dk    r7ddlm} 	  |d           d S # t
          $ r}t          d          |d }~ww xY 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environrp   sqlalchemy.utilr   ImportErrorAssertionError)rH   rB   r   errs       r-   __ensure_cextr     s    	z~~/55<<444444	D)))))) 	 	 	 $  	 =<s   : 
AAAc                8    ddl m} t                      |_        d S Nr   rY   )r3   rY   _fixture_fn_class_fixture_functions)r   rB   rY   s      r-   _init_symbolsr     s(    )))))) 1 3 3Fr/   c                0    | j         rdt          _        d S d S NF)disable_asyncior   ENABLE_ASYNCIOr   s     r-   _set_disable_asyncior     s%    
 '!&' 'r/   c           	        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
        rt| j
        D ]l}t          j        d|          D ]T}||                    d          vrt          d|z            |                    |                    d|                     Um|s)|                    |                    dd	                     d |_        | j        ry|j        rrfd
|D             D ]c}	t)          | j        d          5 }
|
                    |j         d|	                    d           d           d d d            n# 1 swxY w Y   dt          |                    ||                    }|D ]W}	t0                              d|	           |                    |	| ||j                  }|j        s|                    ||           Xd S )Nr   rQ   r   r1   )urlz[,\s]+r   z:Unknown URI specifier '%s'.  Specify --dbs for known uris.r   c                :    g | ]}                     |          S r8   )make_url).0db_urlsa_urls     r-   
<listcomp>z_engine_uri.<locals>.<listcomp>  s%    EEE6vv..EEEr/   a F)hide_password
zAdding database URL: %s)r\   rR   r3   rY   r2   sqlalchemy.enginer   r   listr   r   resplitr   RuntimeErrorr   rp   _currentr   r4   openwriterender_as_stringgenerate_db_urlsloginfosetup_configset_as_current)r   rB   rR   rY   r2   db_urlsextra_driversdb_tokenr   r   file_expanded_urlscfgr   s                @r-   _engine_urir     s   """""")))))),,,,,,//////} w}%%$*Mz 	>
 	> 	>Hhy(33 > >[006666&8:<=  
 NN;??4#<#<====>  9{tY77888FO 	 8 EEEEWEEE 	 	Fg*C00 E / H H..U.CCH H H                 33G]KKLLM - -*F333$$G[)*B
 
  	-sG,,,- -s   !5E""E&	)E&	c                P    |                     dd          }t          |           d S )Nsqla_testingrequirement_cls)rp   rv   )r   rB   r   s      r-   _requirementsr     s*    !oon6GHHO(((((r/   c                0   ddl m} ddlm} |                     d          \  }}t          |          }|                    d          dd          D ]}t          ||          }t          ||          } |            x|_        |_        t          |_	        d S )Nr   r   rQ   :.   )
r3   rY   r\   rR   r   
__import__getattrrequirementsrequiresbootstrapped_as_sqlalchemy)argumentrY   rR   modnameclsnamemod	componentreq_clss           r-   rv   rv     s    ))))))""""""~~c**GW W

C]]3''+ & &	c9%%c7##G-4WYY6F'*(BF%%%r/   c                    ddl m} | j        r=ddl m} |j                                        D ]}|                    ||j                   d S d S )Nr   r   r1   )r3   rY   r   r2   Configall_configsdrop_all_schema_objectsr   )r   rB   rY   r2   r   s        r-   _prep_testing_databaser     s}    )))))) ;000000=,,.. 	; 	;C--c36::::	; ;	; 	;r/   c                8    ddl m} t          |_        ||_        d S r   )r3   rY   r   rB   )rH   rB   rY   s      r-   _post_setup_optionsr     s)    ))))))FN$Fr/   c                    ddl m} |                    |                    dd          | j        | j                  |_        d S )Nr   )rX   r   profile_file)sortdump)r3   rX   ProfileStatsFilerp   r   r   _profile_stats)r   rB   rX   s      r-   _setup_profilingr     sT    ,,,,,,(9977    :    Ir/   c                l    t          |t          j                  sdS |                     d          rdS dS )NFr   T)
issubclassrS   TestBase
startswith)nameclss     r-   
want_classr     s:    c8,-- u			 utr/   c                P    |j                             d          sdS |j        dS dS )Ntest_FT)__name__r   
__module__)r   rI   s     r-   want_methodr     s1    ;!!'** u		utr/   c              #  2  K   d|v sd|v rd|v }t          | |          D ]p}| j        }t          j        dd|j                  }t          j        dd|          }| j        d|}t          || f||d          }t          |||           |V  qd S | V  d S )	Nr   sparse_backend)sparsez
[_\[\]\.]+r   z_+$ )_sa_orig_cls_name__only_on_config__)_possible_configs_for_clsr   r   subr   r   setattr)	r   modulemarkersr  r   	orig_name
alpha_namer   subclss	            r-   generate_sub_testsr  !  s      G/7::!W,,S@@@ 	 	CI sCH==JJ77J!lllJJ7D&/sKK F
 FD&)))LLLL!	 	$ 					r/   c                B    t          |            t          |            d S rL   )	_do_skips_setup_enginer   s    r-   !start_test_class_outside_fixturesr  9  s!    cNNN#r/   c                v    t                               |            t          j                                         d S rL   )rS   stop_test_class_inside_fixturesrT   testing_reaperr  s    r-   stop_test_classr  >  s3    ,,S111 ::<<<<<r/   c                &   t           j                                         t                              t          t          j        |            	 t          j        st          	                                 t                       d S # t                       w xY wrL   )rT   r   stop_test_class_outside_fixturesr2   rY   r   r   r   rV   global_cleanup_assertions_restore_enginer  s    r-   r  r  G  sw    ;;===..vvy#FFF& 	300222s   %B   Bc                 j    t           j        r&t           j                            t                     d S d S rL   )rY   r   resetrR   r8   r/   r-   r  r  Q  s2     'g&&&&&' 'r/   c                     t           j                                         t                                           t                       d S rL   )rT   r  final_cleanuprV   r  r  r8   r/   r-   final_process_cleanupr   V  s;    ((***((***r/   c                    t          | dd           r[t          | j                  }d|d<   t                              |          }t
          j                            |t                     d S d S )N__engine_options__classscoper   )	r   dictr"  rT   testing_enginerY   r   push_enginerR   )r   optsengs      r-   r  r  \  sn    s($// 2C*++W$$T$22##C11111	2 2r/   c                z    t          |d|j                  }|d|d|}t                              |           d S )Nr  r   )r   r   rX   _start_current_test)testtest_module_name
test_class	test_namer   id_s         r-   before_testr1  d  sK     :2J4GHHD((($$$		
:C!!#&&&&&r/   c                t    t                                            t          j                                         d S rL   )rS   
after_testrT   r  r,  s    r-   r3  r3  o  s/    %%'''''r/   c                D    t           j                            |            d S rL   )rT   r  after_test_outside_fixturesr4  s    r-   after_test_fixturesr7  t  s    66t<<<<<r/   c                4   t          t          j                                                  }| j        rEt          j        | j         }t          |          D ]"} ||          r|                    |           #t          | dd           r]t          j        t                              | j                   }t          |          D ]"} ||          s|                    |           #t          | dd           r|                    | j        g           t          | d          r}t          j        }t          |          D ]a}| j        D ]W}t          ||          }|                    |          }	|	r.|                    |           ||                    |	            nXbt          | d          rt                      }
t          j        }t          |          D ]F}| j        D ]<}t          ||          }|                    |          s|
                    |           =G|                    |
          r|                    |
           |rMi }t3          t5          |d                     D ]}|j        j        }||vr|||<   |                                S |S )N__only_on__r  __requires____prefer_requires__c                R    | j         j        | j         j        | j         j        j        fS rL   )r   r   driverdialectserver_version_info)r   s    r-   <lambda>z+_possible_configs_for_cls.<locals>.<lambda>  s!    FKFMFN6! r/   )key)setrY   r   r   __unsupported_on__rU   db_specr   remover   rZ   to_listr9  intersection_updater  hasattrr   r:  matching_config_reasonsextendr;  enabled_for_configr   
differencedifference_updatereversedro   r   r   values)r   reasonsr  r   spec
config_objr   requirementcheckskip_reasonsnon_preferredper_dialectr   r   s                 r-   r  r  x  s   fm//1122K
 /!3#9:{++ 	/ 	/JtJ /"":...sM4(( /!4<<#@#@A{++ 	/ 	/J4
## /"":...s($// B'')?(@AAAsN## *{++ 		 		J"/  k::$<<ZHH &&z222*|444E	 s)** 
9*{++ 	2 	2J"6 2 2k:://
;; 2!%%j111	2
 !!-00 	9))-888 $    	
 	
 	& 	&C B$$"%B!!###r/   c           
     n   g }t          | |          }t          | dd          rGt          | d          D ]6} |            r*t                              d| j        d|j                   7|s~d| j        d| j        dd                    d t          j                                        D                       d                    |          }t                              |           nt          | d	          rt                      }t          j        t                              | j                   }|D ]"} ||          s|                    |           #|                    |          r|                    |           t          j        |vr$t)          |                                |            d S d S )
N__skip_if__F'z' skipped by r   z'' unsupported on any DB implementation z, c           
   3     K   | ]^}d |j         j        dd                    d t                              |j                   D                       d|j         j        d V  _dS )rZ  (r   c              3  4   K   | ]}t          |          V  d S rL   )r$   )r   digs     r-   	<genexpr>z&_do_skips.<locals>.<genexpr>.<genexpr>  s<         C     r/   z)+N)r   r   joinrU   _server_versionr=  )r   rR  s     r-   r_  z_do_skips.<locals>.<genexpr>  s         J M&&&HH  #-#=#=jm#L#L       M(((     r/   __prefer_backends__)r  r   rY   	skip_testr   r   r`  r   r   rH  rB  rU   rD  rZ   rF  rb  r   rL  rM  r   _setup_configpop)r   rP  r   cmsgrV  rQ  rR  s           r-   r  r    s   G+C99KsM5)) m,, 	 	Aqss    ,/LLL!**E    9 9NNNLLLII   #)-";";"="=      IIg
" 		+	,	, 9!4<<0G#H#HI% 	. 	.J4
## .!!*---!!-00 	9))-888k))koo''----- *)r/   c                P    t           j                            | t                     d S rL   )rY   r   pushrR   )rR  ctxs     r-   rd  rd    s     
OW-----r/   c                      e Zd Zej        d             Zej        d             Zej        d             Zej        d             Zd Z	ej        dd            Z
ej        d	             Zd
S )FixtureFunctionsc                    t                      rL   NotImplementedErrorselfargkws      r-   skip_test_exceptionz$FixtureFunctions.skip_test_exception      !###r/   c                    t                      rL   rn  rq  rs   rs  s      r-   combinationszFixtureFunctions.combinations  ru  r/   c                    t                      rL   rn  rw  s      r-   param_identzFixtureFunctions.param_ident  ru  r/   c                    t                      rL   rn  rp  s      r-   fixturezFixtureFunctions.fixture  ru  r/   c                    t                      rL   rn  rq  s    r-   get_current_test_namez&FixtureFunctions.get_current_test_name  s    !###r/   returnr   c                    t                      rL   rn  r~  s    r-   mark_base_test_classz%FixtureFunctions.mark_base_test_class  ru  r/   c                    t                      rL   rn  r~  s    r-   add_to_markerzFixtureFunctions.add_to_marker  ru  r/   N)r  r   )r   r   __qualname__abcabstractmethodrt  rx  rz  r|  r  r  abstractpropertyr  r8   r/   r-   rl  rl    s        $ $ $ 	$ $ $ 	$ $ $ 	$ $ $$ $ $ 	$ $ $ $ 	$ $ $ $ $r/   rl  c                
    | a d S rL   )r   )fixture_fn_classs    r-   set_fixture_functionsr  	  s    (r/   r   )U
__future__r   r  argparser   r@   ra   r   pathlibr   r   rq   typingr   r3   r   r   rd   r   rS   rT   rU   rW   rX   r2   rV   r   rY   rR   rZ   rB   rB  r   r   r   __annotations__r.   r6   r;   r>   rE   rJ   rO   r_   r%   r&   r)   r'   r(   r+   r*   rG   r[   r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r  r  r  r  r  r   r  r1  r3  r7  r  r  rd  ABCrl  r   r  r8   r/   r-   <module>r     s   # " " " " " " 



            				       				 



       & & & & & & # 899 

		
	

suusuu    r r rj	. 	. 	.      ! ! !! ! !  $
9 
9 
9        . . .. . .   
  
   
    
 
 
 4 4 4 ' ' '
 .- .- .-b ) ) )
C C C$ ; ; ; % % %         0  
= = =  ' ' '
  2 2 2' ' '( ( (
= = =? ? ? ?D(. (. (.V. . .$ $ $ $ $sw $ $ $:  ) ) ) ) )r/   