Issue #18010: Fix pydoc web server search to handle package exceptions

Implementation by Antoine Pitrou.
This commit is contained in:
Martin Panter 2015-11-06 00:27:14 +00:00
parent ade0412613
commit 9ad0aae656
3 changed files with 38 additions and 7 deletions

View File

@ -2355,7 +2355,9 @@ def _url_handler(url, content_type="text/html"):
with warnings.catch_warnings(): with warnings.catch_warnings():
warnings.filterwarnings('ignore') # ignore problems during import warnings.filterwarnings('ignore') # ignore problems during import
ModuleScanner().run(callback, key) def onerror(modname):
pass
ModuleScanner().run(callback, key, onerror=onerror)
# format page # format page
def bltinlink(name): def bltinlink(name):

View File

@ -403,6 +403,13 @@ class PydocBaseTest(unittest.TestCase):
finally: finally:
pkgutil.walk_packages = walk_packages pkgutil.walk_packages = walk_packages
def call_url_handler(self, url, expected_title):
text = pydoc._url_handler(url, "text/html")
result = get_html_title(text)
# Check the title to ensure an unexpected error page was not returned
self.assertEqual(result, expected_title, text)
return text
class PydocDocTest(unittest.TestCase): class PydocDocTest(unittest.TestCase):
@ -715,6 +722,29 @@ class PydocImportTest(PydocBaseTest):
finally: finally:
os.chmod(pkgdir, current_mode) os.chmod(pkgdir, current_mode)
def test_url_search_package_error(self):
# URL handler search should cope with packages that raise exceptions
pkgdir = os.path.join(TESTFN, "test_error_package")
os.mkdir(pkgdir)
init = os.path.join(pkgdir, "__init__.py")
with open(init, "wt", encoding="ascii") as f:
f.write("""raise ValueError("ouch")\n""")
with self.restrict_walk_packages(path=[TESTFN]):
# Package has to be importable for the error to have any effect
saved_paths = tuple(sys.path)
sys.path.insert(0, TESTFN)
try:
with self.assertRaisesRegex(ValueError, "ouch"):
import test_error_package # Sanity check
text = self.call_url_handler("search?key=test_error_package",
"Pydoc: Search Results")
found = ('<a href="test_error_package.html">'
'test_error_package</a>')
self.assertIn(found, text)
finally:
sys.path[:] = saved_paths
@unittest.skip('causes undesireable side-effects (#20128)') @unittest.skip('causes undesireable side-effects (#20128)')
def test_modules(self): def test_modules(self):
# See Helper.listmodules(). # See Helper.listmodules().
@ -891,16 +921,12 @@ class PydocUrlHandlerTest(PydocBaseTest):
with self.restrict_walk_packages(): with self.restrict_walk_packages():
for url, title in requests: for url, title in requests:
text = pydoc._url_handler(url, "text/html") self.call_url_handler(url, title)
result = get_html_title(text)
self.assertEqual(result, title, text)
path = string.__file__ path = string.__file__
title = "Pydoc: getfile " + path title = "Pydoc: getfile " + path
url = "getfile?key=" + path url = "getfile?key=" + path
text = pydoc._url_handler(url, "text/html") self.call_url_handler(url, title)
result = get_html_title(text)
self.assertEqual(result, title)
class TestHelper(unittest.TestCase): class TestHelper(unittest.TestCase):

View File

@ -96,6 +96,9 @@ Core and Builtins
Library Library
------- -------
- Issue #18010: Fix the pydoc web server's module search function to handle
exceptions from importing packages.
- Issue #25510: fileinput.FileInput.readline() now returns b'' instead of '' - Issue #25510: fileinput.FileInput.readline() now returns b'' instead of ''
at the end if the FileInput was opened with binary mode. at the end if the FileInput was opened with binary mode.
Patch by Ryosuke Ito. Patch by Ryosuke Ito.