grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a XC?hx˜ã @s2dZgd¢ZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZeddƒZiZdd „Zed ƒZed ƒZed ƒZed ƒZedƒZedƒZeeBeBeBeBeBZedƒZedƒZedƒZedƒZedƒZeeBeBeBeBZdZ dZ!dd„Z"dqdd„Z#dd„Z$dd„Z%drd!d"„Z&d#d$„Z'Gd%d&„d&e ƒZ(d'd(„Z)d)d*„Z*d+d,„Z+Gd-d.„d.ej,ƒZ-d/d0„Z.Gd1d2„d2ƒZ/Gd3d4„d4ƒZ0Gd5d6„d6ƒZ1Gd7d8„d8ƒZ2Gd9d:„d:ƒZ3Gd;d<„d<ƒZ4Gd=d>„d>e5ƒZ6Gd?d@„d@e5ƒZ7GdAdB„dBe3ƒZ8da9dsdEdF„Z:dCdddddCdddDe1ƒdf dGdH„Z;dtdJdK„ZGdNdO„dOe j?ƒZ@GdPdQ„dQe@ƒZAGdRdS„dSe jBƒZCdudTdU„ZDGdVdW„dWe@ƒZEdCdde1ƒdfdXdY„ZFdZd[„ZGd\d]„ZHd^d_„ZIdvd`da„ZJdwdbdc„ZKdxddde„ZLGdfdg„dgƒZMeMdhdidjdkdldmœZNdndo„ZOePdpk�r.e  QeOƒ¡dS)yzreStructuredText en)!Úregister_optionflagÚDONT_ACCEPT_TRUE_FOR_1ÚDONT_ACCEPT_BLANKLINEÚNORMALIZE_WHITESPACEÚELLIPSISÚSKIPÚIGNORE_EXCEPTION_DETAILÚCOMPARISON_FLAGSÚ REPORT_UDIFFÚ REPORT_CDIFFÚ REPORT_NDIFFÚREPORT_ONLY_FIRST_FAILUREÚREPORTING_FLAGSÚ FAIL_FASTÚExampleÚDocTestÚ DocTestParserÚ DocTestFinderÚ DocTestRunnerÚ OutputCheckerÚDocTestFailureÚUnexpectedExceptionÚ DebugRunnerÚtestmodÚtestfileÚrun_docstring_examplesÚ DocTestSuiteÚ DocFileSuiteÚset_unittest_reportflagsÚscript_from_examplesÚ testsourceÚ debug_srcÚdebugéN)ÚStringIO)Ú namedtupleÚ TestResultszfailed attemptedcCst |dttƒ>¡S)Né)ÚOPTIONFLAGS_BY_NAMEÚ setdefaultÚlen©Úname©r,ú,/opt/alt/python39/lib64/python3.9/doctest.pyr„srrrrrrrr r r r rz z...cCs8d}tjD](}| |d¡}|tt|ƒur ||jO}q |S)Nr")Ú __future__Zall_feature_namesÚgetÚgetattrZ compiler_flag)ÚglobsÚflagsZfnameZfeaturer,r,r-Ú_extract_future_flags·s    r3écCsVt |¡r|St|tƒr,t|tƒtƒdgƒS|durJtjt  |¡j dSt dƒ‚dS)NÚ*Ú__name__z"Expected a module, string, or None) ÚinspectÚismoduleÚ isinstanceÚstrÚ __import__ÚglobalsÚlocalsÚsysÚmodulesÚ _getframeÚ f_globalsÚ TypeError)ÚmoduleZdepthr,r,r-Ú_normalize_moduleÃs  rDcCsdD]}| |d¡}q|S)N)z ú Ú )Úreplace)ÚdataÚnewliner,r,r-Ú_newline_convertÖsrJcCs’|rVt|dƒ}t||ƒ}t|ddƒdurVt|jdƒrV|j |¡}| |¡}t|ƒ|fSt||d��}|  ¡|fWdƒS1s„0YdS)NéÚ __loader__Úget_data)Úencoding) rDÚ_module_relative_pathr0ÚhasattrrLrMÚdecoderJÚopenÚread)ÚfilenameÚpackageÚmodule_relativerNZ file_contentsÚfr,r,r-Ú_load_testfileÝs      rXécCst d|d|¡S)Nz (?m)^(?!$)ú )ÚreÚsub)ÚsÚindentr,r,r-Ú_indentësr_cCs*tƒ}|\}}}tj||||d�| ¡S)N)Úfile)r#Ú tracebackÚprint_exceptionÚgetvalue)Úexc_infoZexcoutÚexc_typeZexc_valZexc_tbr,r,r-Ú_exception_tracebackós rfc@seZdZdd„Zddd„ZdS)Ú _SpoofOutcCs$t |¡}|r | d¡s |d7}|S©NrF)r#rcÚendswith)ÚselfÚresultr,r,r-rcs z_SpoofOut.getvalueNcCs| |¡t |¡dS©N)Úseekr#Útruncate)rjÚsizer,r,r-rn s z_SpoofOut.truncate)N)r6Ú __module__Ú __qualname__rcrnr,r,r,r-rgÿs rgcCsÂt|vr||kS| t¡}dt|ƒ}}|d}|rR| |¡rNt|ƒ}|d=ndS|d}|r€| |¡r||t|ƒ8}|d=ndS||krŒdS|D],}| |||¡}|dkr°dS|t|ƒ7}q�dS)Nr"FéÿÿÿÿT)ÚELLIPSIS_MARKERÚsplitr)Ú startswithriÚfind)ÚwantÚgotZwsÚstartposÚendposÚwr,r,r-Ú_ellipsis_matchs0    r|cCs| ¡}|rd|SdSdS)Nz# ú#)Úrstrip)Úliner,r,r-Ú _comment_line?sr€cCshdt|ƒ}}| d¡}|dkr$|}| dd|¡}|dkr>|}| dd|¡}|dkr\|d}|||…S)Nr"rFú:Ú.r&)r)rvÚrfind)ÚmsgÚstartÚendÚir,r,r-Ú_strip_exception_detailsGs  rˆc@s.eZdZdd„Zd dd„Zdd„Zdd „ZdS) Ú_OutputRedirectingPdbcCs(||_d|_tjj||dd�d|_dS)NFT)ÚstdoutÚnosigintr&)Ú_OutputRedirectingPdb__outÚ$_OutputRedirectingPdb__debugger_usedÚpdbÚPdbÚ__init__Z use_rawinput)rjÚoutr,r,r-r�gsz_OutputRedirectingPdb.__init__NcCs*d|_|durt ¡j}tj ||¡dS)NT)r�r>r@Úf_backrŽr�Ú set_trace)rjÚframer,r,r-r“os z_OutputRedirectingPdb.set_tracecCs|jrtj |¡dSrl)r�rŽr�Ú set_continue©rjr,r,r-r•usz"_OutputRedirectingPdb.set_continuecGs8tj}|jt_ztjj|g|¢RŽW|t_S|t_0dSrl)r>rŠrŒrŽr�Útrace_dispatch)rjÚargsÚ save_stdoutr,r,r-r—{sþz$_OutputRedirectingPdb.trace_dispatch)N)r6rprqr�r“r•r—r,r,r,r-r‰as r‰cCsòt |¡std|ƒ‚| d¡r(tdƒ‚tjj| d¡Ž}t |dƒrXtj |j ¡d}nŒ|j dkržt t jƒdkr–t jddkr–tj t jd¡d}qätj}nFt |dƒrÖ|jD]&}tj ||¡}tj |¡r®|Sq®td |j ƒ‚tj ||¡S) NzExpected a module: %rú/z1Module-relative files may not have absolute pathsÚ__file__r"Ú__main__ÚÚ__path__zBCan't resolve paths relative to the module %r (it has no __file__))r7r8rBruÚ ValueErrorÚosÚpathÚjoinrtrPr›r6r)r>ÚargvÚcurdirržÚexists)rCZ test_pathZbasedirZ directoryÚfullpathr,r,r-rO†s(         þrOc@s&eZdZd dd„Zdd„Zdd„ZdS) rNr"cCsv| d¡s|d7}|r(| d¡s(|d7}|durB| d¡sB|d7}||_||_||_||_|durfi}||_||_dSrh)riÚsourcerwÚlinenor^ÚoptionsÚexc_msg)rjr§rwrªr¨r^r©r,r,r-r�×s  zExample.__init__cCs\t|ƒt|ƒurtS|j|jkoZ|j|jkoZ|j|jkoZ|j|jkoZ|j|jkoZ|j|jkSrl)ÚtypeÚNotImplementedr§rwr¨r^r©rª©rjÚotherr,r,r-Ú__eq__és  ÿ þ ý ü ûzExample.__eq__cCst|j|j|j|j|jfƒSrl)Úhashr§rwr¨r^rªr–r,r,r-Ú__hash__ôsÿzExample.__hash__)Nr"r"N)r6rprqr�r¯r±r,r,r,r-r´s #ÿ  rc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) rcCs,||_||_| ¡|_||_||_||_dSrl)ÚexamplesÚ docstringÚcopyr1r+rTr¨)rjr²r1r+rTr¨r³r,r,r-r�s  zDocTest.__init__cCsRt|jƒdkrd}n"t|jƒdkr(d}ndt|jƒ}d|jj|j|j|j|fS)Nr"z no examplesr&z 1 examplez %d examplesz<%s %s from %s:%s (%s)>)r)r²Ú __class__r6r+rTr¨)rjr²r,r,r-Ú__repr__sÿÿzDocTest.__repr__cCs\t|ƒt|ƒurtS|j|jkoZ|j|jkoZ|j|jkoZ|j|jkoZ|j|jkoZ|j|jkSrl)r«r¬r²r³r1r+rTr¨r­r,r,r-r¯)s  ÿ þ ý ü ûzDocTest.__eq__cCst|j|j|j|jfƒSrl)r°r³r+rTr¨r–r,r,r-r±4szDocTest.__hash__cCs:t|tƒstS|j|j|jt|ƒf|j|j|jt|ƒfkSrl)r9rr¬r+rTr¨Úidr­r,r,r-Ú__lt__8s  þzDocTest.__lt__N)r6rprqr�r¶r¯r±r¸r,r,r,r-røs   rc@s¦eZdZe dejejB¡Ze dejejBejB¡Z e d¡j Z ddd„Z dd„Z dd d „Zd d „Ze d ej¡Zdd„Ze dej¡Zdd„Zdd„Zdd„ZdS)raú # Source consists of a PS1 line followed by zero or more PS2 lines. (?P (?:^(?P [ ]*) >>> .*) # PS1 line (?:\n [ ]* \.\.\. .*)*) # PS2 lines \n? # Want consists of any non-blank lines that do not start with PS1. (?P (?:(?![ ]*$) # Not a blank line (?![ ]*>>>) # Not a line starting with PS1 .+$\n? # But any other line )*) aß # Grab the traceback header. Different versions of Python have # said different things on the first traceback line. ^(?P Traceback\ \( (?: most\ recent\ call\ last | innermost\ last ) \) : ) \s* $ # toss trailing whitespace on the header. (?P .*?) # don't blink: absorb stuff until... ^ (?P \w+ .*) # a line *starts* with alphanum. z ^[ ]*(#.*)?$úc s| ¡}| |¡‰ˆdkr8d ‡fdd„| d¡Dƒ¡}g}d\}}|j |¡D]š}| ||| ¡…¡|| d|| ¡¡7}|  |||¡\}}} } |  |¡sÈ| t || | |ˆt |  d¡ƒ|d�¡|| d| ¡| ¡¡7}| ¡}qP| ||d…¡|S)Nr"rFcsg|]}|ˆd…‘qSrlr,©Ú.0Úl©Z min_indentr,r-Ú óz'DocTestParser.parse..©r"r"r^)r¨r^r©)Ú expandtabsÚ _min_indentr¢rtÚ _EXAMPLE_REÚfinditerÚappendr…ÚcountÚ_parse_exampleÚ_IS_BLANK_OR_COMMENTrr)Úgroupr†) rjÚstringr+ÚoutputZcharnor¨Úmr§r©rwrªr,r½r-Úparsess*  ÿ   ý zDocTestParser.parsecCst| ||¡|||||ƒSrl)rÚ get_examples)rjrÊr1r+rTr¨r,r,r-Ú get_doctestšs ÿzDocTestParser.get_doctestcCsdd„| ||¡DƒS)NcSsg|]}t|tƒr|‘qSr,)r9r)r»Úxr,r,r-r¾±s ÿz.DocTestParser.get_examples..)rÍ)rjrÊr+r,r,r-rΦs zDocTestParser.get_examplesc s t| d¡ƒ‰| d¡ d¡}| |ˆ||¡| |dd…dˆd||¡d ‡fdd„|Dƒ¡}| d ¡}| d¡}t|ƒdkrœt d |d ¡rœ|d =| |dˆ||t|ƒ¡d ‡fd d„|Dƒ¡}|j |¡}|rì| d ¡}nd}|  |||¡} || ||fS)Nr^r§rFr&rZr‚csg|]}|ˆdd…‘qS)rYNr,)r»Zsl©r^r,r-r¾Çr¿z0DocTestParser._parse_example..rwz *$rrcsg|]}|ˆd…‘qSrlr,)r»ZwlrÑr,r-r¾Òr¿r„) r)rÉrtÚ_check_prompt_blankÚ _check_prefixr¢r[ÚmatchÚ _EXCEPTION_REÚ _find_options) rjrÌr+r¨Ú source_linesr§rwÚ want_linesrªr©r,rÑr-rÇ´s&     ÿ  zDocTestParser._parse_examplez#\s*doctest:\s*([^\n\'"]*)$c Cs¬i}|j |¡D]v}| d¡ dd¡ ¡}|D]V}|ddvsN|dd…tvrdtd|d||fƒ‚t|dd…}|ddk||<q.q|r¨| |¡r¨td|||fƒ‚|S) Nr&ú,rZr"z+-z7line %r of the doctest for %s has an invalid option: %rú+zSline %r of the doctest for %s has an option directive on a line with no example: %r)Ú_OPTION_DIRECTIVE_RErÄrÉrGrtr'rŸrÈ) rjr§r+r¨r©rÌZoption_stringsÚoptionÚflagr,r,r-rÖês" ÿ þþzDocTestParser._find_optionsz ^([ ]*)(?=\S)cCs2dd„|j |¡Dƒ}t|ƒdkr*t|ƒSdSdS)NcSsg|] }t|ƒ‘qSr,)r))r»r^r,r,r-r¾ r¿z-DocTestParser._min_indent..r")Ú _INDENT_REÚfindallr)Úmin)rjr]Úindentsr,r,r-rÂs zDocTestParser._min_indentc Cs^t|ƒD]P\}}t|ƒ|dkr||ddkrtd||d||||d…|fƒ‚qdS)NrYrKrZz8line %r of the docstring for %s lacks blank after %s: %rr&)Ú enumerater)rŸ)rjÚlinesr^r+r¨r‡rr,r,r-rÒs  ÿþz!DocTestParser._check_prompt_blankcCs>t|ƒD]0\}}|r| |¡std||d||fƒ‚qdS)NzGline %r of the docstring for %s has inconsistent leading whitespace: %rr&)rârurŸ)rjrãÚprefixr+r¨r‡rr,r,r-rÓs þzDocTestParser._check_prefixN)r¹)r¹)r6rprqr[ÚcompileÚ MULTILINEÚVERBOSErÃÚDOTALLrÕrÔrÈrÍrÏrÎrÇrÛrÖrÞrÂrÒrÓr,r,r,r-rCs&  õ õ  ' 3ÿrc@sJeZdZdeƒddfdd„Zddd„Zdd „Zd d „Zd d „Zdd„Z dS)rFTcCs||_||_||_||_dSrl)Ú_parserÚ_verboseÚ_recurseÚ_exclude_empty)rjÚverboseÚparserÚrecurseÚ exclude_emptyr,r,r-r�7szDocTestFinder.__init__Nc CsL|dur.t|ddƒ}|dur.tdt|ƒfƒ‚|durrœ)r0rŸr«r7Ú getmoduleZ getsourcefilerBZgetfileÚ linecacheÚgetlinesÚ__dict__r´ÚupdateÚ_findÚsort) rjÚobjr+rCr1Ú extraglobsr`r×Útestsr,r,r-rvMsJ$ þ         zDocTestFinder.findcCsÂ|dur dSt |¡dur(|t |¡uSt |¡r>|j|juSt |¡r|t|dƒr\|jj}nt|dƒrn|j}ndS|j |kSt  |¡r’|j |jkSt|dƒr¨|j |jkSt |t ƒr¶dSt dƒ‚dS)NTÚ __objclass__rpz"object must be a class or function)r7ròÚ isfunctionrõÚ __globals__ZismethoddescriptorrPrürpr6Úisclassr9ÚpropertyrŸ)rjrCÚobjectZobj_modr,r,r-Ú _from_module³s(            zDocTestFinder._from_modulec Cs|jrtd|ƒt|ƒ|vr"dSd|t|ƒ<| |||||¡}|durR| |¡t |¡r¾|jr¾|j  ¡D]P\} } d|| f} t  t  | ¡¡sšt  | ¡rl|  || ¡rl| || | ||||¡qlt |¡�rn|j�rnt|diƒ  ¡D]Š\} } t| tƒ�stdt| ƒfƒ‚t  | ¡�sJt  | ¡�sJt | ¡�sJt| tƒ�sJtdt| ƒfƒ‚d|| f} | || | ||||¡qât  |¡�r|j�r|j  ¡D]t\} } t| ttfƒ�rª| j} t  | ¡�sÎt  | ¡�sÎt| tƒ�rŒ|  || ¡�rŒd|| f} | || | ||||¡�qŒdS)NzFinding tests in %sr&z%s.%sÚ__test__z5DocTestFinder.find: __test__ keys must be strings: %rz`DocTestFinder.find: __test__ values must be strings, functions, methods, classes, or modules: %rz%s.__test__.%s)rêÚprintr·Ú _get_testrÅr7r8rërõÚitemsZ isroutineZunwraprÿrr÷r0r9r:rŸr«Ú staticmethodÚ classmethodÚ__func__r) rjrûrùr+rCr×r1ÚseenÚtestZvalnameÚvalr,r,r-r÷Ïsd     ÿ þÿ þÿÿý ÿÿ þ ÿzDocTestFinder._findc CsÂt|tƒr|}nHz,|jdur"d}n|j}t|tƒs:t|ƒ}WnttfyVd}Yn0| ||¡}|jrr|srdS|dur€d}n.t|ddƒp�|j}|dd…dkr®|dd…}|j   |||||¡S)Nr�r›éüÿÿÿú.pycrr) r9r:Ú__doc__rBÚAttributeErrorÚ _find_linenorìr0r6rérÏ) rjrùr+rCr1r×r³r¨rTr,r,r-r s*         ÿzDocTestFinder._get_testcCsd}t |¡rd}t |¡rb|dur(dSt dt|ddƒ¡}t|ƒD]\}}| |¡rF|}qbqFt |¡rr|j }t  |¡r‚|j }t  |¡r’|j }t |¡r¢|j}t |¡r¼t|ddƒd}|du�r |durÖ|dSt d¡}t|t|ƒƒD]}| ||¡rî|SqîdS)Nr"z^\s*class\s*%s\br6ú-Úco_firstlinenor&z(^|.*:)\s*\w*("|\'))r7r8rÿr[rår0rârÔZismethodr rýÚ__code__Z istracebackÚtb_frameZisframeÚf_codeZiscodeÚranger))rjrùr×r¨Zpatr‡rr,r,r-r2s6   ÿ     zDocTestFinder._find_lineno)NNNN) r6rprqrr�rvrr÷rrr,r,r,r-r.s ÿ  f=&rc@s‚eZdZdZddd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z e   d¡Zddd„Zd dd„Zd!dd„Zdd„ZdS)"rzF**********************************************************************Nr"cCsN|ptƒ|_|durdtjv}||_||_||_d|_d|_i|_ t ƒ|_ dS)Nú-vr") rÚ_checkerr>r£rêÚ optionflagsÚoriginal_optionflagsÚtriesÚfailuresÚ_name2ftrgÚ_fakeout)rjÚcheckerrírr,r,r-r�¢s  zDocTestRunner.__init__cCsH|jrD|jr.|dt|jƒdt|jƒƒn|dt|jƒdƒdS)NzTrying: z Expecting: zExpecting nothing )rêrwr_r§)rjr‘r Úexampler,r,r-Ú report_startÆsÿÿÿzDocTestRunner.report_startcCs|jr|dƒdS)Nzok )rê©rjr‘r r!rxr,r,r-Úreport_successÓszDocTestRunner.report_successcCs&|| ||¡|j |||j¡ƒdSrl)Ú_failure_headerrÚoutput_differencerr#r,r,r-Úreport_failureÛs ÿzDocTestRunner.report_failurecCs$|| ||¡dtt|ƒƒƒdS)NzException raised: )r%r_rf©rjr‘r r!rdr,r,r-Úreport_unexpected_exceptionâs  ÿ ÿz)DocTestRunner.report_unexpected_exceptioncCs”|jg}|jrR|jdur4|jdur4|j|jd}nd}| d|j||jf¡n| d|jd|jf¡| d¡|j}| t|ƒ¡d |¡S)Nr&ú?zFile "%s", line %s, in %szLine %s, in %szFailed example:rF)ÚDIVIDERrTr¨rÅr+r§r_r¢)rjr r!r‘r¨r§r,r,r-r%és ÿ zDocTestRunner._failure_headerc Cs„d}}|j}tdƒ\}}} |jj} t|jƒD�]4\} } |jt@oH|dk} ||_| jrŽ| j ¡D],\}}|r||j|O_q`|j|M_q`|jt @ršq.|d7}| s´|  ||| ¡d|j | f}z,t t | j|d|dƒ|jƒ|j ¡d}Wn2t�y‚Ynt ¡}|j ¡Yn0|j ¡}|j d¡|}|du�r^| | j||jƒ�rÚ|}n|tj|dd…Žd}| �s†|t|ƒ7}| jdu�r˜| }nB| | j||jƒ�r°|}n*|jt@�rÚ| t| jƒt|ƒ|jƒ�rÚ|}||u�rü| �sP| ||| |¡nT||u�r&| �s|  ||| |¡|d7}n*|| u�rP| �sF| !||| |¡|d7}n|r.|jt"@r.�qfq.||_| #|||¡t$||ƒS) Nr"rKr&zZsingleTr4rr)%rrrÚ check_outputrâr²r r©rrr"r+Úexecrår§r1Údebuggerr•ÚKeyboardInterruptr>rdrrcrnrwraÚformat_exception_onlyrfrªrrˆr$r'r)rÚ_DocTestRunner__record_outcomer%)rjr Ú compileflagsr‘rrrÚSUCCESSÚFAILUREZBOOMZcheckÚ examplenumr!ÚquietZ optionflagr rTZ exceptionrxZoutcomerªr,r,r-Z__runýsŒ  ÿ  ÿÿ        þ     ÿ zDocTestRunner.__runcCsL|j |jd¡\}}||||f|j|j<|j|7_|j|7_dS)NrÀ)rr/r+rr)rjr rWÚtÚf2Út2r,r,r-Z__record_outcomezszDocTestRunner.__record_outcomez..+)\[(?P\d+)\]>$cCsV|j |¡}|rF| d¡|jjkrF|jjt| d¡ƒ}|jjdd�S|  ||¡SdS)Nr+r5T©Úkeepends) Ú%_DocTestRunner__LINECACHE_FILENAME_RErÔrÉr r+r²Úintr§Ú splitlinesÚsave_linecache_getlines)rjrTÚmodule_globalsrÌr!r,r,r-Z__patched_linecache_getlines‡s  z*DocTestRunner.__patched_linecache_getlinesTc sD||_|durt|jƒ}tj‰|durVˆj‰ˆdus@ˆ ¡dkrHˆj}n‡‡fdd„}|jt_t  ¡}t j }t ˆƒ|_ |j  ¡|j j t _ tj|_|jt_tj}tjt_zR| |||¡Wˆt_|t _ t |¡|jt_|t_|rø|j ¡ddl}d|_SnDˆt_|t _ t |¡|jt_|t_|�r>|j ¡ddl}d|_0dS)Núutf-8cs t| ˆd¡ˆƒ}ˆ |¡dS)NÚbackslashreplace)r:ÚencodeÚwrite)r]©rNr™r,r-r‘¯szDocTestRunner.run..outr")r r3r1r>rŠrNÚlowerrDrÚgettracerŽr“r‰r.Úresetrórôr?Ú*_DocTestRunner__patched_linecache_getlinesÚ displayhookÚ__displayhook__Ú_DocTestRunner__runÚsettraceÚclearÚbuiltinsÚ_) rjr r2r‘Ú clear_globsZ save_traceZsave_set_traceZsave_displayhookrOr,rEr-Úrun�sb      öø  zDocTestRunner.runc Cs’|dur|j}g}g}g}d}}|j ¡D]V}|\}\} } || 7}|| 7}| dkr`| |¡q,| dkrx| || f¡q,| |¡q,|rî|r¶tt|ƒdƒ| ¡|D]} td| ƒq¦|rîtt|ƒdƒ| ¡|D]\} } td| | fƒqÔ|�r:t|jƒtt|ƒdƒ| ¡|D] \} \} } td| | | fƒ�q|�rft|dt|jƒd ƒt||d |d ƒ|�rztd |d ƒn|�rˆtdƒt||ƒS)Nr"zitems had no tests:z zitems passed all tests:z %3d tests in %szitems had failures:z %3d of %3d in %sztests inzitems.z passed andzfailed.z***Test Failed***z failures.z Test passed.) rêrrrÅrr)rør+r%) rjríZnotestsZpassedZfailedZtotaltZtotalfrÐr+rWr7ÚthingrÆr,r,r-Ú summarizeØsP       zDocTestRunner.summarizecCsR|j}|j ¡D]<\}\}}||vr@||\}}||}||}||f||<qdSrl)rr)rjr®Údr+rWr7r8r9r,r,r-Úmerges zDocTestRunner.merge)NNr")N)NNT)N)r6rprqr+r�r"r$r'r)r%rLr1r[rår<rIrRrTrVr,r,r,r-rfs: $ }   I 9rc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) rcCst| dd¡dƒS)NÚASCIIrB)r:rC)rjr]r,r,r-Ú_toAscii&szOutputChecker._toAsciicCsÌ| |¡}| |¡}||kr dS|t@sH||fdkr8dS||fdkrHdS|t@s‚t dt t¡d|¡}t dd|¡}||kr‚dS|t@r²d |  ¡¡}d |  ¡¡}||kr²dS|t @rÈt ||ƒrÈdSdS) NT)zTrue z1 )zFalse z0 z (?m)^%s\s*?$r�z(?m)^[^\S\n]+$rZF) rXrrr[r\ÚescapeÚBLANKLINE_MARKERrr¢rtrr|©rjrwrxrr,r,r-r,,s2    ÿ zOutputChecker.check_outputcCs<|ttBtB@sdS|t@r dS| d¡dko:| d¡dkS)NFTrFr4)r r r rÆr[r,r,r-Ú_do_a_fancy_diffksÿþ zOutputChecker._do_a_fancy_diffc Cs(|j}|t@st dt|¡}| |||¡rà|jdd�}|jdd�}|t@rptj ||dd�}t |ƒdd…}d}nZ|t @ržtj ||dd�}t |ƒdd…}d}n,|t @rÊtjtjd�} t |  ||¡ƒ}d }nd |td  |¡ƒS|rü|rüd t|ƒt|ƒfS|�rd t|ƒS|�r dt|ƒSdSdS)Nz(?m)^[ ]*(?= )Tr:r4)Únz#unified diff with -expected +actualz-context diff with expected followed by actual)Zcharjunkzndiff with -expected +actualzDifferences (%s): r�zExpected: %sGot: %szExpected: %sGot nothing zExpected nothing Got: %szExpected nothing Got nothing )rwrr[r\rZr\r>r ÚdifflibZ unified_diffÚlistr Z context_diffr ZDifferZIS_CHARACTER_JUNKZcomparer_r¢) rjr!rxrrwrØZ got_linesZdiffÚkindZenginer,r,r-r&‚s4    zOutputChecker.output_differenceN)r6rprqrXr,r\r&r,r,r,r-rs?rc@seZdZdd„Zdd„ZdS)rcCs||_||_||_dSrl)r r!rx)rjr r!rxr,r,r-r�»szDocTestFailure.__init__cCs t|jƒSrl©r:r r–r,r,r-Ú__str__ÀszDocTestFailure.__str__N©r6rprqr�rbr,r,r,r-r°s rc@seZdZdd„Zdd„ZdS)rcCs||_||_||_dSrl)r r!rd)rjr r!rdr,r,r-r�ÎszUnexpectedException.__init__cCs t|jƒSrlrar–r,r,r-rbÓszUnexpectedException.__str__Nrcr,r,r,r-rÃs rc@s&eZdZd dd„Zdd„Zdd„ZdS) rNTcCs$t ||||d¡}|r |j ¡|S)NF)rrRr1rN)rjr r2r‘rQÚrr,r,r-rR1s zDebugRunner.runcCst|||ƒ‚dSrl)rr(r,r,r-r)7sz'DebugRunner.report_unexpected_exceptioncCst|||ƒ‚dSrl)rr#r,r,r-r':szDebugRunner.report_failure)NNT)r6rprqrRr)r'r,r,r,r-rÖs[ rTFc Cs¶|durtj d¡}t |¡s,td|fƒ‚|dur:|j}t|d�} |rVt||d�} n t ||d�} | j ||||d�D]} |   | ¡qt|r�|   ¡t durž| a n t  | ¡t| j| jƒS)Nrœztestmod: module required; %r)rð©rír©r1rú)r>r?r/r7r8rBr6rrrrvrRrTÚmasterrVr%rr) rÌr+r1ríÚreportrrúÚraise_on_errorrðÚfinderÚrunnerr r,r,r-rFs$E      rc CsÞ|r|stdƒ‚t|||| pdƒ\} }|dur:tj |¡}|durHi}n| ¡}|durb| |¡d|vrrd|d<| r„t||d�} n t||d�} |   | |||d¡}|   |¡|r¸|   ¡t durÆ| a n t   | ¡t| j| jƒS)Nú8Package may only be specified for module-relative paths.rAr6rœrer")rŸrXr r¡Úbasenamer´rörrrÏrRrTrgrVr%rr)rTrVr+rUr1rírhrrúrirîrNÚtextrkr r,r,r-r®s2Rÿ     rÚNoNamec Cs@t|dd�}t||d�}|j|||d�D]}|j||d�q(dS)NF)rírïre)r1)r2)rrrvrR) rWr1rír+r2rrjrkr r,r,r-r)s  rcCs"|t@|krtd|ƒ‚t}|a|S)NzOnly reporting flags allowed)r rŸÚ_unittest_reportflags)r2Úoldr,r,r-rFs   rc@sleZdZddd„Zdd„Zdd„Zd d „Zd d „Zd d„Zdd„Z dd„Z dd„Z dd„Z e jZdd„ZdS)Ú DocTestCaser"NcCs:tj |¡||_||_|j ¡|_||_||_ ||_ dSrl) ÚunittestÚTestCaser�Ú_dt_optionflagsÚ _dt_checkerr1r´Ú _dt_globsÚ_dt_testÚ _dt_setUpÚ _dt_tearDown)rjr rÚsetUpÚtearDownr r,r,r-r�ls  zDocTestCase.__init__cCs|j}|jdur| |¡dSrl)rxry©rjr r,r,r-r{ws zDocTestCase.setUpcCs6|j}|jdur| |¡|j ¡|j |j¡dSrl)rxrzr1rNrörwr}r,r,r-r|}s    zDocTestCase.tearDowncCs„|j}tj}tƒ}|j}|t@s(|tO}t||jdd�}z&d|_ |j ||j dd�\}}W|t_n|t_0|r€|  |  | ¡¡¡‚dS)NF©rr rízF----------------------------------------------------------------------)r‘rQ)rxr>rŠr#rur rprrvr+rRrDZfailureExceptionÚformat_failurerc)rjr rqÚnewrrkrrr,r,r-ÚrunTest‡s"ÿÿ zDocTestCase.runTestcCsP|j}|jdurd}n d|j}d |j d¡dd…¡}d|j|j|||fS)Nzunknown line numberz%sr‚rrz:Failed doctest test for %s File "%s", line %s, in %s %s)rxr¨r¢r+rtrT)rjÚerrr r¨Zlnamer,r,r-rŸs  þzDocTestCase.format_failurecCs6| ¡t|j|jdd�}|j|jdd�| ¡dS)NFr~)rQ)r{rrurvrRrxr|)rjrkr,r,r-r!«s BÿzDocTestCase.debugcCs|jjSrl©rxr+r–r,r,r-r·ószDocTestCase.idcCsPt|ƒt|ƒurtS|j|jkoN|j|jkoN|j|jkoN|j|jkoN|j|jkSrl)r«r¬rxruryrzrvr­r,r,r-r¯ös  ÿ þ ý üzDocTestCase.__eq__cCst|j|j|j|jfƒSrl)r°ruryrzrvr–r,r,r-r± sÿzDocTestCase.__hash__cCs,|jj d¡}d|dd |dd…¡fS)Nr‚z%s (%s)rr)rxr+rtr¢)rjr+r,r,r-r¶ szDocTestCase.__repr__cCs d|jjS)Nz Doctest: rƒr–r,r,r-ÚshortDescription szDocTestCase.shortDescription)r"NNN)r6rprqr�r{r|r�rr!r·r¯r±r¶rrbr„r,r,r,r-rrjsÿ   H rrc@s0eZdZdd„Zdd„Zdd„Zdd„ZeZd S) ÚSkipDocTestCasecCs||_t |d¡dSrl)rCrrr�)rjrCr,r,r-r� szSkipDocTestCase.__init__cCs| d¡dS)Nz-DocTestSuite will not work with -O2 and above)ZskipTestr–r,r,r-r{ szSkipDocTestCase.setUpcCsdSrlr,r–r,r,r-Ú test_skip szSkipDocTestCase.test_skipcCs d|jjS)NzSkipping tests from %s)rCr6r–r,r,r-r„ sz SkipDocTestCase.shortDescriptionN)r6rprqr�r{r†r„rbr,r,r,r-r… s r…c@seZdZdd„ZdS)Ú _DocTestSuitecCsdSrlr,)rjÚindexr,r,r-Ú_removeTestAtIndex sz _DocTestSuite._removeTestAtIndexN)r6rprqr‰r,r,r,r-r‡ sr‡c Ks¾|durtƒ}t|ƒ}|j|||d�}|sNtjjdkrNtƒ}| t|ƒ¡|S|  ¡tƒ}|D]X}t |j ƒdkrtq`|j s¢|j }|dd…dkrœ|dd…}||_ | t|fi|¤Ž¡q`|S)Nrfr4r"r rrr)rrDrvr>r2Úoptimizer‡ÚaddTestr…rør)r²rTr›rr) rCr1rúZ test_finderr©rûÚsuiter rTr,r,r-r$ s(% rc@s$eZdZdd„Zdd„Zdd„ZdS)Ú DocFileCasecCsd |jj d¡¡S)NrPr‚)r¢rxr+rtr–r,r,r-r·f szDocFileCase.idcCs|jjSrl)rxrTr–r,r,r-r¶i szDocFileCase.__repr__cCsd|jj|jj|fS)Nz2Failed doctest test for %s File "%s", line 0 %s)rxr+rT)rjr‚r,r,r-rl sÿzDocFileCase.format_failureN)r6rprqr·r¶rr,r,r,r-r�d sr�c Ksz|duri}n| ¡}|r&|s&tdƒ‚t||||p4dƒ\}}d|vrL||d<tj |¡}| ||||d¡} t| fi|¤ŽS)NrlrAr›r")r´rŸrXr r¡rmrÏr�) r¡rVrUr1rîrNr©Údocr+r r,r,r-Ú DocFileTestq sÿ r�cOsHtƒ}| dd¡r$t| d¡ƒ|d<|D]}| t|fi|¤Ž¡q(|S)NrVTrU)r‡r/rDr‹r�)ÚpathsÚkwrŒr¡r,r,r-r‹ s 8 rcCsÎg}tƒ |¡D]x}t|tƒrh| |jdd…¡|j}|rˆ| d¡|dd„| d¡dd…Dƒ7}q|dd„| d¡dd…Dƒ7}q|r¤|ddkr¤| ¡qŠ|rÀ|ddkrÀ| d¡q¤d  |¡dS) Nrrz # Expected:cSsg|] }d|‘qS)z## r,rºr,r,r-r¾ r¿z(script_from_examples..rFcSsg|] }t|ƒ‘qSr,)r€rºr,r,r-r¾ sÿr}r") rrÍr9rrÅr§rwrtÚpopr¢)r]rËZpiecerwr,r,r-rÔ s :  "ÿ   rcsJt|ƒ}tƒ |¡}‡fdd„|Dƒ}|s4tˆdƒ‚|d}t|jƒ}|S)Ncsg|]}|jˆkr|‘qSr,r*)r»r7r*r,r-r¾/ r¿ztestsource..znot found in testsr")rDrrvrŸrr³)rCr+rûr Útestsrcr,r*r-r& s   rcCst|ƒ}t|||ƒdSrl)rÚ debug_script)ÚsrcÚpmr1r“r,r,r-r 6 sr cCs”ddl}|r| ¡}ni}|rvzt|||ƒWq�tt ¡dƒ|jdd�}| ¡| dt ¡d¡Yq�0n|jdd�  d|||¡dS)Nr"r&T)r‹r4zexec(%r)) rŽr´r-rr>rdr�rHZ interactionrR)r•r–r1rŽÚpr,r,r-r”; s  r”cCs$t|ƒ}t||ƒ}t|||jƒdSrl)rDrr”rõ)rCr+r–r“r,r,r-r!O s r!c@s$eZdZdd„Zdd„Zdd„ZdS)Ú _TestClasscCs ||_dSrl©r )rjr r,r,r-r�k sz_TestClass.__init__cCs|jd|_|S)Nr4r™r–r,r,r-Úsquareu s z_TestClass.squarecCs|jSrlr™r–r,r,r-r/ sz_TestClass.getN)r6rprqr�ršr/r,r,r,r-r˜] s  r˜zÄ Example of a string object, searched as-is. >>> x = 1; y = 2 >>> x + y, x * y (3, 2) aÜ In 2.2, boolean expressions displayed 0 or 1. By default, we still accept them. This can be disabled by passing DONT_ACCEPT_TRUE_FOR_1 to the new optionflags argument. >>> 4 == 4 1 >>> 4 == 4 True >>> 4 > 4 0 >>> 4 > 4 False zç Blank lines can be marked with : >>> print('foo\n\nbar\n') foo bar zú If the ellipsis flag is used, then '...' can be used to elide substrings in the desired output: >>> print(list(range(1000))) #doctest: +ELLIPSIS [0, 1, 2, ..., 999] aƒ If the whitespace normalization flag is used, then differences in whitespace are ignored. >>> print(list(range(30))) #doctest: +NORMALIZE_WHITESPACE [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29] )r˜rÊzbool-int equivalencez blank linesZellipsiszwhitespace normalizationc Cs"ddl}|jdd�}|jdddddd �|jd d d t ¡gd d�|jddddd�|jdddd�| ¡}|j}|j}d}|jD]}|t|O}q‚|j r¢|t O}|D]v}|  d¡rþt j  |¡\}}tj  d|¡t|dd…ƒ} tj d=t| ||d�\} } nt|d||d�\} } | r¦dSq¦dS)Nr"zdoctest runner)Z descriptionrz --verboseÚ store_trueFz'print very verbose output for all tests)ÚactionÚdefaultÚhelpz-oz--optionrÅzqspecify a doctest option flag to apply to the test run; may be specified more than once to apply multiple options)rœÚchoicesr�ržz-fz --fail-fastzystop running tests after first failure (this is a shorthand for -o FAIL_FAST, and is in addition to any other -o options))rœržr`rÚz file containing the tests to run)Únargsržz.pyéýÿÿÿre)rVrírr&)ÚargparseÚArgumentParserÚ add_argumentr'ÚkeysÚ parse_argsr`rírÜZ fail_fastrrir r¡rtr>Úinsertr;rr) r¢rîr˜Z testfilesrír©rÜrTÚdirnamerÌrrPr,r,r-Ú_test¼ sH  ÿ þ ÿÿ  ÿ r©rœ)r4)rY) NNNNTr"NFF)FroNr")NNNN)FN)FN)F)RZ __docformat__Ú__all__r.r^r7rór rŽr[r>rarsÚior#Ú collectionsr$r%r'rrrrrrrrr r r r rr rZrsr3rDrJrXr_rfrgr|r€rˆr�r‰rOrrrrrrÚ Exceptionrrrrgrrrrprrtrrr…Z TestSuiter‡rr�r�rrrr r”r!r˜rr©r6Úexitr,r,r,r-Ú0sî-   ÿþýüûÿþýü   1%.DKl:;nþ hý {ÿ $$ @ þ IR   , Ø3-