
    z%i                    N   	 d Z g dZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZ ddlmZ  edd      Zi Zd Z ed	      Z ed
      Z ed      Z ed      Z ed      Z ed      Zeez  ez  ez  ez  ez  Z ed      Z ed      Z ed      Z ed      Z ed      Zeez  ez  ez  ez  Z dZ!dZ"d Z#dVdZ$d Z%d Z&dWdZ'd Z( G d de      Z)d Z*d Z+d  Z, G d! d"ejZ                        Z.d# Z/ G d$ d%      Z0 G d& d'      Z1 G d( d)      Z2 G d* d+      Z3 G d, d-      Z4 G d. d/      Z5 G d0 d1e6      Z7 G d2 d3e6      Z8 G d4 d5e4      Z9da:	 	 	 dXd8Z;d6ddddd6ddd7 e2       dfd9Z<	 	 dYd:Z=da>d; Z? G d< d=ej                        ZA G d> d?eA      ZB G d@ dAej                        ZDdZdBZE G dC dDeA      ZFd6dd e2       dfdEZGdF ZHdG ZIdH ZJd[dIZKd[dJZLd\dKZM G dL dM      ZNeNdNdOdPdQdRdSZOdT ZPeQdUk(  r e	j                   eP              yy)]zreStructuredText 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IncrementalNewlineDecoder)
namedtupleTestResultszfailed attemptedc                 N    t         j                  | dt        t               z        S )N   )OPTIONFLAGS_BY_NAME
setdefaultlen)names    ;/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/doctest.pyr   r      s     ))$S9L5M0MNN    r   r   r   r   r   r   r
   r   r   r   r   z<BLANKLINE>z...c                     	 d}t         j                  D ]6  }| j                  |d       }|t        t         |      u s(||j                  z  }8 |S Nr#   )
__future__all_feature_namesgetgetattrcompiler_flag)globsflagsfnamefeatures       r.   _extract_future_flagsr;      sY     E-- +))E4(gj%00W***E+ Lr/   c                    	 t        j                  |       r| S t        | t              rt	        | t               t               dg      S | (	 	 t        j                  t        j                  |         S t        d      # t        $ r6 t        j                  t        j                  |      j                  d      cY S w xY w# t        $ r Y y w xY w)N*__name__z"Expected a module, string, or None)inspectismodule
isinstancestr
__import__globalslocalssysmodules_getframemodulenameAttributeError	_getframe	f_globalsKeyError	TypeError)moduledepths     r.   _normalize_modulerP      s     	FC	 &')VXu==		O{{3#:#:5#ABB <== " O{{3==#7#A#A*#MNNO 		s*   %A= =<B<9B? ;B<<B? ?	C
Cc                 :    t        d d      j                  | d      S NT)r%   decode)datas    r.   _newline_convertrU      s    $T4077dCCr/   c                    |ryt        |d      }t        ||       } t        |dd       x}	 |j                  j                  }t        |d      r/|j                  |       }|j                  |      }t        |      | fS t        | |      5 }|j                         | fcd d d        S # t
        $ r Y ow xY w# 1 sw Y   y xY w)N   
__loader__get_data)encoding)rP   _module_relative_pathr5   __spec__loaderrI   hasattrrY   rS   rU   openread)filenamepackagemodule_relativerZ   r]   file_contentsfs          r.   _load_testfilerf      s    #GQ/((;g|T::FC ))00 6:&"OOH5M)00:M $M2H<<	h	* "avvx!" " " " "s   B% 	B4%	B10B14B=c                 8    	 t        j                  d|dz  |       S )Nz
(?m)^(?!$) )resub)sindents     r.   _indentrm      s     
 66,s
