
    +ht:              	          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  G d	 d
e      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d d e      Z G d! d" e j6                  d"g d#            Z G d$ d%e      Zej<                  d&        Zy)'    N   )event)util)url)DefaultDialect)_distill_cursor_params)_DDLCompilesc                   $    e Zd ZdZdZdZd Zd Zy)
AssertRuleFNTc                      y N selfexecute_observeds     O/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.pyprocess_statementzAssertRule.process_statement   s        c                     J d       )Nz?All statements are complete, but pending assertion rules remainr   r   s    r   no_more_statementszAssertRule.no_more_statements   s    	
%	
ur   )__name__
__module____qualname__is_consumederrormessageconsume_statementr   r   r   r   r   r   r      s    KL
r   r   c                       e Zd Zy)SQLMatchRuleNr   r   r   r   r   r   r   r   $   s    r   r   c                       e Zd ZddZd Zy)	CursorSQLNc                 .    || _         || _        || _        y r   )	statementparamsr   )r   r$   r%   r   s       r   __init__zCursorSQL.__init__)   s    "!2r   c                    |j                   d   }| j                  |j                  k7  s%| j                  U| j                  |j                  k7  r<d| j                  d| j                  d|j                  d|j                  | _        y |j                   j                  d       d| _        |j                   sd| _        y y )Nr   zTesting for exact SQL z parameters z
 received  T)
statementsr$   r%   
parametersr   popr   r   )r   r   stmts      r   r   zCursorSQL.process_statement.   s    **1->>T^^+KK#t(F
 NNKKNNOO  ''++A.#D#..)-& /r   )NTr   r   r   r&   r   r   r   r   r"   r"   (   s    3
.r   r"   c                   8    e Zd Zd	dZd Zd Zd Zd Zd Zd Z	y)
CompiledSQLNc                 .    || _         || _        || _        y r   )r$   r%   dialect)r   r$   r%   r1   s       r   r&   zCompiledSQL.__init__D   s    "r   c                 N    t        j                  dd| j                        }||k(  S N[\n\t] )resubr$   )r   r   received_statementr,   s       r   _compare_sqlzCompiledSQL._compare_sqlI   s#    vviT^^4!T))r   c                     | j                   dk(  rt               }d|_        |S | j                   dk(  rddi}ni }t        j                  j                  | j                         j                         di |S )NdefaultT
postgresqlimplicit_returningr   )r1   r   supports_default_metavaluer   URLcreateget_dialect)r   r   r1   r%   s       r   _compile_dialectzCompiledSQL._compile_dialectM   sj    <<9$$&G 26G.N |||+.577>>$,,/;;=GGGr   c                 t   |j                   }| j                  |      }d}d}d|j                  v r|j                  d   }nd}t        |j                  t
              r|j                  j                  ||      }nH|j                  j                  |||j                  j                  |j                  j                  |      }t        j                  ddt        j                  |            }|j                  }	|	s|j                  |      g}
||
fS |	D cg c]  }|j                  ||       }
}||
fS c c}w )zxreconstruct the statement and params in terms
        of a target dialect, which for CompiledSQL is just DefaultDialect.Nschema_translate_map)r1   rD   )	cache_keyr1   column_keysfor_executemanyrD   r4   r5   )extracted_parameters)contextrB   execution_options
