U
    `»{j)O  ã                   @  s(  U d Z ddlm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 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 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Zded< dZded< dZded< G dd„ deƒZ dddœdd„Z!dddœdd „Z"d!dd"œd#d$„Z#d%d&d'œd(d)„Z$d%d&d'œd*d+„Z%d%d&d'œd,d-„Z&d%d&d'œd.d/„Z'd%d&d0œd1d2„Z(d%d&d0œd3d4„Z)d%d&d0œd5d6„Z*d%d&d0œd7d8„Z+d9d&d0œd:d;„Z,dgdd%d%d&d=d>œd?d@„Z-dhd%d%ddAddBœdCdD„Z.didddAddEœdFdG„Z/djdHdHddAddBœdIdJ„Z0dkdKdKddAddBœdLdM„Z1dldNdNddAddBœdOdP„Z2dmdNdNddAddBœdQdR„Z3dndNdNddAddBœdSdT„Z4dodNdNddAddBœdUdV„Z5dpdNdNddAddBœdWdX„Z6ddNdNdddYœdZd[„Z7dqd\d\ddAddBœd]d^„Z8d%d%ddAddBœd_d`„Z9drdddAddaœdbdc„Z:d&ddœdedf„Z;dS )sz"Utilities for assertion debugging.é    )ÚannotationsN)ÚAbstractSet)ÚAny)ÚCallable)ÚIterable)ÚLiteral)ÚMapping)ÚProtocol)ÚSequence)Ú	normalize)Úoutcomes)ÚPrettyPrinter)Úsaferepr)Úsaferepr_unlimited)ÚConfigz2Callable[[str, object, object], str | None] | NoneÚ_reprcomparez&Callable[[int, str, str], None] | NoneÚ_assertion_passzConfig | NoneÚ_configc                   @  s    e Zd Zdddddœdd„ZdS )	Ú_HighlightFuncÚpythonÚstrzLiteral[('diff', 'python')])ÚsourceÚlexerÚreturnc                 C  s   dS )z'Apply highlighting to the given source.N© )Úselfr   r   r   r   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/_pytest/assertion/util.pyÚ__call__*   s    z_HighlightFunc.__call__N)r   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   )   s   r   r   )Úexplanationr   c                 C  s   t | ƒ}t|ƒ}d |¡S )aŠ  Format an explanation.

    Normally all embedded newlines are escaped, however there are
    three exceptions: \n{, \n} and \n~.  The first two are intended
    cover nested explanations, see function and attribute explanations
    for examples (.visit_Call(), visit_Attribute()).  The last one is
    for when one explanation needs to span multiple lines, e.g. when
    displaying diffs.
    Ú
)Ú_split_explanationÚ_format_linesÚjoin)r!   ÚlinesÚresultr   r   r   Úformat_explanation.   s    
r(   z	list[str]c                 C  s^   | pd  d¡}|d g}|dd… D ]4}|rD|d dkrD| |¡ q$|d  d| 7  < q$|S )	zãReturn a list of individual lines in the explanation.

    This will return a list of lines split on '\n{', '\n}' and '\n~'.
    Any other newlines will be escaped and appear in the line as the
    literal '\n' characters.
    Ú r"   r   é   N)Ú{Ú}ú~ú>éÿÿÿÿz\n)ÚsplitÚappend)r!   Z	raw_linesr&   Úvaluesr   r   r   r#   =   s    
r#   zSequence[str])r&   r   c                 C  sH  t | dd… ƒ}dg}dg}| dd… D �]}| d¡rž|d rFd}nd}| t|ƒ¡ |d  d7  < | d¡ | dd	t|ƒd   | |dd…  ¡ q(| d
¡rÖ| ¡  | ¡  ||d   |dd… 7  < q(|d dksæt‚|d  d7  < | d¡�r
t|ƒn
t|ƒd }| d	| |dd…  ¡ q(t|ƒdk�sDt‚|S )a  Format the individual lines.

    This will replace the '{', '}' and '~' characters of our mini formatting
    language with the proper 'where ...', 'and ...' and ' + ...' text, taking
    care of indentation along the way.

    Return a list of formatted lines.
    Nr*   r   r+   r/   zand   zwhere z +ú  r,   )r-   r.   r-   )ÚlistÚ