A..r/   c                 v    	 t               }| \  }}}t        j                  ||||       |j                         S )N)file)r$   	tracebackprint_exceptiongetvalue)exc_infoexcoutexc_typeexc_valexc_tbs        r.   _exception_tracebackrx      s=    
 ZF (HgvhfE??r/   c                       e Zd Zd ZddZy)	_SpoofOutc                 `    t        j                  |       }|r|j                  d      s|dz  }|S N
)r$   rr   endswith)selfresults     r.   rr   z_SpoofOut.getvalue  s0    ""4( &//$/dNFr/   Nc                 P    | j                  |       t        j                  |        y N)seekr$   truncate)r   sizes     r.   r   z_SpoofOut.truncate  s    		$$r/   r   )r>   
__module____qualname__rr   r    r/   r.   rz   rz     s     r/   rz   c                 t   	 t         | vr| |k(  S | j                  t               }dt        |      }}|d   }|r!|j                  |      rt        |      }|d= ny|d   }|r$|j	                  |      r|t        |      z  }|d= ny||kD  ry|D ]*  }|j                  |||      }|dk  r y|t        |      z  }, y)Nr#   FT)ELLIPSIS_MARKERsplitr,   
startswithr~   find)wantgotwsstartposendposws         r.   _ellipsis_matchr     s    
 d"s{ 
O	$B #c(fH
1A>>!1vH1
2A<<?c!fF2& 
   88Ax0a<CF r/   c                 4    	 | j                         } | rd| z   S y)Nz# #)rstrip)lines    r.   _comment_liner   F  s     /;;=DDyr/   c                     dt        |       }}| j                  d      }|dk\  r|}| j                  dd|      }|dk\  r|}| j                  dd|      }|dk\  r|dz   }| || S )Nr#   r}   :.r)   )r,   r   rfind)msgstartendis       r.   _strip_exception_detailsr   N  sv     CH3EAAvaAAv		#q#AAv!uc?r/   c                   (    e Zd Z	 d ZddZd Zd Zy)_OutputRedirectingPdbc                 r    || _         d| _        t        j                  j	                  | |d       d| _        y )NFT)stdoutnosigintr)   )_OutputRedirectingPdb__out$_OutputRedirectingPdb__debugger_usedpdbPdb__init__use_rawinput)r   outs     r.   r   z_OutputRedirectingPdb.__init__n  s2    
$cD9r/   Nc                     d| _         |t        j                         j                  }t        j
                  j                  | |       y rR   )r   rF   rJ   f_backr   r   	set_trace)r   frames     r.   r   z_OutputRedirectingPdb.set_tracev  s4    #=MMO**E$&r/   c                 \    | j                   r t        j                  j                  |        y y r   )r   r   r   set_continuer   s    r.   r   z"_OutputRedirectingPdb.set_continue|  s$     GG  &  r/   c                     t         j                  }| j                  t         _        	 t        j                  j
                  | g| |t         _        S # |t         _        w xY wr   )rF   r   r   r   r   trace_dispatch)r   argssave_stdouts      r.   r   z$_OutputRedirectingPdb.trace_dispatch  sA    jjZZ
	%77))$66$CJCJs   A Ar   )r>   r   r   r   r   r   r   r   r/   r.   r   r   h  s    
''%r/   r   c                    t        j                  |       st        d| z        |j                  d      rt	        d      t        j                  j                  |j                  d       }t        | d      r-t
        j                  j                  | j                        d   }n| j                  dk(  rwt        t        j                        dkD  rJt        j                  d   dk7  r4t
        j                  j                  t        j                  d         d   }nt
        j                  }nxt        | d      rT| j                   D ]E  }t
        j                  j                  ||      }t
        j                  j#                  |      sC|c S  t	        d	| j                  z        t
        j                  j                  ||      S )
NzExpected 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__))r?   r@   rM   r   
ValueErrorospathjoinr   r^   r   r>   r,   rF   argvcurdirr   exists)rN   	test_pathbasedir	directoryfullpaths        r.   r[   r[     sN   F#/&899C LMM ys35I vz"''--03	J	&sxx=?sxx{b0ggmmCHHQK03GiiG6:&#__ $	77<<	9=77>>(+#O$  3!??+ , 	,
 77<<++r/   c                   &    e Zd Z	 	 	 ddZd Zd Zy)r   Nc                     |j                  d      s|dz  }|r|j                  d      s|dz  }||j                  d      s|dz  }|| _        || _        || _        || _        |i }|| _        || _        y r|   )r~   sourcer   linenorl   optionsexc_msg)r   r   r   r   r   rl   r   s          r.   r   zExample.__init__  s     t$dNFd+DLDw'7'7'=tOG	?bGr/   c                 z   t        |       t        |      urt        S | j                  |j                  k(  xr | j                  |j                  k(  xrj | j                  |j                  k(  xrO | j
                  |j
                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )typeNotImplementedr   r   r   rl   r   r   r   others     r.   __eq__zExample.__eq__  s    :T%[(!!{{ell* -yyEJJ&-{{ell*- {{ell*- ||u}},	-
 ||u}},	-r/   c                     t        | j                  | j                  | j                  | j                  | j
                  f      S r   )hashr   r   r   rl   r   r   s    r.   __hash__zExample.__hash__  s3    T[[$))T[[$++\\# $ 	$r/   )Nr#   r#   N)r>   r   r   r   r   r   r   r/   r.   r   r     s!    !D EF$	-$r/   r   c                   ,    e Zd Z	 d Zd Zd Zd Zd Zy)r   c                 v    	 || _         || _        |j                         | _        || _        || _        || _        y r   )examples	docstringcopyr7   r-   ra   r   )r   r   r7   r-   ra   r   r   s          r.   r   zDocTest.__init__  s9    	 !"ZZ\
	 r/   c                 &   t        | j                        dk(  rd}n3t        | j                        dk(  rd}ndt        | j                        z  }d| j                  j                  d| j                  d| j
                  d	| j                  d
|dS )Nr#   zno examplesr)   z	1 examplez%d examples<rh   z from r    (z)>)r,   r   	__class__r>   r-   ra   r   )r   r   s     r.   __repr__zDocTest.__repr__%  sp    t}}"$H1$"H$s4=='99H((DMM4;;B 	Cr/   c                 z   t        |       t        |      urt        S | j                  |j                  k(  xr | j                  |j                  k(  xrj | j                  |j                  k(  xrO | j
                  |j
                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )r   r   r   r   r7   r-   ra   r   r   s     r.   r   zDocTest.__eq__0  s    :T%[(!!}}. +~~0+zzU[[(+ yyEJJ&+ }}.	+
 {{ell*	+r/   c                 p    t        | j                  | j                  | j                  | j                  f      S r   )r   r   r-   ra   r   r   s    r.   r   zDocTest.__hash__;  s&    T^^TYYt{{KLLr/   c                     t        |t              st        S | j                  | j                  | j
                  t        |       f|j                  |j                  |j
                  t        |      fk  S r   )rA   r   r   r-   ra   r   idr   s     r.   __lt__zDocTest.__lt__?  sV    %)!!DMM4;;4AU^^U\\2e9EF 	Gr/   N)r>   r   r   r   r   r   r   r   r   r/   r.   r   r     s#    .	C	+MGr/   r   c                      e Zd Z	  ej                  dej
                  ej                  z        Z ej                  dej                  ej
                  z  ej                  z        Z	 ej                  d      j                  ZddZd ZddZd Z ej                  dej
                        Zd	 Z ej                  d
ej
                        Zd Zd Zd Zy)r   a  
        # Source consists of a PS1 line followed by zero or more PS2 lines.
        (?P<source>
            (?:^(?P<indent> [ ]*) >>>    .*)    # PS1 line
            (?:\n           [ ]*  \.\.\. .*)*)  # PS2 lines
        \n?
        # Want consists of any non-blank lines that do not start with PS1.
        (?P<want> (?:(?![ ]*$)    # 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<hdr> Traceback\ \(
            (?: most\ recent\ call\ last
            |   innermost\ last
            ) \) :
        )
        \s* $                # toss trailing whitespace on the header.
        (?P<stack> .*?)      # don't blink: absorb stuff until...
        ^ (?P<msg> \w+ .*)   #     a line *starts* with alphanum.
        z^[ ]*(#.*)?$c                    	 |j                         }| j                  |      }|dkD  r1dj                  |j                  d      D cg c]  }||d  	 c}      }g }d\  }}| j                  j                  |      D ]  }|j                  |||j                                 ||j                  d||j                               z  }| j                  |||      \  }	}
}}| j                  |	      s;|j                  t        |	||||t        |j                  d            z   |
             ||j                  d|j                         |j                               z  }|j                         } |j                  ||d         |S c c}w )Nr#   r}   r#   r#   rl   )r   rl   r   )
expandtabs_min_indentr   r   _EXAMPLE_REfinditerappendr   count_parse_example_IS_BLANK_OR_COMMENTr   r,   groupr   )r   stringr-   
min_indentloutputcharnor   mr   r   r   r   s                r.   parsezDocTestParser.parsez  so   	 ""$%%f-
>YYT8JK1*+KLF!!**62 	AMM&	23fll4;;F ((D&9 -VWdG ,,V4wvtW+1+5c!''(:K6L+L,3 5 7
 fll4AEEG<<FUUWF#	& 	fVWo&3  Ls   Fc                 D    	 t        | j                  ||      |||||      S r   )r   get_examples)r   r   r7   r-   ra   r   s         r.   get_doctestzDocTestParser.get_doctest  s0    	 t((6Xvv7 	7r/   c                 n    	 | j                  ||      D cg c]  }t        |t              r| c}S c c}w r   )r   rA   r   )r   r   r-   xs       r.   r   zDocTestParser.get_examples  s=    		  ::fd3 +aa)  + 	+ +s   2c           	         	 t        |j                  d            }|j                  d      j                  d      }| j                  ||||       | j	                  |dd  d|z  dz   ||       dj                  |D cg c]
  }||dz   d   c}      }|j                  d      }|j                  d      }	t        |	      dkD  rt        j                  d	|	d
         r|	d
= | j	                  |	d|z  ||t        |      z          dj                  |	D 
cg c]  }
|
|d  	 c}
      }| j                  j                  |      }|r|j                  d      }nd }| j                  |||      }||||fS c c}w c c}
w )Nrl   r   r}   r)   rh   r      r   z *$r   r   )
r,   r   r   _check_prompt_blank_check_prefixr   ri   match_EXCEPTION_RE_find_options)r   r   r-   r   rl   source_linesslr   r   
want_lineswlr   r   s                r.   r   zDocTestParser._parse_example  st   		 QWWX&' wwx(..t4  vtVD<+SZ#-=tVLLAbBvaxyMAB
 wwvZZ%
z?Q288FJrN#C2:s6z4!C$55	7yy
;""VW+;< $$T*ggenGG $$VT6:wg--/ B <s   <E-E2z#\s*doctest:\s*([^\n\'"]*)$c           
         	 i }| j                   j                  |      D ]x  }|j                  d      j                  dd      j	                         }|D ]B  }|d   dvs|dd  t
        vrt        d|dz   d|d|      t
        |dd     }|d   d	k(  ||<   D z |r%| j                  |      rt        d|d|d
|      |S )Nr)   ,rh   r#   z+-line z of the doctest for z has an invalid option: +z4 has an option directive on a line with no example: )_OPTION_DIRECTIVE_REr   r   replacer   r*   r   r   )	r   r   r-   r   r   r   option_stringsoptionflags	            r.   r  zDocTestParser._find_options  s    	 **33F; 		3AWWQZ//S9??AN( 31IT)12J&99$&,Qhf&> ? ? +6!":6!'c!13		3 t008$dF4 5 5 r/   z^([ ]*)(?=\S)c                     	 | j                   j                  |      D cg c]  }t        |       }}t        |      dkD  rt        |      S yc c}w r1   )
_INDENT_REfindallr,   min)r   rk   rl   indentss       r.   r   zDocTestParser._min_indent  sJ    E-1__-D-DQ-GH63v;HHw<!w<	 Is   Ac                     	 t        |      D ]E  \  }}t        |      |dz   k\  s||dz      dk7  s$t        d||z   dz   d|d|||dz    d|       y )	Nr  rW   rh   r  r)    of the docstring for z lacks blank after z: )	enumerater,   r   )r   linesrl   r-   r   r   r   s          r.   r  z!DocTestParser._check_prompt_blank  ss    	 !' 	@GAt4yF1H$fQh3)> "((1*d"&vfQh"7"? @ @	@r/   c           	          	 t        |      D ]3  \  }}|s	|j                  |      rt        d||z   dz   d|d|       y )Nr  r)   r  z& has inconsistent leading whitespace: )r  r   r   )r   r  prefixr-   r   r   r   s          r.   r  zDocTestParser._check_prefix%  sP    	 !' 	;GAtDOOF3 "((1*dD": ; ;	;r/   N)z<string>)r>   r   r   ri   compile	MULTILINEVERBOSEr   DOTALLr  r  r   r   r   r   r   r  r  r  r   r  r  r   r/   r.   r   r   J  s     "**  \\BJJ&(K, BJJ   ZZ",,&24M &2::o6<<%N
7+*.f &2::&D&(ll48 ,bll;J@	;r/   r   c                   N    e Zd Z	 d e       ddfdZddZd Zd Zd Zd	 Z	d
 Z
y)r   FTc                 >    	 || _         || _        || _        || _        y r   )_parser_verbose_recurse_exclude_empty)r   verboseparserrecurseexclude_emptys        r.   r   zDocTestFinder.__init__>  s&    	 +r/   Nc           	         	 |&t        |dd       }|t        dt        |            |du rd }n|t        j                  |      }	 t        j
                  |      }|s%t        j                  |      }|d   |dd  z   dk(  sd }|d }n=|!t        j                  ||j                        }nt        j                  |      }|sd }	 | |i }n+|j                  j                         }n|j                         }||j                  |       d|vrd|d<   g }| j                  ||||||i        |j                          |S # t        $ r d }Y w xY w)Nr>   zHDocTestFinder.find: name must be given when obj.__name__ doesn't exist: Fr#   z<]>r   )r5   r   r   r?   	getmodulegetsourcefilegetfile	linecachegetlines__dict__rM   r   update_findsort)	r   objr-   rN   r7   
extraglobsro   r	  testss	            r.   r   zDocTestFinder.findT  s}   !	F <3
D1D| "&s)". / / U?F^&&s+F
	(((-D  s+AwtBCy(E1$4|#% $-#5#5dFOO#LL $-#5#5d#;L##'L =~,,.JJLE!LL$U" *E* 

5#tV\5"E
 	

Y  	 L	 s   	E   EEc                    	 |yt        j                  |      |t        j                  |      u S t        j                  |      r|j                  |j                  u S t        j
                  |      st        j                  |      rLt        |d      r|j                  j                  }nt        |d      r|j                  }ny|j                  |k(  S t        j                  |      r|j                  |j                  k(  S t        |d      r|j                  |j                  k(  S t        |t              ryt        d      )NT__objclass__r   z"object must be a class or function)r?   r1  
isfunctionr6  __globals__ismethoddescriptorismethodwrapperr^   r>  r   r>   isclassrA   propertyr   )r   rN   objectobj_mods       r.   _from_modulezDocTestFinder._from_module  s   	 >v&2W..v666'??f&8&888((0%%f-v~. --88. ++??g--__V$??f&7&777V\*??f&7&777)ABBr/   c                 |    	 |}	 t        j                  |      }t        j                  |      S # t        $ r Y  w xY wr   )r?   unwrapr   	isroutine)r   r:  maybe_routines      r.   _is_routinezDocTestFinder._is_routine  sH    	 	#NN=9M   //  		s   / 	;;c           
      |   	 | j                   rt        d|z         t        |      |v ry d|t        |      <   | j                  |||||      }||j	                  |       t        j                  |      r| j                  rz|j                  j                         D ]]  \  }	}
|d|	}	| j                  |
      st        j                  |
      s4| j                  ||
      sG| j                  ||
|	||||       _ t        j                  |      r| j                  rt        |di       j                         D ]  \  }	}
t        |	t               st#        dt%        |	            t        j&                  |
      sQt        j                  |
      s<t        j                  |
      s't        |
t               st#        dt%        |
            |d|	}	| j                  ||
|	||||        t        j                  |      r| j                  r|j                  j                         D ]  \  }	}
t        |
t(        t*        f      r|
j,                  }
t        j&                  |
      s&t        j                  |
      st        |
t.              sc| j                  ||
      sv|d|	}	| j                  ||
|	||||        y y y )NzFinding tests in %sr)   r   __test__z3DocTestFinder.find: __test__ keys must be strings: z^DocTestFinder.find: __test__ values must be strings, functions, methods, classes, or modules: z
.__test__.)r(  printr   	_get_testr   r?   r@   r)  r6  itemsrL  rC  rG  r8  r5   rA   rB   r   r   rJ  staticmethodclassmethod__func__rD  )r   r<  r:  r-   rN   r	  r7   seentestvalnamevals              r.   r8  zDocTestFinder._find  sk   	 =='$./ c7d?RW ~~c4ELL C T]] # 2 2 4 ,%)73 %%c*gooc.B%%fc2JJuc7FL$d,, C T]] 'Z < B B D (!'3/$&*7m&6 7 7  ))#.'//#2F((-C1E$ '+3i&2 3 3 /3G<

5#w $((  ??3DMM # 2 2 4 ,cL+#>?,,C &&s+ws/C h/''4)-w7GJJuc7FL$d,, %2r/   c                    	 t        |t              r|}n7	 |j                  d}n'|j                  }t        |t              st        |      }| j                  ||      }| j                  r|sy |d }n(t        |dd       xs |j                  }|dd  dk(  r|d d }| j                  j                  |||||      S # t        t        f$ r d}Y w xY w)Nr   r   .pycr   )rA   rB   __doc__rM   rI   _find_linenor*  r5   r>   r'  r   )	r   r:  r-   rN   r7   r	  r   r   ra   s	            r.   rP  zDocTestFinder._get_test  s    	 c3I;;& "I #I%i5$'	N	
 ""35 y >H vz48KFOOH}&#CR=||''	5$(0&: 	:% ~. 	s   6B9 9CCc           
      P   	 d }t        |dd       }t        j                  |      r|d}t        j                  |      rc|a|y t	        j
                  dt	        j                  t        |dd            z        }t        |      D ]  \  }}|j                  |      s|} n t        j                  |      r|j                  }t        j                  |      rt        |dd       r|j                  }t        j                  |      r|j                  }t        j                  |      r|j                   }t        j"                  |      r|j$                  dz
  }|N||dz   S t	        j
                  d      }t'        |t)        |            D ]  }|j                  ||         s|c S  y )Nr\  r#   z^\s*class\s*%s\br>   -r)   z(^|.*:)\s*\w*("|\'))r5   r?   r@   rC  ri   r!  escaper  r  ismethodrT  r?  __code__istracebacktb_frameisframef_codeiscodeco_firstlinenoranger,   )r   r:  r	  r   r   patr   r   s           r.   r]  zDocTestFinder._find_linenoE  s   	
 CD1	 C Y%:F
 ??3I$9#**0YYwsJ'DEF GC$\2 499T?F C #c"wsIt'D,,Cs#3<<S??3szz>>#''!+F #ax**34CL(9: "99\&12!M"
 r/   NNNN)r>   r   r   r   r   r   rG  rL  r8  rP  r]  r   r/   r.   r   r   5  s=      %]_T,,dLC:	0;,z$:L2r/   r   c                       e Zd Z	 dZddZd Zd Zd Zd Zd Z	d	 Z
d
 Z ej                  d      ZddZddZddZd Zy)r   zF**********************************************************************Nc                     	 |xs
 t               | _        |dt        j                  v }|| _        || _        || _        d| _        d| _        i | _	        t               | _        y )N-vr#   )r   _checkerrF   r   r(  optionflagsoriginal_optionflagstriesfailures_name2ftrz   _fakeout)r   checkerr+  rp  s       r.   r   zDocTestRunner.__init__  sc    	   2=??chh&G&$/! 
 "r/   c                     	 | j                   rf|j                  r8 |dt        |j                        z   dz   t        |j                        z          y  |dt        |j                        z   dz          y y )NzTrying:
zExpecting:
zExpecting nothing
)r(  r   rm   r   )r   r   rV  examples       r.   report_startzDocTestRunner.report_start  so    	 ==||K''.."99"#%,W\\%:; < K''.."99)* + r/   c                 0    	 | j                   r	 |d       y y )Nzok
)r(  r   r   rV  rx  r   s        r.   report_successzDocTestRunner.report_success  s    	 ==K r/   c                     	  || j                  ||      | j                  j                  ||| j                        z          y r   )_failure_headerro  output_differencerp  r{  s        r.   report_failurezDocTestRunner.report_failure  sC    	 	D  w/MM++GS$:J:JKL 	Mr/   c                 f    	  || j                  ||      dz   t        t        |            z          y )NzException raised:
)r~  rm   rx   r   r   rV  rx  rs   s        r.   report_unexpected_exceptionz)DocTestRunner.report_unexpected_exception  s=    	 	D  w/!"$+,@,J$KL 	Mr/   c                    | j                   g}|j                  rf|j                  )|j                  |j                  |j                  z   dz   }nd}|j                  d|j                  d|d|j                         n.|j                  d|j                  dz   d|j                         |j                  d       |j
                  }|j                  t        |             dj                  |      S )	Nr)   ?zFile "", line , in zLine zFailed example:r}   )DIVIDERra   r   r   r-   r   rm   r   )r   rV  rx  r   r   r   s         r.   r~  zDocTestRunner._failure_header   s    ||n=={{&7>>+Ew~~59JJvtyy: ; JJ7>>!+;TYYGH

$%

76?#yy~r/   c           
      V   	 dx}}| j                   }t        d      \  }}}	| j                  j                  }
t	        |j
                        D ]v  \  }}| j                   t        z  xr |dkD  }|| _         |j                  rP|j                  j                         D ]3  \  }}|r| xj                   |z  c_         | xj                   | z  c_         5 | j                   t        z  r|dz  }|s| j                  |||       d|j                  |fz  }	 t        t        |j                  |d|d      |j                         | j                   j#                          d }| j*                  j-                         }| j*                  j/                  d       |}|! |
|j0                  || j                         r|}nt3        j4                  |d d  d   }|s|t7        |      z  }|j8                  |	}nf |
|j8                  || j                         r|}nE| j                   t:        z  r2 |
t=        |j8                        t=        |      | j                         r|}||u r|sT| j?                  ||||       n?||u r|s| jA                  ||||       |dz  }n||	u r|s| jC                  ||||       |dz  }|sb| j                   tD        z  sw n || _         | jG                  |||       tI        ||      S # t$        $ r   t'        j(                         }| j                   j#                          Y xY w)	Nr#   rW   r)   z<doctest %s[%d]>singleT   r   )%rp  ri  ro  check_outputr  r   r   r   rQ  r   ry  r-   execr!  r   r7   debuggerr   KeyboardInterruptrF   rs   ru  rr   r   r   rp   format_exception_onlyrx   r   r   r   r|  r  r  r   _DocTestRunner__record_outcomer'   )r   rV  compileflagsr   rs  rr  rq  SUCCESSFAILUREBOOMcheck
examplenumrx  quiet
optionflagrX  ra   	exceptionr   outcomer   s                        r.   __runzDocTestRunner.__run  s2   	 5  $//!&q$** $-T]]#; ^	J %%(AA "\   4D)0)>)>)@ 8%Z((J6(((ZK7(	8 $& QJE!!#tW5
 *TYY
,CCH

-WW^^Xx)4126**>**, 	 --((*CMM""1%G  sD,<,<=%G $999Ra=I"M/	::C ??*"G 7??GT5E5EF%G %%(??5gooF5g>!--/ #* '!''T7C@G#''T7C@AD44S$5>@A D,,y8}^	B 0 	dHe48U++} % -LLN	**,s   A	K,,9L(c                     	 | j                   j                  |j                  d      \  }}||z   ||z   f| j                   |j                  <   | xj                  |z  c_        | xj                  |z  c_        y )Nr   )rt  r4   r-   rs  rr  )r   rV  re   tf2t2s         r.   __record_outcomezDocTestRunner.__record_outcome  s`    	 ""499e4B$%bD!B$<dii 

