U
    [ht:                  
   @   sb  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"d#d$d%d&g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   @/tmp/pip-unpacked-wheel-joqu7d3y/sqlalchemy/testing/assertsql.pyprocess_statement   s    zAssertRule.process_statementc                 C   s   dst dd S )NFz?All statements are complete, but pending assertion rules remain)AssertionError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                   @   s   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   s   || _ || _|| _d S r
   )	statementparamsr   )r   r   r   r   r   r   r   __init__)   s    zCursorSQL.__init__c                 C   sj   |j d }| j|jks,| jd k	rH| j|jkrHd| j| j|j|jf | _n|j d d| _|j sfd| _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   s   || _ || _|| _d S r
   )r   r   dialect)r   r   r   r'   r   r   r   r   D   s    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  f |S d S )Nr&   TZ
postgresqlZimplicit_returning)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kr.|jd }nd}t|jtrP|jj||d n|jj|||jj|jj	|d t
ddt }|j}|s jdg}n 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'   r3   )	cache_keyr'   column_keysfor_executemanyr3   r)   r*   extracted_parametersc                    s   g | ]} j |d qS )r7   )construct_params).0mcompiledr8   r   r   
<listcomp>   s
    z3CompiledSQL._received_statement.<locals>.<listcomp>)contextr2   execution_options
isinstanceclauseelementr   compiler=   r5   r6   r+   r,   r   	text_typer!   r9   )	r   r   r?   Zcompare_dialectr4   Zmap__received_statementr!   _received_parametersr   r<   r   rE   \   s>    

zCompiledSQL._received_statementc                 C   s   |j }| |\}}| |}| ||}|r|d k	rt|}t|}|r|rt|d}	tt|D ]8\}
}|	D ] }||ks|| |	| krt qhqt||
=  qFqhd}qqF|s|rd}|rd| _d | _	n| 
|||d | _	d S )Nr   FT)r-   Zreceived_parameters)r?   rE   _all_paramsr.   listdictr"   	enumerater   r   _failure_message)r   r   r?   rE   rF   r   Z
equivalent
all_paramsZall_receivedparamidxZreceivedZ	param_keyr   r   r   r      s@    
zCompiledSQL.process_statementc                 C   s>   | j r6t| j r|  |}n| j }t|ts2|g}|S d S d S r
   )r   callablerA   rH   )r   r?   r   r   r   r   rG      s    

zCompiledSQL._all_paramsc                 C   s"   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   rK      s    zCompiledSQL._failure_message)Nr&   )
r   r   r   r   r.   r2   rE   r   rG   rK   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+   rC   regex
orig_regexr   r'   )r   rV   r   r'   r   r   r   r      s
    
zRegexSQL.__init__c                 C   s"   d| j ddt|ddf S )Nz{Testing for compiled statement ~%r partial params %s, received %%(received_statement)r with params %%(received_parameters)rrP   rQ   )rW   rR   rS   rT   r   r   r   rK      s    zRegexSQL._failure_messagec                 C   s   t | j|S r
   )boolrV   match)r   r   r-   r   r   r   r.      s    zRegexSQL._compare_sql)Nr&   )r   r   r   r   rK   r.   r   r   r   r   rU      s   
rU   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
   )r?   r'   r   r   r   r   r2      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 q>qtd| ||jjfS )NzICan't locate compiled statement %r in list of statements actually invoked)	superrZ   rE   r    r]   r   r   r?   Zcompiled_parameters)r   r   r\   Zreceived_paramsr[   	__class__r   r   rE      s     
zDialectSQL._received_statementc                 C   st   t dd| j}|jjj}|dkr2t dd|}n:d }|dkrDd}n|dkrRd	}n|d
kr^d }t d||}||kS )Nr)   r*   Zpyformatz	:([\w_]+)z%(\1)sZqmark?formatz%snumeric)r+   r,   r   r?   r'   
paramstyle)r   r   r-   r#   rd   replr   r   r   r.     s    
zDialectSQL._compare_sql)r   r   r   r2   r]   rE   r.   __classcell__r   r   r_   r   rZ      s   rZ   c                   @   s$   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   ri   r   r   r   r   !  s    zCountStatements.__init__c                 C   s   |  j d7  _ d S )N   )rj   r   r   r   r   r   %  s    z!CountStatements.process_statementc                 C   s(   | j | jkr$ds$td| j | jf d S )NFz,desired statement count %d does not match %d)ri   rj   r   r   r   r   r   r   (  s
    z"CountStatements.no_more_statementsN)r   r   r   r   r   r   r   r   r   r   rg      s   rg   c                   @   s   e Zd Zdd Zdd ZdS )AllOfc                 G   s   t || _d S r
   )setrulesr   rn   r   r   r   r   1  s    zAllOf.__init__c                 C   sj   t | jD ]H}d |_|| |jrB| j| | js<d| _ qfq
