
    ,h8                    `   S SK Jr  S SKJr  S SKrS SKrS SKrS SKJr  S SK	r	S SK
r
S SK
Jr  S SKrS SKrS SKJr  SSKJr  SS	KJr  S
SKJr  S
SKJr  S
SKJr  S
SKJr  S
SKJr  S
SKJr  S
SKJr  S
SKJr  S
SKJr  S
SKJr  S
SK J!r!  S
SK J"r"  S
SK J#r#  S
SK J$r$  \#(       d  S r%\%=r&r'O\RP                  r&S r'S r)S5S jr*S r+ " S S\,5      r-S  r.S! r/S" r0S# r1S$ r2S% r3\!S& 5       r4S' r5S( r6S) r7S6S* jr8S+ r9 " S, S-\:5      r;S. r<   S7S0 jr=S1 r>S2 r?S3 r@\R                  S/S8S4 jj5       rBg)9    )annotations)dequeN)chain)	getsizeof)Any   )config)mock   )inspect)
Connection)Column)DropConstraint)	DropTable)ForeignKeyConstraint)MetaData)Tableschema)Integer	decorator)defaultdict)has_refcount_gc)inspect_getfullargspecc                 X    [         R                  " 5         [         R                  " 5         g N)gccollect)argss    O/var/www/auris/envauris/lib/python3.13/site-packages/sqlalchemy/testing/util.pynon_refcount_gc_collectr"   ,   s    





    c                     g r    r%   r#   r!   lazy_gcr&   5   s    r#   c               #     ^^#    [        5       n SS KnU R                  U5        U  H8  m[        SUR                  S-   5       H  mTR
                  UU4S j4v   M     M:     g 7f)Nr   r   c                (   > TR                  U T5      $ r   )dumps)dpickle_protocols    r!   <lambda>picklers.<locals>.<lambda>B   s    7==H+Er#   )setpickleaddrangeHIGHEST_PROTOCOLloads)picklersr1   r,   r-   s     @@r!   r6   r6   9   sT     uHLL b&"9"9A"=>H--!EEE ? s   AA#c                *    [         R                  " XS9$ )N)k)randomchoices)
populationr8   s     r!   random_choicesr<   E   s    >>***r#   c                    [        U [        5      (       a  [        X5      $ U [        R                  " SSU-  -   5      -  R                  [        R                  5      [        SU5      -  $ )N10
   )
isinstancefloatrounddecimalDecimalto_integralROUND_FLOORpow)valueprecs     r!   round_decimalrK   I   s]    %U!! GOOC#*$455BBB r#   c                  8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
	RandomSetS   c                    [        [        R                  U 5      5      n[        R                  " U5        [        U5      $ r   )listr0   __iter__r9   shuffleiter)selfls     r!   rQ   RandomSet.__iter__T   s*    d#$qAwr#   c                    [         R                  " S[        U 5      S-
  5      n[        [        R                  U 5      5      U   nU R                  U5        U$ )Nr   r   )r9   randintlenrP   r0   rQ   remove)rT   indexitems      r!   popRandomSet.popY   sC    q#d)a-0CLL&'.Dr#   c                >    [        [        R                  X5      5      $ r   )rM   r0   unionrT   others     r!   r`   RandomSet.union_   s    4/00r#   c                >    [        [        R                  X5      5      $ r   )rM   r0   