a
r/   z.<doctest (?P<name>.+)\[(?P<examplenum>\d+)\]>$c                 J   | j                   j                  |      }|ru|j                  d      | j                  j                  k(  rM| j                  j
                  t        |j                  d               }|j                  j                  d      S | j                  ||      S )Nr-   r  Tkeepends)
%_DocTestRunner__LINECACHE_FILENAME_REr  r   rV  r-   r   intr   
splitlinessave_linecache_getlines)r   ra   module_globalsr   rx  s        r.   __patched_linecache_getlinesz*DocTestRunner.__patched_linecache_getlines  s    ((..x8DIINN2ii((QWW\-B)CDG>>,,d,;;//.IIr/   c                 x  	
 	 || _         |t        |j                        }t        j                  
|4
j
                  			j                         dk(  r
j                  }n	
fd}| j                  t        _        t        j                         }t        j                  }t        
      | _        | j                  j                          | j                  j                  t        _        t        j                   | _        | j$                  t        _        t        j&                  }t        j(                  t        _        	 | j+                  |||      
t        _        |t        _        t        j,                  |       | j"                  t        _        |t        _        |r&|j                  j/                          dd l}d |_        S S # 
t        _        |t        _        t        j,                  |       | j"                  t        _        |t        _        |r&|j                  j/                          dd l}d |_        w w xY w)Nutf-8c                 `    t        | j                  d            } j                  |        y )Nbackslashreplace)rB   encodewrite)rk   rZ   r   s    r.   r   zDocTestRunner.run.<locals>.out  s)    AHHX/ABHMA%%a(r/   r#   )rV  r;   r7   rF   r   rZ   lowerr  ru  gettracer   r   r   r  resetr4  r5  r  *_DocTestRunner__patched_linecache_getlinesdisplayhook__displayhook___DocTestRunner__runsettraceclearbuiltins_)r   rV  r  r   clear_globs
save_tracesave_set_tracesave_displayhookr  rZ   r   s            @@r.   runzDocTestRunner.run  s   	& 	0<Ljj;"++H8>>#3w#>!'') ]]
 \\^
-k:// (1'9'9$!>>	 ??--	"::dL#6$CJ*CMLL$!%!=!=I.CO

  "!
  %CJ*CMLL$!%!=!=I.CO

  "!
 s   >G A5H9c                    	 || j                   }g }g }g }dx}}| j                  j                         D ]U  }|\  }\  }	}