startswithr1   ÚlenÚpopÚAssertionError)r&   r'   ÚstackZstackcntÚlineÚsÚindentr   r   r   r$   N   s,    	

,
 r$   r   Úbool)Úxr   c                 C  s   t | tjjƒot | tƒ S ©N)Ú
isinstanceÚcollectionsÚabcr
   r   ©r>   r   r   r   Ú
issequenceq   s    rD   c                 C  s
   t | tƒS r?   )r@   r   rC   r   r   r   Úistextu   s    rE   c                 C  s
   t | tƒS r?   )r@   ÚdictrC   r   r   r   Úisdicty   s    rG   c                 C  s   t | ttfƒS r?   )r@   ÚsetÚ	frozensetrC   r   r   r   Úisset}   s    rJ   )Úobjr   c                 C  s   t | tƒot| dd ƒd k	S )NÚ_fields)r@   ÚtupleÚgetattr©rK   r   r   r   Úisnamedtuple�   s    rP   c                 C  s   t | dd ƒd k	S )NÚ__dataclass_fields__©rN   rO   r   r   r   Ú	isdatacls…   s    rS   c                 C  s   t | dd ƒd k	S )NÚ__attrs_attrs__rR   rO   r   r   r   Úisattrs‰   s    rU   c                 C  s0   zt | ƒ t| ƒ W S  tk
r*   Y dS X d S )NF)ÚiterrE   Ú	ExceptionrO   r   r   r   Ú
isiterable�   s
    rX   Úobjectc                 C  s@   t | jdƒr<t | jjdƒr<| jjj}t| ƒr4d|kS |dkS dS )a�  Check if an instance of an object contains the default eq

    First, we check if the object's __eq__ attribute has __code__,
    if so, we check the equally of the method code filename (__code__.co_filename)
    to the default one generated by the dataclass and attr module
    for dataclasses the default co_filename is <string>, for attrs class, the __eq__ should contain "attrs eq generated"
    Ú__code__Úco_filenamezattrs generated eqz<string>T)ÚhasattrÚ__eq__rZ   r[   rU   )rK   Zcode_filenamer   r   r   Úhas_default_eq•   s    
