o
    Rc=<                     @   s^  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
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"e d"g d#ZG d$d% d%eZejd&d' ZdS )(    N   )event)util)url)DefaultDialect)_distill_cursor_params)_DDLCompilesc                   @   s(   e Zd ZdZdZdZdd Zdd ZdS )
AssertRuleFNTc                 C   s   d S N selfexecute_observedr   r   >D:\Flask\env\Lib\site-packages\sqlalchemy/testing/assertsql.pyprocess_statement   s   zAssertRule.process_statementc                 C   s   J d)NFz?All statements are complete, but pending assertion rules remainr   r   r   r   r   no_more_statements   s   zAssertRule.no_more_statements)__name__
__module____qualname__is_consumederrormessageconsume_statementr   r   r   r   r   r   r	      s    r	   c                   @      e Zd ZdS )SQLMatchRuleNr   r   r   r   r   r   r   r   $   s    r   c                   @   s   e Zd ZdddZdd ZdS )	CursorSQLNTc                 C      || _ || _|| _d S r
   )	statementparamsr   )r   r   r   r   r   r   r   __init__)      
zCursorSQL.__init__c                 C   sp   |j d }| j|jks| jd ur%| j|jkr%d| j| j|j|jf | _d S |j d d| _|j s6d| _d S d S )Nr   z5Testing for exact SQL %s parameters %s received %s %sT)
statementsr   r   
parametersr   popr   r   )r   r   stmtr   r   r   r   .   s&   



zCursorSQL.process_statement)NTr   r   r   r    r   r   r   r   r   r   (   s    
r   c                   @   sF   e Zd ZdddZdd Zdd Zd	d
 Zdd Zdd Zdd Z	dS )CompiledSQLNdefaultc                 C   r   r
   )r   r   dialect)r   r   r   r)   r   r   r   r    D   r!   zCompiledSQL.__init__c                 C   s   t dd| j}||kS N[\n\t] )resubr   )r   r   received_statementr%   r   r   r   _compare_sqlI   s   zCompiledSQL._compare_sqlc                 C   sN   | j dkrt }d|_|S | j dkrddi}ni }tj| j  di |S )Nr(   T
postgresqlZimplicit_returningr   )r)   r   Zsupports_default_metavaluer   URLcreateget_dialect)r   r   r)   r   r   r   r   _compile_dialectM   s   


zCompiledSQL._compile_dialectc           	         s   |j }| |}d}dd|jv r|jd }nd}t|jtr(|jj||d n|jj|||jj|jj	|d t
ddt }|j}|sQ jdg}||fS  fdd	|D }||fS )
zxreconstruct the statement and params in terms
        of a target dialect, which for CompiledSQL is just DefaultDialect.Nschema_translate_map)r)   r6   )	cache_keyr)   column_keysfor_executemanyr6   r+   r,   extracted_parametersc                    s   g | ]	} j |d qS )r:   )construct_params).0mcompiledr;   r   r   
<listcomp>   s    z3CompiledSQL._received_statement.<locals>.<listcomp>)contextr5   execution_options
isinstanceclauseelementr   compiler@   r8   r9   r-   r.   r   	text_typer#   r<   )	r   r   rB   Zcompare_dialectr7   Zmap__received_statementr#   _received_parametersr   r?   r   rH   \   s@   

zCompiledSQL._received_statementc                 C   s   |j }| |\}}| |}| ||}|r^|d ur^t|}t|}|rX|rXt|d}	tt|D ]\}
}|	D ]}||vsH|| |	| krJ nq:||
=  nq4d}n|rX|s'|s\|r^d}|rhd| _d | _	d S | 
|||d | _	d S )Nr   FT)r/   Zreceived_parameters)rB   rH   _all_paramsr0   listdictr$   	enumerater   r   _failure_message)r   r   rB   rH   rI   r   Z
equivalent
all_paramsZall_receivedparamidxZreceivedZ	param_keyr   r   r   r      sF   
	
zCompiledSQL.process_statementc                 C   s:   | j rt| j r|  |}n| j }t|ts|g}|S d S r
   )r   callablerD   rK   )r   rB   r   r   r   r   rJ      s   

zCompiledSQL._all_paramsc                 C   "   d| j ddt|ddf S )NzzTesting for compiled statement
%r partial params %s, received
%%(received_statement)r with params %%(received_parameters)r%%%)r   replacereprr   Zexpected_paramsr   r   r   rN         zCompiledSQL._failure_messageNr(   )
r   r   r   r    r0   r5   rH   r   rJ   rN   r   r   r   r   r'   C   s    
61r'   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
RegexSQLNr(   c                 C   s,   t |  t|| _|| _|| _|| _d S r
   )r   r    r-   rF   regex
orig_regexr   r)   )r   r\   r   r)   r   r   r   r       s
   

zRegexSQL.__init__c                 C   rS   )Nz{Testing for compiled statement ~%r partial params %s, received %%(received_statement)r with params %%(received_parameters)rrT   rU   )r]   rV   rW   rX   r   r   r   rN      rY   zRegexSQL._failure_messagec                 C   s   t | j|S r
   )boolr\   match)r   r   r/   r   r   r   r0      s   zRegexSQL._compare_sqlrZ   )r   r   r   r    rN   r0   r   r   r   r   r[      s    
r[   c                       s4   e Zd Zdd Zdd Z fddZdd Z  ZS )	
DialectSQLc                 C   s   |j jS r
   )rB   r)   r   r   r   r   r5      s   zDialectSQL._compile_dialectc                 C   s   t dd|}||kS r*   )r-   r.   )r   	real_stmtreceived_stmtr%   r   r   r   _compare_no_space   s   zDialectSQL._compare_no_spacec                    sJ   t t| |\}}|jD ]}| |j|r nqtd| ||jjfS )NzICan't locate compiled statement %r in list of statements actually invoked)	superr`   rH   r"   rc   r   AssertionErrorrB   Zcompiled_parameters)r   r   rb   Zreceived_paramsra   	__class__r   r   rH      s   