||
z  }||	z  }|
dk(  r|j                  |       ,|	dk(  r|j                  ||
f       E|j                  |       W |r{|r8t	        t        |      d       |j                          |D ]  }t	        d|        |r?t	        t        |      d       |j                          |D ]  \  }}t	        d||fz          |rXt	        | j                         t	        t        |      d       |j                          |D ]  \  }\  }	}
t	        d|	|
|fz          |r2t	        |dt        | j                        d	       t	        ||z
  d
|d       |rt	        d|d       n|rt	        d       t        ||      S )Nr#   zitems had no tests:z   zitems passed all tests:z %3d tests in %szitems had failures:z %3d of %3d in %sztests inzitems.z
passed andzfailed.z***Test Failed***z	failures.zTest passed.)	r(  rt  rQ  r   rO  r,   r9  r  r'   )r   r+  notestspassedfailedtotalttotalfr  r-   re   r  thingr   s                r.   	summarizezDocTestRunner.summarize  s   		 ?mmG$$& 
	!ALD&1aaKFaKFAvt$aay*a 
	! c'l$9:$ (E%'(c&k#<=$* ?LE5,u~=>?$,,#f+45KKM!' ;v1)Q5M9:;&*c$--&8(C&6/<C%v{;.!66**r/   c                     | j                   }|j                   j                         D ]%  \  }\  }}||v r||   \  }}||z   }||z   }||f||<   ' y r   )rt  rQ  )r   r   dr-   re   r  r  r  s           r.   mergezDocTestRunner.merge(  sd    MM!NN002 		LD&1aqy
 4BFFdAdG		r/   )NNr#   r   NNT)r>   r   r   r  r   ry  r|  r  r  r~  r  r  ri   r!  r  r  r  r  r  r   r/   r.   r   r   }  sn    6r G$H+MM({,z )bjj *F GJD"R4+rr/   r   c                   &    e Zd Z	 d Zd Zd Zd Zy)r   c                 <    	 t        |j                  dd      d      S )NASCIIr  )rB   r  )r   rk   s     r.   _toAsciizOutputChecker._toAscii=  s"    	 188G%78'BBr/   c                    	 | j                  |      }| j                  |      }||k(  ry|t        z  s||fdk(  ry||fdk(  ry|t        z  sNt        j                  dt        j
                  t              z  d|      }t        j                  dd|      }||k(  ry|t        z  rDdj                  |j                               }dj                  |j                               }||k(  ry|t        z  rt        ||      ryy)	NT)zTrue