r^   Fzlist[str] | None)ÚopÚleftÚrightÚ	use_asciir   c                 C  sD  |   tj¡}t|tƒo2t|tƒo2td|ƒtd|ƒk}|dkrVt||d�}t||d�}n0dt|ƒ d d }t|||d�}t|||d�}|› d|› d|› �}	|  	¡ j
}
d}�z |d	krÆt|||
|ƒ}�n|d
krìt|ƒrêt|ƒrêt|||ƒ}nÜ|dk�rt|ƒ�rÈt|ƒ�rÈdg}n¶|dk�r@t|ƒ�rÈt|ƒ�rÈt|||
|ƒ}nˆ|dk�rnt|ƒ�rÈt|ƒ�rÈt|||
|ƒ}nZ|dk�rœt|ƒ�rÈt|ƒ�rÈt|||
|ƒ}n,|dk�rÈt|ƒ�rÈt|ƒ�rÈt|||
|ƒ}W nN tjk
�rä   ‚ Y n6 tk
�r   tjj ¡  ¡ }d|› d�dg}Y nX |�s$dS |d dk�r:d|•}|	f|•S )z<Return specialised explanations for some operators/operands.ZNFDr*   )rb   éA   é   )Úmaxsizerb   ú Nz==znot inz!=úBoth sets are equalz>=z<=r.   ú<z<(pytest_assertion plugin: representation of details failed: Ú.z+ Probably an object has a faulty __repr__.)r   r)   )r)   )Zget_verbosityr   ZVERBOSITY_ASSERTIONSr@   r   r   r   r6   r   Zget_terminal_writerÚ
_highlightÚ_compare_eq_anyrE   Ú_notin_textrJ   Ú_compare_gte_setÚ_compare_lte_setÚ_compare_gt_setÚ_compare_lt_setr   ZExitrW   Ú_pytestÚ_codeZExceptionInfoZfrom_currentZ_getreprcrash)Úconfigr_   r`   ra   rb   ÚverboseZ	left_reprZ
right_reprre   ÚsummaryÚhighlighterr!   Z
repr_crashr   r   r   Úassertrepr_compareª   sd    
ÿýþ






þ
rw   Úint)r`   ra   rv   rt   r   c           	      C  s>  g }t | ƒr$t |ƒr$t| ||ƒ}�nddlm} t| |ƒsDt||ƒrtt| |ƒrR| n|}t| |ƒrd|n| }| |¡}nšt| ƒt|ƒkr¬t| ƒsœt| ƒsœt	| ƒr¬t
| |||ƒ}nbt| ƒrÌt|ƒrÌt| |||ƒ}nBt| ƒrìt|ƒrìt| |||ƒ}n"t| ƒ�rt|ƒ�rt| |||ƒ}t| ƒ�r:t|ƒ�r:t| |||ƒ}| |¡ |S )Nr   )Ú
ApproxBase)rE   Ú
_diff_textZ_pytest.python_apiry   r@   Z_repr_compareÚtyperS   rU   rP   Ú_compare_eq_clsrD   Ú_compare_eq_sequencerJ   Ú_compare_eq_setrG   Ú_compare_eq_dictrX   Ú_compare_eq_iterableÚextend)	r`   ra   rv   rt   r!   ry   Zapprox_sideZ
other_sideZexplr   r   r   rk   ð   s4    ÿÿÿ
rk   )r`   ra   rt   r   c                 C  s\  ddl m} g }|dk rúd}ttt| ƒt|ƒƒƒD ]}| | || kr2 qLq2|dkr‚|d8 }d|› d�g}| |d… } ||d… }t| ƒt|ƒkrútt| ƒƒD ]}| |  ||  krž q¼qž|dkrú|d8 }|d|› d	�g7 }| d| … } |d| … }d
}|  ¡ �s| ¡ �r4tt| ƒƒ} tt|ƒƒ}|dg7 }|dd„ || |¡|  |¡ƒD ƒ7 }|S )zµReturn the explanation for the diff between text.

    Unless --verbose is used this will skip leading and trailing
    characters which are identical to keep the diff minimal.
    r   )Úndiffr*   é*   é
   z	Skipping z5 identical leading characters in diff, use -v to showNz6 identical trailing characters in diff, use -v to showTz;Strings contain only whitespace, escaping them using repr()c                 S  s   g | ]}|  d ¡‘qS )r"   )Ústrip©Ú.0r:   r   r   r   Ú
<listcomp>>  s   ÿz_diff_text.<locals>.<listcomp>)	Údifflibr‚   ÚrangeÚminr6   ÚisspaceÚreprr   Ú
splitlines)r`   ra   rt   r‚   r!   ÚiÚkeependsr   r   r   rz     sB    
ÿ
ÿ
þrz   zIterable[Any]c              
   C  sv   |dkrt ƒ sdgS dd l}tƒ  | ¡ ¡ }tƒ  |¡ ¡ }ddg}| |d dd„ | ||¡D ƒ¡dd	� ¡ ¡ |S )
Nr   zUse -v to get more diffr)   z
Full diff:r"   c                 s  s   | ]}|  ¡ V  qd S r?   )Úrstripr†   r   r   r   Ú	<genexpr>X  s   ÿz'_compare_eq_iterable.<locals>.<genexpr>Údiff)r   )Úrunning_on_cir‰   r   ÚpformatrŽ   r�   r%   r‚   )r`   ra   rv   rt   r‰   Zleft_formattingZright_formattingr!   r   r   r   r€   E  s    

