mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
merge 3.4 (#21548)
This commit is contained in:
commit
77c041ba64
4 changed files with 38 additions and 2 deletions
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue