U
    dA                  
   @  sX  d dl mZ d dlZ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 G dd	 d	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ZG d d! d!ed!d"d#d$d%gZG d&d' d'Zejd(d) ZdS )*    )annotationsN   )event)url)DefaultDialect)BaseDDLElementc                   @  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-wbr0uges/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   1   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defaultTc                 C  s   || _ || _|| _|| _d S r	   )r   r   dialectenable_returning)r   r   r   r&   r'   r
   r
   r   r   G   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_sqlO   s    zCompiledSQL._compare_sqlc                 C  sl   | j dkrTt }d|_| jrPd |_ |_|_d|_d|_d|_	d|_
|jsPt|S tj| j   S d S )Nr%   T)r&   r   Zsupports_default_metavaluer'   Zinsert_returningZupdate_returningZdelete_returningZuse_insertmanyvaluesZsupports_multivalues_insertZupdate_returning_multifromZdelete_returning_multifromZinsert_executemany_returningr   r   URLcreateget_dialect)r   r   r&   r
   r
   r   _compile_dialectS   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&   r4   )	cache_keyr&   column_keysfor_executemanyr4   r)   r*   extracted_parametersc                   s   g | ]} j |d qS )r8   )construct_params).0mcompiledr9   r
   r   
<listcomp>   s
    z3CompiledSQL._received_statement.<locals>.<listcomp>)contextr3   execution_options
isinstanceclauseelementr   compiler>   r6   r7   r+   r,   strr    r:   )	r   r   r@   Zcompare_dialectr5   Zmap__received_statementr    _received_parametersr
   r=   r   rF   m   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@   rF   _all_paramsr/   listdictr!   	enumerater   r   _failure_message)r   r   r@   rF   rG   r   Z
equivalent
all_paramsZall_receivedparamidxZreceivedZ	param_keyr
   r
   r   r      sH    
 zCompiledSQL.process_statementc                 C  s>   | j r6t| j r|  |}n| j }t|ts2|g}|S d S d S r	   )r   callablerB   rI   )r   r@   r   r
   r
   r   rH      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   r   Zexpected_paramsr
   r
   r   rL      s    zCompiledSQL._failure_message)Nr%   T)
r   r   r   r   r/   r3   rF   r   rH   rL   r
   r
   r
   r   r$   F   s        
63r$   c                   @  s&   e Zd Zd
ddZdd Zdd	 ZdS )RegexSQLNr%   Fc                 C  s2   t |  t|| _|| _|| _|| _|| _d S r	   )	r   r   r+   rD   regex
orig_regexr   r&   r'   )r   rX   r   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)rrR   rS   )rY   rT   rU   rV   r
   r
   r   rL      s    zRegexSQL._failure_messagec                 C  s   t | j|S r	   )boolrX   match)r   r   r.   r
   r
   r   r/     s    zRegexSQL._compare_sql)Nr%   F)r   r   r   r   rL   r/   r
   r
   r
   r   rW      s        

rW   c                      sD   e Zd Zdd Zdd Z fddZdd Zd	d
 Zdd Z  Z	S )
DialectSQLc                 C  s   |j jS r	   )r@   r&   r   r
   r
   r   r3   	  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                   sF   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)superrF   r   r_   r   r   r@   Zcompiled_parameters)r   r   r^   Zreceived_paramsr]   	__class__r
   r   rF     s    
zDialectSQL._received_statementc                   s   |j }tdd| j}|dd}|dkr:tdd|}n`d }|dkrLd	}n@|d
krZd}n2|drtd |dkrzdnd fdd}td||}|dd}|S )Nr)   r*   z::z!!Zpyformatz	:([\w_]+)z%(\1)sZqmark?formatz%snumeric   Znumeric_dollar$:c                   s    t   S r	   )next)r<   counterZnum_identifierr
   r   repl6  s    z4DialectSQL._dialect_adjusted_statement.<locals>.repl)
paramstyler+   r,   r   rT   
startswith	itertoolscount)r   r&   rm   r"   rl   r
   rj   r   _dialect_adjusted_statement!  s"    

z&DialectSQL._dialect_adjusted_statementc                 C  s   |  |jj}||kS r	   )rq   r@   r&   r-   r
   r
   r   r/   @  s    zDialectSQL._compare_sqlc                 C  s*   d|  |jjddt|ddf S rQ   )rq   r@   r&   rT   rU   rV   r
   r
   r   rL   F  s     zDialectSQL._failure_message)
r   r   r   r3   r_   rF   rq   r/   rL   __classcell__r
   r
   ra   r   r\     s   r\   c                   @  s$   e Zd Zdd Zdd Zdd ZdS )CountStatementsc                 C  s   || _ d| _d S Nr   )rp   _statement_count)r   rp   r
   r
   r   r   U  s    zCountStatements.__init__c                 C  s   |  j d7  _ d S )Nrf   )ru   r   r
   r
   r   r   Y  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)rp   ru   r   r   r
   r
   r   r   \  s
    z"CountStatements.no_more_statementsN)r   r   r   r   r   r   r
   r
   r
   r   rs   T  s   rs   c                   @  s   e Zd Zdd Zdd ZdS )AllOfc                 G  s   t || _d S r	   )setrulesr   rx   r
   r
   r   r   e  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   )rI   rx   r   r   r   discardr   r   ruler
   r
   r   r   h  s    
zAllOf.process_statementNr#   r
   r
   r
   r   rv   d  s   rv   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	   )rI   rx   ry   r
   r
   r   r   z  s    zEachOf.__init__c                 C  sh   | j sd| _d| _| j rX| j d }|| |jr@| j d n|jrN|j| _|jrqXq| j sdd| _d S )NTFr   )rx   r   r   r   r!   r   r|   r
   r
   r   r   }  s    

zEachOf.process_statementc                   s6   | j r"| j d js"| j d   n| j r2t   d S rt   )rx   r   r   r`   r   ra   r
   r   r     s    zEachOf.no_more_statements)r   r   r   r   r   r   rr   r
   r
   ra   r   r~   y  s   r~   c                      s   e Zd Z fddZ  ZS )Conditionalc                   s"   |rt  j|  nt  j|  d S r	   )r`   r   )r   	conditionrx   Z
else_rulesra   r
   r   r     s    zConditional.__init__)r   r   r   r   rr   r
   r
   ra   r   r     s   r   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 rz   )rx   r   r   rI   r   r|   r
   r
   r   r     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d ZdS )SQLExecuteObservedc                 C  s6   || _ || _|r|| _n|r&|g| _ng | _g | _d S r	   )r@   rC   r    r   )r   r@   rC   multiparamsr   r
   r
   r   r     s    
zSQLExecuteObserved.__init__c                 C  s
   t | jS r	   )rE   r   r   r
   r
   r   __repr__  s    zSQLExecuteObserved.__repr__N)r   r   r   r   r   r
   r
   r
   r   r     s   r   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)	r~   rI   r   r!   r   r   r   r   r   )r   rx   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                 #  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
   )connrC   r   r   rA   )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   rf   r   )r   r@   r   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   )
__future__r   collections
contextlibro   r+   r*   r   r   r   Zengine.defaultr   Zschemar   r   r   r   r$   rW   r\   rs   rv   r~   r   r   r   
namedtupler   r   contextmanagerr   r
   r
   r
   r   <module>
   s<    )L

	