
    ؄_O                        d Z ddlmZ ddlZddlZddl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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 Z,d Z-d Z.e-d             Z/e-d             Z0e-d             Z1e.d             Z2e.d             Z3e.d             Z4d Z5e.d             Z6e.d             Z7e.d             Z8e.d              Z9d! Z:d" Z;d# Z<d$ Z=d% Z>d& Z?d' Z@d( ZAd) ZBd* ZCd2d,ZDd- ZEd. ZF G d/ d0e	          ZGdaHd1 ZIdS )3zTesting 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_importN)   r   c                       e Zd Zej        ZdS )ABCN)__name__
__module____qualname__abcABCMeta__metaclass__     j/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/testing/plugin/plugin_base.pyr   r   "   s        r   r   c                 r    | dddt           d            | dddt           d            | dd	dd
d            | ddt          d            | dd	ddd            | dddd            | dddd            | dddd            | ddd             | d!dd"d#            | d$dd%d&'            | d(dd)d*d+,            | d-ddt          d.            | d/dd0d*d1,            | d2dt          dd34            | d5dt          dd64            | d7dd8d*d9,            | d:dd;d*d<,           d S )=Nz
--log-infocallbackstringz,turn on info logging for <LOG> (multiple OK))actiontyper   helpz--log-debugz-turn on debug logging for <LOG> (multiple OK)z--dbappenddbzBUse prefab database uri. Multiple OK, first one is run by default.)r   r   destr   z--dbszList available prefab dbs)r   zeroarg_callbackr   z--dburidburiz8Database uri.  Multiple OK, first one is run by default.z--dropfirst
store_true	dropfirstz,Drop all tables in the target database first)r   r   r   z--backend-onlybackend_onlyz<Run only tests marked with __backend__ or __sparse_backend__z
--nomemorynomemoryz Don't run memory profiling testsz--postgresql-templatedbz^name of template database to use for PostgreSQL CREATE DATABASE (defaults to current database))r   r   z--low-connectionslow_connectionsz>Use a low number of distinct connections - i.e. for Oracle TNSz--write-identswrite_identszCwrite out generated follower idents to <file>, when -n<num> is used)r   r   r   z--reversetop
reversetopFzTUse a random-ordering set implementation in the ORM (helps reveal dependency issues))r   r   defaultr   z--requirementsz3requirements class for testing, overrides setup.cfgz--with-cdecimalcdecimalzDMonkeypatch the cdecimal library into Python 'decimal' for all testsz--include-tagzInclude tests with tag <tag>)r   r   r   r   z--exclude-tagzExclude tests with tag <tag>z--write-profileswrite_profilesz$Write/update failing profiling data.z--force-write-profilesforce_write_profilesz,Unconditionally write/update profiling data.)_log	_list_dbs_requirements_opt_include_tag_exclude_tag)make_options    r   setup_optionsr,   :   s   K;    K<    K'    K"(	    KJ    K;	    KK	    K/	    K!9    K	    K	    K+    K"B    K    K+    K+    K3    K #;     r   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.testingr/   FOLLOWER_IDENT)follower_identr/   s     r   configure_followerr3      s$     -,,,,,-Ir   c                 *    t           t          d| d<   dS )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_configNr5   dict_s    r   !memoize_important_follower_configr;      s"     %$   E
r   c                     t                               | d         d                    t                              | d         d                    dS )zfRestore important configuration needed by a follower.

    This invokes in the follower process.

    r8   r6   r7   N)r6   updater7   r9   s    r   !restore_important_follower_configr>      sH     /0@AAA/0@AAAAAr   c                  d    t          j                    at                              ddg           d S )Nz	setup.cfgztest.cfg)configparserConfigParserfile_configreadr   r   r   read_configrD      s/    +--Kk:./////r   c                 J    | a t          D ]} |t           t                     dS )z7things to set up early, before coverage might be setup.N)optionspre_configurerB   )optfns     r   	pre_beginrJ      s7     G ! !
