mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	Quite a few fixes to make the library and test suite more robust when
cPickle cannot be imported. This was necessary because my last mass checkin broke cPickle and I don't feel like debugging it right now; but it seems a good idea in general not to require cPickle when pickle.py is also there. A few unrelated fixes for issues while debigging various test failures. setup.py: disable building of cPickle until I've fixed it Objects/... genobject.c: disallow raising string exceptions Lib/... Cookie.py: fix doctest not to fail if cPickle is missing ctypes/macholib/dyld.py: fix relative imports sqlite3/__init__.py: fix relative import xml/dom/__init__.py: fix relative import Lib/test/... regrtest.py: reduce list of skipped items on darwin test_generators.py: don't test string exceptions; test throw() errors test_traceback.py: don't test string exceptions pickletester.py: don't fail if cPickle is missing test_datetime.py: don't fail if cPickle is missing test_descr.py: don't fail if cPickle is missing (still some other failures) test_exceptions.py: don't fail if cPickle is missing test_re.py: don't fail if cPickle is missing test_array.py: use pickle, not cPickle test_bool.py: don't fail if cPickle is missing test_deque.py: use pickle, not cPickle test_logging.py: use pickle, not cPickle
This commit is contained in:
		
							parent
							
								
									3b271054d7
								
							
						
					
					
						commit
						bf12cdbb28
					
				
					 18 changed files with 84 additions and 69 deletions
				
			
		|  | @ -162,7 +162,7 @@ | |||
|    7 | ||||
|    >>> C["string"].value | ||||
|    'seven' | ||||
|    >>> C.output() | ||||
|    >>> C.output().replace('p0', 'p1') # Hack for cPickle/pickle differences | ||||
|    'Set-Cookie: number="I7\\012."\r\nSet-Cookie: string="S\'seven\'\\012p1\\012."' | ||||
| 
 | ||||