isinstanceclauseelementr	   compilecompiledrF   rG   r6   r7   r   	text_typer*   construct_params)r   r   rI   compare_dialectrE   rH   map_rN   _received_statementr*   _received_parametersms               r   rS   zCompiledSQL._received_statement\   sn    #**//0@A 	 	 "W%>%>>,,-CDDD&44lC'55=='%) > H
 (55==#'#,,88 ' 0 0 @ @%) > H !ffYDNN84LM%00
)))= * $  #$888 $	$  )),@ * $  $ #$888$s   D5c                    |j                   }| j                  |      \  }}| j                  |      }| j                  ||      }|r||zt	        |      }t	        |      }|r\|rZt        |j                  d            }	t        t	        |            D ]!  \  }
}|	D ]  }||vs||   |	|   k7  s  ||
=  n d}n|r|rZ|s|rd}|rd| _        d | _	        y | j                  |      ||dz  | _	        y )Nr   FT)r8   received_parameters)rI   rS   _all_paramsr9   listdictr+   	enumerater   r   _failure_message)r   r   rI   rS   rT   r%   
equivalent
all_paramsall_receivedparamidxreceived	param_keys                r   r   zCompiledSQL.process_statement   s.   "**484L4L5
11 !!'*&&'79LM
!!&\
#$89 \ !23E)243E)F X). "I !* 9#+I#6%	:J#J %" !-S 1!$ &+
- !\. !&J#D $D $ 5 5f =&9';A !Dr   c                     | j                   rHt        | j                         r| j                  |      }n| j                   }t        |t              s|g}|S y r   )r%   callablerK   rY   )r   rI   r%   s      r   rX   zCompiledSQL._all_params   sE    ;;$W-fd+ Mr   c                 z    d| j                   j                  dd      dt        |      j                  dd      dS )NzTesting for compiled statement
%%% partial params zE, received
%(received_statement)r with params %(received_parameters)r)r$   replacereprr   expected_paramss     r   r\   zCompiledSQL._failure_message   s7     &&sD1_%--c48	
r   Nr;   )
r   r   r   r&   r9   rB   rS   r   rX   r\   r   r   r   r/   r/   C   s(    
*H49l/b
	
r   r/   c                        e Zd ZddZd Zd Zy)RegexSQLNc                     t         j                  |        t        j                  |      | _        || _        || _        || _        y r   )r   r&   r6   rM   regex
orig_regexr%   r1   )r   rr   r%   r1   s       r   r&   zRegexSQL.__init__   s5    d#ZZ&
r   c                 z    d| j                   j                  dd      dt        |      j                  dd      dS )Nz Testing for compiled statement ~rg   rh   ri   zE, received %(received_statement)r with params %(received_parameters)r)rs   rj   rk   rl   s     r   r\   zRegexSQL._failure_message   s7     ''T2_%--c48	
r   c                 J    t        | j                  j                  |            S r   )boolrr   match)r   r   r8   s      r   r9   zRegexSQL._compare_sql   s    DJJ$$%7899r   rn   )r   r   r   r&   r\   r9   r   r   r   rp   rp      s    	
:r   rp   c                   0     e Zd Zd Zd Z fdZd Z xZS )
DialectSQLc                 .    |j                   j                  S r   )rI   r1   r   s     r   rB   zDialectSQL._compile_dialect   s    ''///r   c                 :    t        j                  dd|      }||k(  S r3   )r6   r7   )r   	real_stmtreceived_stmtr,   s       r   _compare_no_spacezDialectSQL._compare_no_space   s    vviY/$$r   c                     t         t        |   |      \  }}|j                  D ]   }| j	                  |j
                  |      s  n t        d|z        ||j                  j                  fS )NzICan't locate compiled statement %r in list of statements actually invoked)	superry   rS   r)   r~   r$   AssertionErrorrI   compiled_parameters)r   r   r}   received_paramsr|   	__class__s        r   rS   zDialectSQL._received_statement   s    ).*.
/ 	'
 *44 	I%%i&9&9=I	 !.0=> 
 .66JJJJr   c                 0   t        j                  dd| j                        }|j                  j                  j
                  }|dk(  rt        j                  dd|      }||k(  S d }|dk(  rd}n|dk(  rd	}n|d
k(  rd }t        j                  d||      }||k(  S )Nr4   r5   pyformatz	:([\w_]+)z%(\1)sqmark?formatz%snumeric)r6   r7   r$   rI   r1   
paramstyle)r   r   r8   r,   r   repls         r   r9   zDialectSQL._compare_sql  s    vviT^^4 &--55@@
#66,	48D "T)) DW$x'y(66,d3D!T))r   )r   r   r   rB   r~   rS   r9   __classcell__r   s   @r   ry   ry      s    0%K"*r   ry   c                       e Zd Zd Zd Zd Zy)CountStatementsc                      || _         d| _        y Nr   count_statement_count)r   r   s     r   r&   zCountStatements.__init__!  s    
 !r   c                 .    | xj                   dz  c_         y )N   )r   r   s     r   r   z!CountStatements.process_statement%  s    "r   c                 v    | j                   | j                  k7  r J d| j                   | j                  fz         y )Nz,desired statement count %d does not match %dr   r   s    r   r   z"CountStatements.no_more_statements(  sC    ::...H

%%L  5 /r   N)r   r   r   r&   r   r   r   r   r   r   r      s    "#r   r   c                       e Zd Zd Zd Zy)AllOfc                 $    t        |      | _        y r   )setrulesr   r   s     r   r&   zAllOf.__init__1  s    Z
r   c                 X   t        | j                        D ]k  }d |_        |j                  |       |j                  r0| j                  j                  |       | j                  sd| _         y |j                  rdd | _         y  t        | j                        d   j                  | _        y NTr   )rY   r   r   r   r   discardr   r   rules      r   r   zAllOf.process_statement4  s    $ 	AD $D""#34