differencera   s     r!   re   RandomSet.differenceb   s    455r#   c                >    [        [        R                  X5      5      $ r   )rM   r0   intersectionra   s     r!   rh   RandomSet.intersectione   s    ))$677r#   c                    [        U 5      $ r   )rM   )rT   s    r!   copyRandomSet.copyh   s    r#   r%   N)__name__
__module____qualname____firstlineno__rQ   r]   r`   re   rh   rk   __static_attributes__r%   r#   r!   rM   rM   S   s     
168r#   rM   c                    [        [        5      nU  H  u  p4X#   R                  U5        M     [        U5       H  u  pVXS  H  nXbU   ;   d  M      g   M     g)zATrue if the given sorting conforms to the given partial ordering.NFT)r   r0   r2   	enumerate)tuplessorted_elementsdepsparentchildinodens           r!   conforms_partial_orderingr|   l   s[     sD  _- $AAw % .
 r#   c                   ^^ [        [        5      mU  H  u  p#TU   R                  U5        M     UU4S jm[        T" U5      5      $ )Nc              3     >#    [        U 5      S:X  a  [        U 5      v   g U  HP  n[        U 5      R                  U/5      nUR	                  TU   5      (       a  M9  T" U5       H  nU/U-   v   M     MR     g 7f)Nr   )rY   rP   r0   re   rh   )elementselemsubsetsub_ordering_all_orderingsedgess       r!   r   -all_partial_orderings.<locals>._all_orderings   sm     x=Ax.  X114&9**5;77(6v(>#f|33 )? !s   AA8A8)r   r0   r2   rS   )rt   r   rw   rx   r   r   s       @@r!   all_partial_orderingsr   z   sB    Ee   4 x())r#   c                     Xl         U $ ! [         aE    [        R                  " U R                  U R
                  XR                  U R                  5      n  U $ f = f)aK  Return a function with a given __name__.

Will assign to __name__ and return the original function if possible on
the Python implementation, otherwise a new function will be constructed.

This function should be phased out as much as possible
in favor of @decorator.   Tests that "generate" many named tests
should be modernized.

)rm   	TypeErrortypesFunctionType__code____globals____defaults____closure__)fnnames     r!   function_namedr      sT    

 I	  
KK
 I	
s   
 AAAc                    U R                  5       n U" U/UQ70 UD6nU R                  SSS5        U$ !   [        R                  " 5       nU R                  " U6 nU(       d  e Us $ = f)zRun the given function under the given contextmanager,
simulating the behavior of 'with' to support older
Python versions.

This is not necessary anymore as we have placed 2.6
as minimum Python version, however some tests are still using
this structure.

N)	__enter____exit__sysexc_info)ctxr   argkwobjresultr   raise_s           r!   run_as_contextmanagerr      sh     --/C
C$#$$T4&<<>x(Ms	    3 0A%c                D    U  Vs1 s H  n[        U5      iM     sn$ s  snf )zConverts the results of sql execution into a plain set of column tuples.

Useful for asserting the results of an unordered query.
tuple)resultsrows     r!   rowsetr      s      #**'3E#J'***s   c                     U 5       er   r%   )msgs    r!   failr      s    #5r#   c                x   SSK Jn  [        R                  " 5       nUS   n[	        USS5      nXEl         U " U0 UD6UR                  5         UR                  R                  nU(       a0  [        XG5        UR                  5       R                  5         Xel        $ [        U[        R                  5        Xel        $ ! UR                  5         UR                  R                  nU(       a0  [        XG5        UR                  5       R                  5         Xel        f [        U[        R                  5        Xel        f = f)zlProvide bound MetaData for a single test, dropping afterwards.

Legacy; use the "metadata" pytest fixture.

r   )fixturesr   metadataN) r   r   r   getattrr   close_all_sessionsbase_connection_fixture_connectiondrop_all_tables_from_metadataget_transactioncommitr	   db)r   r    r   r   r   rT   	prev_metacfcs           r!   provide_metadatar      s      H7Dj$/IM"42 	##% mm:: *(8
 !((* " *(FII>!# 	##% mm:: *(8
 !((* " *(FII>!s   B: :A?D9c            
     Z  ^ [        5       nU  H  mUR                  T5        M     [        U5      n[        R                  " U  V^s/ s H5  mSR                  U4S jU 5       5      4[        U4S jU 5       5      -   PM7     snSS[        U5      -  -   SR                  U5      S.6$ s  snf )a  A facade around @testing.combinations() oriented towards boolean
keyword-based arguments.

Basically generates a nice looking identifier based on the keywords
and also sets up the argument names.

E.g.::

    @testing.flag_combinations(
        dict(lazy=False, passive=False),
        dict(lazy=True, passive=False),
        dict(lazy=False, passive=True),
        dict(lazy=False, passive=True, raiseload=True),
    )
    def test_fn(lazy, passive, raiseload): ...

would result in::

    @testing.combinations(
        ("", False, False, False),
        ("lazy", True, False, False),
        ("lazy_passive", True, True, False),
        ("lazy_passive", True, True, True),
        id_="iaaa",
        argnames="lazy,passive,raiseload",
    )
    def test_fn(lazy, passive, raiseload): ...

_c              3  Z   >#    U  H   nTR                  US 5      (       d  M  Uv   M"     g7fFNget.0r8   r+   s     r!   	<genexpr>$flag_combinations.<locals>.<genexpr>  s     9Aq%aas   +	+c              3  H   >#    U  H  nTR                  US 5      v   M     g7fr   r   r   s     r!   r   r     s     2TAEE!UOOTs   "ry   a,)id_argnames)r0   updatesortedr	   combinationsjoinr   rY   )r   keysr+   s     `r!   flag_combinationsr      s    > 5DA  $<D "

 " XX999;2T223!


 3T?#$ 

