j7iQP UdZddlmZddlZddlmZddlmZddlmZddlmZddlm Z ddl Z dd l m Z dd l mZdd l mZdd lmZdd lmZddlZddlmZddlmZddlmZddlmZddlmZdZded<dZ ded<dZ!ded<GddeZ"d6d7dZ#d8dZ$d9dZ%d:dZ&d;dZ'd;d Z(d;d!Z)d;d"Z*d d?d(Z0 d@ dAd)Z1 d@ dBd*Z2 d@ dCd+Z3 d@ dDd,Z4 d@ dEd-Z5 d@ dEd.Z6 d@ dEd/Z7 d@ dEd0Z8 d@ dEd1Z9 dFd2Z: d@ dGd3Z; dAd4Zz\n)splitappend)r/ raw_linesr0valuess rr,r,Esm"))$/I q\NEAB-( fQi#77 LL "I 'I ( Lrct|dd}dg}dg}|ddD]"}|jdro|drd}nd}|jt||dxxdz cc<|jd|jdd t|dz zz|z|ddz|jd r4|j |j ||dxx|ddz cc<|dd vsJ|dxxdz cc<|jd r t|n t|dz }|jd |z|ddz%t|dk(sJ|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. Nr5rr6r:zand zwhere z + r7)r8r9r8)list startswithr<lenpop)r0r1stackstackcntlinesindents rr-r-VsR%)_F CEsHab 4 ??3 | LLV % RLA L OOA  MM$Ua!881, for attrs class, the __eq__ should contain "attrs eq generated" __code__ co_filenamezattrs generated zT)hasattr__eq__rnrorh)r` code_filenames rhas_default_eqrssZszz:&73::3F3F +V ++77 3<%6 6 ** rc|jtj}t|txr+t|txrt d|t d|k(}|dkDrt ||}t ||}n0dt|z dz dz}t|||}t|||}|d|d|} |jj} d} |d k(rt||| |} n|d k(r$t|rt|rt|||} n|d k(rt|rt|rd g} n|d k(r%t|rt|rt||| |} n}|dk(r%t|rmt|rbt!||| |} nS|dk(r%t|rCt|r8t#||| |} n)|dk(r$t|rt|rt%||| |} | sy| ddk7rdg| } | g| S#t&j($rt*$rAt,j.j0j3j5} d| ddg} YqwxYw)z=z<=r9#>?G 4 > uc " > eT "iu&= = {&tyA 'C c"g  ! T7iH eW J  1RD*.G,,.99KK :)${GLK 8^d|u )$w? 4ZT{uU|45 4ZT{uU|.tUKQ 4ZT{uU|.tUKQ 3YT{uU|-dE;P 3YT{uU|-dE;P  1~(K(  "k "" ==  ]]00==?MMO J:,VW X 9  sDG,,AI I cg}t|rt|rt||||}|Sddlm}t ||s t ||r2t ||r|n|}t ||r|n|}|j |}nt |t |ur0t|st|s t|rt||||}nnt|rt|rt||||}nIt|rt|rt||||}n$t|rt|rt!||||}t#|r*t#|rt%||||}|j'||S)Nr) ApproxBase)rS _diff_text_pytest.python_apirrL _repr_comparetypererhra_compare_eq_clsrQ_compare_eq_sequencerZ_compare_eq_setrV_compare_eq_dictrl_compare_eq_iterableextend) rrrrr/r approx_side other_sideexpls rrrs8K d|u  uk7C : 7 2 dJ ':eZ+H",T:">$EK",T:">DJ%33J?K $Z4; & dOwt} T0B *${GLK  *U"3.tUKQK 4[U5\)${GLK D\fUm*4 WMK d  5 1'e['JD   t $ rc ddlm}g}|dkrd}ttt |t |D]}||||k7sn|dkDr|dz}d|dg}||d}||d}t |t |k(rHtt |D]}|| || k7sn|dkDr|dz}|d|d gz }|d| }|d| }d }|j s|j r.t t|}t t|}|d gz }|j|d jd ||j||j|Ddj|S)zReturn 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)ndiffr5* 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+c3>K|]}|jdyw)r+N)strip.0rGs r z_diff_text..Js! 4 sdiffr) difflibrrangeminrCisspacereprr#rr. splitlines)rrrrrr/ikeependss rrrsK{ s3t9c%j12 AAw%("  r6 GAA3STK8D!"IE t9E "3t9% 8uaRy( 2vRs#99  CaRycr H ||~CISZ UVV  II!%"2"28"WX   *, rc p|dkr tsdgSddl}tj|j }tj|j }ddg}|j |dj d|j||Ddj |S) NrzUse -v to get more diffr4z Full diff:r+c3<K|]}|jywrK)rstriprs rrz'_compare_eq_iterable..gs srr)rrrpformatrrr.r)rrrrrleft_formattingright_formattingr/s rrrTs !|MO)**#o--d3>>@O$..u5@@B|$K II#MM*:OL   *, rc 6t|txrt|t}g}t|}t|}tt ||D]d}||||k7s|r|||dz} |||dz} n ||} ||} |j d|d|t | d|t | n|r|S||z } | rW| dkDrd} t||} nd| z } d} t||} | dk(r|| d|| gz }|S|| d | d || gz }|S) Nr5z At index z diff:  != rLeftRightz contains one more item: z contains z more items, first extra item: )rLbytesrCrrr<rr)rrrrcomparing_bytesr/len_left len_rightr left_value right_valuelen_diff dir_with_moreextras rrrqs !u-J*UE2JOK4yHE I 3x+ , 7eAh "!a!e_ #AA. !!W #Ah   A3Z 012${4 CT7U6VX  +.)#H a<"MT)_-E8|H#MU8_-E q=  /!:;u;M:NO K   /H:5TU`afUgThi K rc~g}|jtd||||jtd||||S)Nrr)r_set_one_sided_diffrrrrr/s rrrsC K*64 LM*7E4MN rc*t|||}|sdgS|SNr{)rrs rrr$ #4 : ; < rc g}t|}t|}|j|}|Dcic]}||||k(s|||} }| r|dkr|dt| dgz }n4| r2|dgz }||tj| j z }|Dchc]}||||k7s|} }| rA|dgz }| D]6}||t |||idz|t |||izgz }8||z } t| } | ri|jd| d| d k(rd nd d |j|tj| Dcic]}||| c}j ||z } t| }|ri|jd |d|d k(rd nd d |j|tj| Dcic]}||| c}j |Scc}wcc}wcc}wcc}w)Nrx Omitting ! identical items, use -vv to showz Common items:zDiffering items:rzLeft contains z more itemr5r4rH:zRight contains ) rX intersectionrCpprintrrrr<r)rrrrr/set_left set_rightcommonksamer extra_leftlen_extra_left extra_rightlen_extra_rights rrrsW  K4yHE I  " "9 -F & >1$q'U1X*=AtAwJ >D > ! )CI;.OPQQ (( {6>>$#78CCEE  5!aE!H!4A 5D 5 *++  A Haa\23h58}567 K  I%J_N^,J^q=PrVY6ZZ[ \   J'Gq47 'GH I T T V h&K+&Oo.jRS?SY\8]]^ _   ['I58 'IJ K V V X  C ? 6 (H(Js"G.G.G3-G3 G8 G=c,t|sgSt|r}t||t||k(r| j|.| j|@g} | s| r| dgz } | r$|dkr| jdt| dn4| r2| dgz } | |tj| jz } | r| d gz } | |tj| jz } | D]p}t||} t||}| dd |d | |d |t!| d |t!|gz } | t#| |||Dcgc]}| |z c}z } r| Scc}wcc}wcc}w)Nreqr@r4rxrrzMatching attributes:zDiffering attributes:z$Drill down into differing attribute rz: r)rsre dataclassesfieldscomparenamerhrgr^rar\r<rCrrrrr)rrrrr all_fieldsinfofields_to_checkfieldrIrrr/ field_left field_rightrGs rrr sB $   ''- 1;Lt||499LL )) 3=V%PTAU5::VV d ,,u F D D  4 75%#8 8 KK  KK   K tt  ! Ys4yk1RST .// {6>>$#78CCEE  /00 {6>>$#78CCEE  E u-J!%/K 6ugQ?(5'KZ0@$A#B${SWXcSdGeFfg K + ['  K  WMWDsHH0H H 2 Hcn|j|}|d|}||t|zd}||z}t||t|}t |ddg}|D]`} | j dr| j dr'| j dr|j d| ddzP|j | b|S) Nr)ryz is contained here:Skippingz- z+ r@rx)findrCrr)rrBr<) termtextrindexheadtail correct_textrnewdiffrGs rrrWs IIdOE __doc__ __future__rcollections.abcrMrrrrr AbstractSetrtypingr r r unicodedatar rr _pytest._code_pytest._io.pprintr_pytest._io.safereprrr_pytest.compatr_pytest.configrr__annotations__rrrr)r2r,r-rQrSrVrZrarerhrlrsrrrrrrrrrrrrrrrrrrs("$$#$. !,)3(!DH @G;?7>6X6  " FN*PB=  ,?DC#C#C#'*C#7;C#C#NHI" ""(6"AD""LHI4 44(64AD44v       B 9 9 9 9 9  9@                                  B B B B B  B A A A A A  A          & + + + + +  +\4 44(64AD44nr