z1
)zFalse
z0
z(?m)^%s\s*?$r   z(?m)^[^\S\n]+$rh   F)r  r   r   ri   rj   r`  BLANKLINE_MARKERr   r   r   r   r   r   r   r   rp  s       r.   r  zOutputChecker.check_outputC  s   	 mmC }}T" $; 44Dz..Dz// 3366/BII6F,GGd$D &&*B4Cd{
 --((399;'C88DJJL)Dd{ !tS) r/   c                     |t         t        z  t        z  z  sy|t        z  ry|j                  d      dkD  xr |j                  d      dkD  S )NFTr}   r  )r
   r   r   r   r  s       r.   _do_a_fancy_diffzOutputChecker._do_a_fancy_diff  sV    l*+*+ ,  % zz$!#;		$!(;;r/   c                    	 |j                   }|t        z  st        j                  dt        |      }| j                  |||      r|j                  d      }|j                  d      }|t        z  r)t        j                  ||d      }t        |      dd  }d}n||t        z  r)t        j                  ||d      }t        |      dd  }d}nJ|t        z  rAt        j                  t        j                        }	t        |	j!                  ||            }d	}d
z  t#        dj%                              z   S |r|rdt#        |      dt#        |      S |rdt#        |      z  S |rdt#        |      z  S y)Nz(?m)^[ ]*(?=
)Tr  r  )nz#unified diff with -expected +actualz-context diff with expected followed by actual)charjunkzndiff with -expected +actualzDifferences (%s):
r   z
Expected:
zGot:
zExpected:
%sGot nothing
zExpected nothing
Got:
%szExpected nothing
Got nothing
)r   r   ri   rj   r  r  r  r
   difflibunified_difflistr   context_diffr   DifferIS_CHARACTER_JUNKcomparerm   r   )
r   rx  r   rp  r   r  	got_linesdiffkindengines
             r.   r  zOutputChecker.output_difference  s[   	 || 33&&*,<cBC   sK8$7J5I\)++J	QGDz!"~<|+++J	QGDz!"~F|+ 1J1JKFNN:yAB5 )4/'"''$-2HHH C.5dmWS\JJ/'$-??/'#,>>4r/   N)r>   r   r   r  r  r  r  r   r/   r.   r   r   5  s    C<~<.,5r/   r   c                       e Zd Z	 d Zd Zy)r   c                 .    || _         || _        || _        y r   )rV  rx  r   )r   rV  rx  r   s       r.   r   zDocTestFailure.__init__  s    	r/   c                 ,    t        | j                        S r   rB   rV  r   s    r.   __str__zDocTestFailure.__str__      499~r/   Nr>   r   r   r   r  r   r/   r.   r   r     s    	
r/   r   c                       e Zd Z	 d Zd Zy)r   c                 .    || _         || _        || _        y r   )rV  rx  rs   )r   rV  rx  rs   s       r.   r   zUnexpectedException.__init__  s    	 r/   c                 ,    t        | j                        S r   r  r   s    r.   r  zUnexpectedException.__str__  r  r/   Nr  r   r/   r.   r   r     s    	!
r/   r   c                   "    e Zd Z	 ddZd Zd Zy)r   Nc                 p    t         j                  | |||d      }|r|j                  j                          |S )NF)r   r  r7   r  )r   rV  r  r   r  rs         r.   r  zDebugRunner.runH  s2    dD,UCJJr/   c                     t        |||      r   )r   r  s        r.   r  z'DebugRunner.report_unexpected_exceptionN  s    !$::r/   c                     t        |||      r   )r   r{  s        r.   r  zDebugRunner.report_failureQ  s    T7C00r/   r  )r>   r   r   r  r  r  r   r/   r.   r   r     s    Xt;1r/   r   TFc	                    	 | t         j                  j                  d      } t        j                  |       st        d|       || j                  }t        |      }	|rt        ||      }
nt        ||      }
|	j                  | |||      D ]  }|
j                  |        |r|
j                          t        |
ant        j                  |
       t        |
j                   |
j"                        S )Nr   ztestmod: module required; )r.  r+  rp  r7   r;  )rF   rG   r4   r?   r@   rM   r>   r   r   r   r   r  r  masterr  r'   rs  rr  )r   r-   r7   r+  reportrp  r;  raise_on_errorr.  finderrunnerrV  s               r.   r   r   ]  s    >D 	y KKOOJ' A!=>> |zz 7FW+FwKHAt5ZH 

4 ~Vv55r/   c                    	 |r|st        d      t        | |||xs d      \  }} |t        j                  j	                  |       }|i }n|j                         }||j                  |       d|vrd|d<   |	rt        ||      }nt        ||      }|
j                  |||| d      }|j                  |       |r|j                          t        |ant        j                  |       t        |j                  |j                         S )N8Package may only be specified for module-relative paths.r  r>   r   r  r#   )r   rf   r   r   basenamer   r7  r   r   r   r  r  r  r  r'   rs  rr  )ra   rc   r-   rb   r7   r+  r  rp  r;  r  r,  rZ   textr  rV  s                  r.   r   r     s   K\  + , 	, $Hg$,$79ND( |ww) }

Z &jW+FwKH dE41=D
JJt~Vv55r/   c                     	 t        |d      }t        ||      }|j                  | ||      D ]  }|j                  ||        y )NF)r+  r-  r  )r7   )r  )r   r   r   r  )	re   r7   r+  r-   r  rp  r  r  rV  s	            r.   r   r   @  sO      7E:F7DFAt51 4

4l
34r/   c                 H    	 | t         z  | k7  rt        d|       t        }| a|S )NzOnly reporting flags allowed)r   r   _unittest_reportflags)r8   olds     r.   r   r   ]  s4    8 	E)7??
C!Jr/   c                   l    e Zd Z	 	 ddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zej                  Zd Zy)DocTestCaseNc                     t         j                  j                  |        || _        || _        |j
                  j                         | _        || _        || _	        || _
        y r   )unittestTestCaser   _dt_optionflags_dt_checkerr7   r   	_dt_globs_dt_test	_dt_setUp_dt_tearDown)r   rV  rp  setUptearDownrv  s         r.   r   zDocTestCase.__init__  sP     	""4(*"*$r/   c                 X    | j                   }| j                  | j                  |       y y r   )r  r  r   rV  s     r.   r  zDocTestCase.setUp  s&    }}>>%NN4  &r/   c                     | j                   }| j                  | j                  |       |j                  j                          |j                  j	                  | j
                         y r   )r  r  r7   r  r7  r
  r  s     r.   r  zDocTestCase.tearDown  sM    }}(d# 	



$..)r/   c                    | j                   }t        j                  }t               }| j                  }|t
        z  s	|t        z  }t        || j                  d      }	 d|_	        |j                  ||j                  d      \  }}|t        _        |r.| j                  | j                  |j                                     y # |t        _        w xY w)NFrp  rv  r+  zF----------------------------------------------------------------------)r   r  )r  rF   r   r$   r  r   r  r   r	  r  r  r  failureExceptionformat_failurerr   )r   rV  r  newrp  r  rs  rr  s           r.   runTestzDocTestCase.runTest  s    }}jjj**o- 00K;'+'7'7H	#FN$jj#)) ) 8OHe CJ''(;(;CLLN(KLL  CJs   (C Cc           
          | j                   }|j                  d}nd|j                  z  }dj                  |j                  j	                  d      dd        }d|j                  d|j
                  d|d|d	|
S )
Nzunknown line numberz%sr   r   Failed doctest test for 	
  File "r  r  z

)r  r   r   r-   r   ra   )r   errrV  r   lnames        r.   r  zDocTestCase.format_failure  sj    }};;*FDKK'F-bc23 99dmmVUCA 	r/   c                     	 | j                          t        | j                  | j                  d      }|j	                  | j
                  d       | j                          y )NFr  )r  )r  r   r  r	  r  r  r  )r   r  s     r.   r"   zDocTestCase.debug  sN    ?	B 	

)=)=%)%5%5uF

4==e
4r/   c                 .    | j                   j                  S r   r  r-   r   s    r.   r   zDocTestCase.id
	  s    }}!!!r/   c                 D   t        |       t        |      urt        S | j                  |j                  k(  xrj | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j
                  |j
                  k(  xr | j                  |j                  k(  S r   )r   r   r  r  r  r  r	  r   s     r.   r   zDocTestCase.__eq__	  s    :T%[(!!}}. 5##u'<'<<5~~05   E$6$665 5#4#44		5r/   c                 p    t        | j                  | j                  | j                  | j                  f      S r   )r   r  r  r  r	  r   s    r.   r   zDocTestCase.__hash__	  s3    T))4>>4;L;L%%' ( 	(r/   c                     | j                   j                  j                  d      }|d   ddj                  |d d       dS )Nr   r   r   ))r  r-   r   r   )r   r-   s     r.   r   zDocTestCase.__repr__	  s:    }}!!'', HchhtCRy&9::r/   c                 4    d| j                   j                  z   S )Nz	Doctest: r   r   s    r.   shortDescriptionzDocTestCase.shortDescription!	  s    T]]////r/   )r#   NNN)r>   r   r   r   r  r  r  r  r"   r   r   r   r   rE  r  r&  r   r/   r.   r  r    sM    AE	%!*M0
FP"5(; nnG0r/   r  c                   (    e Zd Zd Zd Zd Zd ZeZy)SkipDocTestCasec                 >    || _         t        j                  | d        y r   )rN   r  r   )r   rN   s     r.   r   zSkipDocTestCase.__init__%	  s    T4(r/   c                 &    | j                  d       y )Nz-DocTestSuite will not work with -O2 and above)skipTestr   s    r.   r  zSkipDocTestCase.setUp)	  s    EFr/   c                      y r   r   r   s    r.   	test_skipzSkipDocTestCase.test_skip,	      r/   c                 4    d| j                   j                  z  S )NzSkipping tests from %s)rN   r>   r   s    r.   r&  z SkipDocTestCase.shortDescription/	  s    '$++*>*>>>r/   N)r>   r   r   r   r  r-  r&  r  r   r/   r.   r(  r(  $	  s    )G? Gr/   r(  c                       e Zd Zd Zy)_DocTestSuitec                      y r   r   )r   indexs     r.   _removeTestAtIndexz _DocTestSuite._removeTestAtIndex7	  r.  r/   N)r>   r   r   r4  r   r/   r.   r1  r1  5	  s    r/   r1  c                    	 |
t               }t        |       } |j                  | ||      }|sCt        j                  j
                  dk\  r&t               }|j                  t        |              |S |j                          t               }|D ]b  }t        |j                        dk(  r|j                  s | j                  }|dd  dk(  r|d d }||_        |j                  t        |fi |       d |S )Nr  r  r#   rZ  r[  r   )r   rP   r   rF   r8   optimizer1  addTestr(  r9  r,   r   ra   r   r  )	rN   r7   r;  test_finderr   r<  suiterV  ra   s	            r.   r   r   ;	  s    !F #ov&FV5ZHESYY''!+of-.	JJLOE 4t}}"}}H}&#CR=$DMk$2'234 Lr/   c                       e Zd Zd Zd Zd Zy)DocFileCasec                 j    dj                  | j                  j                  j                  d            S )Nr  r   )r   r  r-   r   r   s    r.   r   zDocFileCase.id}	  s&    xx**00566r/   c                 .    | j                   j                  S r   )r  ra   r   s    r.   r   zDocFileCase.__repr__	  s    }}%%%r/   c                 h    d| j                   j                  d| j                   j                  d|S )Nr  r  z", line 0

)r  r-   ra   )r   r  s     r.   r  zDocFileCase.format_failure	  s(    ==%%t}}'='=sD 	r/   N)r>   r   r   r   r   r  r   r/   r.   r;  r;  {	  s    7&r/   r;  c                    |i }n|j                         }|r|st        d      t        | |||xs d      \  }} d|vr| |d<   t        j                  j                  |       }|j                  |||| d      }	t        |	fi |S )Nr  r  r   r#   )r   r   rf   r   r   r  r   r;  )
r   rc   rb   r7   r,  rZ   r   docr-   rV  s
             r.   DocFileTestrA  	  s     }

 + , 	, tWo'274IC  j 77D!D c5$a8Dt'w''r/   c                      	 t               }|j                  dd      rt        |j                  d            |d<   | D ]  }|j                  t	        |fi |        |S )Nrc   Trb   )r1  r4   rP   r7  rA  )pathskwr9  r   s       r.   r   r   	  se    6n OE
 
vv&)"&&*;<9 /k$-"-./ Lr/   c                 `   	 g }t               j                  |       D ]  }t        |t              rg|j	                  |j
                  d d        |j                  }|s@|j	                  d       ||j                  d      d d D cg c]  }d|z   	 c}z  }z||j                  d      d d D cg c]  }t        |       c}z  } |r#|d   dk(  r|j                          |r	|d   dk(  r|r$|d   dk(  r|j                  d       |r	|d   dk(  rdj                  |      dz   S c c}w c c}w )Nr   z# Expected:r}   z## r   r#   )r   r   rA   r   r   r   r   r   r   popr   )rk   r   piecer   r   s        r.   r   r   	  s7   8r F&&q) 8eW%MM%,,s+,::Dm,DJJt,<Sb,ABq57BB  %D 1#2 68 %Q' 8 8F8 VBZ3&

 VBZ3&
