
    gJT                       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j                        ZRdaSd8 ZTy):    )annotationsN)	Namespace)Path)Any)asyncioFzsqlalchemy.testing.plugin_baser   optionsc                X    | 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       y )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    d/var/www/html/AdoubleTech/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/plugin_base.pysetup_optionsr.   ;   su   ; < ' "(	 G  ;	 G
 ))4N )*<=	 )*<=	 )&1M	 9 A	 	 	 "B . 2 3  #; >	  $A !9 I    c                    ddl m} | |_        y)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                     y)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                     y)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        j                  t	        | dz        t	        | dz        g       y )Nz	setup.cfgztest.cfg)configparserConfigParserfile_configreadr$   )	root_paths    r-   read_configrE     s:    ++-K	Y$	%s9z+A'BCr/   c                @    | a t        D ]  } |t         t                y)z7things to set up early, before coverage might be setup.N)r   pre_configurerB   )optfns     r-   	pre_beginrJ     s"     G !
7K !r/   c                    | t         _        y 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        j                          y)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4r/   c                P   t         sdd l a t        j                          | j                  d      r3t        j                  |      j	                  t         j
                         y | j                  d      r3t        j                  |      j	                  t         j                         y y )Nr   z-infoz-debug)loggingbasicConfigendswith	getLoggersetLevelINFODEBUGopt_strrN   parsers      r-   r%   r%   6  so     % ))',,7			(	#% ))'--8 