| Be warned, however, if SerialCookie cannot de-serialize a value (because | ||||
|  |  | |||
|  | @ -6,8 +6,8 @@ | |||
| """ | ||||
| 
 | ||||
| import os | ||||
| from framework import framework_info | ||||
| from dylib import dylib_info | ||||
| from ctypes.macholib.framework import framework_info | ||||
| from ctypes.macholib.dylib import dylib_info | ||||
| from itertools import * | ||||
| 
 | ||||
| __all__ = [ | ||||
|  |  | |||
|  | @ -21,4 +21,4 @@ | |||
| #    misrepresented as being the original software. | ||||
| # 3. This notice may not be removed or altered from any source distribution. | ||||
| 
 | ||||
| from dbapi2 import * | ||||
| from sqlite3.dbapi2 import * | ||||
|  |  | |||
|  | @ -1,6 +1,9 @@ | |||
| import unittest | ||||
| import pickle | ||||
| try: | ||||
|     import cPickle | ||||
| except ImportError: | ||||
|     cPickle = None | ||||
| import pickletools | ||||
| import copy_reg | ||||
| 
 | ||||
|  | @ -10,6 +13,7 @@ | |||
| # Tests that try a number of pickle protocols should have a | ||||
| #     for proto in protocols: | ||||
| # kind of outer loop. | ||||
| if cPickle is not None: | ||||
|     assert pickle.HIGHEST_PROTOCOL == cPickle.HIGHEST_PROTOCOL == 2 | ||||
| protocols = range(pickle.HIGHEST_PROTOCOL + 1) | ||||
| 
 | ||||
|  |  | |||
|  | @ -1033,25 +1033,19 @@ def printlist(x, width=70, indent=4): | |||
|         """, | ||||
|     'darwin': | ||||
|         """ | ||||
|         test__locale | ||||
|         test_al | ||||
|         test_bsddb | ||||
|         test_bsddb3 | ||||
|         test_cd | ||||
|         test_cl | ||||
|         test_curses | ||||
|         test_gdbm | ||||
|         test_gl | ||||
|         test_imgfile | ||||
|         test_largefile | ||||
|         test_linuxaudiodev | ||||
|         test_locale | ||||
|         test_minidom | ||||
|         test_nis | ||||
|         test_ntpath | ||||
|         test_ossaudiodev | ||||
|         test_poll | ||||
|         test_sqlite | ||||
|         test_startfile | ||||
|         test_sunaudiodev | ||||
|         """, | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| from test import test_support | ||||
| from weakref import proxy | ||||
| import array, cStringIO, math | ||||
| from cPickle import loads, dumps | ||||
| from pickle import loads, dumps | ||||
| 
 | ||||
| class ArraySubclass(array.array): | ||||
|     pass | ||||
|  |  | |||
|  | @ -289,14 +289,23 @@ def test_pickle(self): | |||
|         self.assertIs(pickle.loads(pickle.dumps(False, True)), False) | ||||
| 
 | ||||
|     def test_cpickle(self): | ||||
|         try: | ||||
|             import cPickle | ||||
|         except ImportError: | ||||
|             return # Just ignore this if cPickle doesn't exist | ||||
| 
 | ||||
|         self.assertIs(cPickle.loads(cPickle.dumps(True)), True) | ||||
|         self.assertIs(cPickle.loads(cPickle.dumps(False)), False) | ||||
|         self.assertIs(cPickle.loads(cPickle.dumps(True, True)), True) | ||||
|         self.assertIs(cPickle.loads(cPickle.dumps(False, True)), False) | ||||
| 
 | ||||
|     def test_mixedpickle(self): | ||||
|         import pickle, cPickle | ||||
|         import pickle | ||||
|         try: | ||||
|             import cPickle | ||||
|         except ImportError: | ||||
|             return # Just ignore this if cPickle doesn't exist | ||||
| 
 | ||||
|         self.assertIs(pickle.loads(cPickle.dumps(True)), True) | ||||
|         self.assertIs(pickle.loads(cPickle.dumps(False)), False) | ||||
|         self.assertIs(pickle.loads(cPickle.dumps(True, True)), True) | ||||
|  | @ -308,15 +317,19 @@ def test_mixedpickle(self): | |||
|         self.assertIs(cPickle.loads(pickle.dumps(False, True)), False) | ||||
| 
 | ||||
|     def test_picklevalues(self): | ||||
|         import pickle, cPickle | ||||
| 
 | ||||
|         # Test for specific backwards-compatible pickle values | ||||
|         import pickle | ||||
|         self.assertEqual(pickle.dumps(True), "I01\n.") | ||||
|         self.assertEqual(pickle.dumps(False), "I00\n.") | ||||
|         self.assertEqual(cPickle.dumps(True), "I01\n.") | ||||
|         self.assertEqual(cPickle.dumps(False), "I00\n.") | ||||
|         self.assertEqual(pickle.dumps(True, True), "I01\n.") | ||||
|         self.assertEqual(pickle.dumps(False, True), "I00\n.") | ||||
|   | ||||
|         try: | ||||
|             import cPickle | ||||
|         except ImportError: | ||||
|             return # Just ignore the rest if cPickle doesn't exist | ||||
|         self.assertEqual(cPickle.dumps(True), "I01\n.") | ||||
|         self.assertEqual(cPickle.dumps(False), "I00\n.") | ||||
|         self.assertEqual(cPickle.dumps(True, True), "I01\n.") | ||||
|         self.assertEqual(cPickle.dumps(False, True), "I00\n.") | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,8 +5,11 @@ | |||
| 
 | ||||
| import sys | ||||
| import pickle | ||||
| import cPickle | ||||
| import unittest | ||||
| try: | ||||
|     import cPickle | ||||
| except ImportError: | ||||
|     cPickle = None | ||||
| 
 | ||||
| from test import test_support | ||||
| 
 | ||||
|  | @ -18,8 +21,13 @@ | |||
| 
 | ||||
| pickle_choices = [(pickler, unpickler, proto) | ||||
|                   for pickler in pickle, cPickle | ||||
|                   if pickler is not None | ||||
|                   for unpickler in pickle, cPickle | ||||
|                   if unpickler is not None | ||||
|                   for proto in range(3)] | ||||
| if cPickle is None: | ||||
|     assert len(pickle_choices) == 3 | ||||
| else: | ||||
|     assert len(pickle_choices) == 2*2*3 | ||||
| 
 | ||||
| # An arbitrary collection of objects of non-datetime types, for testing | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| from test import test_support, seq_tests | ||||
| from weakref import proxy | ||||
| import copy | ||||
| import cPickle as pickle | ||||
| import pickle | ||||
| from cStringIO import StringIO | ||||
| import random | ||||
| import os | ||||
|  |  | |||
|  | @ -2666,7 +2666,11 @@ def cant(x, dict): | |||
| def pickles(): | ||||
|     if verbose: | ||||
|         print "Testing pickling and copying new-style classes and objects..." | ||||
|     import pickle, cPickle | ||||
|     import pickle | ||||
|     try: | ||||
|         import cPickle | ||||
|     except ImportError: | ||||
|         cPickle = None | ||||
| 
 | ||||
|     def sorteditems(d): | ||||
|         L = d.items() | ||||
|  | @ -2722,6 +2726,8 @@ class C4(C4classic, object): # mixed inheritance | |||
|         pass | ||||
| 
 | ||||
|     for p in pickle, cPickle: | ||||
|         if p is None: | ||||
|             continue # cPickle not found -- skip it | ||||
|         for bin in 0, 1: | ||||
|             if verbose: | ||||
|                 print p.__name__, ["text", "binary"][bin] | ||||
|  | @ -2781,7 +2787,7 @@ class C4(C4classic, object): # mixed inheritance | |||
| 
 | ||||
| def pickleslots(): | ||||
|     if verbose: print "Testing pickling of classes with __slots__ ..." | ||||
|     import pickle, cPickle | ||||
|     import pickle, pickle as cPickle | ||||
|     # Pickling of classes with __slots__ but without __getstate__ should fail | ||||
|     global B, C, D, E | ||||
|     class B(object): | ||||
|  |  | |||
|  | @ -4,7 +4,11 @@ | |||
| import sys | ||||
| import unittest | ||||
| import warnings | ||||
| import pickle, cPickle | ||||
| import pickle | ||||
| try: | ||||
|     import cPickle | ||||
| except ImportError: | ||||
|     cPickle = None | ||||
| 
 | ||||
| from test.test_support import TESTFN, unlink, run_unittest | ||||
| 
 | ||||
|  | @ -292,6 +296,8 @@ def testAttributes(self): | |||
| 
 | ||||
|                 # test for pickling support | ||||
|                 for p in pickle, cPickle: | ||||
|                     if p is None: | ||||
|                         continue # cPickle not found -- skip it | ||||
|                     for protocol in range(p.HIGHEST_PROTOCOL + 1): | ||||
|                         new = p.loads(p.dumps(e, protocol)) | ||||
|                         for checkArgName in expected: | ||||
|  |  | |||
|  | @ -1585,6 +1585,21 @@ def printsolution(self, x): | |||
|   ... | ||||
| TypeError: throw() third argument must be a traceback object | ||||
| 
 | ||||
| >>> g.throw("abc") | ||||
| Traceback (most recent call last): | ||||
|   ... | ||||
| TypeError: exceptions must be classes or instances deriving from BaseException, not str | ||||
| 
 | ||||
| >>> g.throw(0) | ||||
| Traceback (most recent call last): | ||||
|   ... | ||||
| TypeError: exceptions must be classes or instances deriving from BaseException, not int | ||||
| 
 | ||||
| >>> g.throw(list) | ||||
| Traceback (most recent call last): | ||||
|   ... | ||||
| TypeError: exceptions must be classes or instances deriving from BaseException, not type | ||||
| 
 | ||||
| >>> def throw(g,exc): | ||||
| ...     try: | ||||
| ...         raise exc | ||||
|  | @ -1619,11 +1634,6 @@ def printsolution(self, x): | |||
|   ... | ||||
| ValueError: 7 | ||||
| 
 | ||||
| >>> f().throw("abc")     # throw on just-opened generator | ||||
| Traceback (most recent call last): | ||||
|   ... | ||||
| abc | ||||
| 
 | ||||
| Now let's try closing a generator: | ||||
| 
 | ||||
| >>> def f(): | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ | |||
| """ | ||||
| 
 | ||||
| import select | ||||
| import os, sys, string, struct, types, cPickle, cStringIO | ||||
| import os, sys, string, struct, types, pickle, cStringIO | ||||
| import socket, tempfile, threading, time | ||||
| import logging, logging.handlers, logging.config | ||||
| from test.test_support import run_with_locale | ||||
|  | @ -70,7 +70,7 @@ def handle(self): | |||
|                 raise | ||||
| 
 | ||||
|     def unPickle(self, data): | ||||
|         return cPickle.loads(data) | ||||
|         return pickle.loads(data) | ||||
| 
 | ||||
|     def handleLogRecord(self, record): | ||||
|         logname = "logrecv.tcp." + record.name | ||||
|  |  | |||
|  | @ -412,7 +412,11 @@ def test_re_escape(self): | |||
|     def test_pickling(self): | ||||
|         import pickle | ||||
|         self.pickle_test(pickle) | ||||
|         try: | ||||
|             import cPickle | ||||
|         except ImportError: | ||||
|             pass # cPickle not found -- skip it | ||||
|         else: | ||||
|             self.pickle_test(cPickle) | ||||
| 
 | ||||
|     def pickle_test(self, pickle): | ||||
|  |  | |||
|  | @ -111,35 +111,6 @@ def test_base_exception(self): | |||
|         lst = traceback.format_exception_only(e.__class__, e) | ||||
|         self.assertEqual(lst, ['KeyboardInterrupt\n']) | ||||
| 
 | ||||
|     # String exceptions are deprecated, but legal.  The quirky form with | ||||
|     # separate "type" and "value" tends to break things, because | ||||
|     #     not isinstance(value, type) | ||||
|     # and a string cannot be the first argument to issubclass. | ||||
|     # | ||||
|     # Note that sys.last_type and sys.last_value do not get set if an | ||||
|     # exception is caught, so we sort of cheat and just emulate them. | ||||
|     # | ||||
|     # test_string_exception1 is equivalent to | ||||
|     # | ||||
|     # >>> raise "String Exception" | ||||
|     # | ||||
|     # test_string_exception2 is equivalent to | ||||
|     # | ||||
|     # >>> raise "String Exception", "String Value" | ||||
|     # | ||||
|     def test_string_exception1(self): | ||||
|         str_type = "String Exception" | ||||
|         err = traceback.format_exception_only(str_type, None) | ||||
|         self.assertEqual(len(err), 1) | ||||
|         self.assertEqual(err[0], str_type + '\n') | ||||
| 
 | ||||
|     def test_string_exception2(self): | ||||
|         str_type = "String Exception" | ||||
|         str_value = "String Value" | ||||
|         err = traceback.format_exception_only(str_type, str_value) | ||||
|         self.assertEqual(len(err), 1) | ||||
|         self.assertEqual(err[0], str_type + ': ' + str_value + '\n') | ||||
| 
 | ||||
|     def test_format_exception_only_bad__str__(self): | ||||
|         class X(Exception): | ||||
|             def __str__(self): | ||||
|  |  | |||
|  | @ -136,4 +136,4 @@ class UserDataHandler: | |||
| EMPTY_NAMESPACE = None | ||||
| EMPTY_PREFIX = None | ||||
| 
 | ||||
| from domreg import getDOMImplementation,registerDOMImplementation | ||||
| from .domreg import getDOMImplementation, registerDOMImplementation | ||||
|  |  | |||
|  | @ -253,12 +253,11 @@ gen_throw(PyGenObject *gen, PyObject *args) | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Allow raising builtin string exceptions */ | ||||
| 
 | ||||
| 	else if (!PyString_CheckExact(typ)) { | ||||
| 	else { | ||||
| 		/* Not something you can raise.  throw() fails. */ | ||||
| 		PyErr_Format(PyExc_TypeError, | ||||
| 			     "exceptions must be classes, or instances, not %s", | ||||
| 			     "exceptions must be classes or instances " | ||||
| 			     "deriving from BaseException, not %s", | ||||
| 			     typ->ob_type->tp_name); | ||||
| 			goto failed_throw; | ||||
| 	} | ||||
|  |  | |||
							
								
								
									
										2
									
								
								setup.py
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								setup.py
									
										
									
									
									
								
							|  | @ -430,7 +430,7 @@ def detect_modules(self): | |||
| 
 | ||||
|         # cStringIO and cPickle | ||||
|         exts.append( Extension('cStringIO', ['cStringIO.c']) ) | ||||
|         exts.append( Extension('cPickle', ['cPickle.c']) ) | ||||
|         ##exts.append( Extension('cPickle', ['cPickle.c']) ) | ||||
| 
 | ||||
|         # Memory-mapped files (also works on Win32). | ||||
|         if platform not in ['atheos', 'mac']: | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Guido van Rossum
						Guido van Rossum