VAY#%

1 VAY#% 99Vt## C8s   D&.D+c                     	 t        |       } t               j                  |       }|D cg c]  }|j                  |k(  s| }}|st	        |d      |d   }t        |j                        }|S c c}w )Nznot found in testsr#   )rP   r   r   r-   r   r   r   )rN   r-   r<  r  rV  testsrcs         r.   r    r    =
  st     v&FO  (E/!$A/D/3447D"4>>2GN 0s
   A/A/c                 6    	 t        |       }t        |||       y r   )r   debug_script)srcpmr7   rI  s       r.   r!   r!   M
  s    >"3'G"e$r/   c                    	 dd l }|r|j                         }ni }|r	 t        | ||       y  |j                  d      j                  d| z  ||       y #  t        t	        j
                         d           |j                  d      }|j                          |j                  d t	        j
                         d          Y y xY w)Nr#   r)   T)r   r  zexec(%r))
r   r   r  rO  rF   rs   r   r  interactionr  )rL  rM  r7   r   ps        r.   rK  rK  R
  s    =

		3eU# 	"":#3UEB	3#,,.#$&AGGIMM$q 12s   A A,Cc                 b    	 t        |       } t        | |      }t        ||| j                         y r   )rP   r    rK  r6  )rN   r-   rM  rI  s       r.   r"   r"   f
  s/     v&F&G"foo.r/   c                        e Zd Z	 d Zd Zd Zy)
