U
    x^5                  
   @   sR  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 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_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/tmp/pip-install-dq5v43_d/SQLAlchemy/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ZdddZdd ZdS )	CursorSQLFNc                 C   s   || _ || _d S r
   )	statementparams)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)N)r   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   E   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_sqlJ   s    zCompiledSQL._compare_sqlc                 C   sB   | j dkrt S | j dkr$ddi}ni }t| j  f |S d S )Nr%   Z
postgresqlZimplicit_returningT)r&   r   r   URLget_dialect)r   r   r   r   r   r   _compile_dialectN   s    


zCompiledSQL._compile_dialectc                    s   |j }| |}t|jjtr:|jjj||jdd n&|jjj||jj	|jj
|jdd tddt }|j}|s  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.schema_translate_map)r&   r1   )r&   column_keysinliner1   r(   r)   c                    s   g | ]}  |qS r   )construct_params).0mcompiledr   r   
<listcomp>u   s    z3CompiledSQL._received_statement.<locals>.<listcomp>)contextr0   
isinstancer8   r   r   compileZexecution_optionsgetr2   r3   r*   r+   r   	text_typer!   r4   )r   r   r:   Zcompare_dialect_received_statementr!   _received_parametersr   r7   r   r?   Y   s2    

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:   r?   _all_paramsr-   listdictr"   	enumerater   r   _failure_message)r   r   r:   r?   r@   r   Z
equivalentZ
all_paramsZall_receivedparamidxZreceivedZ	param_keyr   r   r   r   {   s@    
zCompiledSQL.process_statementc                 C   s@   | j r8t| j r|  |}n| j }t|ts4|g}|S d S d S r
   )r   r   callabler;   rB   )r   r:   r   r   r   r   rA      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   rE      s    zCompiledSQL._failure_message)Nr%   )
r   r   r   r   r-   r0   r?   r   rA   rE   r   r   r   r   r$   D   s   
"1r$   c                   @   s&   e Zd ZdddZdd Zdd ZdS )	RegexSQLNc                 C   s,   t |  t|| _|| _|| _d| _d S )Nr%   )r   r   r*   r<   regex
orig_regexr   r&   )r   rO   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)rrI   rJ   )rP   rK   rL   rM   r   r   r   rE      s    zRegexSQL._failure_messagec                 C   s   t | j|S r
   )boolrO   match)r   r   r,   r   r   r   r-      s    zRegexSQL._compare_sql)N)r   r   r   r   rE   r-   r   r   r   r   rN      s   
rN   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   r0      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)	superrS   r?   r    rV   r   r   r:   Zcompiled_parameters)r   r   rU   Zreceived_paramsrT   	__class__r   r   r?      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#   r]   replr   r   r   r-      s    
zDialectSQL._compare_sql)r   r   r   r0   rV   r?   r-   __classcell__r   r   rX   r   rS      s   rS   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   rb   r   r   r   r   
  s    zCountStatements.__init__c                 C   s   |  j d7  _ d S )N   )rc   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)rb   rc   r   r   r   r   r   r     s
    z"CountStatements.no_more_statementsN)r   r   r   r   r   r   r   r   r   r   r`   	  s   r`   c                   @   s   e Zd Zdd Zdd ZdS )AllOfc                 G   s   t || _d S r
   )setrulesr   rg   r   r   r   r     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   )rB   rg   r   r   r   discardr   r   ruler   r   r   r     s    
zAllOf.process_statementN)r   r   r   r   r   r   r   r   r   re     s   re   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
   )rB   rg   rh   r   r   r   r   /  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)rg   r   r   r"   r   r   rk   r   r   r   r   2  s    

zEachOf.process_statementc                    s:   | j r"| j d js"| j d   n| j r6tt|   d S ra   )rg   r   r   rW   rm   r   rX   r   r   r   @  s    zEachOf.no_more_statements)r   r   r   r   r   r   r_   r   r   rX   r   rm   .  s   rm   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 ri   )rg   r   r   rB   r   rk   r   r   r   r   H  s    

zOr.process_statementN)r   r   r   r   r   r   r   r   rn   G  s   rn   c                   @   s   e Zd Zdd ZdS )SQLExecuteObservedc                 C   s"   || _ || _t||| _g | _d S r
   )r:   clauseelementr   r!   r    )r   r:   rp   multiparamsr   r   r   r   r   S  s    zSQLExecuteObserved.__init__N)r   r   r   r   r   r   r   r   ro   R  s   ro   c                   @   s   e Zd ZdS )SQLCursorExecuteObservedNr   r   r   r   r   rr   Z  s   rr   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   d  s    zSQLAsserter.__init__c                 C   s   | j | _| ` d S r
   )ru   _finalr   r   r   r   _closeg  s    zSQLAsserter._closec                 G   sn   t | }t| j}|rJ|d}|| |jr4qJq|jrdst|jq|r\dsjtdn|jsj|  d S )Nr   Fz Additional SQL statements remain)	rm   rB   rv   r"   r   r   r   r   r   )r   rg   rl   Zobservedr   r   r   r   assert_k  s    


zSQLAsserter.assert_N)r   r   r   r   rw   rx   r   r   r   r   rt   c  s   rt   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   )connrp   rq   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   rd   r   )ru   r:   ro   appendr    rr   )ry   cursorr   r!   r:   rs   ZobsZasserterrz   r   r   cursor_execute  s"       z%assert_engine.<locals>.cursor_execute)rt   r   Zlistens_forremoverw   )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$   rN   rS   r`   re   rm   rn   ro   
namedtuplerr   rt   contextmanagerr   r   r   r   r   <module>   s:    .

	