
    ؄_ N                     J   d dl mZ d dlZd dlZd dlZd dlZddlmZ ddlmZ ddlm	Z	 ddlm
Z ddlmZ dd	l
mZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlm
Z
 d
dlmZ d
dlmZ d
dl
mZ d
dl
mZ d Zej        d             Zd Zd Zd Zd Z ej        	 d8d            Z!d Z"d a#d Z$d9dZ%d9dZ&d9d Z'd9d!Z(d9d"Z)d9d#Z*d9d$Z+d9d%Z,d9d&Z-e-Z.d9d'Z/d9d(Z0e0Z1d9d)Z2d9d*Z3d+ Z4d, Z5d- Z6d. Z7d/ Z8d0 Z9	 d:d1Z: G d2 d3e;          Z< G d4 d5e;          Z= G d6 d7e;          Z>dS );    )absolute_importN   )	assertsql)config)mock)util)db_spec)fail   )exc)pool)schema)types)default)url)compat	decoratorc                  2    t          t          j        | fi |S )a  Context manager which expects one or more warnings.

    With no arguments, squelches all SAWarnings emitted via
    sqlalchemy.util.warn and sqlalchemy.util.warn_limited.   Otherwise
    pass string expressions that will match selected warnings via regex;
    all non-matching warnings are sent through.

    The expect version **asserts** that the warnings were in fact seen.

    Note that the test suite sets SAWarning warnings to raise exceptions.

    )_expect_warningssa_exc	SAWarningmessageskws     b/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/testing/assertions.pyexpect_warningsr       s     F,h=="===    c              /      K   t          |           }t          | t          j                  r |t          j                  sdV  dS t          |i |5  dV  ddd           dS # 1 swxY w Y   dS )zContext manager which expects one or more warnings on specific
    dialects.

    The expect version **asserts** that the warnings were in fact seen.

    N)r	   
isinstancer   string_typesr   _currentr   )dbr   r   specs       r   expect_warnings_onr%   0   s       2;;D"d'(( fo1F1F h-"-- 	 	EEE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A%%A),A)c                  ,     t            fd            }|S )zDecorator form of expect_warnings().

    Note that emits_warning does **not** assert that the warnings
    were in fact seen.

    c                 `    t          ddi5   | |i |cd d d            S # 1 swxY w Y   d S Nassert_F)r   fnargsr   r   s      r   decoratezemits_warning.<locals>.decorateI   s    X6U66 	# 	#2t?r??	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#   #''r   r   r-   s   ` r   emits_warningr0   A   s/     # # # # Y# Or   c                  2    t          t          j        | fi |S N)r   r   SADeprecationWarningr   s     r   expect_deprecatedr4   Q   s    F7HHRHHHr   c                 0     t            fd            }|S )aV  Mark a test as emitting a warning on a specific dialect.

    With no arguments, squelches all SAWarning failures.  Or pass one or more
    strings; these will be matched to the root of the warning description by
    warnings.filterwarnings().

    Note that emits_warning_on does **not** assert that the warnings
    were in fact seen.

    c                 h    t          gR ddi5   | |i |cd d d            S # 1 swxY w Y   d S r(   )r%   )r+   r,   r   r#   r   s      r   r-   z"emits_warning_on.<locals>.decoratea   s    =H===E== 	# 	#2t?r??	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   '++r   )r#   r   r-   s   `` r   emits_warning_onr7   U   s5     # # # # # Y# Or   c                  ,     t            fd            }|S )a+  Mark a test as immune from fatal deprecation warnings.

    With no arguments, squelches all SADeprecationWarning failures.
    Or pass one or more strings; these will be matched to the root
    of the warning description by warnings.filterwarnings().

    As a special case, you may pass a function name prefixed with //
    and it will be re-written as needed to match the standard warning
    verbiage emitted by the sqlalchemy.util.deprecated decorator.

    Note that uses_deprecated does **not** assert that the warnings
    were in fact seen.

    c                 `    t          ddi5   | |i |cd d d            S # 1 swxY w Y   d S r(   )r4   r*   s      r   r-   z!uses_deprecated.<locals>.decoratey   s    8%88 	# 	#2t?r??	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#r.   r   r/   s   ` r   uses_deprecatedr:   i   s/      # # # # Y# Or   TFc              #   d   K   rd |D             n|t                    t          j         fd}t          j        d|          5  d V  d d d            n# 1 swxY w Y   |r<|rt
          j        s2r.J dd                    fdD                       z              d S d S d S )Nc                 f    g | ].}t          j        |t           j        t           j        z            /S  )recompileIS).0msgs     r   
