a
    *ñ»jéP  ã                   @  s>  U d 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dlm	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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!dkd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/d0„Z'd*d+d,œd1d2„Z(d*d+d,œd3d4„Z)d*d+d5œd6d7„Z*d*d+d5œd8d9„Z+d*d+d5œd:d;„Z,d*d+d5œd<d=„Z-d>d+d5œd?d@„Z.dldd*d*d+dBdCœdDdE„Z/dmd*d*ddFd#dGœdHdI„Z0dnddddFd#dGœdJdK„Z1dodLdLddFd#dGœdMdN„Z2dpdOdOddFd#dGœdPdQ„Z3dqdRdRddFd#dGœdSdT„Z4drdRdRddFd#dGœdUdV„Z5dsdRdRddFd#dGœdWdX„Z6dtdRdRddFd#dGœdYdZ„Z7dudRdRddFd#dGœd[d\„Z8ddRdRdd#d]œd^d_„Z9dvd`d`ddFd#dGœdadb„Z:d*d*ddFd#dGœdcdd„Z;dwdddFd#deœdfdg„Z<d+dhœdidj„Z=dS )xz"Utilities for assertion debugging.é    )ÚannotationsN)ÚCallable)ÚIterable)ÚMapping)ÚSequence)ÚSet)ÚAny)ÚLiteral)ÚProtocol)Ú	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ÚstrúLiteral['diff', 'python']©ÚsourceÚlexerÚreturnc                 C  s   dS )z'Apply highlighting to the given source.N© )Úselfr   r   r   r   ú<E:\soccer\ml_env\Lib\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   r   r   r   c                 C  s   | S )z‘Dummy highlighter that returns the text unprocessed.

    Needed for _notin_text, as the diff gets post-processed to only show the "+" part.
    r   )r   r   r   r   r   Údummy_highlighter.   s    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_explanation6   s    
r+   z	list[str]c                 C  s^   | pd  d¡}|d g}|dd… D ]4}|rD|d dv 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&   E   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v sæJ ‚|d  d7  < | d¡�r
t|ƒn
t|ƒd }| d	| |dd…  ¡ q(t|ƒdk�sDJ ‚|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.   r2   zand   zwhere z +ú  r/   )r0   r1   r0   )ÚlistÚ
startswithr4   ÚlenÚpop)r)   r*   ÚstackZstackcntÚlineÚsÚindentr   r   r   r'   V   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   Ú
issequencey   s    rF   c                 C  s
   t | tƒS rA   )rB   r   rE   r   r   r   Úistext}   s    rG   c                 C  s
   t | tƒS rA   )rB   ÚdictrE   r   r   r   Úisdict�   s    rI   c                 C  s   t | ttfƒS rA   )rB   ÚsetÚ	frozensetrE   r   r   r   Úisset…   s    rL   )Úobjr   c                 C  s   t | tƒot| dd ƒd uS )NÚ_fields)rB   ÚtupleÚgetattr©rM   r   r   r   Úisnamedtuple‰   s    rR   c                 C  s   t | dd ƒd uS )NÚ__dataclass_fields__©rP   rQ   r   r   r   Ú	isdatacls�   s    rU   c                 C  s   t | dd ƒd uS )NÚ__attrs_attrs__rT   rQ   r   r   r   Úisattrs‘   s    rW   c                 C  s.   zt | ƒ t| ƒ W S  ty(   Y dS 0 d S )NF)ÚiterrG   Ú	ExceptionrQ   r   r   r   Ú
isiterable•   s
    rZ   Úobjectc                 C  s@   t | jdƒr<t | jjdƒr<| jjj}t| ƒr4d|v 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 z<string>T)ÚhasattrÚ__eq__r\   r]   rW   )rM   Zcode_filenamer   r   r   Úhas_default_eq�   s    
