B
    \V4              
   @   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
   ;lib/python3.7/site-packages/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 )N)	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 )N)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 )Nz[\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   ZURLZ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"   r)   )r"   column_keysinliner)   z[\n\t]r#   c                s   g | ]}  |qS r
   )construct_params).0m)compiledr
   r   
<listcomp>v   s    z3CompiledSQL._received_statement.<locals>.<listcomp>)contextr(   
isinstancer/   r   r   compileZexecution_optionsgetr*   r+   r$   r%   r   Z	text_typer   r,   )r   r   r1   Zcompare_dialect_received_statementr   _received_parametersr
   )r/   r   r5   Y   s&    

zCompiledSQL._received_statementc             C   s   |j }| |\}}| |}| ||}|r|d k	rt|}t|}xj|r|rt|d}	xNtt|D ]8\}
}x.|	D ]}||ks|| |	| krzP qzW ||
= P qlW d}P qHW |s|rd}|rd| _d | _	n| 
|||d | _	d S )Nr   FT)r&   Zreceived_parameters)r1   r5   _all_paramsr'   listdictr   	enumerater   r   _failure_message)r   r   r1   r5   r6   r   Z
equivalentZ
all_paramsZall_receivedZparamidxZreceivedZ	param_keyr
   r
   r   r   {   s8    



zCompiledSQL.process_statementc             C   s@   | j r8t| j r|  |}n| j }t|ts4|g}|S d S d S )N)r   r   callabler2   r8   )r   r1   r   r
   r
   r   r7      s    
zCompiledSQL._all_paramsc             C   s   d| j dd|f S )NzzTesting for compiled statement %r partial params %r, received %%(received_statement)r with params %%(received_parameters)r%z%%)r   replace)r   expected_paramsr
   r
   r   r;      s    zCompiledSQL._failure_message)Nr!   )
r   r   r   r   r'   r(   r5   r   r7   r;   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$   r3   regex
orig_regexr   r"   )r   rB   r   r
   r
   r   r      s
    
zRegexSQL.__init__c             C   s   d| j |f S )Nz{Testing for compiled statement ~%r partial params %r, received %%(received_statement)r with params %%(received_parameters)r)rC   )r   r@   r
   r
   r   r;      s    zRegexSQL._failure_messagec             C   s   t | j|S )N)boolrB   match)r   r   r&   r
   r
   r   r'      s    zRegexSQL._compare_sql)N)r   r   r   r   r;   r'   r
   r
   r
   r   rA      s   
rA   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 )N)r1   r"   )r   r   r
   r
   r   r(      s    zDialectSQL._compile_dialectc             C   s   t dd|}||kS )Nz[\n\t]r#   )r$   r%   )r   	real_stmtreceived_stmtr   r
   r
   r   _compare_no_space   s    zDialectSQL._compare_no_spacec                sL   t t| |\}}x*|jD ]}| |j|rP qW td| ||jjfS )NzICan't locate compiled statement %r in list of statements actually invoked)	superrF   r5   r   rI   r   r   r1   Zcompiled_parameters)r   r   rH   Zreceived_paramsrG   )	__class__r
   r   r5      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 )Nz[\n\t]r#   Zpyformatz	:([\w_]+)z%(\1)sZqmark?formatz%sZnumeric)r$   r%   r   r1   r"   
paramstyle)r   r   r&   r   rN   replr
   r
   r   r'      s    
zDialectSQL._compare_sql)r   r   r   r(   rI   r5   r'   __classcell__r
   r
   )rK   r   rF      s   rF   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   rR   r
   r
   r   r     s    zCountStatements.__init__c             C   s   |  j d7  _ d S )N   )rS   )r   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)rR   rS   r   )r   r
   r
   r   r   
  s    z"CountStatements.no_more_statementsN)r   r   r   r   r   r   r
   r
   r
   r   rQ     s   rQ   c               @   s   e Zd Zdd Zdd ZdS )AllOfc             G   s   t || _d S )N)setrules)r   rW   r
   r
   r   r     s    zAllOf.__init__c             C   sj   xdt | jD ]D}d |_|| |jrB| j| | js>d| _P q|jsd | _P qW t | jd j| _d S )NTr   )r8   rW   r   r   r   discard)r   r   ruler
   r
   r   r     s    
zAllOf.process_statementN)r   r   r   r   r   r
   r
   r
   r   rU     s   rU   c                   s,   e Zd Zdd Zdd Z fddZ  ZS )EachOfc             G   s   t || _d S )N)r8   rW   )r   rW   r
   r
   r   r   (  s    zEachOf.__init__c             C   sZ   xH| j rH| j d }|| |jr0| j d n|jr>|j| _|jrP qW | j sVd| _d S )Nr   T)rW   r   r   r   r   r   )r   r   rY   r
   r
   r   r   +  s    

zEachOf.process_statementc                s:   | j r"| j d js"| j d   n| j r6tt|   d S )Nr   )rW   r   r   rJ   rZ   )r   )rK   r
   r   r   9  s    zEachOf.no_more_statements)r   r   r   r   r   r   rP   r
   r
   )rK   r   rZ   '  s   rZ   c               @   s   e Zd Zdd ZdS )Orc             C   s>   x8| j D ]}|| |jrd| _P qW t| j d j| _d S )NTr   )rW   r   r   r8   r   )r   r   rY   r
   r
   r   r   A  s    
zOr.process_statementN)r   r   r   r   r
   r
   r
   r   r[   @  s   r[   c               @   s   e Zd Zdd ZdS )SQLExecuteObservedc             C   s"   || _ || _t||| _g | _d S )N)r1   clauseelementr   r   r   )r   r1   r]   multiparamsr   r
   r
   r   r   L  s    zSQLExecuteObserved.__init__N)r   r   r   r   r
   r
   r
   r   r\   K  s   r\   c               @   s   e Zd ZdS )SQLCursorExecuteObservedN)r   r   r   r
   r
   r
   r   r_   S  s   r_   r   r   r1   executemanyc               @   s$   e Zd Zdd Zdd Zdd ZdS )SQLAsserterc             C   s
   g | _ d S )N)accumulated)r   r
   r
   r   r   ]  s    zSQLAsserter.__init__c             C   s   | j | _| ` d S )N)rb   _final)r   r
   r
   r   _close`  s    zSQLAsserter._closec             G   sr   t | }t| j}x:|rL|d}|| |jr6P q|jrdst|jqW |r`dsntdn|jsn|  d S )Nr   Fz Additional SQL statements remain)	rZ   r8   rc   r   r   r   r   r   r   )r   rW   rY   Zobservedr   r
   r
   r   assert_d  s    


zSQLAsserter.assert_N)r   r   r   r   rd   re   r
   r
   r
   r   ra   \  s   ra   c             #   sr   t   g t| dfdd}t| d fdd}z
 V  W d t| d| t| d|    X d S )NZbefore_executec                s   |||f d d < d S )Nr
   )connr]   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   rT   r   )rb   r1   r\   appendr   r_   )rf   Zcursorr   r   r1   r`   Zobs)asserterrg   r
   r   cursor_execute  s    z%assert_engine.<locals>.cursor_execute)ra   r   Zlistens_forremoverd   )enginerh   rl   r
   )rk   rg   r   assert_engineu  s    
ro   )collections
contextlibr$   r#   r   r   rn   r   Zengine.defaultr   Zengine.utilr   Zschemar   objectr	   r   r   r    rA   rF   rQ   rU   rZ   r[   r\   
namedtupler_   ra   contextmanagerro   r
   r
   r
   r   <module>   s2   }.