<listcomp>z$_expect_warnings.<locals>.<listcomp>   s,    DDDC2:c24"$;//DDDr   c                 :   t          |           r| }t          |          } n|r	|d         }nd }|rt          |          s | g|R i |S sd S D ]9}r|                    |           ss|| k    r	                    |            d S : | g|R i | d S )Nr   )r    str
issubclassmatchdiscard)
rC   argr   	exceptionfilter_exc_clsfilters	real_warnregexseens
        r   our_warnz"_expect_warnings.<locals>.our_warn   s    c7## 	Ii..CC 	AIII 	.
9g > > 	.9S-3---"--- 	F 	' 	'G '--,, %nnW%%%Ic&C&&&2&&&&&r   zwarnings.warnzWarnings were not seen: %sz, c              3   4   K   | ]}d r|j         n|z  V  dS )z%rN)pattern)rB   srP   s     r   	<genexpr>z#_expect_warnings.<locals>.<genexpr>   sL       B
 B
34D-AIIA.B
 B
 B
 B
 B
 B
r   )setwarningswarnr   patchr   py3kjoin)	rM   r   rP   r)   py2konlyrR   rN   rO   rQ   s	   ` `   @@@r   r   r      sy     
  DD8DDDw<<DI' ' ' ' ' ' ' ' '. 
OX	.	.                  
 
 
 	
 	
5		 B
 B
 B
 B
8<B
 B
 B
 9
 9
 
 	
 	
 	

 
	
 	

 