r`   Fzlist[str] | None)ÚopÚleftÚrightÚ	use_asciir   c                 C  sB  |   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 nJ tj�yâ   ‚ Y n4 t�y   tjj ¡  ¡ }d|› d�dg}Y n0 |�s dS |d dk�r8dg|¢}|	g|¢S )z<Return specialised explanations for some operators/operands.ZNFDr-   )rd   éA   é   )Úmaxsizerd   ú Nz==znot inz!=úBoth sets are equalz>=z<=r1   ú<z<(pytest_assertion plugin: representation of details failed: Ú.z+ Probably an object has a faulty __repr__.)r   r,   )Zget_verbosityr   ZVERBOSITY_ASSERTIONSrB   r   r   r   r9   r   Zget_terminal_writerÚ
_highlightÚ_compare_eq_anyrG   Ú_notin_textrL   Ú_compare_gte_setÚ_compare_lte_setÚ_compare_gt_setÚ_compare_lt_setr   ZExitrY   Ú_pytestÚ_codeZExceptionInfoZfrom_currentZ_getreprcrash)Úconfigra   rb   rc   rd   ÚverboseZ	left_reprZ
right_reprrg   ÚsummaryÚhighlighterr$   Z
repr_crashr   r   r   Úassertrepr_compare²   sd    
ÿýþ






þ

ry   Úint)rb   rc   rx   rv   r   c           	      C  s@  g }t | ƒr&t |ƒr&t| |||ƒ}�nddlm} t| |ƒsFt||ƒrvt| |ƒrT| n|}t| |ƒrf|n| }| |¡}nšt| ƒt|ƒu 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)rG   Ú
_diff_textZ_pytest.python_apir{   rB   Z_repr_compareÚtyperU   rW   rR   Ú_compare_eq_clsrF   Ú_compare_eq_sequencerL   Ú_compare_eq_setrI   Ú_compare_eq_dictrZ   Ú_compare_eq_iterableÚextend)	rb   rc   rx   rv   r$   r{   Zapprox_sideZ
other_sideZexplr   r   r   rm   ø   s4    ÿÿÿ
rm   c                 C  sp  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„ || 
|¡|  
|¡ƒD ƒ¡dd� 
¡ ¡ |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()r%   c                 s  s   | ]}|  d ¡V  qdS )r%   N)Ústrip©Ú.0r<   r   r   r   Ú	<genexpr>J  s   ÿz_diff_text.<locals>.<genexpr>Údiff©r   )Údifflibr„   ÚrangeÚminr9   ÚisspaceÚreprr   rƒ   r(   Ú
splitlines)rb   rc   rx   rv   r„   r$   ÚiÚkeependsr   r   r   r|     sL    
ÿ
ÿ

þûÿ	r|   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 rA   )Úrstriprˆ   r   r   r   rŠ   g  s   ÿz'_compare_eq_iterable.<locals>.<genexpr>r‹   rŒ   )Úrunning_on_cir�   r   Úpformatr’   rƒ   r(   r„   )rb   rc   rx   rv   r�   Zleft_formattingZright_formattingr$   r   r   r   r‚   T  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 || }|�r<|dkrâd}t| | ƒ}nd| }d}t|| ƒ}|dk�r||› d||ƒ› �g7 }n||› d	|› d
||ƒ› �g7 }|S )Nr-   z	At index z diff: ú != r   ÚLeftÚRightz contains one more item: z
 contains z more items, first extra item: )rB   Úbytesr9   rŽ   r�   r4   r‘   r   )rb   rc   rx   rv   Zcomparing_bytesr$   Zlen_leftZ	len_rightr“   Z
left_valueZright_valueZlen_diffZdir_with_moreÚextrar   r   r   r   q  sJ    	
ÿ
ÿÿ
ÿÿr   zAbstractSet[Any]c                 C  s0   g }|  td| ||ƒ¡ |  td|| |ƒ¡ |S )Nrb   rc   )rƒ   Ú_set_one_sided_diff©rb   rc   rx   rv   r$   r   r   r   r€   ­  s    r€   c                 C  s   t | ||ƒ}|sdgS |S ©Nri   )ro   rž   r   r   r   rq   ¹  s    rq   c                 C  s   t | ||ƒ}|sdgS |S rŸ   )rp   rž   r   r   r   rr   Å  s    rr   c                 C  s   t d|| |ƒS )Nrc   ©r�   ©rb   rc   rx   rv   r   r   r   ro   Ñ  s    ro   c                 C  s   t d| ||ƒS )Nrb   r    r¡   r   r   r   rp   Ú  s    rp   )ÚposnÚset1Úset2rx   r   c                 C  sB   g }|| }|r>|  d| › d�¡ |D ]}|  |t|ƒƒ¡ q&|S )NzExtra items in the z set:)r4   r   )r¢   r£   r¤   rx   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|ƒ}|�r:| d|› d|dk�rdnd› d�¡ | |t ‡ fdd„|D ƒ¡ƒ ¡ ¡ || }t|ƒ}|�rœ| d|› d|dk�rjdnd› d�¡ | |t ‡fdd„|D ƒ¡ƒ ¡ ¡ |S )Nc                   s&   i | ]}ˆ | ˆ| kr|ˆ | “qS r   r   ©r‰   Úk©rb   rc   r   r   Ú
<dictcomp>ü  ó    z$_compare_eq_dict.<locals>.<dictcomp>rf   ú	Omitting ú! identical items, use -vv to showzCommon items:c                   s    h | ]}ˆ | ˆ| kr|’qS r   r   r¦   r¨   r   r   Ú	<setcomp>  rª   z#_compare_eq_dict.<locals>.<setcomp>zDiffering items:r˜   zLeft contains z
 more itemr-   r,   r=   ú:c                   s   i | ]}|ˆ | “qS r   r   r¦   )rb   r   r   r©     rª   zRight contains c                   s   i | ]}|ˆ | “qS r   r   r¦   )rc   r   r   r©     rª   )	rJ   Úintersectionr9   Úpprintr—   r’   r   r4   rƒ   )rb   rc   rx   rv   r$   Zset_leftZ	set_rightÚcommonÚsamer‹   r§   Z
extra_leftZlen_extra_leftZextra_rightZlen_extra_rightr   r¨   r   r�   ò  sP    


ÿþÿÿÿÿÿ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slJ ‚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   Ú
<listcomp>)  rª   z#_compare_eq_cls.<locals>.<listcomp>c                 S  s   g | ]}t |d ƒr|j‘qS )Úeq)rP   r´   )r‰   Úfieldr   r   r   r¶   ,  rª   Fr6   r,   rf   r«   r¬   zMatching attributes:zDiffering attributes:z$Drill down into differing attribute r®   z: r˜   c                   s   g | ]}ˆ | ‘qS r   r   rˆ   ©r>   r   r   r¶   N  s   ÿ)r`   rU   ÚdataclassesÚfieldsrW   rV   rR   rN   rP   r4   r9   r°   r—   r’   r‘   rm   )rb   rc   rx   rv   rº   Z
all_fieldsZfields_to_checkr²   r‹   r¸   r$   Z
field_leftZfield_rightr   r¹   r   r~      sX    