þûÿ	r€   zSequence[Any]c                 C  s:  t | tƒot |tƒ}g }t| ƒ}t|ƒ}tt||ƒƒD ]z}| | || kr6|rp| ||d … }	|||d … }
n| | }	|| }
| d|› d|t|	ƒƒ› d|t|
ƒƒ› �¡  q²q6|rº|S || }|�r6|dkrâd}t| | ƒ}nd| }d}t|| ƒ}|dk�r||› d||ƒ› �g7 }n|d	||||ƒf g7 }|S )
Nr*   z	At index z diff: ú != r   ZLeftZRightz contains one more item: z/%s contains %d more items, first extra item: %s)r@   Úbytesr6   rŠ   r‹   r1   r�   r   )r`   ra   rv   rt   Zcomparing_bytesr!   Zlen_leftZ	len_rightr�   Z
left_valueZright_valueZlen_diffZdir_with_moreÚextrar   r   r   r}   b  sF    	$ÿ
ÿÿÿr}   zAbstractSet[Any]c                 C  s0   g }|  td| ||ƒ¡ |  td|| |ƒ¡ |S )Nr`   ra   )r�   Ú_set_one_sided_diff©r`   ra   rv   rt   r!   r   r   r   r~   Ÿ  s    r~   c                 C  s   t | ||ƒ}|sdgS |S ©Nrg   )rm   rš   r   r   r   ro   «  s    ro   c                 C  s   t | ||ƒ}|sdgS |S r›   )rn   rš   r   r   r   rp   ·  s    rp   c                 C  s   t d|| |ƒS )Nra   ©r™   ©r`   ra   rv   rt   r   r   r   rm   Ã  s    rm   c                 C  s   t d| ||ƒS )Nr`   rœ   r�   r   r   r   rn   Ì  s    rn   )ÚposnÚset1Úset2rv   r   c                 C  sB   g }|| }|r>|  d| › d�¡ |D ]}|  |t|ƒƒ¡ q&|S )NzExtra items in the z set:)r1   r   )rž   rŸ   r    rv   r!   r“   Úitemr   r   r   r™   Õ  s    r™   zMapping[Any, Any]c                   s”  g }t ˆ ƒ}t ˆƒ}| |¡}‡ ‡fdd„|D ƒ}|rV|dk rV|dt|ƒ› d�g7 }n$|rz|dg7 }||t |¡ƒ ¡ 7 }‡ ‡fdd„|D ƒ}	|	rØ|d	g7 }|	D ]6}
||t|
ˆ |
 iƒƒd
 |t|
ˆ|
 iƒƒ g7 }q || }t|ƒ}|�r4| d||dk�rdndf ¡ | |t ‡ fdd„|D ƒ¡ƒ ¡ ¡ || }t|ƒ}|�r�| d||dk�r`dndf ¡ | |t ‡fdd„|D ƒ¡ƒ ¡ ¡ |S )Nc                   s&   i | ]}ˆ | ˆ| kr|ˆ | “qS r   r   ©r‡   Úk©r`   ra   r   r   Ú
<dictcomp>î  s       z$_compare_eq_dict.<locals>.<dictcomp>rd   ú	Omitting ú! identical items, use -vv to showzCommon items:c                   s    h | ]}ˆ | ˆ| kr|’qS r   r   r¢   r¤   r   r   Ú	<setcomp>ô  s      z#_compare_eq_dict.<locals>.<setcomp>zDiffering items:r–   zLeft contains %d more item%s:r*   r)   r;   c                   s   i | ]}|ˆ | “qS r   r   r¢   )r`   r   r   r¥     s      zRight contains %d more item%s:c                   s   i | ]}|ˆ | “qS r   r   r¢   )ra   r   r   r¥     s      )	rH   Úintersectionr6   Úpprintr•   rŽ   r   r1   r�   )r`   ra   rv   rt   r!   Zset_leftZ	set_rightÚcommonÚsamer“   r£   Z
extra_leftZlen_extra_leftZextra_rightZlen_extra_rightr   r¤   r   r   ä  sX    


ÿþÿÿÿÿÿÿÿr   c                   s°  t | ƒsg S t| ƒr6dd l}| | ¡}dd„ |D ƒ}n6t| ƒrT| j}dd„ |D ƒ}nt| ƒrd| j}ndslt‚d‰ g }g }|D ].}	t	| |	ƒt	||	ƒkr | 
|	¡ q|| 
|	¡ q|g }
|s¸|rÂ|
dg7 }
|ræ|dk ræ|
 
d	t|ƒ› d
�¡ n&|�r|
dg7 }
|
|t |¡ƒ ¡ 7 }
|�r¬|
dg7 }
|
|t |¡ƒ ¡ 7 }
|D ]t}	t	| |	ƒ}t	||	ƒ}|
dd|	› d�ˆ › |	› d|t|ƒƒ› d|t|ƒƒ› �g7 }
|
‡ fdd„t||||ƒD ƒ7 }
�q6|
S )Nr   c                 S  s   g | ]}|j r|j‘qS r   )ÚcompareÚname)r‡   Úinfor   r   r   rˆ     s      z#_compare_eq_cls.<locals>.<listcomp>c                 S  s   g | ]}t |d ƒr|j‘qS )Úeq)rN   r®   )r‡   Úfieldr   r   r   rˆ      s     
 Fr3   r)   rd   r¦   r§   zMatching attributes:zDiffering attributes:z$Drill down into differing attribute ú:z: r–   c                   s   g | ]}ˆ | ‘qS r   r   r†   ©r<   r   r   rˆ   B  s   ÿ)r^   rS   ÚdataclassesÚfieldsrU   rT   rP   rL   r8   rN   r1   r6   rª   r•   rŽ   r�   rk   )r`   ra   rv   rt   r´   Z