""4(zz'+D$&&$(!	A !%TZZ 0 3 @ @Dr   Nr-   r   r   r   r   r   0  s     Ar   r   c                   *     e Zd Zd Zd Z fdZ xZS )EachOfc                 $    t        |      | _        y r   )rY   r   r   s     r   r&   zEachOf.__init__F  s    %[
r   c                 B   | j                   r| j                   d   }|j                  |       |j                  r| j                   j                  d       n|j                  r|j                  | _        |j
                  rn| j                   r| j                   sd| _        y y )Nr   T)r   r   r   r+   r   r   r   s      r   r   zEachOf.process_statementI  s    jj::a=D""#34

q!""$($5$5!%% jj zz#D r   c                     | j                   r7| j                   d   j                  s| j                   d   j                          y | j                   rt        t        |           y y r   )r   r   r   r   r   )r   r   s    r   r   zEachOf.no_more_statementsW  sG    ::djjm77JJqM,,.ZZ&$24 r   )r   r   r   r&   r   r   r   r   s   @r   r   r   E  s    !$5 5r   r   c                        e Zd Z fdZ xZS )Conditionalc                 L    |rt        t        | 
  |  y t        t        | 
  |  y r   )r   r   r&   )r   	conditionr   
else_rulesr   s       r   r&   zConditional.__init___  s$    +t-u5+t-z:r   )r   r   r   r&   r   r   s   @r   r   r   ^  s    ; ;r   r   c                       e Zd Zd Zy)Orc                     | j                   D ](  }|j                  |       |j                  s!d| _         y  t        | j                         d   j                  | _        y r   )r   r   r   rY   r   r   s      r   r   zOr.process_statementg  sX    JJ 	AD""#34#' 		A !%TZZ 0 3 @ @Dr   N)r   r   r   r   r   r   r   r   r   f  s    Ar   r   c                       e Zd Zd Zd Zy)SQLExecuteObservedc                 x    || _         || _        t        |j                  t	        |      |      | _        g | _        y r   )rI   rL   r   
connectiontupler*   r)   )r   rI   rL   multiparamsr%   s        r   r&   zSQLExecuteObserved.__init__r  s8    *0k 2F
 r   c                 ,    t        | j                        S r   )strr)   r   s    r   __repr__zSQLExecuteObserved.__repr__z  s    4??##r   N)r   r   r   r&   r   r   r   r   r   r   q  s    $r   r   c                       e Zd Zy)SQLCursorExecuteObservedNr    r   r   r   r   r   ~  s     	r   r   )r$   r*   rI   executemanyc                       e Zd Zd Zd Zd Zy)SQLAsserterc                     g | _         y r   )accumulatedr   s    r   r&   zSQLAsserter.__init__  s
    r   c                 *    | j                   | _        | ` y r   )r   _finalr   s    r   _closezSQLAsserter._close  s    &&r   c                 2   t        | }t        | j                        }|rO|j                  d      }|j	                  |       |j
                  rn |j                  rJ |j                         |rO|r
J d|z         |j
                  s|j                          y y )Nr   z$Additional SQL statements remain:
%s)r   rY   r   r+   r   r   r   r   )r   r   r   observedr$   s        r   assert_zSQLAsserter.assert_  s    u~$ QI""9-""/d///u  LAHLL5!!##% "r   N)r   r   r   r&   r   r   r   r   r   r   r     s    &r   r   c              #     K   t               g t        j                  | d      fd       }t        j                  | d      fd       }	  t        j                  | d|       t        j                  | d|       j	                          y # t        j                  | d|       t        j                  | d|       j	                          w xY ww)Nbefore_executec                     |||fd d  y r   r   )connrL   r   r%   rJ   origs        r   connection_executez)assert_engine.<locals>.connection_execute  s      f4Qr   after_cursor_executec                 ,   |sy j                   r+j                   d   j                  |u rj                   d   }n2t        |d   d   d         }j                   j                  |       |j                  j                  t        ||||             y )Nr   r   r   )r   rI   r   appendr)   r   )	r   cursorr$   r*   rI   r   obsasserterr   s	          r   cursor_executez%assert_engine.<locals>.cursor_execute  s        $$R(00G;&&r*C$Wd1gtAwQHC  '',$:w	
r   )r   r   listens_forremover   )enginer   r   r   r   s      @@r   assert_enginer     s     }HD
v/05 15 v56
 7
*V3^DV-/AB 	V3^DV-/ABs   A
CB ?CA CC) collections
contextlibr6   r5   r   r   r   r   engine.defaultr   engine.utilr   schemar	   objectr   r   r"   r/   rp   ry   r   r   r   r   r   r   
namedtupler   r   contextmanagerr   r   r   r   <module>r      s      	    + 0 !
 
 	: 	. .6U
, U
p:{ :.+* +*\j  AJ A*5Z 52;& ;A A
$ 
$	K"=	&& &2 ( (r   