U
    [hA                  
   @  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
   B./venv/lib/python3.8/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 r	   )	statementparamsr   )r   r   r   r   r
   r
   r   __init__+   s    zCursorSQL.__init__c                 C  sp   |j d }| j|jks,| jd k	rN| j|jkrNd| _d| j| j|j|jf | _n|j d d| _|j sld| _d S )Nr   Tz5Testing for exact SQL %s parameters %s received %s %s)
statementsr   r   
parametersr   r   popr   )r   r   stmtr
   r
   r   r   0   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   ZURLZcreateZ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&   r1   )	cache_keyr&   column_keysfor_executemanyr1   r)   r*   extracted_parametersc                   s   g | ]} j |d qS )r5   )construct_params).0mcompiledr6   r
   r   
<listcomp>   s
    z3CompiledSQL._received_statement.<locals>.<listcomp>)contextr0   execution_options
isinstanceclauseelementr   compiler;   r3   r4   r+   r,   strr    r7   )	r   r   r=   Zcompare_dialectr2   Zmap__received_statementr    _received_parametersr
   r:   r   rC   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=   rC   _all_paramsr/   listdictr!   	enumerater   r   _failure_message)r   r   r=   rC   rD   r   Z
equivalentZ
all_paramsZall_receivedZ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   callabler?   rF   )r   r=   r   r
   r
   r   rE      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   rI      s    zCompiledSQL._failure_message)Nr%   T)
r   r   r   r   r/   r0   rC   r   rE   rI   r
   r
   r
   r   r$   F   s        
5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+   rA   regex
orig_regexr   r&   r'   )r   rS   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)rrM   rN   )rT   rO   rP   rQ   r
   r
   r   rI      s    zRegexSQL._failure_messagec                 C  s   t | j|S r	   )boolrS   match)r   r   r.   r
   r
   r   r/     s    zRegexSQL._compare_sql)Nr%   F)r   r   r   r   rI   r/   r
   r
   r
   r   rR      s        

rR   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   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                   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)superrC   r   rZ   r   r   r=   Zcompiled_parameters)r   r   rY   Zreceived_paramsrX   	__class__r
   r   rC     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)r9   ZcounterZnum_identifierr
   r   repl5  s    z4DialectSQL._dialect_adjusted_statement.<locals>.repl)
paramstyler+   r,   r   rO   
startswith	itertoolscount)r   r&   rg   r"   rf   r
   re   r   _dialect_adjusted_statement   s"    

z&DialectSQL._dialect_adjusted_statementc                 C  s   |  |jj}||kS r	   )rk   r=   r&   r-   r
   r
   r   r/   ?  s    zDialectSQL._compare_sqlc                 C  s*   d|  |jjddt|ddf S rL   )rk   r=   r&   rO   rP   rQ   r
   r
   r   rI   E  s     zDialectSQL._failure_message)
r   r   r   r0   rZ   rC   rk   r/   rI   __classcell__r
   r
   r\   r   rW     s   rW   c                   @  s$   e Zd Zdd Zdd Zdd ZdS )CountStatementsc                 C  s   || _ d| _d S Nr   )rj   _statement_count)r   rj   r
   r
   r   r   T  s    zCountStatements.__init__c                 C  s   |  j d7  _ d S )Nra   )ro   r   r
   r
   r   r   X  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)rj   ro   r   r   r
   r
   r   r   [  s
    z"CountStatements.no_more_statementsN)r   r   r   r   r   r   r
   r
   r
   r   rm   S  s   rm   c                   @  s   e Zd Zdd Zdd ZdS )AllOfc                 G  s   t || _d S r	   )setrulesr   rr   r
   r
   r   r   d  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   )rF   rr   r   r   r   discardr   r   ruler
   r
   r   r   g  s    
zAllOf.process_statementNr#   r
   r
   r
   r   rp   c  s   rp   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	   )rF   rr   rs   r
   r
   r   r   y  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   )rr   r   r   r   r!   r   rv   r
   r
   r   r   |  s    

zEachOf.process_statementc                   s6   | j r"| j d js"| j d   n| j r2t   d S rn   )rr   r   r   r[   r   r\   r
   r   r     s    zEachOf.no_more_statements)r   r   r   r   r   r   rl   r
   r
   r\   r   rx   x  s   rx   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   Z	conditionrr   Z
else_rulesr\   r
   r   r     s    zConditional.__init__)r   r   r   r   rl   r
   r
   r\   r   ry     s   ry   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 rt   )rr   r   r   rF   r   rv   r
   r
   r   r     s    

zOr.process_statementN)r   r   r   r   r
   r
   r
   r   rz     s   rz   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=   r@   r    r   )r   r=   r@   multiparamsr   r
   r
   r   r     s    
zSQLExecuteObserved.__init__c                 C  s
   t | jS r	   )rB   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)	rx   rF   r   r!   r   r   r   r   r   )r   rr   rw   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
   )connr@   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   ra   r   )r   r=   r{   appendr   r~   )r   Z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   )Z
__future__r   collections
contextlibri   r+   r*   r   r   r   Zengine.defaultr   Zschemar   r   r   r   r$   rR   rW   rm   rp   rx   ry   rz   r{   
namedtupler~   r   contextmanagerr   r
   r
   r
   r   <module>
   s<    (L

	