]> granicus.if.org Git - python/commitdiff
Issue #21548: Fix pydoc.synopsis() and pydoc.apropos() on modules with empty
authorBerker Peksag <berker.peksag@gmail.com>
Fri, 20 Feb 2015 10:10:33 +0000 (12:10 +0200)
committerBerker Peksag <berker.peksag@gmail.com>
Fri, 20 Feb 2015 10:10:33 +0000 (12:10 +0200)
docstrings.

Initial patch by Yuyang Guo.

Lib/pydoc.py
Lib/test/test_pydoc.py
Misc/NEWS

index 0647d1e8ffee56459c92c26ff29abac7cba0bfb2..b56d385bf7445bf3cae9bc795c9b8bfba163116d 100755 (executable)
@@ -255,7 +255,7 @@ def synopsis(filename, cache={}):
         if info and 'b' in info[2]: # binary modules have to be imported
             try: module = imp.load_module('__temp__', file, filename, info[1:])
             except: return None
-            result = (module.__doc__ or '').splitlines()[0]
+            result = module.__doc__.splitlines()[0] if module.__doc__ else None
             del sys.modules['__temp__']
         else: # text modules can be directly examined
             result = source_synopsis(file)
@@ -2020,7 +2020,7 @@ class ModuleScanner:
                         path = None
                 else:
                     module = loader.load_module(modname)
-                    desc = (module.__doc__ or '').splitlines()[0]
+                    desc = module.__doc__.splitlines()[0] if module.__doc__ else ''
                     path = getattr(module,'__file__',None)
                 if find(lower(modname + ' - ' + desc), key) >= 0:
                     callback(path, modname, desc)
index c11c06b524e4cc8a5b8a9f22949b6b741378c9aa..5bb97e245fb45249a6e2b80079a0bb689a0e51a2 100644 (file)
@@ -3,6 +3,7 @@ import sys
 import difflib
 import __builtin__
 import re
+import py_compile
 import pydoc
 import contextlib
 import inspect
@@ -382,6 +383,34 @@ class PydocDocTest(unittest.TestCase):
         self.assertEqual(stripid("<type 'exceptions.Exception'>"),
                          "<type 'exceptions.Exception'>")
 
+    def test_synopsis(self):
+        with test.test_support.temp_cwd() as test_dir:
+            init_path = os.path.join(test_dir, 'dt.py')
+            with open(init_path, 'w') as fobj:
+                fobj.write('''\
+"""
+my doc
+
+second line
+"""
+foo = 1
+''')
+            py_compile.compile(init_path)
+            synopsis = pydoc.synopsis(init_path, {})
+            self.assertEqual(synopsis, 'my doc')
+
+    def test_synopsis_sourceless_empty_doc(self):
+        with test.test_support.temp_cwd() as test_dir:
+            init_path = os.path.join(test_dir, 'foomod42.py')
+            cached_path = os.path.join(test_dir, 'foomod42.pyc')
+            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)
+
 
 class PydocImportTest(PydocBaseTest):
 
index 2f171c26c3c61b412bc48753c68f27dab3b27f01..6a5f90aebd8485b18c5a4c66ea827ba745be617e 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -18,6 +18,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #21548: Fix pydoc.synopsis() and pydoc.apropos() on modules with empty
+  docstrings.  Initial patch by Yuyang Guo.
+
 - Issue #22885: Fixed arbitrary code execution vulnerability in the dumbdbm
   module.  Original patch by Claudiu Popa.