zDialectSQL._received_statementc                 C   sz   t dd| j}|jjj}|dkrt dd|}||kS d }|dkr%d}n|dkr,d	}n|d
kr2d }t d||}||kS )Nr+   r,   Zpyformatz	:([\w_]+)z%(\1)sZqmark?formatz%snumeric)r-   r.   r   rB   r)   
paramstyle)r   r   r/   r%   rk   replr   r   r   r0     s   
zDialectSQL._compare_sql)r   r   r   r5   rc   rH   r0   __classcell__r   r   rf   r   r`      s
    r`   c                   @   $   e Zd Zdd Zdd Zdd ZdS )CountStatementsc                 C   s   || _ d| _d S Nr   count_statement_count)r   rr   r   r   r   r    !  s   
zCountStatements.__init__c                 C   s   |  j d7  _ d S )N   )rs   r   r   r   r   r   %  s   z!CountStatements.process_statementc                 C   s$   | j | jkrJ d| j | jf d S )NFz,desired statement count %d does not match %drq   r   r   r   r   r   (  s   z"CountStatements.no_more_statementsN)r   r   r   r    r   r   r   r   r   r   ro      s    ro   c                   @      e Zd Zdd Zdd ZdS )AllOfc                 G      t || _d S r
   )setrulesr   ry   r   r   r   r    1     zAllOf.__init__c                 C   sl   t | jD ]%}d |_|| |jr!| j| | jsd| _ d S |js*d | _ d S qt | jd j| _d S NTr   )rK   ry   r   r   r   discardr   r   ruler   r   r   r   4  s   
zAllOf.process_statementNr&   r   r   r   r   rv   0  s    rv   c                       s,   e Zd Zdd Zdd Z fddZ  ZS )EachOfc                 G   rw   r
   )rK   ry   rz   r   r   r   r    F  r{   zEachOf.__init__c                 C   s^   | j r%| j d }|| |jr| j d n|jr|j| _|jr"n| j s| j s-d| _d S d S )Nr   T)ry   r   r   r$   r   r   r~   r   r   r   r   I  s   



zEachOf.process_statementc                    s@   | j r| j d js| j d   d S | j rtt|   d S d S rp   )ry   r   r   rd   r   r   rf   r   r   r   W  s
   zEachOf.no_more_statements)r   r   r   r    r   r   rm   r   r   rf   r   r   E  s    r   c                       s   e Zd Z fddZ  ZS )Conditionalc                    s,   |rt t| j|  d S t t| j|  d S r
   )rd   r   r    )r   	conditionry   Z
else_rulesrf   r   r   r    _  s   zConditional.__init__)r   r   r   r    rm   r   r   rf   r   r   ^  s    r   c                   @   s   e Zd Zdd ZdS )Orc                 C   s>   | j D ]}|| |jrd| _ d S qt| j d j| _d S r|   )ry   r   r   rK   r   r~   r   r   r   r   g  s   

zOr.process_statementN)r   r   r   r   r   r   r   r   r   f  s    r   c                   @   ru   )SQLExecuteObservedc                 C   s*   || _ || _t|jt||| _g | _d S r
   )rB   rE   r   
connectiontupler#   r"   )r   rB   rE   multiparamsr   r   r   r   r    r  s   
zSQLExecuteObserved.__init__c                 C   s
   t | jS r
   )strr"   r   r   r   r   __repr__z     
zSQLExecuteObserved.__repr__N)r   r   r   r    r   r   r   r   r   r   q  s    r   c                   @   r   )SQLCursorExecuteObservedNr   r   r   r   r   r   ~  s    r   )r   r#   rB   executemanyc                   @   rn   )SQLAsserterc                 C   s
   g | _ d S r
   )accumulatedr   r   r   r   r      r   zSQLAsserter.__init__c                 C   s   | j | _| ` d S r
   )r   _finalr   r   r   r   _close  s   zSQLAsserter._closec                 G   sl   t | }t| j}|r#|d}|| |jrn
|jr!J |j|s|r+J d| |js4|  d S d S )Nr   Fz$Additional SQL statements remain:
%s)r   rK   r   r$   r   r   r   r   )r   ry   r   Zobservedr   r   r   r   assert_  s   



zSQLAsserter.assert_N)r   r   r   r    r   r   r   r   r   r   r     s    r   c                 #   s    t   g t| dfdd}t| d fdd}z V  W t| d| t| d|    d S t| d| t| d|    w )NZbefore_executec                    s   |||f d d < d S r
   r   )connrE   r   r   rC   )origr   r   connection_execute  s   z)assert_engine.<locals>.connection_executeZafter_cursor_executec                    sj   |sd S  j r j d j|u r j d }nt|d d d } j | |jt|||| d S )Nr   rt   r   )r   rB   r   appendr"   r   )r   cursorr   r#   rB   r   ZobsZasserterr   r   r   cursor_execute  s   z%assert_engine.<locals>.cursor_execute)r   r   Zlistens_forremover   )enginer   r   r   r   r   assert_engine  s   


r   ) collections
contextlibr-   r,   r   r   r   r   Zengine.defaultr   Zengine.utilr   Zschemar   objectr	   r   r   r'   r[   r`   ro   rv   r   r   r   r   
namedtupler   r   contextmanagerr   r   r   r   r   <module>   s>    .
	