_TestClassc                     	 || _         y r   rX  )r   rX  s     r.   r   z_TestClass.__init__
  s    	 r/   c                 0    	 | j                   dz  | _         | S )Nr  rU  r   s    r.   squarez_TestClass.square
  s    	 88q=r/   c                     	 | j                   S r   rU  r   s    r.   r4   z_TestClass.get
  s    	 xxr/   N)r>   r   r   r   rW  r4   r   r/   r.   rS  rS  t
  s    r/   rS  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 <BLANKLINE>:
                    >>> print('foo\n\nbar\n')
                    foo
                    <BLANKLINE>
                    bar
                    <BLANKLINE>
            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]
            )rS  r   zbool-int equivalencezblank linesellipsiszwhitespace normalizationc                     dd l } | j                  d      }|j                  ddddd	       |j                  d
ddt        j	                         g d       |j                  dddd       |j                  ddd       |j                         }|j                  }|j                  }d}|j                  D ]  }|t        |   z  } |j                  r	|t        z  }|D ]  }|j                  d      rst        j                  j                  |      \  }}t        j                  j!                  d|       t#        |d d       }	t        j                  d= t%        |	||      \  }
}nt'        |d||      \  }
}|
s y y)Nr#   zdoctest runner)descriptionrn  z	--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_  ro   r  z file containing the tests to run)nargsr_  z.pyr  )rc   r+  rp  r)   )argparseArgumentParseradd_argumentr*   keys
parse_argsro   r+  r  	fail_fastr   r~   r   r   r   rF   insertrC   r   r   )rc  r,  r   	testfilesr+  r   r  ra   dirnamer   rs  r  s               r.   _testrl  
  s   $$1A$BF