s   <B(c                  ^  [        T 5      nT " US    Vs/ s H  n[        R                  " 5       PM     sn6 nU 4S jn[        R                  " [        [        U5      5       Vs/ s H  oe" U5      4PM     sn0 UD6$ s  snf s  snf )Nr   c                ,   >^  UU 4S jnST -  Ul         U$ )Nc                    > T" S0 U D6T   $ )Nr%   r%   )r   lambda_arg_setsposs    r!   fixture<lambda_combinations.<locals>.create_fixture.<locals>.fixture)  s    "(R(--r#   zfixture_%3.3d)rm   )r   r   r   s   ` r!   create_fixture+lambda_combinations.<locals>.create_fixture(  s    	. +S0r#   )r   r
   Mockr	   r   r3   rY   )r   r   r    r   arg_setsr   ry   s   `      r!   lambda_combinationsr   #  s    !/2DQ @ @AH (-c(m(<	=(<1>!
(<	=AC  !A 
>s   A>%Bc                   [        U 5      S   nU Vs0 s H  o3UR                  U5      _M     nn[        U R                  5      nUR	                  U5        [
        R                  " U R                  U5      nU" S0 UD6$ s  snf )zGiven a no-arg lambda and a namespace, return a new lambda that
has all the values filled in.

This is used so that we can have module-level fixtures that
refer to instance-level variables using lambdas.

r   r%   )r   r]   dictr   r   r   r   r   )__fnr   pos_argsr   pass_pos_argsglbnew_fns          r!   resolve_lambdar   4  sv     &d+A.H19:#"&&+%M:
t
 CJJrNs3F"M""	 ;s   A?c                   ^  U 4S jnU$ )z&Provide MetaData for a pytest fixture.c                F   >^  U 4S jn[         R                  " TS9" U5      $ )Nc              3  "  >#    [         R                  " 5       =ol         T" X5      nUR                  [        R
                  5        Uv   UR                  [        R
                  5        g ! UR                  [        R
                  5        f = f7fr   )r   r   r   
create_allr	   r   drop_all)rT   r   r   r   s      r!   run_ddl3metadata_fixture.<locals>.decorate.<locals>.run_ddlI  sc     '-'88H}-D+##FII. !!&)),!!&)),s   B+A+  B+!BB)scope)r	   r   )r   r   ddls   ` r!   decorate"metadata_fixture.<locals>.decorateH  s    		- ~~C(11r#   r%   )r   r   s   ` r!   metadata_fixturer   E  s    2 Or#   c                 &   ^  [         U 4S j5       nU$ )zaForce the given table names to be dropped after test complete,
isolating for foreign key cycles

c                   >  U " U0 UD6[        [        R                  [        [        R                  5      TS9  $ ! [        [        R                  [        [        R                  5      TS9  f = f)N)include_names)drop_all_tablesr	   r   r   )r   r    r   namess      r!   goforce_drop_names.<locals>.go_  sG    	Pt?r?FIIwvyy'9OOFIIwvyy'9Os	   ; 2A-r   )r   r   s   ` r!   force_drop_namesr   Y  s      P P Ir#   c                  (    \ rS rSrSrS rS r\rSrg)adictii  z,Dict keys available as attributes.  Shadows.c                V     X   $ ! [          a    [        R                  X5      s $ f = fr   )KeyErrorr   __getattribute__)rT   keys     r!   r   adict.__getattribute__l  s/    	49 	4((33	4s    ((c                H    [        U Vs/ s H  o U   PM	     sn5      $ s  snf r   r   )rT   r   r   s      r!   __call__adict.__call__r  s!    404C3i40110s   r%   N)	rm   rn   ro   rp   __doc__r   r   get_allrq   r%   r#   r!   r   r   i  s    642 Gr#   r   c                   ^ ^ SSK Jm  UU 4S jn[        U[        5      (       d"  UR	                  5        nU" U5        S S S 5        g U" U5        g ! , (       d  f       g = f)Nr   )enginesc                  > TR                   R                  U 5        U R                  R                  (       d1  SSKJn  UR                  SSS9   TR                  U 5        S S S 5        g TR                  U 5        g ! , (       d  f       g = f)Nr   )
assertionszCan't sort tablesF)assert_)testing_reaperprepare_for_drop_tablesdialectsupports_alterr   r  expect_warningsr   )
connectionr  r   r   s     r!   r   )drop_all_tables_from_metadata.<locals>.go{  sv    66zB!!00$++#U ,  !!*- 
 j) s   A;;
