diff options
author | Benjamin Peterson <benjamin@python.org> | 2015-02-17 00:45:42 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2015-02-17 00:45:42 (GMT) |
commit | 77c041ba64f87ac021c2a7a9314d9a3a1145057f (patch) | |
tree | e0f19e9fa4974fe541862907eae85fe1c3b5ba0a | |
parent | 43036a66c37075534febdc4a4caaae8a364a9942 (diff) | |
parent | 54237f9feaefd209c2aaa5b4003810e69f6714f3 (diff) | |
download | cpython-77c041ba64f87ac021c2a7a9314d9a3a1145057f.zip cpython-77c041ba64f87ac021c2a7a9314d9a3a1145057f.tar.gz cpython-77c041ba64f87ac021c2a7a9314d9a3a1145057f.tar.bz2 |
merge 3.4 (#21548)
-rwxr-xr-x | Lib/pydoc.py | 4 | ||||
-rw-r--r-- | Lib/test/test_pydoc.py | 32 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
4 files changed, 38 insertions, 2 deletions
diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 60b0a9e5..1fc8cc7 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -269,7 +269,7 @@ def synopsis(filename, cache={}): except: return None del sys.modules['__temp__'] - result = (module.__doc__ or '').splitlines()[0] + result = module.__doc__.splitlines()[0] if module.__doc__ else None # Cache the result. cache[filename] = (mtime, result) return result @@ -2073,7 +2073,7 @@ class ModuleScanner: if onerror: onerror(modname) continue - desc = (module.__doc__ or '').splitlines()[0] + desc = module.__doc__.splitlines()[0] if module.__doc__ else '' path = getattr(module,'__file__',None) name = modname + ' - ' + desc if name.lower().find(key) >= 0: diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 6742444..41ad792 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -2,12 +2,15 @@ import os import sys import builtins import contextlib +import importlib.util import inspect import pydoc +import py_compile import keyword import _pickle import pkgutil import re +import stat import string import test.support import time @@ -543,6 +546,18 @@ class PydocDocTest(unittest.TestCase): self.assertEqual(synopsis, expected) + def test_synopsis_sourceless_empty_doc(self): + with test.support.temp_cwd() as test_dir: + init_path = os.path.join(test_dir, 'foomod42.py') + cached_path = importlib.util.cache_from_source(init_path) + with open(init_path, 'w') as fobj: + fobj.write("foo = 1") + py_compile.compile(init_path) + synopsis = pydoc.synopsis(init_path, {}) + self.assertIsNone(synopsis) + synopsis_cached = pydoc.synopsis(cached_path, {}) + self.assertIsNone(synopsis_cached) + def test_splitdoc_with_description(self): example_string = "I Am A Doc\n\n\nHere is my description" self.assertEqual(pydoc.splitdoc(example_string), @@ -598,6 +613,7 @@ class PydocImportTest(PydocBaseTest): def setUp(self): self.test_dir = os.mkdir(TESTFN) self.addCleanup(rmtree, TESTFN) + importlib.invalidate_caches() def test_badimport(self): # This tests the fix for issue 5230, where if pydoc found the module @@ -656,6 +672,22 @@ class PydocImportTest(PydocBaseTest): self.assertEqual(out.getvalue(), '') self.assertEqual(err.getvalue(), '') + def test_apropos_empty_doc(self): + pkgdir = os.path.join(TESTFN, 'walkpkg') + os.mkdir(pkgdir) + self.addCleanup(rmtree, pkgdir) + init_path = os.path.join(pkgdir, '__init__.py') + with open(init_path, 'w') as fobj: + fobj.write("foo = 1") + current_mode = stat.S_IMODE(os.stat(pkgdir).st_mode) + try: + os.chmod(pkgdir, current_mode & ~stat.S_IEXEC) + with self.restrict_walk_packages(path=[TESTFN]), captured_stdout() as stdout: + pydoc.apropos('') + self.assertIn('walkpkg', stdout.getvalue()) + finally: + os.chmod(pkgdir, current_mode) + @unittest.skip('causes undesireable side-effects (#20128)') def test_modules(self): # See Helper.listmodules(). @@ -513,6 +513,7 @@ Eric Groo Dag Gruneau Filip Gruszczyński Thomas Guettler +Yuyang Guo Anuj Gupta Michael Guravage Lars Gustäbel @@ -13,6 +13,9 @@ Core and Builtins Library ------- +- Issue #21548: Fix pydoc.synopsis() and pydoc.apropos() on modules with empty + docstrings. + - Issue #22885: Fixed arbitrary code execution vulnerability in the dbm.dumb module. Original patch by Claudiu Popa. |