
    +h#T                        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	        j                  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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	 Z"d
 Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.g Z/g Z0d Z1d Z2e1d        Z3e1d        Z4e1d        Z5e1d        Z6e2d        Z7e1d        Z8e2d        Z9e2d        Z:d  Z;e2d!        Z<e2d"        Z=e2d#        Z>e2d$        Z?d% Z@d& ZAd' ZBd( ZCd) ZDd* ZEd+ ZFd, ZGd- ZHd. ZId/ ZJd0 ZKd7d1ZLd2 ZMd3 ZN G d4 d5e      ZOdaPd6 ZQy)8zTesting 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                   $    e Zd Zej                  Zy)ABCN)__name__
__module____qualname__abcABCMeta__metaclass__     X/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/plugin_base.pyr   r   )   s    r   r   c                     | 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dd        | d dd!d"        | d#dd$d%        | d&t         d'd(d)*        | d+t         d,d-.        | d/t         d01        | d2dd3d4        | d5t         d6d7.        | d8dd9d:d;<        | d=dt         t        d>        | d?dd@d:dA<        | dBdt        t         dCD        | dEdt
        t         dFD        | dGddHd:dI<        | dJddKd:dL<        | dMt         dNdO.        | dPt         dg dQdRS       y )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   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-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--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-profileswrite_profilesz$Write/update failing profiling data.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   )str_log	_list_dbs_requirements_opt_include_tag_exclude_tag)make_options    r   setup_optionsr3   A   s^   ; < ' "(	 J  ;	 G
 K	 /	  /	 9 A	 !9 	 	 + "B  + + 3  #; >	  $Ar   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.testingr6   FOLLOWER_IDENT)follower_identr6   s     r   configure_followerr:      s     --Ir   c                 $    t         t        d| d<   y)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<   dict_s    r   !memoize_important_follower_configrB      s     %$ E
r   c                 p    t         j                  | d   d          t        j                  | d   d          y)zfRestore important configuration needed by a follower.

    This invokes in the follower process.

    r?   r=   r>   N)r=   updater>   r@   s    r   !restore_important_follower_configrE     s6     /0@A/0@Ar   c                  Z    t        j                         at        j                  ddg       y )Nz	setup.cfgztest.cfg)configparserConfigParserfile_configreadr   r   r   read_configrK     s#    ++-Kk:./r   c                 @    | a t        D ]  } |t         t                y)z7things to set up early, before coverage might be setup.N)optionspre_configurerI   )optfns     r   	pre_beginrQ     s"     G !
7K !r   c                     | t         _        y N)rM   has_coverage)values    r   set_coverage_flagrV   %  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)configr6   )utilN)post_configurerM   rI   
sqlalchemyrY   r7   rZ   r[   r\   r]   r^   r_   r`   r6   ra   setup_filtersrP   s    r   
post_beginrf   )  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_strrU   parsers      r   r-   r-   ;  so     % ))',,7			(	#% ))'--8 
$r   c            	          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   )printsortedrI   rM   getsysexit)argsmacros     r   r.   r.   H  sO    	
<=++D12 BE;??4#?@ABHHQKr   c                     t        |       y rS   )_setup_requirementsro   s      r   r/   r/   O  s
    r   c                 N    t         j                  |j                  dd             y N-_)r>   addreplacero   s      r   r1   r1   S      U]]3,-r   c                 N    t         j                  |j                  dd             y r~   )r=   r   r   ro   s      r   r0   r0   W  r   r   c                 0    t         j                  |        | S rS   )rN   r   re   s    r   prer   _  s    Ir   c                 0    t         j                  |        | S rS   )rb   r   re   s    r   postr   d  s    "Ir   c                     | a y rS   rM   rO   rI   s     r   _setup_optionsr   i  s	     Gr   c                 H    | j                   rt        j                  d       y y )Nmemory_intensive)r   r>   r   r   s     r   _set_nomemoryr   o  s    
||+, r   c                 H    | j                   rt        j                  d       y y )Ntiming_intensive)r   r>   r   r   s     r   _set_notimingintensiver   u  s    
+, r   c                 L    | j                   rdd l }|t        j                  d<   y y )Nr   decimal)r'   rw   modules)rM   rI   r'   s      r   _monkeypatch_cdecimalr   {  s!    !)I r   c                 .    ddl m} t               |_        y Nr   r`   )r7   r`   _fixture_fn_class_fixture_functions)rM   rI   r`   s      r   _init_symbolsr     s    ) 1 3Fr   c                 D    | j                   st        sddlm} d|_        y y )Nr   )asyncioF)disable_asynciopy3kr7   r   ENABLE_ASYNCIO)rO   rI   r   s      r   _set_disable_asyncior     s    
$.!& #'r   c                    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 |_        t        |j!                  ||            }	|	D ]  }
t"        j%                  d	|
       | j&                  rO|j(                  rCt+        | j&                  d
      5 }|j-                  |j(                  dz   |
z   dz          d d d        |j/                  |
| ||j(                        }|j                  r|j1                  ||        y # 1 sw Y   IxY w)Nr   rX   r   r5   z[,\s]+r   z:Unknown URI specifier '%s'.  Specify --dbs for known uris.r"   zAdding database URL: %sa 
)rc   rY   r7   r`   r6   r   listr   r   resplitrM   RuntimeErrorr   rv   _currentgenerate_db_urlsloginfor%   r8   openwritesetup_configset_as_current)rM   rI   rY   r`   r6   db_urlsextra_driversdb_tokenr   expanded_urlsdb_urlfile_cfgs                r   _engine_urir     s    #),}}w}}%$$*Mzz

 	>Hhhy(3 >[0066&8:<= 
 NN;??4#<=>	> {tY78FO33G]KLM -*F3I$<$<g**C0 LEI44s:VCdJKL $$G[)*B*B
 sG,-L Ls   %F<<G	c                 >    |j                  dd      }t        |       y )Nsqla_testingrequirement_cls)rv   r|   )rM   rI   r   s      r   _requirementsr     s     "oon6GHO(r   c                    ddl m} ddlm} |j                  y | j                  d      \  }}t        |      }|j                  d      dd  D ]  }t        ||      } t        ||      } |       x|_        |_        t        |_	        y )Nr   r   rX   :.   )
