1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport os 2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys 3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport difflib 4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport __builtin__ 5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport re 6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport pydoc 7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport inspect 8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport keyword 9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest 10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport xml.etree 11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport test.test_support 12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom collections import namedtuple 13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test.script_helper import assert_python_ok 14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test.test_support import ( 15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TESTFN, rmtree, reap_children, captured_stdout) 16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test import pydoc_mod 18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif test.test_support.HAVE_DOCSTRINGS: 20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected_data_docstrings = ( 21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'dictionary for instance variables (if defined)', 22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'list of weak references to the object (if defined)', 23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehelse: 25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected_data_docstrings = ('', '') 26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexpected_text_pattern = \ 28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh""" 29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehNAME 30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test.pydoc_mod - This is a test module for test_pydoc 31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehFILE 33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh %s 34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh%s 35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehCLASSES 36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh __builtin__.object 37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh B 38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh A 39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh\x20\x20\x20\x20 40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class A 41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh | Hello and goodbye 42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh |\x20\x20 43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh | Methods defined here: 44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh |\x20\x20 45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh | __init__() 46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh | Wow, I have no function! 47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh\x20\x20\x20\x20 48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class B(__builtin__.object) 49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh | Data descriptors defined here: 50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh |\x20\x20 51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh | __dict__%s 52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh |\x20\x20 53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh | __weakref__%s 54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh |\x20\x20 55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh | ---------------------------------------------------------------------- 56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh | Data and other attributes defined here: 57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh |\x20\x20 58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh | NO_MEANING = 'eggs' 59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehFUNCTIONS 61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh doc_func() 62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh This function solves all of the world's problems: 63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh hunger 64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lack of Python 65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh war 66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh\x20\x20\x20\x20 67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh nodoc_func() 68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehDATA 70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh __author__ = 'Benjamin Peterson' 71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh __credits__ = 'Nobody' 72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh __version__ = '1.2.3.4' 73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehVERSION 75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1.2.3.4 76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehAUTHOR 78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Benjamin Peterson 79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehCREDITS 81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Nobody 82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh""".strip() 83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexpected_text_data_docstrings = tuple('\n | ' + s if s else '' 85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for s in expected_data_docstrings) 86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexpected_html_pattern = \ 88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh""" 89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<table width="100%%" cellspacing=0 cellpadding=2 border=0 summary="heading"> 90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr bgcolor="#7799ee"> 91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td valign=bottom> <br> 92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="test.html"><font color="#ffffff">test</font></a>.pydoc_mod</strong></big></big> (version 1.2.3.4)</font></td 93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh><td align=right valign=bottom 94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:%s">%s</a>%s</font></td></tr></table> 95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh <p><tt>This is a test module for test_pydoc</tt></p> 96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<p> 97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<table width="100%%" cellspacing=0 cellpadding=2 border=0 summary="section"> 98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr bgcolor="#ee77aa"> 99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td colspan=3 valign=bottom> <br> 100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr> 101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh\x20\x20\x20\x20 102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td> 103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td width="100%%"><dl> 104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a> 105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh</font></dt><dd> 106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<dl> 107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<dt><font face="helvetica, arial"><a href="test.pydoc_mod.html#B">B</a> 108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh</font></dt></dl> 109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh</dd> 110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<dt><font face="helvetica, arial"><a href="test.pydoc_mod.html#A">A</a> 111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh</font></dt></dl> 112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh <p> 113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<table width="100%%" cellspacing=0 cellpadding=2 border=0 summary="section"> 114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr bgcolor="#ffc8d8"> 115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td colspan=3 valign=bottom> <br> 116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<font color="#000000" face="helvetica, arial"><a name="A">class <strong>A</strong></a></font></td></tr> 117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh\x20\x20\x20\x20 118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td> 119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td colspan=2><tt>Hello and goodbye<br> </tt></td></tr> 120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr><td> </td> 121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td width="100%%">Methods defined here:<br> 122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<dl><dt><a name="A-__init__"><strong>__init__</strong></a>()</dt><dd><tt>Wow, I have no function!</tt></dd></dl> 123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh</td></tr></table> <p> 125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<table width="100%%" cellspacing=0 cellpadding=2 border=0 summary="section"> 126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr bgcolor="#ffc8d8"> 127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td colspan=3 valign=bottom> <br> 128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<font color="#000000" face="helvetica, arial"><a name="B">class <strong>B</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr> 129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh\x20\x20\x20\x20 130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr><td bgcolor="#ffc8d8"><tt> </tt></td><td> </td> 131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td width="100%%">Data descriptors defined here:<br> 132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<dl><dt><strong>__dict__</strong></dt> 133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<dd><tt>%s</tt></dd> 134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh</dl> 135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<dl><dt><strong>__weakref__</strong></dt> 136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<dd><tt>%s</tt></dd> 137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh</dl> 138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<hr> 139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehData and other attributes defined here:<br> 140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<dl><dt><strong>NO_MEANING</strong> = 'eggs'</dl> 141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh</td></tr></table></td></tr></table><p> 143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<table width="100%%" cellspacing=0 cellpadding=2 border=0 summary="section"> 144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr bgcolor="#eeaa77"> 145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td colspan=3 valign=bottom> <br> 146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr> 147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh\x20\x20\x20\x20 148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr><td bgcolor="#eeaa77"><tt> </tt></td><td> </td> 149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td width="100%%"><dl><dt><a name="-doc_func"><strong>doc_func</strong></a>()</dt><dd><tt>This function solves all of the world's problems:<br> 150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehhunger<br> 151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehlack of Python<br> 152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehwar</tt></dd></dl> 153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh <dl><dt><a name="-nodoc_func"><strong>nodoc_func</strong></a>()</dt></dl> 154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh</td></tr></table><p> 155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<table width="100%%" cellspacing=0 cellpadding=2 border=0 summary="section"> 156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr bgcolor="#55aa55"> 157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td colspan=3 valign=bottom> <br> 158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr> 159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh\x20\x20\x20\x20 160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td> 161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td width="100%%"><strong>__author__</strong> = 'Benjamin Peterson'<br> 162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<strong>__credits__</strong> = 'Nobody'<br> 163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<strong>__version__</strong> = '1.2.3.4'</td></tr></table><p> 164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<table width="100%%" cellspacing=0 cellpadding=2 border=0 summary="section"> 165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr bgcolor="#7799ee"> 166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td colspan=3 valign=bottom> <br> 167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr> 168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh\x20\x20\x20\x20 169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr><td bgcolor="#7799ee"><tt> </tt></td><td> </td> 170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td width="100%%">Benjamin Peterson</td></tr></table><p> 171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<table width="100%%" cellspacing=0 cellpadding=2 border=0 summary="section"> 172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr bgcolor="#7799ee"> 173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td colspan=3 valign=bottom> <br> 174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<font color="#ffffff" face="helvetica, arial"><big><strong>Credits</strong></big></font></td></tr> 175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh\x20\x20\x20\x20 176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<tr><td bgcolor="#7799ee"><tt> </tt></td><td> </td> 177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh<td width="100%%">Nobody</td></tr></table> 178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh""".strip() 179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexpected_html_data_docstrings = tuple(s.replace(' ', ' ') 181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for s in expected_data_docstrings) 182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# output pattern for missing module 184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehmissing_pattern = "no Python documentation found for '%s'" 185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# output pattern for module with bad imports 187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehbadimport_pattern = "problem in %s - <type 'exceptions.ImportError'>: No module named %s" 188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef run_pydoc(module_name, *args, **env): 190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """ 191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Runs pydoc on the specified module. Returns the stripped 192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh output of pydoc. 193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """ 194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh args = args + (module_name,) 195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # do not write bytecode files to avoid caching errors 196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rc, out, err = assert_python_ok('-B', pydoc.__file__, *args, **env) 197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return out.strip() 198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef get_pydoc_html(module): 200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "Returns pydoc generated output as html" 201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh doc = pydoc.HTMLDoc() 202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh output = doc.docmodule(module) 203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh loc = doc.getdocloc(pydoc_mod) or "" 204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if loc: 205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh loc = "<br><a href=\"" + loc + "\">Module Docs</a>" 206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return output.strip(), loc 207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef get_pydoc_text(module): 209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "Returns pydoc generated output as text" 210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh doc = pydoc.TextDoc() 211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh loc = doc.getdocloc(pydoc_mod) or "" 212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if loc: 213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh loc = "\nMODULE DOCS\n " + loc + "\n" 214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh output = doc.docmodule(module) 216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # cleanup the extra text formatting that pydoc preforms 218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh patt = re.compile('\b.') 219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh output = patt.sub('', output) 220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return output.strip(), loc 221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef print_diffs(text1, text2): 223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "Prints unified diffs for two texts" 224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lines1 = text1.splitlines(True) 225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lines2 = text2.splitlines(True) 226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh diffs = difflib.unified_diff(lines1, lines2, n=0, fromfile='expected', 227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh tofile='got') 228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh print '\n' + ''.join(diffs) 229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass PyDocDocTest(unittest.TestCase): 232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(sys.flags.optimize >= 2, 234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "Docstrings are omitted with -O2 and above") 235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_html_doc(self): 236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result, doc_loc = get_pydoc_html(pydoc_mod) 237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh mod_file = inspect.getabsfile(pydoc_mod) 238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if sys.platform == 'win32': 239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import nturl2path 240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh mod_url = nturl2path.pathname2url(mod_file) 241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh mod_url = mod_file 243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected_html = expected_html_pattern % ( 244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (mod_url, mod_file, doc_loc) + 245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected_html_data_docstrings) 246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if result != expected_html: 247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh print_diffs(expected_html, result) 248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("outputs are not equal, see diff above") 249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(sys.flags.optimize >= 2, 251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "Docstrings are omitted with -O2 and above") 252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_text_doc(self): 253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result, doc_loc = get_pydoc_text(pydoc_mod) 254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected_text = expected_text_pattern % ( 255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (inspect.getabsfile(pydoc_mod), doc_loc) + 256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected_text_data_docstrings) 257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if result != expected_text: 258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh print_diffs(expected_text, result) 259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("outputs are not equal, see diff above") 260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_issue8225(self): 262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Test issue8225 to ensure no doc link appears for xml.etree 263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result, doc_loc = get_pydoc_text(xml.etree) 264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(doc_loc, "", "MODULE DOCS incorrectly includes a link") 265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_non_str_name(self): 267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # issue14638 268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Treat illegal (non-str) name like no name 269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class A: 270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh __name__ = 42 271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class B: 272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh adoc = pydoc.render_doc(A()) 274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh bdoc = pydoc.render_doc(B()) 275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(adoc.replace("A", "B"), bdoc) 276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_not_here(self): 278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh missing_module = "test.i_am_not_here" 279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result = run_pydoc(missing_module) 280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected = missing_pattern % missing_module 281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(expected, result, 282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "documentation for missing module found") 283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_input_strip(self): 285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh missing_module = " test.i_am_not_here " 286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result = run_pydoc(missing_module) 287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected = missing_pattern % missing_module.strip() 288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(expected, result, 289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "white space was not stripped from module name " 290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "or other error output mismatch") 291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_stripid(self): 293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # test with strings, other implementations might have different repr() 294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh stripid = pydoc.stripid 295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # strip the id 296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(stripid('<function stripid at 0x88dcee4>'), 297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '<function stripid>') 298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(stripid('<function stripid at 0x01F65390>'), 299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '<function stripid>') 300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # nothing to strip, return the same text 301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(stripid('42'), '42') 302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(stripid("<type 'exceptions.Exception'>"), 303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "<type 'exceptions.Exception'>") 304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass PydocImportTest(unittest.TestCase): 307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.test_dir = os.mkdir(TESTFN) 310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.addCleanup(rmtree, TESTFN) 311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_badimport(self): 313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # This tests the fix for issue 5230, where if pydoc found the module 314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # but the module had an internal import error pydoc would report no doc 315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # found. 316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh modname = 'testmod_xyzzy' 317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh testpairs = ( 318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('i_am_not_here', 'i_am_not_here'), 319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('test.i_am_not_here_either', 'i_am_not_here_either'), 320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'), 321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('i_am_not_here.{}'.format(modname), 322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'i_am_not_here.{}'.format(modname)), 323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('test.{}'.format(modname), modname), 324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sourcefn = os.path.join(TESTFN, modname) + os.extsep + "py" 327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for importstring, expectedinmsg in testpairs: 328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(sourcefn, 'w') as f: 329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh f.write("import {}\n".format(importstring)) 330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result = run_pydoc(modname, PYTHONPATH=TESTFN) 331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected = badimport_pattern % (modname, expectedinmsg) 332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(expected, result) 333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_apropos_with_bad_package(self): 335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue 7425 - pydoc -k failed when bad package on path 336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pkgdir = os.path.join(TESTFN, "syntaxerr") 337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.mkdir(pkgdir) 338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py" 339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(badsyntax, 'w') as f: 340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh f.write("invalid python syntax = $1\n") 341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN) 342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('', result) 343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_apropos_with_unreadable_dir(self): 345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue 7367 - pydoc -k failed when unreadable dir on path 346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.unreadable_dir = os.path.join(TESTFN, "unreadable") 347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.mkdir(self.unreadable_dir, 0) 348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.addCleanup(os.rmdir, self.unreadable_dir) 349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Note, on Windows the directory appears to be still 350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # readable so this is not really testing the issue there 351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN) 352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('', result) 353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestDescriptions(unittest.TestCase): 356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_module(self): 358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check that pydocfodder module can be described 359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh from test import pydocfodder 360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh doc = pydoc.render_doc(pydocfodder) 361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn("pydocfodder", doc) 362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_classic_class(self): 364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class C: "Classic class" 365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh c = C() 366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(pydoc.describe(C), 'class C') 367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(pydoc.describe(c), 'instance of C') 368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected = 'instance of C in module %s' % __name__ 369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(expected, pydoc.render_doc(c)) 370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_class(self): 372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class C(object): "New-style class" 373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh c = C() 374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(pydoc.describe(C), 'class C') 376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(pydoc.describe(c), 'C') 377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected = 'C in module %s object' % __name__ 378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(expected, pydoc.render_doc(c)) 379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_namedtuple_public_underscore(self): 381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh NT = namedtuple('NT', ['abc', 'def'], rename=True) 382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with captured_stdout() as help_io: 383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh help(NT) 384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh helptext = help_io.getvalue() 385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn('_1', helptext) 386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn('_replace', helptext) 387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn('_asdict', helptext) 388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelper(unittest.TestCase): 391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_keywords(self): 392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sorted(pydoc.Helper.keywords), 393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sorted(keyword.kwlist)) 394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_builtin(self): 396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for name in ('str', 'str.translate', '__builtin__.str', 397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '__builtin__.str.translate'): 398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # test low-level function 399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsNotNone(pydoc.locate(name)) 400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # test high-level function 401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pydoc.render_doc(name) 403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ImportError: 404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail('finding the doc of {!r} failed'.format(o)) 405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for name in ('not__builtin__', 'strrr', 'strr.translate', 407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'str.trrrranslate', '__builtin__.strrr', 408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '__builtin__.str.trrranslate'): 409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsNone(pydoc.locate(name)) 410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ImportError, pydoc.render_doc, name) 411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main(): 414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test.test_support.run_unittest(PyDocDocTest, 416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PydocImportTest, 417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TestDescriptions, 418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TestHelper) 419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh finally: 420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh reap_children() 421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == "__main__": 423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test_main() 424