s   A##A'*A'c                  "    t                       dS )zCheck things that have to be finalized at the end of a test suite.

    Hardcoded at the moment, a modular system can be built here
    to support things like PG prepared transactions, tables all
    dropped, etc.

    N)!_assert_no_stray_pool_connectionsr=   r   r   global_cleanup_assertionsr`      s     &'''''r   c                     t          j                     t          j        rFt          dz  at          dt          t          j                  z             t          j                     t          j        rRt          t          j                  } t          j                                         dat          j
        d| z             d S t          dk    r
J d            d S )Nr   z2Encountered a stray connection in test cleanup: %sr   z8Stray connection refused to leave after gc.collect(): %s
   Fz*Encountered more than 10 stray connections)testutillazy_gcr   _refs_STRAY_CONNECTION_FAILURESprintrF   
gc_collectclearrX   rY   )errs    r   r_   r_      s    
  z  	#a'"@$*oo	
 	
 	
 	
 z '$*oo
 	
%&"ICO	
 	
 	
 	
 	
 
$b	(	(BBBBB 
)	(r   c                 R    t          j        ||           sJ |p| d|            d S )N !~ )r>   rH   abrC   s      r   eq_regexrp      s6    8Aq>>553511"555555r   c                 4    | |k    sJ |p| d|            dS )z.Assert a == b, with repr messaging on failure. != Nr=   rm   s      r   eq_rs      )    6663-11-66666r   c                 4    | |k    sJ |p| d|            dS )z.Assert a != b, with repr messaging on failure.z == Nr=   rm   s      r   ne_rv      rt   r   c                 4    | |k    sJ |p| d|            dS )z.Assert a <= b, with repr messaging on failure.rr   Nr=   rm   s      r   le_rx      rt   r   c                 H    t          | |          sJ |p| d|            d S )Nz is not an instance of r    rm   s      r   is_instance_ofr{      s6    aJJSJQQQ$JJJJJJr   c                 *    t          | d|           d S )NTrC   is_rn   rC   s     r   is_truer      s    4Sr   c                 *    t          | d|           d S )NFr}   r~   r   s     r   is_falser     s    5cr   c                 0    | |u sJ |p| d|            dS )z.Assert a is b, with repr messaging on failure.z is not Nr=   rm   s      r   r   r     )    66631AAAqq166666r   c                 0    | |usJ |p| d|            dS )z2Assert a is not b, with repr messaging on failure.z is Nr=   rm   s      r   is_notr     s)    A:::s1AAAqq1:::::r   c                 0    | |v sJ |p| d|            dS )z.Assert a in b, with repr messaging on failure.z not in Nr=   rm   s      r   in_r     r   r   c                 0    | |vsJ |p| d|            dS )z2Assert a in not b, with repr messaging on failure.z is in Nr=   rm   s      r   not_inr     s)    A:::s4qqq!!4:::::r   c                 R    |                      |          sJ |p| d|            dS )z>Assert a.startswith(fragment), with repr messaging on failure.z does not start with N)
startswith)rn   fragmentrC   s      r   startswith_r   "  sL    <<!!  3 $	+     r   c                     t          j        dd|           } t          j        dd|           } t          j        dd|          }t          j        dd|          }| |k    sJ |p| d|            d S )Nz^\s+?|\n z {2,} rr   )r>   subrm   s      r   eq_ignore_whitespacer   *  su    
{B""A
xa  A
{B""A
xa  A6663-11-66666r   c                 |    t           j        sdS | j        | j        ur| j        sJ d| d| j        d            dS dS )aH  assert that any exception we're catching does not have a __context__
    without a __cause__, and that __suppress_context__ is never set.

    Python 3 will report nested as exceptions as "during the handling of
    error X, error Y occurred". That's not what we want to do.  we want
    these exceptions in a cause chain.

    NFz
Exception z> was correctly raised but did not set a cause, within context z as its cause.)r   r[   __context__	__cause____suppress_context__)rK   s    r    _assert_proper_exception_contextr   3  sq     9  	Y%888. 	9	
 	
 yy)///1	
 	
 	
 	9888r   c                 .    t          | |||d           d S NT)check_context_assert_raises
except_cls	callable_r,   r   s       r   assert_raisesr   K  s!    :y$$GGGGGGr   c                 *    t          | |||           d S r2   r   r   s       r   assert_raises_context_okr   O  s*    
	    r   c                 *    t          | |||d          S r   r   r   s       r   assert_raises_returnr   X  s    *irNNNNr   c                 0    t          | ||||d           d S )NT)rC   r   r   r   rC   r   r,   kwargss        r   assert_raises_messager   \  s0    ItVD     r   c                 .    t          | ||||           d S )Nr}   r   r   s        r    assert_raises_message_context_okr   b  s#     :y$C@@@@@@r   c                    d }|rt          j                    d         }	  ||i | d}n# | $ r}	|	}d}|At          j        |t	          j        |	          t          j                  sJ |d|	            |r|st          |	           t          t	          j        |	          	                    d                     Y d }	~	nd }	~	ww xY w|s
J d            |S )Nr   FTrl   utf-8z#Callable did not raise an exception)
sysexc_infor>   searchr   	text_typeUNICODEr   rg   encode)
r   r   r,   r   rC   r   ret_errare_we_already_in_a_tracebacksuccessrj   s
             r   r   r   h  s0    G :(+q(9%3	4"6""" 3 3 3?9T^C(("*        	2!> 	2,S111dnS!!((11222222223 999999Ns   
* CBCCc                   (    e Zd Z	 	 	 	 	 	 	 	 	 ddZdS )AssertsCompiledSQLNFc           	         |rt          j                    }n|	rd }n|t          | dd           }|t          j        j        }n||dk    rt          j                    }nb|dk    rt          j                    }nHt          |t          j	                  r. t          j        |                                                      }i }i }|r||d<   |t          |          |d<   |
rd|d<   dd	lm} t          ||j                  r(|                                }d|j        _        |j        }nt          ||j        j                  ret,          j                            |d
          5 }|                                 |j        d         d         d         }d d d            n# 1 swxY w Y   |r||d<    |j        dd|i|}t9          t          |di                     }t          j        rd|                    d                              dd          }tA          dt          j!        |          z   |z                       d                     n:tA          dt          j!        |                              d          z   |z              tE          j#        ddt          j!        |                    }tI          |||d|d|           |#tI          |%                    |          |           |C|%                    |          tI          tM          fd|j'        D                       |           |tI          |j(        |           d S d S )N__dialect__r   default_enhancedschema_translate_mapcolumn_keysTliteral_bindsr   )orm_execute_stmtr   compile_kwargsdialectparamsr   asciiignorez
SQL String:
z[\n\t]r   rr   z on dialect c                      g | ]
}|         S r=   r=   )rB   xps     r   rD   z5AssertsCompiledSQL.assert_compile.<locals>.<listcomp>  s    333qt333r   r=   ))r   DefaultDialectgetattrr   r#   r   StrCompileDialectr    r   r!   r   URLget_dialectlist
sqlalchemyr   Query_compile_context	statement
use_labelspersistenceBulkUDr   rZ   objectexec_
mock_callsr?   reprr[   r   decoderg   r   r>   r   rs   construct_paramstuplepositiontupprefetch)selfclauseresultr   checkparamsr   checkpositionalcheck_prefetchuse_default_dialectallow_dialect_selectr   r   r   r   r   context	stmt_mockc	param_strccr   s                       @r   assert_compilez!AssertsCompiledSQL.assert_compile  s     	;,..GG! 	;GG!$t<< )+I%%!022...!355GT%677 ;8#''**6688:: 	>)=B%& $VB} 	3.2N?+""""""fci(( 	7--//G+/G(&FF 677 	7""6?;; 7y"-a03A67 7 7 7 7 7 7 7 7 7 7 7 7 7 7  	2#1B FN1171b11Hb1122	9 	!((1188(KKI"T^A%6%66BJJ     !.##**7334   VIr4>!#4#455BBBBHIII"""6**K888&""6**A3333Q]33344oFFF%
N+++++ &%s   #.FF!$F!)	NNNNNFFFN)__name__
__module____qualname__r   r=   r   r   r   r     sK        
 !"!U, U, U, U, U, U,r   r   c                       e Zd ZddZd ZdS )ComparesTablesFc                    t          |j                  t          |j                  k    sJ t          |j        |j                  D ]^\  }}t          |j        |j                   ||j        |j                 u sJ t          |j        |j                   t          |j        |j                   |rCd}t          |j        t          |j                            sJ ||j        |j        fz              n| 	                    ||           t          |j        t          j                  r$t          |j        j        |j        j                   t          d |j        D             d |j        D                        |j        r!t          |j        t          j                  sJ `t          |j                  t          |j                  k    sJ |j        D ]}|j        j        |j                 J d S )Nz)Type '%s' doesn't correspond to type '%s'c                 &    h | ]}|j         j        S r=   columnnamerB   fs     r   	<setcomp>z5ComparesTables.assert_tables_equal.<locals>.<setcomp>  s    7771777r   c                 &    h | ]}|j         j        S r=   r   r   s     r   r   z5ComparesTables.assert_tables_equal.<locals>.<setcomp>  s    AAA1AAAr   )lenr   ziprs   r   primary_keynullabler    typeassert_types_basesqltypesStringlengthforeign_keysserver_defaultr   FetchedValuecolumns)r   tablereflected_tablestrict_typesr   reflected_crC   s          r   assert_tables_equalz"ComparesTables.assert_tables_equal  s   57||s?#4555555!%'?+<== 	 	NA{()))/"3AF";;;;;{6777
K0111 7A!+"2DLLAA  3$FJ D    
 &&{A666!&(/22 <AFM;#3#:;;;77777AA(@AAA    !.0C     5$%%_-H)I)IIIII" 	K 	KA".6qv>JJJJ	K 	Kr   c                     |j                             |j                   s#J d|j        d|j         d|j         d            d S )Nz
On column z, type 'z' doesn't correspond to type '')r   _compare_type_affinityr   )r   c1c2s      r   r  z ComparesTables.assert_types_base   sf    w--G
 
 	
 	
 	
 GGGGGGGGG
	
 	
 	
 	
 	
r   N)F)r   r   r   r  r  r=   r   r   r   r     s<        K K K KB
 
 
 
 
r   r   c                   l    e Zd Zd Zd Zd Zd ZddZd Zd Z	d	 Z
d
 Zej        d             Zd ZdS )AssertsExecutionResultsc                     t          |          }t          t          |                     |                     |||           d S r2   )r   rg   r   assert_list)r   r   class_objectss       r   assert_resultz%AssertsExecutionResults.assert_result  s?    fd6ll11111r   c                    |                      t          |          t          |          k    d|j        z              t          dt          |                    D ]%}|                     |||         ||                    &d S )Nz9result list is not the same size as test list, for class r   )r)   r   r   range
