o
    Šåg±A  ã                   @  sT  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!g d"¢¡ƒ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
   úX/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/testing/assertsql.pyÚprocess_statement   s   zAssertRule.process_statementc                 C  s   J dƒ‚)NFz?All statements are complete, but pending assertion rules remainr
   ©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                   @  ó   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  sv   |j d }| j|jks| jd ur(| j|jkr(d| _d| j| j|j|jf | _d S |j  d¡ d| _|j s9d| _d S 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                   @  sH   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  sh   | j dkr*tƒ }d|_| jr(d |_ |_|_d|_d|_d|_	d|_
|js(J ‚|S tj | j ¡ ¡ ƒ S ©Nr%   T)r&   r   Úsupports_default_metavaluer'   Úinsert_returningÚupdate_returningÚdelete_returningÚuse_insertmanyvaluesÚsupports_multivalues_insertÚupdate_returning_multifromÚdelete_returning_multifromÚinsert_executemany_returningr   ÚURLÚcreateÚget_dialect)r   r   r&   r
   r
   r   Ú_compile_dialectS   s   
þ
zCompiledSQL._compile_dialectc           	        s¼   |j }|  |¡}d}d‰d|jv r|jd }nd}t|jtƒr(|jj||d�‰ n|jj|||jj|jj	|d�‰ t
 ddtˆ ƒ¡}|j}|sPˆ jˆd�g}||fS ‡ ‡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>   r)   r*   ©Úextracted_parametersc                   s   g | ]	}ˆ j |ˆd �‘qS )rB   )Úconstruct_params)Ú.0Úm©ÚcompiledrC   r
   r   Ú
<listcomp>™   s    ýÿÿz3CompiledSQL._received_statement.<locals>.<listcomp>)Úcontextr=   Úexecution_optionsÚ
isinstanceÚclauseelementr   ÚcompilerH   r@   rA   r+   r,   Ústrr    rD   )	r   r   rJ   Úcompare_dialectr?   Úmap_Ú_received_statementr    Ú_received_parametersr
   rG   r   rR   m   s@   
ÿ
þûÿÿùüzCompiledSQL._received_statementc                 C  sì   |j }|  |¡\}}|  |¡}|  ||¡}|r^|d ur^t|ƒ}t|ƒ}|rX|rXt| d¡ƒ}	tt|ƒƒD ]\}
}|	D ]}||vsH|| |	| krJ nq:||
=  nq4d}n|rX|s'|s\|r^d}|rhd| _d | _	d S |  
||¡||dœ | _	d S )Nr   FT)r.   Úreceived_parameters)rJ   rR   Ú_all_paramsr/   ÚlistÚdictr!   Ú	enumerater   r   Ú_failure_message)r   r   rJ   rR   rS   r   Ú
equivalentÚ
all_paramsÚall_receivedÚparamÚidxÚreceivedÚ	param_keyr
   r
   r   r   ¢   sH   ÿ
þû	ê
ÿþ
þzCompiledSQL.process_statementc                 C  s:   | j rt| j ƒr|   |¡}n| j }t|tƒs|g}|S d S r	   )r   ÚcallablerL   rV   )r   rJ   r   r
   r
   r   rU   Õ   s   

zCompiledSQL._all_paramsc                 C  ó"   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   Úexpected_paramsr
   r
   r   rY   á   ó   þýÿzCompiledSQL._failure_messager0   )
r   r   r   r   r/   r=   rR   r   rU   rY   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+   rN   ÚregexÚ
orig_regexr   r&   r'   )r   rl   r   r&   r'   r
   r
   r   r   î   s   

zRegexSQL.__init__c                 C  rb   )Nz{Testing for compiled statement ~%r partial params %s, received %%(received_statement)r with params %%(received_parameters)rrd   re   )rm   rf   rg   rh   r
   r
   r   rY   ø   rj   zRegexSQL._failure_messagec                 C  s   t | j |¡ƒS r	   )Úboolrl   Úmatch)r   r   r.   r
   r
   r   r/     ó   zRegexSQL._compare_sql)Nr%   F)r   r   r   r   rY   r/   r
   r
   r
   r   rk   í   s
    