all_fieldsZfields_to_checkr¬   r“   r±   r!   Z
field_leftZfield_rightr   r³   r   r|     s^    






&ý   ÿþr|   )ÚtermÚtextrt   r   c           
      C  s¤   |  | ¡}|d |… }||t| ƒ d … }|| }t|||ƒ}t| dd�› d�g}|D ]H}	|	 d¡rfqV|	 d¡rrqV|	 d¡r”| d|	dd …  ¡ qV| |	¡ qV|S )	Nrƒ   )re   z is contained here:ZSkippingz- z+ r3   rd   )Úfindr6   rz   r   r5   r1   )
r¶   r·   rt   ÚindexÚheadÚtailZcorrect_textr“   Znewdiffr:   r   r   r   rl   K  s    



rl   )r   c                  C  s   ddg} t dd„ | D ƒƒS )z0Check if we're currently running on a CI system.ÚCIZBUILD_NUMBERc                 s  s   | ]}|t jkV  qd S r?   )ÚosÚenviron)r‡   Úvarr   r   r   r’   a  s     z running_on_ci.<locals>.<genexpr>)Úany)Zenv_varsr   r   r   r”   ^  s    r”   )F)r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )<Ú__doc__Ú
__future__r   Úcollections.abcrA   r½   rª   Útypingr   r   r   r   r   r   r	   r
   Úunicodedatar   rq   r   Z_pytest._codeZ_pytest._io.pprintr   Z_pytest._io.safereprr   r   Z_pytest.configr   r   Ú__annotations__r   r   r   r(   r#   r$   rD   rE   rG   rJ   rP   rS   rU   rX   r^   rw   rk   rz   r€   r}   r~   ro   rp   rm   rn   r™   r   r|   rl   r”   r   r   r   r   Ú<module>   sx   # ÿG ÿ%4 ü! üA ü ü ü ü ü	 ü07