assert_row)r   r   r  list_is        r   r  z#AssertsExecutionResults.assert_list  s    KK3u::%o	
 	
 	
 q#e**%% 	9 	9AOOFF1IuQx8888	9 	9r   c                 :   |                      |j        |u dt          |          z              |                                D ]\  }}t	          |t
                    rt	          |d         t                    r2|                     t          ||          |d         |d                    g| 	                    |d         t          ||          |d                    |                      t          ||          |k    d|dt          ||          d|           d S )Nzitem class is not r   r   z
attribute z value z does not match )
r)   	__class__r   itemsr    r   r   r  r   r  )r   r  rowobjdesckeyvalues         r   r  z"AssertsExecutionResults.assert_row  s+   &(<tF||(K	
 	
 	
 **,, 	 	JC%'' 
eAh-- N$$WVS%9%958U1XNNNNOOE!Hgfc.B.BE!HMMMMFC((E11ssGFC0000%%9   	 	r   c           	      z   	
  G d dt                     
t          j        |          }
fd|D             }t          j        fd|          D ]/}t	          dt          |          j        dj        d           0t          |          t          |          k    r0t	          dt          |          dt          |          d           t                      		 fd	}|D ]R}|D ]%} |||          r|	                    |            n)&t	          d
j        dt          |          d           SdS )zAs assert_result, but the order of objects is not considered.

        The algorithm is very expensive but not a big deal for the small
        numbers of rows that the test suite manipulates.
        c                       e Zd Zd ZdS )FAssertsExecutionResults.assert_unordered_result.<locals>.immutabledictc                      t          |           S r2   )id)r   s    r   __hash__zOAssertsExecutionResults.assert_unordered_result.<locals>.immutabledict.__hash__3  s    $xxr   N)r   r   r   r+  r=   r   r   immutabledictr(  2  s#                 r   r,  c                 &    h | ]} |          S r=   r=   )rB   er,  s     r   r   zBAssertsExecutionResults.assert_unordered_result.<locals>.<setcomp>7  s#    777MM!$$777r   c                 $    t          |           S r2   rz   )oclss    r   <lambda>zAAssertsExecutionResults.assert_unordered_result.<locals>.<lambda>:  s    jC(( r   zUnexpected type "z", expected ""zUnexpected object count "c                    |                                 D ]o\  }}t          |t                    r=	  j        t	          | |          |d         g|d         R   E# t
          $ r Y  dS w xY wt	          | |          |k    r dS pdS )Nr   r   FT)r!  r    r   assert_unordered_resultr   AssertionError)objr$   r$  r%  NOVALUEr   s       r   _compare_itemzFAssertsExecutionResults.assert_unordered_result.<locals>._compare_itemI  s    "jjll 