ÿ
rk   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	   )rJ   r&   r   r
   r
   r   r=     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 nqtd| ƒ‚||jjfS )NzICan't locate compiled statement %r in list of statements actually invoked)ÚsuperrR   r   rt   r   ÚAssertionErrorrJ   Úcompiled_parameters)r   r   rs   Úreceived_paramsrr   ©Ú	__class__r
   r   rR     s   ÿ
ÿÿÿzDialectSQL._received_statementc                   sª   |j }t dd| j¡}| dd¡}|dkrt dd|¡}n0d }|dkr&d	}n |d
kr-d}n| d¡rFt d¡‰ |dkr=dnd‰‡ ‡fdd„}t d||¡}| dd¡}|S )Nr)   r*   z::z!!Úpyformatz	:([\w_]+)z%(\1)sÚqmarkú?Úformatz%sÚnumericé   Únumeric_dollarú$ú:c                   s   ˆ› t ˆ ƒ› �S r	   )Únext)rF   ©ÚcounterÚnum_identifierr
   r   Úrepl5  rp   z4DialectSQL._dialect_adjusted_statement.<locals>.repl)Ú
paramstyler+   r,   r   rf   Ú
startswithÚ	itertoolsÚcount)r   r&   r‰   r"   rˆ   r
   r…   r   Ú_dialect_adjusted_statement   s"   

z&DialectSQL._dialect_adjusted_statementc                 C  s   |   |jj¡}||kS r	   )r�   rJ   r&   r-   r
   r
   r   r/   ?  s   ÿzDialectSQL._compare_sqlc                 C  s*   d|   |jj¡ dd¡t|ƒ dd¡f S rc   )r�   rJ   r&   rf   rg   rh   r
   r
   r   rY   E  s   ÿüýÿzDialectSQL._failure_message)
r   r   r   r=   rt   rR   r�   r/   rY   Ú__classcell__r
   r
   ry   r   rq     s    rq   c                   @  ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚCountStatementsc                 C  s   || _ d| _d S ©Nr   ©rŒ   Ú_statement_count)r   rŒ   r
   r
   r   r   T  s   
zCountStatements.__init__c                 C  s   |  j d7  _ d S )Nr€   )r“   r   r
   r
   r   r   X  s   z!CountStatements.process_statementc                 C  s$   | j | jkrJ d| j | jf ƒ‚d S )NFz,desired statement count %d does not match %dr’   r   r
   r
   r   r   [  s   þÿz"CountStatements.no_more_statementsN)r   r   r   r   r   r   r
   r
   r
   r   r�   S  s    r�   c                   @  ó   e Zd Zdd„ Zdd„ ZdS )ÚAllOfc                 G  ó   t |ƒ| _d S r	   )ÚsetÚrules©r   r˜   r
   r
   r   r   d  ó   zAllOf.__init__c                 C  sl   t | jƒD ]%}d |_| |¡ |jr!| j |¡ | jsd| _ d S |js*d | _ d S qt | jƒd j| _d S ©NTr   )rV   r˜   r   r   r   Údiscard©r   r   Úruler
   r
   r   r   g  s   
ýzAllOf.process_statementNr#   r
   r
   r
   r   r•   c  s    r•   c                      s,   e Zd Zdd„ Zdd„ Z‡ fdd„Z‡  ZS )ÚEachOfc                 G  r–   r	   )rV   r˜   r™   r
   r
   r   r   y  rš   zEachOf.__init__c                 C  sp   | j s	d| _d| _| j r.| j d }| |¡ |jr | j  d¡ n|jr'|j| _|jr+n| j s| j s6d| _d S d S )NTFr   )r˜   r   r   r   r!   r   r�   r
   r
   r   r   |  s    

ø

ÿzEachOf.process_statementc                   s<   | j r| j d js| j d  ¡  d S | j rtƒ  ¡  d S d S r‘   )r˜   r   r   ru   r   ry   r
   r   r   Ž  s
   ÿzEachOf.no_more_statements)r   r   r   r   r   r   rŽ   r
   r
   ry   r   rŸ   x  s    rŸ   c                      s   e Zd Z‡ fdd„Z‡  ZS )ÚConditionalc                   s$   |r
