summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/email/mime/nonmultipart.py4
-rwxr-xr-xLib/pydoc.py7
-rw-r--r--Lib/test/test_coding.py12
-rw-r--r--Lib/test/test_extcall.py18
-rw-r--r--Lib/test/test_pydoc.py42
-rw-r--r--Lib/xml/sax/expatreader.py6
6 files changed, 79 insertions, 10 deletions
diff --git a/Lib/email/mime/nonmultipart.py b/Lib/email/mime/nonmultipart.py
index dd280b5..fc3b9eb 100644
--- a/Lib/email/mime/nonmultipart.py
+++ b/Lib/email/mime/nonmultipart.py
@@ -14,13 +14,9 @@ from email.mime.base import MIMEBase
class MIMENonMultipart(MIMEBase):
"""Base class for MIME multipart/* type messages."""
- __pychecker__ = 'unusednames=payload'
-
def attach(self, payload):
# The public API prohibits attaching multiple subparts to MIMEBase
# derived subtypes since none of them are, by definition, of content
# type multipart/*
raise errors.MultipartConversionError(
'Cannot attach additional subparts to non-multipart/*')
-
- del __pychecker__
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index 6475dec..fe439c2 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -54,6 +54,7 @@ Richard Chamberlain, for the first implementation of textdoc.
import sys, imp, os, re, inspect, builtins, pkgutil
from reprlib import Repr
+from traceback import extract_tb as _extract_tb
try:
from collections import deque
except ImportError:
@@ -292,9 +293,9 @@ def safeimport(path, forceload=0, cache={}):
elif exc is SyntaxError:
# A SyntaxError occurred before we could execute the module.
raise ErrorDuringImport(value.filename, info)
- elif exc is ImportError and \
- str(value).lower().split()[:2] == ['no', 'module']:
- # The module was not found.
+ elif exc is ImportError and _extract_tb(tb)[-1][2]=='safeimport':
+ # The import error occurred directly in this function,
+ # which means there is no such module in the path.
return None
else:
# Some other error occurred during the importing process.
diff --git a/Lib/test/test_coding.py b/Lib/test/test_coding.py
index 51873b4..9d368c5 100644
--- a/Lib/test/test_coding.py
+++ b/Lib/test/test_coding.py
@@ -49,6 +49,18 @@ class CodingTest(unittest.TestCase):
unlink(TESTFN+".pyc")
sys.path.pop(0)
+ def test_error_from_string(self):
+ # See http://bugs.python.org/issue6289
+ input = "# coding: ascii\n\N{SNOWMAN}".encode('utf-8')
+ try:
+ compile(input, "<string>", "exec")
+ except SyntaxError as e:
+ expected = "'ascii' codec can't decode byte 0xe2 in position 16: " \
+ "ordinal not in range(128)"
+ self.assertTrue(str(e).startswith(expected))
+ else:
+ self.fail("didn't raise")
+
def test_main():
test.support.run_unittest(CodingTest)
diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py
index 7ed0e2e..f1fff0a 100644
--- a/Lib/test/test_extcall.py
+++ b/Lib/test/test_extcall.py
@@ -243,6 +243,24 @@ TypeError if te dictionary is not empty
...
TypeError: id() takes no keyword arguments
+A corner case of keyword dictionary items being deleted during
+the function call setup. See <http://bugs.python.org/issue2016>.
+
+ >>> class Name(str):
+ ... def __eq__(self, other):
+ ... try:
+ ... del x[self]
+ ... except KeyError:
+ ... pass
+ ... return str.__eq__(self, other)
+ ... def __hash__(self):
+ ... return str.__hash__(self)
+
+ >>> x = {Name("a"):1, Name("b"):2}
+ >>> def f(a, b):
+ ... print(a,b)
+ >>> f(**x)
+ 1 2
"""
from test import support
diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py
index 03b3539..00a2ada 100644
--- a/Lib/test/test_pydoc.py
+++ b/Lib/test/test_pydoc.py
@@ -1,5 +1,6 @@
import sys
import os
+import os.path
import difflib
import subprocess
import re
@@ -7,6 +8,8 @@ import pydoc
import inspect
import unittest
import test.support
+from contextlib import contextmanager
+from test.support import TESTFN, forget, rmtree, EnvironmentVarGuard
from test import pydoc_mod
@@ -183,6 +186,9 @@ war</tt></dd></dl>
# output pattern for missing module
missing_pattern = "no Python documentation found for '%s'"
+# output pattern for module with bad imports
+badimport_pattern = "problem in %s - ImportError: No module named %s"
+
def run_pydoc(module_name, *args):
"""
Runs pydoc on the specified module. Returns the stripped
@@ -254,6 +260,42 @@ class PyDocDocTest(unittest.TestCase):
self.assertEqual(expected, result,
"documentation for missing module found")
+ def test_badimport(self):
+ # This tests the fix for issue 5230, where if pydoc found the module
+ # but the module had an internal import error pydoc would report no doc
+ # found.
+ modname = 'testmod_xyzzy'
+ testpairs = (
+ ('i_am_not_here', 'i_am_not_here'),
+ ('test.i_am_not_here_either', 'i_am_not_here_either'),
+ ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'),
+ ('i_am_not_here.{}'.format(modname), 'i_am_not_here.{}'.format(modname)),
+ ('test.{}'.format(modname), modname),
+ )
+
+ @contextmanager
+ def newdirinpath(dir):
+ os.mkdir(dir)
+ sys.path.insert(0, dir)
+ yield
+ sys.path.pop(0)
+ rmtree(dir)
+
+ with newdirinpath(TESTFN), EnvironmentVarGuard() as env:
+ env['PYTHONPATH'] = TESTFN
+ fullmodname = os.path.join(TESTFN, modname)
+ sourcefn = fullmodname + os.extsep + "py"
+ for importstring, expectedinmsg in testpairs:
+ f = open(sourcefn, 'w')
+ f.write("import {}\n".format(importstring))
+ f.close()
+ try:
+ result = run_pydoc(modname).decode("ascii")
+ finally:
+ forget(modname)
+ expected = badimport_pattern % (modname, expectedinmsg)
+ self.assertEqual(expected, result)
+
def test_input_strip(self):
missing_module = " test.i_am_not_here "
result = str(run_pydoc(missing_module), 'ascii')
diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py
index 26b05c3..c9fc894 100644
--- a/Lib/xml/sax/expatreader.py
+++ b/Lib/xml/sax/expatreader.py
@@ -407,8 +407,8 @@ def create_parser(*args, **kwargs):
# ---
if __name__ == "__main__":
- import xml.sax
+ import xml.sax.saxutils
p = create_parser()
- p.setContentHandler(xml.sax.XMLGenerator())
+ p.setContentHandler(xml.sax.saxutils.XMLGenerator())
p.setErrorHandler(xml.sax.ErrorHandler())
- p.parse("../../../hamlet.xml")
+ p.parse("http://www.ibiblio.org/xml/examples/shakespeare/hamlet.xml")