k,F  H
j 3 8 8 :BE  G
 mLF  H c?  AD		I llGG++ /&v../~~9 U# !#h 7GXHHOOAw'8CR=)A!!W'JKHa"8U-4'KKHa r/   r   )r  )r  )	NNNNTr#   NFF)FNoNameNr#   rk  )FN)F)S__docformat____all__r2   r  r?   r4  r   r   ri   rF   rp   r  ior$   r%   collectionsr&   r'   r*   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r  r   r;   rP   rU   rf   rm   rx   rz   r   r   r   r   r   r[   r   r   r   r   r   r   	Exceptionr   r   r   r  r   r   r   r  r   r  r  r(  	TestSuiter1  r   r;  rA  r   r   r    r!   rK  r"   rS  rN  rl  r>   exitr   r/   r.   <module>ru     s7  %N &+Z     	 
 	 
   2 "(:;.  O --EF +,CD *+AB z*6"-.GH *)*()  	
 ,,  #>2">2">2/0KL ,	   -- 	 ! &
>2D"$/	   /b4"%CGG "%J ,\B$ B$HEG EGVd; d;VB BP
v vpP5 P5dY &) &e1- e1\ 
373705f6P (,$dU=?y6v :B:;46  !Ha0(## a0Fk "H&& >@+  '+D=?(4CRP$d %
C(	/* *X %%( )Q0f*Z zCHHUW r/   