
    Bh8                    t   S SK Jr  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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\RT                  r(S r)S r+S6S jr,S r- " S S \.5      r/S! r0S" r1S# r2S$ r3S% r4S& r5\#S' 5       r6S( r7S) r8S* r9S7S+ jr:S, r; " S- S.\<5      r=S/ r>   S8S1 jr?S2 r@S3 rAS4 rB\R                  S0S9S5 jj5       rDg):    )annotations)deque)
namedtupleN)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    Z/home/kali/devsecops-assessor/venv/lib/python3.13/site-packages/sqlalchemy/testing/util.pynon_refcount_gc_collectr#   .   s    





    c                     g r    r&   r$   r"   lazy_gcr'   7   s    r$   c               #     ^#    [        SSS/5      n [        S[        R                  S-   5       H   mU " [        R                  U4S j5      v   M"     g 7f)Npicklersloadsdumpsr	   c                2   > [         R                  " U T5      $ r   )pickler+   )dprotocols    r"   <lambda>picklers.<locals>.<lambda>?   s    a)Br$   )r   ranger.   HIGHEST_PROTOCOLr*   )ntr0   s    @r"   r)   r)   ;   sE     	J' 2	3B"f559:BCC ;s   AAc                *    [         R                  " XS9$ )N)k)randomchoices)
populationr7   s     r"   random_choicesr;   B   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_decimalrJ   F   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	)
	RandomSetP   c                    [        [        R                  U 5      5      n[        R                  " U5        [        U5      $ r   )listset__iter__r8   shuffleiter)selfls     r"   rQ   RandomSet.__iter__Q   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	   )r8   randintlenrO   rP   rQ   remove)rT   indexitems      r"   popRandomSet.popV   sC    q#d)a-0CLL&'.Dr$   c                >    [        [        R                  X5      5      $ r   )rL   rP   unionrT   others     r"   r`   RandomSet.union\   s    4/00r$   c                >    [        [        R                  X5      5      $ r   )rL   rP   
differencera   s     r"   re   RandomSet.difference_   s    455r$   c                >    [        [        R                  X5      5      $ r   )rL   rP   intersectionra   s     r"   rh   RandomSet.intersectionb   s    ))$677r$   c                    [        U 5      $ r   )rL   )rT   s    r"   copyRandomSet.copye   s    r$   r&   N)__name__
__module____qualname____firstlineno__rQ   r]   r`   re   rh   rk   __static_attributes__r&   r$   r"   rL   rL   P   s     
168r$   rL   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   rP   add	enumerate)tuplessorted_elementsdepsparentchildinodens           r"   conforms_partial_orderingr}   i   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   rO   rP   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   rP   rs   rS   )ru   r   rx   ry   r   r   s       @@r"   all_partial_orderingsr   w   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.0r7   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   "rz   a,)id_argnames)rP   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   rz   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   1  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_ddlF  sc     '-'88H}-D+##FII. !!&)),!!&)),s   B+A+  B+!BB)scope)r
   r   )r   r   ddls   ` r"   decorate"metadata_fixture.<locals>.decorateE  s    		- ~~C(11r$   r&   )r   r   s   ` r"   metadata_fixturer   B  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   V  s      P P Ir$   c                  (    \ rS rSrSrS rS r\rSrg)adictif  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__i  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__o  s!    404C3i40110s   r&   N)	rm   rn   ro   rp   __doc__r   r   get_allrq   r&   r$   r"   r   r   f  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>.gox  sv    66zB!!00$++#U ,  !!*- 
 j) s   A;;
B	)r   r  r@   r   begin)r   engine_or_connectionr   r
  r  s   `   @r"   r   r   u  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   )rP   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   )idrs   r   r'  r@   summap)ostyphandlerall_handlersdefault_sizeseensizeofs       r"   r5  total_size.<locals>.sizeof  su    a5D=Aa&(..0LC!!!SVWQZ011	 1 r$   )r   rS   rO   r   r   rP   	frozensetr   )r.  r(  r2  r3  r4  r5  s     @@@@r"   
total_sizer8    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]   r@   r   rO   )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_timeoutrH    s      ))+C	
))+
C
}	I&s3i{7)1E	  &s3i{7)1Es   7BA!  B! BB)r	   )function)Nr   N)rD  rA   rE  r   )E
__future__r   collectionsr   r   
contextlibrC   r   	itertoolsr   r.   r8   r   r   rB  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    r)   r;   rJ   rP   rL   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#  r8  r?  contextmanagerrH  r&   r$   r"   <module>rT     s<   #  "   	    
          #  )    "   " )  32J JD+ 2*$(2+ (" ("V.b"#"( D !4 5p#L,  r$   