B
    KLct:              
   @   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
   ;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ddZdd ZdS )	CursorSQLNTc             C   s   || _ || _|| _d S )N)	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 )N)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 )Nz[\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   ZURLZcreateZ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"   r)   )	cache_keyr"   column_keysfor_executemanyr)   z[\n\t]r#   )extracted_parametersc                s   g | ]} j |d qS ))r-   )construct_params).0m)compiledr-   r
   r   
<listcomp>   s   z3CompiledSQL._received_statement.<locals>.<listcomp>)contextr(   execution_options
isinstanceclauseelementr   compiler1   r+   r,   r$   r%   r   Z	text_typer   r.   )	r   r   r3   Zcompare_dialectr*   Zmap__received_statementr   _received_parametersr
   )r1   r-   r   r8   \   s2    


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)r3   r8   _all_paramsr'   listdictr   	enumerater   r   _failure_message)r   r   r3   r8   r9   r   Z
equivalentZ
all_paramsZall_receivedZparamidxZreceivedZ	param_keyr
   r
   r   r      s8    



zCompiledSQL.process_statementc             C   s>   | j r6t| j r|  |}n| j }t|ts2|g}|S d S d S )N)r   callabler5   r;   )r   r3   r   r
   r
   r   r:      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%z%%)r   replacerepr)r   expected_paramsr
   r
   r   r>      s    zCompiledSQL._failure_message)Nr!   )
r   r   r   r   r'   r(   r8   r   r:   r>   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 )N)r   r   r$   r7   regex
orig_regexr   r"   )r   rF   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)rrA   z%%)rG   rB   rC   )r   rD   r
   r
   r   r>      s    zRegexSQL._failure_messagec             C   s   t | j|S )N)boolrF   match)r   r   r&   r
   r
   r   r'      s    zRegexSQL._compare_sql)Nr!   )r   r   r   r   r>   r'   r
   r
   r
   r   rE      s   
rE   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)r3   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)	superrJ   r8   r   rM   r   r   r3   Zcompiled_parameters)r   r   rL   Zreceived_paramsrK   )	__class__r
   r   r8      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   r3   r"   
paramstyle)r   r   r&   r   rR   replr
   r
   r   r'     s    
zDialectSQL._compare_sql)r   r   r   r(   rM   r8   r'   __classcell__r
   r
   )rO   r   rJ      s   rJ   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   rV   r
   r
   r   r   !  s    zCountStatements.__init__c             C   s   |  j d7  _ d S )N   )rW   )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)rV   rW   r   )r   r
   r
   r   r   (  s    z"CountStatements.no_more_statementsN)r   r   r   r   r   r   r
   r
   r
   r   rU      s   rU   c               @   s   e Zd Zdd Zdd ZdS )AllOfc             G   s   t || _d S )N)setrules)r   r[   r
   r
   r   r   1  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   )r;   r[   r   r   r   discard)r   r   ruler
   r
   r   r   4  s    
zAllOf.process_statementN)r   r   r   r   r   r
   r
   r
   r   rY   0  s   rY   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)r;   r[   )r   r[   r
   r
   r   r   F  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)r[   r   r   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   n| j r6tt|   d S )Nr   )r[   r   r   rN   r^   )r   )rO   r
   r   r   W  s    zEachOf.no_more_statements)r   r   r   r   r   r   rT   r
   r
   )rO   r   r^   E  s   r^   c                   s   e Zd Z fddZ  ZS )Conditionalc                s*   |rt t| j|  nt t| j|  d S )N)rN   r_   r   )r   Z	conditionr[   Z
else_rules)rO   r
   r   r   _  s    zConditional.__init__)r   r   r   r   rT   r
   r
   )rO   r   r_   ^  s   r_   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   )r[   r   r   r;   r   )r   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               @   s   e Zd Zdd Zdd ZdS )SQLExecuteObservedc             C   s*   || _ || _t|jt||| _g | _d S )N)r3   r6   r   Z
connectiontupler   r   )r   r3   r6   multiparamsr   r
   r
   r   r   r  s
    zSQLExecuteObserved.__init__c             C   s
   t | jS )N)strr   )r   r
   r
   r   __repr__z  s    zSQLExecuteObserved.__repr__N)r   r   r   r   re   r
   r
   r
   r   ra   q  s   ra   c               @   s   e Zd ZdS )SQLCursorExecuteObservedN)r   r   r   r
   r
   r
   r   rf   ~  s   rf   r   r   r3   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)ri   _final)r   r
   r
   r   _close  s    zSQLAsserter._closec             G   sv   t | }t| j}x:|rL|d}|| |jr6P q|jrdst|jqW |rddsrtd| n|jsr|  d S )Nr   Fz$Additional SQL statements remain:
%s)	r^   r;   rj   r   r   r   r   r   r   )r   r[   r]   Zobservedr   r
   r
   r   assert_  s    


zSQLAsserter.assert_N)r   r   r   r   rk   rl   r
   r
   r
   r   rh     s   rh   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
   )connr6   rc   r   r4   )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   rX   r   )ri   r3   ra   appendr   rf   )rm   Zcursorr   r   r3   rg   Zobs)asserterrn   r
   r   cursor_execute  s    z%assert_engine.<locals>.cursor_execute)rh   r   Zlistens_forremoverk   )enginero   rs   r
   )rr   rn   r   assert_engine  s    
rv   ) collections
contextlibr$   r#   r   r   ru   r   Zengine.defaultr   Zengine.utilr   Zschemar   objectr	   r   r   r    rE   rJ   rU   rY   r^   r_   r`   ra   
namedtuplerf   rh   contextmanagerrv   r
   r
   r
   r   <module>   s6    .