r7   r`   rc   rY   requirementsr   
__import__getattrrequiresbootstrapped_as_sqlalchemy)argumentr`   rY   modnameclsnamemod	componentreq_clss           r   r|   r|     s    )"&~~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   r5   )r7   r`   r   r6   Configall_configsdrop_all_schema_objectsr   )rM   rI   r`   r6   r   s        r   _prep_testing_databaser     sF    )0==,,. 	;C--c366:	; r   c                 8    | j                   rddlm}  |        y y )Nr   )randomize_unitofwork)r&   sqlalchemy.orm.utilr   )rM   rI   r   s      r   _reverse_topologicalr     s    < r   c                 4    ddl m} t        |_        ||_        y r   )r7   r`   rM   rI   )rO   rI   r`   s      r   _post_setup_optionsr     s    )FN$Fr   c                     ddl m} |j                  |j                  dd      | j                  | j
                        |_        y )Nr   )r_   r   profile_file)sortdump)r7   r_   ProfileStatsFilerv   r!   r#   _profile_stats)rM   rI   r_   s      r   _setup_profilingr     s=    ,(997      :  Ir   c                     t        |t        j                        sy| j                  d      ryt        j
                  j                  r(t        |dd      st        |dd      st        |dd      syy)NFr   __backend____sparse_backend____only_on__T)