7K    ! !r   c                     | t           _        d S N)rF   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 ddlma t                                           dS )z9things to set up later, once we know coverage is running.r   testing)fixturesengines
exclusions)
assertionswarnings	profilingconfig)utilN)post_configurerF   rB   
sqlalchemyrR   r0   rS   rT   rU   rV   rW   rX   rZ   r[   setup_filtersrI   s    r   
post_beginr`      s      ! !
7K    
 #"""""@@@@@@@@@@BBBBBBBBBB))))))r   c                    t           sdd l a t                                            |                     d          r9t                               |                              t           j                   d S |                     d          r9t                               |                              t           j                   d S d S )Nr   z-infoz-debug)loggingbasicConfigendswith	getLoggersetLevelINFODEBUGopt_strrN   parsers      r   r&   r&     s        9%  ))',77777			(	#	# 9%  ))'-888889 9r   c            	          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   )printsortedrB   rF   getsysexit)argsmacros     r   r'   r'     sv    	
<===++D1122 B BEEEE;??4#?#?#?@AAAAHQKKKKKr   c                 $    t          |           d S rL   )_setup_requirementsri   s      r   r(   r(     s    r   c                 b    t                               |                    dd                     d S N-_)r7   addreplaceri   s      r   r*   r*     *    U]]3,,-----r   c                 b    t                               |                    dd                     d S rx   )r6   r{   r|   ri   s      r   r)   r)      r}   r   c                 :    t                               |            | S rL   )rG   r   r_   s    r   prer   (  s    Ir   c                 :    t                               |            | S rL   )r\   r   r_   s    r   postr   -  s    "Ir   c                 
    | a d S rL   rF   rH   rB   s     r   _setup_optionsr   2  s     GGGr   c                 L    | j         rt                              d           d S d S )Nmemory_intensive)r   r7   r{   r   s     r   _set_nomemoryr   8  s1    
| -+,,,,,- -r   c                 >    | j         rdd l }|t          j        d<   d S d S )Nr   decimal)r#   rq   modules)rF   rB   r#   s      r   _monkeypatch_cdecimalr   >  s2     *!)I* *r   c                 8    ddl m} t                      |_        d S Nr   rY   )r0   rZ   _fixture_fn_class_fixture_functions)rF   rB   rZ   s      r   _init_symbolsr   F  s(    )))))) 1 3 3Fr   c                    ddl m} ddlm} ddl m} | j        rt          | j                  }ng }| j        rt| j        D ]l}t          j	        d|          D ]T}||
                    d          vrt          d|z            |                    |                    d|                     Um|s)|                    |                    dd                     d |_        |D ]}| j        rW|j        rPt#          | j        d	          5 }	|	                    |j        d
z   |z   dz              d d d            n# 1 swxY w Y   |                    || ||j                  }
|j        s|
                    |
|           d S )Nr   rY   rQ   r.   z[,\s]+r   z:Unknown URI specifier '%s'.  Specify --dbs for known uris.r"   a 
)r0   rZ   r]   rR   r/   r   listr   resplitrF   RuntimeErrorr   rp   _currentr    r1   openwritesetup_configset_as_current)rF   rB   rZ   rR   r/   db_urlsdb_tokenr   db_urlfile_cfgs              r   _engine_urir   M  s0   ))))))"""""",,,,,,} w}%%z 	>
 	> 	>Hhy(33 > >[006666&8:<=  
 NN;??4#<#<====>  9{tY77888FO - - 	LI$< 	Lg*C00 LEI4s:VCdJKKKL L L L L L L L L L L L L L L $$G[)*B
 
  	-sG,,,- -s   $D55D9	<D9	c                 P    |                     dd          }t          |           d S )Nsqla_testingrequirement_cls)rp   rv   )rF   rB   r   s      r   _requirementsr   u  s,     "oon6GHHO(((((r   c                 *   ddl m} ddlm} |j        d S |                     d          \  }}t          |          }|                    d          dd          D ]}t          ||          }t          ||          } |            x|_        |_        d S )Nr   rY   rQ   :.   )	r0   rZ   r]   rR   requirementsr   
__import__getattrrequires)argumentrZ   rR   modnameclsnamemod	componentreq_clss           r   rv   rv   |  s    ))))))""""""&~~c**GW W

C]]3''+ & &	c9%%c7##G-4WYY6F'***r   c                 Z   ddl m}m} ddlm} ddlm}m} | j        r
|j	        
                                D ]}|j        } ||          }		 |	                                }
|
D ]P}|                    |                    |                    ||                                                               Qn# t"          $ r Y nw xY w|j        j                            |          r}	 |	                    d          }
|
D ]R}|                    |                    |                    ||                                d                               Sn# t"          $ r Y nw xY w|                    ||	           |j        j                            |          r|                    ||	|j                    ||d          rgddlm} |	                    d	          D ]K}|                    |                    |                    |d
         |d                                        Ld S d S )Nr   )rZ   r[   )against)schemainspecttest_schema)r   
postgresql)r   *namer   )r   r   )r0   rZ   r[   sqlalchemy.testing.exclusionsr   r]   r   r   r   Configall_configsr   get_view_namesexecute	_DropViewTableMetaDataNotImplementedErrorr   schemasenabled_for_configdrop_all_tablesr   sqlalchemy.dialectsr   	get_enumsDropEnumTypeENUM)rF   rB   rZ   r[   r   r   r   r   e	inspector
view_namesvnamer   enums                 r   _prep_testing_databaser     s   ////////555555******** 0=,,.. /	 /	CA

I
&5577
 (  EII(("LL0A0ABB     '    "*==cBB !*!9!9!9!O!OJ ", 	 			",, &$)$*OO$5$5+8 !- !" !"    	 +   D   I..."*==cBB K$$Q	#/$JJJwsL)) 
::::::%//44  DII"//&OO%)&\$x. ,      U0 0/	 /	s$   B66
CC&E
EEc                 8    | j         rddlm}  |             d S d S )Nr   )randomize_unitofwork)r!   sqlalchemy.orm.utilr   )rF   rB   r   s      r   _reverse_topologicalr     s>     <<<<<< r   c                 8    ddl m} t          |_        ||_        d S r   )r0   rZ   rF   rB   )rH   rB   rZ   s      r   _post_setup_optionsr     s)    ))))))FN$Fr   c                 n    ddl m} |                    |                    dd                    |_        d S )Nr   )rX   r   profile_file)r0   rX   ProfileStatsFilerp   _profile_stats)rF   rB   rX   s      r   _setup_profilingr     sC    ,,,,,,(9977   Ir   c                     t          |t          j                  sdS |                     d          rdS t          j        j        r$t          |dd          st          |dd          sdS dS )NFrz   __backend____sparse_backend__T)
issubclassrS   TestBase
startswithrZ   rF   r   r   )r   clss     r   
want_classr     sy    c8,-- u			 	u#]E22 1599
 utr   c                    |j                             d          sdS |j        dS t          rt	          | d          o<t
                              | j                                      t          t                    p4t	          |d          o$|j
                            t          t                    S t          rMt	          | d          r=t
                              | j                                      t          t                    S t          r5t	          |d          r%|j
                            t          t                    S dS )Ntest_F__tags___sa_exclusion_extendT)r   r   r   r6   hasattrrU   tagsr   include_testr7   r   )r   rI   s     r   want_methodr     s&   ;!!'** u		u	 C$$ --::l 

 B.// '44l 
	
 
 '#z22 s|,,99,
 
 	
 
 '"&<== &33L,OOOtr   c              #     K   t          | dd          st          | dd          rt          | dd          }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   Fr   )sparsez
[_\[\]\.]+rz   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 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_classr  %  s!    cNNN#r   c                     t           j                                         	 t          j        st
                                           t                       d S # t                       w xY wrL   )rT   testing_reaper_stop_test_ctxrF   r   rV   global_cleanup_assertions_restore_enginer  s    r   stop_test_classr  *  s_     ))+++& 	300222s   %A A%c                  N    t           j                            t                     d S rL   )rZ   r   resetrR   r   r   r   r  r  5  s    
O'"""""r   c                      t           j                                         t                                           t                       d S rL   )rT   r  _stop_test_ctx_aggressiverV   r  r  r   r   r   final_process_cleanupr  9  s;    44666((***r   c                     t          | dd           rGt                              | j                  }t          j                            |t                     d S d S )N__engine_options__r   )r   rT   testing_enginer  rZ   r   push_enginerR   )r   engs     r   r   r   ?  sX    s($// 2$$S-C$DD##C111112 2r   c                 ^    t          |d|j                  }|d|d|}|t          _        d S )Nr   r   )r   r   rX   _current_test)testtest_module_name
test_class	test_namer   id_s         r   before_testr  E  s?    
 :2J4GHHD((($$$		
:C!Ir   c                 B    t           j                                         d S rL   )rT   r  _after_test_ctx)r  s    r   
after_testr  Q  s    **,,,,,r   Fc                 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                 <    | j         j        | j         j        j        fS rL   )r   r   dialectserver_version_info)r   s    r   <lambda>z+_possible_configs_for_cls.<locals>.<lambda>  s    FKFN6! r   )key)setrZ   r   r   __unsupported_on__rU   db_specr   remover   r[   to_listr  intersection_updater   r   r   r   matching_config_reasonsextendr!  r   r{   
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   U  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                 ^   g }t          | |          }t          | dd          rGt          | d          D ]6} |            r*t                              d| j        d|j                   7|svd| 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 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 )r=  (r   c              3   4   K   | ]}t          |          V  d S rL   )str).0digs     r   	<genexpr>z&_do_skips.<locals>.<genexpr>.<genexpr>  s<         C     r   z)+N)r   r   joinrU   _server_versiondriver)rB  r5  s     r   rD  z_do_skips.<locals>.<genexpr>  s         J M&&&HH  #-#=#=jm#L#L       M(((     r   __prefer_backends__)r   r   rZ   	skip_testr   rE  r   r   r   r'  rU   r)  r[   r+  rH  r{   r/  r0  r   _setup_configpop)r   r3  r   cmsgr9  r4  r5  s           r   r   r     s   G+C99KsM5)) m,, 	 	Aqss    ,/LLL!**E    9 9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   )rZ   r   pushrR   )r5  ctxs     r   rJ  rJ    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	dS )FixtureFunctionsc                     t                      rL   r   selfargkws      r   skip_test_exceptionz$FixtureFunctions.skip_test_exception      !###r   c                     t                      rL   rT  rV  rs   rX  s      r   combinationszFixtureFunctions.combinations  rZ  r   c                     t                      rL   rT  r\  s      r   param_identzFixtureFunctions.param_ident  rZ  r   c                     t                      rL   rT  rU  s      r   fixturezFixtureFunctions.fixture  rZ  r   c                     t                      rL   rT  )rV  s    r   get_current_test_namez&FixtureFunctions.get_current_test_name  s    !###r   N)
r   r   r	   r
   abstractmethodrY  r]  r_  ra  rc  r   r   r   rR  rR    s        $ $ $ 	$ $ $ 	$ $ $ 	$ $ $$ $ $ $ $r   rR  c                 
    | a d S rL   )r   )fixture_fn_classs    r   set_fixture_functionsrg    s    (r   )NF)J__doc__
__future__r   r
   r   rq   version_infopy3kr@   r   rA   collectionscollections_abcobjectrS   rT   rU   rW   rX   rV   r   rZ   rR   r[   rB   rb   r'  r6   r7   rF   r,   r3   r;   r>   rD   rJ   rO   r`   r&   r'   r(   r*   r)   rG   r\   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r  r  r  r  r   r  r  r   r   rJ  rR  r   rg  r   r   r   <module>ro     s/    ' & & & & & 



 				 



 6! 	$
'CC''''))))$ $ $ $ $f $ $ $
 

	
	
 suusuu
| | |~	. 	. 	.   B B B0 0 0! ! !! ! !  $
9 
9 
9    . . .. . .   
  
   
 - - -
 * * * 4 4 4 $- $- $-N ) ) )7 7 7& 5 5 5p    % % %       6  4  
  # # #  2 2 2	" 	" 	"- - -> > > >B'. '. '.T. . .$ $ $ $ $s $ $ $*  ) ) ) ) )r   