]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #11995: test_pydoc doesn't import all sys.path modules anymore.
authorAntoine Pitrou <solipsis@pitrou.net>
Sun, 19 May 2013 13:44:54 +0000 (15:44 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Sun, 19 May 2013 13:44:54 +0000 (15:44 +0200)
Lib/test/test_pydoc.py
Misc/NEWS

index 542a29bc990c2ac4b15dc3a6ce9ebb3511498c0e..cdcc707d61b3d3ab800c46fba0c9340273ceef4d 100644 (file)
@@ -1,10 +1,12 @@
 import os
 import sys
 import builtins
+import contextlib
 import difflib
 import inspect
 import pydoc
 import keyword
+import pkgutil
 import re
 import string
 import test.support
@@ -17,7 +19,8 @@ from collections import namedtuple
 from test.script_helper import assert_python_ok
 from test.support import (
     TESTFN, rmtree,
-    reap_children, reap_threads, captured_output, captured_stdout, unlink
+    reap_children, reap_threads, captured_output, captured_stdout,
+    captured_stderr, unlink
 )
 from test import pydoc_mod
 
@@ -259,6 +262,29 @@ def get_html_title(text):
     return title
 
 
+class PydocBaseTest(unittest.TestCase):
+
+    def _restricted_walk_packages(self, walk_packages, path=None):
+        """
+        A version of pkgutil.walk_packages() that will restrict itself to
+        a given path.
+        """
+        default_path = path or [os.path.dirname(__file__)]
+        def wrapper(path=None, prefix='', onerror=None):
+            return walk_packages(path or default_path, prefix, onerror)
+        return wrapper
+
+    @contextlib.contextmanager
+    def restrict_walk_packages(self, path=None):
+        walk_packages = pkgutil.walk_packages
+        pkgutil.walk_packages = self._restricted_walk_packages(walk_packages,
+                                                               path)
+        try:
+            yield
+        finally:
+            pkgutil.walk_packages = walk_packages
+
+
 class PydocDocTest(unittest.TestCase):
 
     @unittest.skipIf(sys.flags.optimize >= 2,
@@ -420,7 +446,7 @@ class PydocDocTest(unittest.TestCase):
         self.assertDictEqual(methods, expected)
 
 
-class PydocImportTest(unittest.TestCase):
+class PydocImportTest(PydocBaseTest):
 
     def setUp(self):
         self.test_dir = os.mkdir(TESTFN)
@@ -454,8 +480,19 @@ class PydocImportTest(unittest.TestCase):
         badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py"
         with open(badsyntax, 'w') as f:
             f.write("invalid python syntax = $1\n")
-        result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN)
-        self.assertEqual(b'', result)
+        with self.restrict_walk_packages(path=[TESTFN]):
+            with captured_stdout() as out:
+                with captured_stderr() as err:
+                    pydoc.apropos('xyzzy')
+            # No result, no error
+            self.assertEqual(out.getvalue(), '')
+            self.assertEqual(err.getvalue(), '')
+            # The package name is still matched
+            with captured_stdout() as out:
+                with captured_stderr() as err:
+                    pydoc.apropos('syntaxerr')
+            self.assertEqual(out.getvalue().strip(), 'syntaxerr')
+            self.assertEqual(err.getvalue(), '')
 
     def test_apropos_with_unreadable_dir(self):
         # Issue 7367 - pydoc -k failed when unreadable dir on path
@@ -464,8 +501,13 @@ class PydocImportTest(unittest.TestCase):
         self.addCleanup(os.rmdir, self.unreadable_dir)
         # Note, on Windows the directory appears to be still
         #   readable so this is not really testing the issue there
-        result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN)
-        self.assertEqual(b'', result)
+        with self.restrict_walk_packages(path=[TESTFN]):
+            with captured_stdout() as out:
+                with captured_stderr() as err:
+                    pydoc.apropos('SOMEKEY')
+        # No result, no error
+        self.assertEqual(out.getvalue(), '')
+        self.assertEqual(err.getvalue(), '')
 
 
 class TestDescriptions(unittest.TestCase):
@@ -527,7 +569,7 @@ class PydocServerTest(unittest.TestCase):
         self.assertEqual(serverthread.error, None)
 
 
-class PydocUrlHandlerTest(unittest.TestCase):
+class PydocUrlHandlerTest(PydocBaseTest):
     """Tests for pydoc._url_handler"""
 
     def test_content_type_err(self):
@@ -554,18 +596,19 @@ class PydocUrlHandlerTest(unittest.TestCase):
             ("getfile?key=foobar", "Pydoc: Error - getfile?key=foobar"),
             ]
 
-        for url, title in requests:
+        with self.restrict_walk_packages():
+            for url, title in requests:
+                text = pydoc._url_handler(url, "text/html")
+                result = get_html_title(text)
+                self.assertEqual(result, title, text)
+
+            path = string.__file__
+            title = "Pydoc: getfile " + path
+            url = "getfile?key=" + path
             text = pydoc._url_handler(url, "text/html")
             result = get_html_title(text)
             self.assertEqual(result, title)
 
-        path = string.__file__
-        title = "Pydoc: getfile " + path
-        url = "getfile?key=" + path
-        text = pydoc._url_handler(url, "text/html")
-        result = get_html_title(text)
-        self.assertEqual(result, title)
-
 
 class TestHelper(unittest.TestCase):
     def test_keywords(self):
index a7435f663ab1a11c1ec1e4ac148c96b8385ed831..a9ce97aec44bdbffebfbfcb10459716e97ac58eb 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -37,6 +37,11 @@ Library
 
 - Issue #17968: Fix memory leak in os.listxattr().
 
+Tests
+-----
+
+- Issue #11995: test_pydoc doesn't import all sys.path modules anymore.
+
 Documentation
 -------------