$r/   c            	        t         t        t        j                                t	        d       t        t         j                  d            D ]'  }t	        |ddt         j                  d|             ) t        j                  d       y )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  se     	DHHJ	
<=++D12 BE;??4#?@ABHHQKr/   c                    t        |       y rL   )_setup_requirementsrh   s      r-   r)   r)   N  s
    r/   c                      fd}|S )Nc                     t        | |       y 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        | |       y 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                N    t         j                  |j                  dd             y N-_)exclude_tagsaddreplacerh   s      r-   r+   r+   `      U]]3,-r/   c                N    t         j                  |j                  dd             y r   )include_tagsr   r   rh   s      r-   r*   r*   d  r   r/   c                0    t         j                  |        | S rL   )rG   r   r^   s    r-   prer   l  s    Ir/   c                0    t         j                  |        | S rL   )r[   r   r^   s    r-   postr   q  s    "Ir/   c                    | a y rL   r   rH   rB   s     r-   _setup_optionsr   v  s	     Gr/   c                \    ddl m} |j                  ddd       |j                  ddd       y )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   |  s5    ,!-)
  -(r/   c                    t         j                  j                  dd      dk(  rddlm} 	  |d       y y # t
        $ r}t        d      |d }~ww xY w)	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     sX    	zz~~/5<4	D)	 =
  	 $ 	s   	6 	AAAc                .    ddl m} t               |_        y Nr   rY   )r3   rY   _fixture_fn_class_fixture_functions)r   rB   rY   s      r-   _init_symbolsr     s    ) 1 3Fr/   c                4    | j                   rdt        _        y y 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                  xs g }| j                  rn| j                  D ]_  }t        j                  d|      D ]D  }	|	|j                  d      vrt        d|	z        |j                  |j!                  d|	             F a |s!|j                  |j!                  dd	             d |_        | j$                  r|j&                  rt|D 
cg c]  }
|j)                  |
       c}
D ]R  }
t+        | j$                  d
      5 }|j-                  |j&                   d|
j/                  d       d       d d d        T t        |j1                  ||            }|D ]U  }
t2        j5                  d|
       |j7                  |
| ||j&                        }|j"                  rD|j9                  ||       W y c c}
w # 1 sw Y   xY w)Nr   rQ   r   r1   )urlz[,\s]+r   z:Unknown URI specifier '%s'.  Specify --dbs for known uris.r   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   make_urlopenwriterender_as_stringgenerate_db_urlsloginfosetup_configset_as_current)r   rB   rR   rY   r2   sa_urldb_urlsextra_driversdb_tokenr   db_urlfile_expanded_urlscfgs                 r-   _engine_urir     s   "),/}}w}}%$$*Mzz

 	>Hhhy(3 >[0066&8:<= 
 NN;??4#<=>	> {tY78FO	 8 8=DE6vv.E 	Fg**C0 E //0..U.CDBH 	 33G]KLM -*F3$$G[)*B*B
 sG,- F s   G32G88H	c                >    |j                  dd      }t        |       y )Nsqla_testingrequirement_cls)rp   rv   )r   rB   r   s      r-   _requirementsr     s    !oon6GHO(r/   c                    ddl m} ddlm} | j	                  d      \  }}t        |      }|j	                  d      dd  D ]  }t        ||      } t        ||      } |       x|_        |_        t        |_	        y )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     sx    )"~~c*GW W
C]]3'+ &	c9%&c7#G-4Y6F'*(BF%r/   c                    ddl m} | j                  rBddl m} |j                  j                         D ]  }|j                  ||j                           y y )Nr   r   r1   )r3   rY   r   r2   Configall_configsdrop_all_schema_objectsr   )r   rB   rY   r2   r   s        r-   _prep_testing_databaser     sF    )0==,,. 	;C--c366:	; r/   c                4    ddl m} t        |_        ||_        y r   )r3   rY   r   rB   )rH   rB   rY   s      r-   _post_setup_optionsr     s    )FN$Fr/   c                    ddl m} |j                  |j                  dd      | j                  | j
                        |_        y )Nr   )rX   r   profile_file)sortdump)r3   rX   ProfileStatsFilerp   r   r   _profile_stats)r   rB   rX   s      r-   _setup_profilingr     s=    ,(997      :  Ir/   c                ^    t        |t        j                        sy| j                  d      ryy)NFr   T)
issubclassrS   TestBase
startswith)nameclss     r-   
want_classr     s'    c8,,-		r/   c                V    |j                   j                  d      sy|j                  yy)Ntest_FT)__name__r   
__module__)r   rI   s     r-   want_methodr     s'    ;;!!'*		r/   c              #  @  K   d|v sd|v rd|v }t        | |      D ]y  }| j                  }t        j                  dd|j                        }t        j                  dd|      }| j                  d|}t        || f||d      }t        |||       | { y |  y w)	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 sCHH=JJ7J!llJ7D&/sKF
 FD&)L!	$ 	s   BBc                0    t        |        t        |        y rL   )	_do_skips_setup_enginer   s    r-   !start_test_class_outside_fixturesr  9  s    cN#r/   c                j    t         j                  |        t        j                  j                          y rL   )rS   stop_test_class_inside_fixturesrT   testing_reaperr  s    r-   stop_test_classr  >  s$    ,,S1 ::<r/   c                   t         j                  j                          t        j                  t        t        j
                  |        	 t        j                  st        j                          t                y # 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  sQ    ;;=..vvyy#F&&002s   	$A8 8Bc                 l    t         j                  r$t         j                  j                  t               y y rL   )rY   r   resetrR   r8   r/   r-   r  r  Q  s     g& r/   c                 |    t         j                  j                          t        j	                          t                y rL   )rT   r  final_cleanuprV   r  r  r8   r/   r-   final_process_cleanupr  V  s&    ((*((*r/   c                    t        | dd       rUt        | j                        }d|d<   t        j	                  |      }t
        j                  j                  |t               y y )N__engine_options__classscoper   )	r   dictr  rT   testing_enginerY   r   push_enginerR   )r   optsengs      r-   r  r  \  sT    s($/C**+W$$T$2##C1	 0r/   c                p    t        |d|j                        }|d|d|}t        j                  |       y )Nr  r   )r   r   rX   _start_current_test)testtest_module_name
test_class	test_namer   id_s         r-   before_testr.  d  s3     :2J4G4GHD($	
:C!!#&r/   c                h    t         j                          t        j                  j                          y rL   )rS   
after_testrT   r  r)  s    r-   r0  r0  o  s     %%'r/   c                B    t         j                  j                  |        y rL   )rT   r  after_test_outside_fixturesr1  s    r-   after_test_fixturesr4  t  s    66t<r/   c                   t        t        j                  j                               }| j                  rFt        j                  | j                   }t        |      D ]  } ||      s|j                  |        t        | dd       rYt        j                  t        j                  | j                         }t        |      D ]  } ||      r|j                  |        t        | dd       r|j                  | j                  g       t        | d      rvt        j                   }t        |      D ]X  }| j"                  D ]G  }t        ||      }|j%                  |      }	|	s#|j                  |       ||j'                  |	        X Z t        | d      rt               }
t        j                   }t        |      D ]B  }| j(                  D ]1  }t        ||      }|j+                  |      r!|
j-                  |       3 D |j/                  |
      r|j1                  |
       |rNi }t3        t5        |d             D ]"  }|j6                  j8                  }||vs|||<   $ |j;                         S |S )N__only_on__r  __requires____prefer_requires__c                    | 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>  s0    FFKKFFMMFFNN66! r/   )key)setrY   r   r   __unsupported_on__rU   db_specr   remover   rZ   to_listr6  intersection_updater  hasattrr   r7  matching_config_reasonsextendr8  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  sP   fmm//12K
!!3#9#9:{+ 	/JJ"":.	/ sM4(!!4<<#@A{+ 	/J
#"":.	/ s($/'')?)?(@AsN#**{+ 		J"// k:$<<ZH&&z2*|4		 s)***{+ 	2J"66 2k://
;!%%j1	2	2 !!-0))-8 	
 	&C B$"%B	& !!##r/   c           
     (   g }t        | |      }t        | dd      rHt        | d      D ]9  } |       st        j                  d| j                  d|j                         ; |sxd| j
                  d| j                  ddj                  d t        j                  j                         D              dj                  |      }t        j                  |       nt        | d	      r|t               }t        j                  t        j                  | j                         }|D ]  } ||      r|j!                  |        |j#                  |      r|j%                  |       t        j&                  |vrt)        |j+                         |        y y )
N__skip_if__F'z' skipped by r   z'' unsupported on any DB implementation z, c           
   3     K   | ]k  }d |j                   j                  ddj                  d t        j	                  |j                         D              d|j                   j
                  d  m yw)rW  (r   c              3  2   K   | ]  }t        |        y wrL   )r$   ).0digs     r-   	<genexpr>z&_do_skips.<locals>.<genexpr>.<genexpr>  s       Cs   z)+N)r   r   joinrU   _server_versionr:  )r[  rO  s     r-   r]  z_do_skips.<locals>.<genexpr>  s`        MM&&HH #-#=#=jmm#L  MM((s   A1A3__prefer_backends__)r  r   rY   	skip_testr   r   r^  r   r   rE  r?  rU   rA  rZ   rC  r`  r   rI  rJ  r   _setup_configpop)r   rM  r   cmsgrS  rN  rO  s           r-   r  r    sN   G+C9KsM5)m, 	As  ,/LL!**E	 NNLLII  #)--";";"=  IIg