% 
%
UeU++ 	%%44#C--uQx:?(     * % % %$uuu% sC11U::$uu ;4s   )A
A*)A*z	Expected z instance with attributes z not found.T)dictr   IdentitySetitertools_filterfalser
   r   r   r   r   remover   )r   r   r1  expectedfoundwrongr9  expected_item
found_itemr8  r,  s   ` `      @@r   r5  z/AssertsExecutionResults.assert_unordered_result+  s   	  	  	  	  	 D 	  	  	   ((7777h777/((((%
 
 	 	E D;;'''7   
 u::X&&Du::::s8}}}}.  
 ((	 	 	 	 	 	 & 		 		M#  
 =];; LL,,,E |||T-%8%8%8%8:   tr   Nc                 :    |ddl m} t          j        |          S )Nr   )r#   )r   r#   r   assert_engine)r   r#   s     r   sql_execution_asserterz.AssertsExecutionResults.sql_execution_asserterc  s*    :""""""&r***r   c                     |                      |          5 } |            }d d d            n# 1 swxY w Y    |j        |  |S r2   rE  r)   )r   r#   r   rulesasserterr   s         r   assert_sql_executionz,AssertsExecutionResults.assert_sql_executioni  s    ((,, 	!Y[[F	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!%  s   -11c                     g }|D ]e}t          |t                    r+t          j        d |                                D              }nt          j        | }|                    |           f | j        ||g|R  S )Nc                 >    g | ]\  }}t          j        ||          S r=   )r   CompiledSQL)rB   kvs      r   rD   z6AssertsExecutionResults.assert_sql.<locals>.<listcomp>u  s)    KKKdai+Aq11KKKr   )r    r:  r   AllOfr!  rM  appendrJ  )r   r#   r   rH  newrulesrulenewrules          r   
assert_sqlz"AssertsExecutionResults.assert_sqlo  s     	% 	%D$%% 7#/KKdjjllKKK $/6OOG$$$$(t(YBBBBBr   c                 X    |                      ||t          j        |                     d S r2   )rJ  r   CountStatements)r   r#   r   counts       r   assert_sql_countz(AssertsExecutionResults.assert_sql_count}  s6    !!	94U;;	
 	
 	
 	
 	
r   c                       fdt          ||          D             }g }|D ]-\  }}}|                    |                                           .	  |            t          ||          D ]G\  }	\  }}}|                    d d d            |	                    t          j        |                     HS # t          ||          D ]G\  }	\  }}}|                    d d d            |	                    t          j        |                     Hw xY w)Nc                 F    g | ]\  }}                     |          ||fS r=   )rE  )rB   r#   rX  r   s      r   rD   zEAssertsExecutionResults.assert_multiple_sql_count.<locals>.<listcomp>  sB     
 
 
U ((,,b%8
 
 
r   )r   rQ  	__enter____exit__r)   r   rW  )
r   dbsr   countsrecs	assertersctxr#   rX  rI  s
   `         r   assert_multiple_sql_countz1AssertsExecutionResults.assert_multiple_sql_count  sL   
 
 
 
"3//
 
 
 	" 	. 	.NCUS]]__----	C9;;.1)T.B.B C C**3ET4...  !:5!A!ABBBBCc)T.B.B C C**3ET4...  !:5!A!ABBBBCs   	B3 3ADc              '      K   |                      |          5 }d V  d d d            n# 1 swxY w Y    |j        |  d S r2   rG  )r   r#   rH  rI  s       r   assert_executionz(AssertsExecutionResults.assert_execution  s      ((,, 	EEE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	%    s   )--c                 R    |                      |t          j        |                    S r2   )re  r   rW  )r   r#   rX  s      r   assert_statement_countz.AssertsExecutionResults.assert_statement_count  s#    $$R)B5)I)IJJJr   r2   )r   r   r   r  r  r  r5  rE  rJ  rU  rY  rc  
contextlibcontextmanagerre  rg  r=   r   r   r  r  
  s        2 2 2
9 9 9  "6 6 6p+ + + +  C C C
 
 

C C C ! ! !
K K K K Kr   r  )TTFr2   )NF)?
__future__r   rh  r>   r   rX   r   r   r   r   r   rc   
exclusionsr	   r
   r   r   r   r   r   r  enginer   r   r   r   r   ri  r%   r0   r4   r7   r:   r   r`   rf   r_   rp   rs   rv   rx   r{   r   r   r   r   is_not_r   r   not_in_r   r   r   r   r   r   r   r   r   r   r   r   r  r=   r   r   <module>ro     sD   ' & & & & &     				 



                                                                                                 > > >        I I I  (  0 :?*
 *
 *
 *
Z( ( (  '' '' ''T6 6 6 6. . . .
. . . .
. . . .
K K K K      2 2 2 2
2 2 2 2 2 2 2 2
5 5 5 5    . . . .
 
 
0H H H  O O O  A A A BG   :V, V, V, V, V, V, V, V,r)
 )
 )
 )
 )
V )
 )
 )
XNK NK NK NK NKf NK NK NK NK NKr   