issubclassrZ   TestBase
startswithr`   rM   r   r   )nameclss     r   
want_classr     s\    c8,,-		##]E2159]E2r   c                 R   |j                   j                  d      sy|j                  yt        ryt	        | d      xr7 t
        j                  | j                        j                  t        t              xs2 t	        |d      xr$ |j                  j                  t        t              S t        rCt	        | d      r7t
        j                  | j                        j                  t        t              S t        r0t	        |d      r$|j                  j                  t        t              S y)Ntest_F__tags___sa_exclusion_extendT)r   r   r   r=   hasattrr\   tagsr   include_testr>   r   )r   rP   s     r   want_methodr     s    ;;!!'*			C$ -::l

 B./ ''44l
	
 
'#z2s||,99,
 	
 
'"&<=&&33L,OOr   c              #   v  K   t        | dd      st        | dd      rt        | dd      }t        | |      D ]y  }| j                  }t        j                  dd|j
                        }t        j                  dd|      }| j                  d|}t        || f||d	      }t        |||       | { y |  y w)
Nr   Fr   )sparsez
[_\[\]\.]+r   z_+$ )_sa_orig_cls_name__only_on_config__)r   _possible_configs_for_clsr   r   subr   r   setattr)r   moduler   r   	orig_name
alpha_namer   subclss           r   generate_sub_testsr   -  s     sM5)W!5. 2E:,S@ 	CI sCHH=JJ7J!llJ7D&/sKF
 FD&)L!	$ 	s   B7B9c                 0    t        |        t        |        y rS   )	_do_skips_setup_enginer   s    r   !start_test_class_outside_fixturesr  G  s    cN#r   c                 j    t         j                  |        t        j                  j                          y rS   )rZ   stop_test_class_inside_fixturesr[   testing_reaperr  s    r   stop_test_classr  L  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rS   )r[   r   stop_test_class_outside_fixturesr6   r`   r   rM   r$   r]   global_cleanup_assertions_restore_enginer  s    r   r	  r	  U  sQ    ;;=..vvyy#F&&002s   	$A8 8Bc                  l    t         j                  r$t         j                  j                  t               y y rS   )r`   r   resetrY   r   r   r   r  r  _  s     g& r   c                  |    t         j                  j                          t        j	                          t                y rS   )r[   r  final_cleanupr]   r
  r  r   r   r   final_process_cleanupr  d  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  r[   testing_enginer`   r   push_enginerY   )r   optsengs      r   r  r  j  sT    s($/C**+W$$T$2##C1	 0r   c                 p    t        |d|j                        }|d|d|}t        j                  |       y )Nr   r   )r   r   r_   _start_current_test)testtest_module_name
test_class	test_namer   id_s         r   before_testr!  r  s3    
 :2J4G4GHD($	
:C!!#&r   c                 h    t         j                          t        j                  j                          y rS   )rZ   
after_testr[   r  r  s    r   r#  r#  ~  s     %%'r   c                 B    t         j                  j                  |        y rS   )r[   r  after_test_outside_fixturesr$  s    r   after_test_fixturesr'    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 )Nr   r   __requires____prefer_requires__c                     | j                   j                  | j                   j                  | j                   j                  j                  fS rS   )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)setr`   r   r   __unsupported_on__r\   db_specr   remover   ra   to_listr   intersection_updater   r   r   r)  matching_config_reasonsextendr*  enabled_for_configr   
differencedifference_updatereversedru   r   r   values)r   reasonsr   r   spec
config_objr   requirementcheckskip_reasonsnon_preferredper_dialectr   r   s                 r   r   r     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                         ; |skd| 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 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)rH  (r   c              3   2   K   | ]  }t        |        y wrS   )r,   ).0digs     r   	<genexpr>z&_do_skips.<locals>.<genexpr>.<genexpr>  s       Cs   z)+N)r   r   joinr\   _server_versionr,  )rL  r@  s     r   rN  z_do_skips.<locals>.<genexpr>  s`        MM&&HH #-#=#=jmm#L  MM((s   A1A3__prefer_backends__)r   r   r`   	skip_testr   rO  r   r   r   r1  r\   r3  ra   r5  rQ  r   r:  r;  r   _setup_configpop)r   r>  r   cmsgrD  r?  r@  s           r   r   r     sG   G+C9KsM5)m, 	As  ,/LL!**E	 LLII  #)--";";"=  IIg
  		+	,!!4<<0G0G#HI% 	.J
#!!*-	. !!-0))-8k)koo'- *r   c                 L    t         j                  j                  | t               y rS   )r`   r   pushrY   )r@  ctxs     r   rS  rS    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        Z
y)FixtureFunctionsc                     t               rS   NotImplementedErrorselfargkws      r   skip_test_exceptionz$FixtureFunctions.skip_test_exception      !##r   c                     t               rS   r]  r`  ry   rb  s      r   combinationszFixtureFunctions.combinations  rd  r   c                     t               rS   r]  rf  s      r   param_identzFixtureFunctions.param_ident   rd  r   c                     t               rS   r]  r_  s      r   fixturezFixtureFunctions.fixture  rd  r   c                     t               rS   r]  r`  s    r   get_current_test_namez&FixtureFunctions.get_current_test_name  s    !##r   c                     t               rS   r]  rm  s    r   mark_base_test_classz%FixtureFunctions.mark_base_test_class  rd  r   N)r   r   r	   r
   abstractmethodrc  rg  ri  rk  rn  rp  r   r   r   r[  r[    s    $ $ 	$ $ 	$ $ 	$ $$ 	$ $r   r[  c                     | a y rS   )r   )fixture_fn_classs    r   set_fixture_functionsrt    s    (r   )NF)R__doc__
__future__r   r
   rh   r   rw   r   rk   r   version_infor   rG   r   rH   collectionscollections_abcobjectrZ   r[   r\   r^   r_   r6   r]   r   r`   rY   ra   rI   r1  r=   r>   rM   r3   r:   rB   rE   rK   rQ   rV   rf   r-   r.   r/   r1   r0   rN   rb   r   r   r   r   r   r   r   r   r   r   r|   r   r   r   r   r   r   r   r  r  r	  r  r  r  r!  r#  r'  r   r   rS  r[  r   rt  r   r   r   <module>r{     st   ' 
  	 
 # 89 6!
''C')$f $
 

		
	

uu
l^	. B0!!$
9.. 

  
 - -
 - -
 * * 4 4 ' ' *- *-Z ) )C* ; ;   % %   64
='
2	'(
=?D'.T.$s $2  )r   