|js
d | _ qfq
t | jd j| _d S NTr   )rH   rn   r   r   r   discardr   r   ruler   r   r   r   4  s    
zAllOf.process_statementNr$   r   r   r   r   rl   0  s   rl   c                       s,   e Zd Zdd Zdd Z fddZ  ZS )EachOfc                 G   s   t || _d S r
   )rH   rn   ro   r   r   r   r   F  s    zEachOf.__init__c                 C   sV   | j rF| j d }|| |jr.| j d n|jr<|j| _|jr qFq | j sRd| _d S )Nr   T)rn   r   r   r"   r   r   rr   r   r   r   r   I  s    

zEachOf.process_statementc                    s:   | j r"| j d js"| j d   n| j r6tt|   d S rh   )rn   r   r   r^   rt   r   r_   r   r   r   W  s    zEachOf.no_more_statements)r   r   r   r   r   r   rf   r   r   r_   r   rt   E  s   rt   c                       s   e Zd Z fddZ  ZS )Conditionalc                    s*   |rt t| j|  nt t| j|  d S r
   )r^   ru   r   )r   	conditionrn   Z
else_rulesr_   r   r   r   _  s    zConditional.__init__)r   r   r   r   rf   r   r   r_   r   ru   ^  s   ru   c                   @   s   e Zd Zdd ZdS )Orc                 C   s<   | j D ]}|| |jrd| _ q8qt| j d j| _d S rp   )rn   r   r   rH   r   rr   r   r   r   r   g  s    

zOr.process_statementN)r   r   r   r   r   r   r   r   rw   f  s   rw   c                   @   s   e Zd Zdd Zdd ZdS )SQLExecuteObservedc                 C   s*   || _ || _t|jt||| _g | _d S r
   )r?   rB   r   
connectiontupler!   r    )r   r?   rB   multiparamsr   r   r   r   r   r  s      zSQLExecuteObserved.__init__c                 C   s
   t | jS r
   )strr    r   r   r   r   __repr__z  s    zSQLExecuteObserved.__repr__N)r   r   r   r   r}   r   r   r   r   rx   q  s   rx   c                   @   s   e Zd ZdS )SQLCursorExecuteObservedNr   r   r   r   r   r~   ~  s   r~   r   r!   r?   executemanyc                   @   s$   e Zd Zdd Zdd Zdd ZdS )SQLAsserterc                 C   s
   g | _ d S r
   )accumulatedr   r   r   r   r     s    zSQLAsserter.__init__c                 C   s   | j | _| ` d S r
   )r   _finalr   r   r   r   _close  s    zSQLAsserter._closec                 G   sr   t | }t| j}|rJ|d}|| |jr4qJq|jrdst|jq|r`dsntd| n|jsn|  d S )Nr   Fz$Additional SQL statements remain:
%s)	rt   rH   r   r"   r   r   r   r   r   )r   rn   rs   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                 #   sr   t   g t| dfdd}t| d fdd}z
 V  W 5 t| d| t| d|    X d S )NZbefore_executec                    s   |||f d d < d S r
   r   )connrB   r{   r   r@   )origr   r   connection_execute  s    z)assert_engine.<locals>.connection_executeZafter_cursor_executec                    sj   |sd S  j r* j d j|kr* j d }n&t|d d d } j | |jt|||| d S )Nr   rk   r   )r   r?   rx   appendr    r~   )r   cursorr   r!   r?   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%   rU   rZ   rg   rl   rt   ru   rw   rx   
namedtupler~   r   contextmanagerr   r   r   r   r   <module>   s<    .

	