t ƒ j|Ž  d S t ƒ j|Ž  d S r	   )ru   r   )r   Ú	conditionr˜   Ú
else_rulesry   r
   r   r   –  s   zConditional.__init__)r   r   r   r   rŽ   r
   r
   ry   r   r    •  s    r    c                   @  s   e Zd Zdd„ ZdS )ÚOrc                 C  s>   | j D ]}| |¡ |jrd| _ d S qt| j ƒd j| _d S r›   )r˜   r   r   rV   r   r�   r
   r
   r   r   ž  s   

þzOr.process_statementN)r   r   r   r   r
   r
   r
   r   r£   �  s    r£   c                   @  r”   )ÚSQLExecuteObservedc                 C  s6   || _ || _|r|| _n
|r|g| _ng | _g | _d S r	   )rJ   rM   r    r   )r   rJ   rM   Úmultiparamsr   r
   r
   r   r   ©  s   

zSQLExecuteObserved.__init__c                 C  s
   t | jƒS r	   )rO   r   r   r
   r
   r   Ú__repr__µ  ó   
zSQLExecuteObserved.__repr__N)r   r   r   r   r¦   r
   r
   r
   r   r¤   ¨  s    r¤   c                   @  r   )ÚSQLCursorExecuteObservedNr   r
   r
   r
   r   r¨   ¹  s    r¨   )r   r    rJ   Úexecutemanyc                   @  r�   )ÚSQLAsserterc                 C  s
   g | _ d S r	   )Úaccumulatedr   r
   r
   r   r   Ã  r§   zSQLAsserter.__init__c                 C  s   | j | _| ` d S r	   )r«   Ú_finalr   r
   r
   r   Ú_closeÆ  s   zSQLAsserter._closec                 G  sl   t |Ž }t| jƒ}|r#| d¡}| |¡ |jrn
|jr!J |jƒ‚|s|r+J d| ƒ‚|js4| ¡  d S d S )Nr   Fz$Additional SQL statements remain:
%s)rŸ   rV   r¬   r!   r   r   r   r   )r   r˜   rž   Úobservedr   r
   r
   r   Úassert_Ê  s   



úÿzSQLAsserter.assert_N)r   r   r   r   r­   r¯   r
   r
   r
   r   rª   Â  s    rª   c                 #  s–   � t ƒ ‰ g ‰t | d¡‡fdd„ƒ}t | d¡‡ ‡fdd„ƒ}zˆ V  W t | d|¡ t | d|¡ ˆ  ¡  d S t | d|¡ t | d|¡ ˆ  ¡  w )NÚbefore_executec                   s   |||fˆ d d …< d S r	   r
   )ÚconnrM   r¥   r   rK   )Úorigr
   r   Úconnection_executeá  s   z)assert_engine.<locals>.connection_executeÚafter_cursor_executec                   sj   |sd S ˆ j rˆ j d j|u rˆ j d }nt|ˆd ˆd ˆd ƒ}ˆ j  |¡ |j t||||ƒ¡ d S )Néÿÿÿÿr   r€   r   )r«   rJ   r¤   Úappendr   r¨   )r±   Úcursorr   r    rJ   r©   Úobs©Úasserterr²   r
   r   Úcursor_executeé  s   ÿÿÿz%assert_engine.<locals>.cursor_execute)rª   r   Úlistens_forÚremover­   )Úenginer³   r»   r
   r¹   r   Úassert_engineÛ  s   €

þ
r¿   )Ú
__future__r   ÚcollectionsÚ
contextlibr‹   r+   r*   r   r¾   r   Úengine.defaultr   Úschemar   r   r   r   r$   rk   rq   r�   r•   rŸ   r    r£   r¤   Ú
namedtupler¨   rª   Úcontextmanagerr¿   r
   r
   r
   r   Ú<module>   s>   	 (L
þÿ	