summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2015-02-17 00:45:42 (GMT)
committerBenjamin Peterson <benjamin@python.org>2015-02-17 00:45:42 (GMT)
commit77c041ba64f87ac021c2a7a9314d9a3a1145057f (patch)
treee0f19e9fa4974fe541862907eae85fe1c3b5ba0a
parent43036a66c37075534febdc4a4caaae8a364a9942 (diff)
parent54237f9feaefd209c2aaa5b4003810e69f6714f3 (diff)
downloadcpython-77c041ba64f87ac021c2a7a9314d9a3a1145057f.zip
cpython-77c041ba64f87ac021c2a7a9314d9a3a1145057f.tar.gz
cpython-77c041ba64f87ac021c2a7a9314d9a3a1145057f.tar.bz2
merge 3.4 (#21548)
-rwxr-xr-xLib/pydoc.py4
-rw-r--r--Lib/test/test_pydoc.py32
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS3
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().
diff --git a/Misc/ACKS b/Misc/ACKS
index c1d0dab..f66baa3 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -513,6 +513,7 @@ Eric Groo
Dag Gruneau
Filip Gruszczyński
Thomas Guettler
+Yuyang Guo
Anuj Gupta
Michael Guravage
Lars Gustäbel
diff --git a/Misc/NEWS b/Misc/NEWS
index f836c8d..e947f78 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.