B	)r   r   rA   r   begin)r   engine_or_connectionr   r	  r   s   `   @r!   r   r   x  sL    * *J77!'')ZzN *) 	  *)s   	A
Ar   c                   Ub  [        U5      nUb  US:X  d   S5       eU4nU R                  5        n[        UR                  US95       GH  u  pgU(       aA  Ub  US   U;  a  M  UR	                  [        [        US   [        5       US   S95      5        MN  U(       d  MW  U R                  R                  (       d  Mt  U H  u  pUb  US   U;  a  M  [        US   [        5       [        S[        5      [        S[        5      US   S9n
UR	                  [        [        U
R                  R                  /U
R                  R                   /U	S	95      5        M     GM     S S S 5        g ! , (       d  f       g = f)
Nr   z2consider_schemas and schema are mutually exclusive)consider_schemasr   r   r   xy)r   )r0   r  reversed%sort_tables_on_foreign_key_dependencyexecuter   r   r   r  r  r   r   r   r   cr  r  )engine	inspectorr   r  r   conn	table_keyfkcst_keyfkctbs              r!   r   r     sd     M* $
 
 	@?	@ 
 #9	4';;!1 <  
OI
 !-!!M9ilHJy|L
 ~~44"&JE%1!!HM9 a 
sG,sG,$QxB LL&0"$$&&BDDFF8#N #'' 
 
s   A,E*"B?E**
E8c                &   ^  [         U 4S j5       nU$ )Nc                `   >  U " U0 UD6TR                  5         $ ! TR                  5         f = fr   )_clear)r   r   r   	event_clss      r!   r   !teardown_events.<locals>.decorate  s,    	s>b>Is    -r   )r   r   s   ` r!   teardown_eventsr"    s      Or#   c                   ^^^^ S n[         [        [        [        [        [        [        U[
        [        [        [        0m[        5       m[        S5      mUUUU4S jmT" U 5      $ )zReturns the approximate memory footprint an object and all of its
contents.

source: https://code.activestate.com/recipes/577504/


c                J    [         R                  " U R                  5       5      $ r   )r   from_iterableitems)r+   s    r!   dict_handler total_size.<locals>.dict_handler  s    ""1779--r#   r   c           
       > [        U 5      T;   a  gTR                  [        U 5      5        [        U T5      nTR                  5        H6  u  p#[	        X5      (       d  M  U[        [        TU" U 5      5      5      -  n  U$    U$ )Nr   )idr2   r   r&  rA   summap)ostyphandlerall_handlersdefault_sizeseensizeofs       r!   r4  total_size.<locals>.sizeof  su    a5D=Aa&(..0LC!!!SVWQZ011	 1 r#   )r   rS   rP   r   r   r0   	frozensetr   )r-  r'  r1  r2  r3  r4  s     @@@@r!   
total_sizer7    sW    . 	tdtlT4L 5DQ<L
 
 !9r#   c                    U /n[        5       nSnU(       aR  UR                  S5      nXBL a  US-  nO.[        U[        5      (       a  U(       a  [	        U5      U/-   U-   nU(       a  MR  U$ )zgiven a cache key tuple, counts how many instances of actual
tuples are found.

used to alert large jumps in cache key complexity.

r   r   )objectr]   rA   r   rP   )tupstacksentinelnum_elementsr   s        r!   count_cache_key_tuplesr>    sk     EExHL
yy|ALe$$T
hZ/%7 % r#   c           	   #    #    [         R                   " 5       nS v   [         R                   " 5       U-
  nX0:  a'   U" 5         [        R                  " SUS SU  S35        g g ! [        R                  " SUS SU  S35        f = f7f)Nztest took too long (z.4fz seconds > ))timer	   	skip_test)secondscleanupnowsecs       r!   skip_if_timeoutrG    s      ))+C	
))+
C
}	I&s3i{7)1E	  &s3i{7)1Es   7BA!  B! BB)r   )function)Nr   N)rC  rB   rD  r   )C
__future__r   collectionsr   
contextlibrD   r   	itertoolsr   r9   r   r   rA  r   typingr   r   r	   r
   r   r  r   r   r   r   r   r   r   r   sqlsql.sqltypesr   utilr   r   r   r   r"   
gc_collectr&   r   r6   r<   rK   r0   rM   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"  r7  r>  contextmanagerrG  r%   r#   r!   <module>rS     s6   #    	   
          #  )    "   " )  32J J	F+ 2*$(2+ (" ("V.b"#"( D !4 5p#L,  r#   