&ýÿþr~   )ÚtermÚtextrv   r   c           
      C  s¦   |  | ¡}|d |… }||t| ƒ d … }|| }t||t|ƒ}t| dd�› d�g}|D ]H}	|	 d¡rhqX|	 d¡rtqX|	 d¡r–| d|	dd …  ¡ qX| |	¡ qX|S )	Nr…   )rg   z is contained here:ZSkippingz- z+ r6   rf   )Úfindr9   r|   r#   r   r8   r4   )
r¼   r½   rv   ÚindexÚheadÚtailZcorrect_textr‹   Znewdiffr<   r   r   r   rn   W  s    



rn   )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v V  qd S rA   )ÚosÚenviron)r‰   Úvarr   r   r   rŠ   m  rª   z running_on_ci.<locals>.<genexpr>)Úany)Zenv_varsr   r   r   r–   j  s    r–   )r   )F)r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )>Ú__doc__Ú
__future__r   Úcollections.abcrC   r   r   r   r   r   ÚAbstractSetrÃ   r°   Útypingr   r	   r
   Úunicodedatar   rs   r   Z_pytest._codeZ_pytest._io.pprintr   Z_pytest._io.safereprr   r   Z_pytest.configr   r   Ú__annotations__r   r   r   r#   r+   r&   r'   rF   rG   rI   rL   rR   rU   rW   rZ   r`   ry   rm   r|   r‚   r   r€   rq   rr   ro   rp   r�   r�   r~   rn   r–   r   r   r   r   Ú<module>   s|   # ÿG ÿ& ÿ; ü! ü@ ü ü ü ü ü	 ü.7