" 		+	,!!4<<0G0G#HI% 	.J
#!!*-	. !!-0))-8k)koo'- *r/   c                L    t         j                  j                  | t               y rL   )rY   r   pushrR   )rO  ctxs     r-   rb  rb    s    
OO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y)
FixtureFunctionsc                    t               rL   NotImplementedErrorselfargkws      r-   skip_test_exceptionz$FixtureFunctions.skip_test_exception      !##r/   c                    t               rL   rl  ro  rs   rq  s      r-   combinationszFixtureFunctions.combinations  rs  r/   c                    t               rL   rl  ru  s      r-   param_identzFixtureFunctions.param_ident  rs  r/   c                    t               rL   rl  rn  s      r-   fixturezFixtureFunctions.fixture  rs  r/   c                    t               rL   rl  ro  s    r-   get_current_test_namez&FixtureFunctions.get_current_test_name  s    !##r/   c                    t               rL   rl  r|  s    r-   mark_base_test_classz%FixtureFunctions.mark_base_test_class  rs  r/   c                    t               rL   rl  r|  s    r-   add_to_markerzFixtureFunctions.add_to_marker  rs  r/   N)returnr   )r   r   __qualname__abcabstractmethodrr  rv  rx  rz  r}  r  abstractpropertyr  r8   r/   r-   rj  rj    s    $ $ 	$ $ 	$ $ 	$ $$ 	$ $ 	$ $r/   rj  c                    | a y 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   r?  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  r.  r0  r4  r  r  rb  ABCrj  r   r  r8   r/   r-   <module>r     s=   # 
    	  	 
  & # 89 

		
	

uu rj	.!!$
9.. 

  
   
 
 4 4 ' '
 .- .-b ) )
C$ ; ; % %  0
='
2'(
=?D(.V.$sww $:  )r/   