From fa0d7034339fee79cf5f095ee48488ea13a3fc4b Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Mon, 1 Jun 2009 22:42:33 +0000 Subject: Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750,72802,72812,72822,72824,72826-72827,72833,72876,72890,72923,72946,73026,73042,73045,73047,73065,73068-73069 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r72506 | vinay.sajip | 2009-05-09 07:07:17 -0500 (Sat, 09 May 2009) | 1 line Issue #5971: StreamHandler.handleError now swallows IOErrors which occur when trying to print a traceback. ........ r72525 | benjamin.peterson | 2009-05-09 20:38:02 -0500 (Sat, 09 May 2009) | 1 line close file explicitly ........ r72526 | benjamin.peterson | 2009-05-09 21:29:00 -0500 (Sat, 09 May 2009) | 1 line make sure files are closed using the with statement ........ r72551 | benjamin.peterson | 2009-05-10 09:16:47 -0500 (Sun, 10 May 2009) | 1 line use isinstance ........ r72558 | benjamin.peterson | 2009-05-10 18:52:09 -0500 (Sun, 10 May 2009) | 1 line sys.setdefaultencoding() strikes me as a bad example ........ r72616 | benjamin.peterson | 2009-05-13 19:33:10 -0500 (Wed, 13 May 2009) | 1 line importlib.import_module is better these days ........ r72654 | benjamin.peterson | 2009-05-14 17:37:49 -0500 (Thu, 14 May 2009) | 1 line prevent refleaks from threads ........ r72655 | benjamin.peterson | 2009-05-14 17:40:34 -0500 (Thu, 14 May 2009) | 1 line a useful decorator for cleaning up threads ........ r72689 | benjamin.peterson | 2009-05-16 13:44:34 -0500 (Sat, 16 May 2009) | 1 line use skipTest() ........ r72745 | benjamin.peterson | 2009-05-17 09:16:29 -0500 (Sun, 17 May 2009) | 1 line ignore .rst files in sphinx its self ........ r72750 | benjamin.peterson | 2009-05-17 11:59:27 -0500 (Sun, 17 May 2009) | 1 line chop off slash ........ r72802 | georg.brandl | 2009-05-20 13:35:27 -0500 (Wed, 20 May 2009) | 1 line #6051: refer to email examples for better way to construct email messages. ........ r72812 | michael.foord | 2009-05-21 17:57:02 -0500 (Thu, 21 May 2009) | 1 line Rename TestCase._result to _resultForDoCleanups to avoid potential clashes in TestCase subclasses. Issue 6072. ........ r72822 | georg.brandl | 2009-05-22 04:33:25 -0500 (Fri, 22 May 2009) | 1 line #6084: fix example. ........ r72824 | georg.brandl | 2009-05-22 04:43:17 -0500 (Fri, 22 May 2009) | 1 line Fix references to file-related functions and methods (os.* vs file.*). ........ r72826 | georg.brandl | 2009-05-22 04:49:42 -0500 (Fri, 22 May 2009) | 1 line Fix confusing wording. ........ r72827 | georg.brandl | 2009-05-22 04:50:30 -0500 (Fri, 22 May 2009) | 1 line s/use/call/ ........ r72833 | georg.brandl | 2009-05-22 12:00:17 -0500 (Fri, 22 May 2009) | 1 line #6078: _warnings is a builtin module and has no standard init_warnings function. ........ r72876 | benjamin.peterson | 2009-05-23 15:59:09 -0500 (Sat, 23 May 2009) | 1 line remove mention of old ctypes version ........ r72890 | gregory.p.smith | 2009-05-24 13:00:13 -0500 (Sun, 24 May 2009) | 2 lines add a versionadded tag for set_tunnel ........ r72923 | michael.foord | 2009-05-25 15:36:56 -0500 (Mon, 25 May 2009) | 1 line Make assertSequenceEqual error messages less cryptic, particularly for nested sequences. ........ r72946 | ronald.oussoren | 2009-05-26 13:44:48 -0500 (Tue, 26 May 2009) | 2 lines Fixes issue 6110 ........ r73026 | r.david.murray | 2009-05-29 14:30:27 -0500 (Fri, 29 May 2009) | 3 lines Issue 6141: document that the first item of args is still the command name even when executable is specified. ........ r73042 | benjamin.peterson | 2009-05-29 22:10:52 -0500 (Fri, 29 May 2009) | 1 line no fdatasync on macos ........ r73045 | georg.brandl | 2009-05-30 02:26:04 -0500 (Sat, 30 May 2009) | 1 line #6146: fix markup bug. ........ r73047 | georg.brandl | 2009-05-30 05:33:23 -0500 (Sat, 30 May 2009) | 1 line Fix some more small markup problems. ........ r73065 | antoine.pitrou | 2009-05-30 16:39:25 -0500 (Sat, 30 May 2009) | 3 lines The test for #5330 wasn't correct. ........ r73068 | antoine.pitrou | 2009-05-30 16:45:40 -0500 (Sat, 30 May 2009) | 3 lines Update ACKS ........ r73069 | benjamin.peterson | 2009-05-30 19:42:42 -0500 (Sat, 30 May 2009) | 1 line fix signature ........ --- Doc/c-api/buffer.rst | 2 +- Doc/c-api/sequence.rst | 10 +++---- Doc/conf.py | 3 ++ Doc/library/ctypes.rst | 3 +- Doc/library/email-examples.rst | 2 ++ Doc/library/exceptions.rst | 6 ++-- Doc/library/functions.rst | 4 +-- Doc/library/http.client.rst | 2 ++ Doc/library/os.rst | 31 +++++++++++---------- Doc/library/rlcompleter.rst | 2 +- Doc/library/smtplib.rst | 5 ++++ Doc/library/subprocess.rst | 9 ++++-- Doc/reference/simple_stmts.rst | 8 ++---- Lib/gettext.py | 4 +-- Lib/idlelib/macosxSupport.py | 1 + Lib/logging/__init__.py | 8 ++++-- Lib/test/support.py | 11 ++++++++ Lib/test/test_hashlib.py | 3 +- Lib/test/test_os.py | 4 +-- Lib/test/test_unittest.py | 2 +- Lib/unittest.py | 63 +++++++++++++++++++++++------------------- Lib/zipfile.py | 48 +++++++++++++++----------------- Tools/freeze/makeconfig.py | 2 +- 23 files changed, 132 insertions(+), 101 deletions(-) diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst index a75e450..6ad4f7b 100644 --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -137,7 +137,7 @@ Buffer related functions Return 1 if *obj* supports the buffer interface otherwise 0. -.. cfunction:: int PyObject_GetBuffer(PyObject *obj, PyObject *view, int flags) +.. cfunction:: int PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) Export *obj* into a :ctype:`Py_buffer`, *view*. These arguments must never be *NULL*. The *flags* argument is a bit field indicating what diff --git a/Doc/c-api/sequence.rst b/Doc/c-api/sequence.rst index 6be9810..d863177 100644 --- a/Doc/c-api/sequence.rst +++ b/Doc/c-api/sequence.rst @@ -50,7 +50,7 @@ Sequence Protocol .. cfunction:: PyObject* PySequence_GetItem(PyObject *o, Py_ssize_t i) - Return the *i*th element of *o*, or *NULL* on failure. This is the equivalent of + Return the *i*\ th element of *o*, or *NULL* on failure. This is the equivalent of the Python expression ``o[i]``. @@ -62,14 +62,14 @@ Sequence Protocol .. cfunction:: int PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v) - Assign object *v* to the *i*th element of *o*. Returns ``-1`` on failure. This + Assign object *v* to the *i*\ th element of *o*. Returns ``-1`` on failure. This is the equivalent of the Python statement ``o[i] = v``. This function *does not* steal a reference to *v*. .. cfunction:: int PySequence_DelItem(PyObject *o, Py_ssize_t i) - Delete the *i*th element of object *o*. Returns ``-1`` on failure. This is the + Delete the *i*\ th element of object *o*. Returns ``-1`` on failure. This is the equivalent of the Python statement ``del o[i]``. @@ -131,7 +131,7 @@ Sequence Protocol .. cfunction:: PyObject* PySequence_Fast_GET_ITEM(PyObject *o, Py_ssize_t i) - Return the *i*th element of *o*, assuming that *o* was returned by + Return the *i*\ th element of *o*, assuming that *o* was returned by :cfunc:`PySequence_Fast`, *o* is not *NULL*, and that *i* is within bounds. @@ -147,7 +147,7 @@ Sequence Protocol .. cfunction:: PyObject* PySequence_ITEM(PyObject *o, Py_ssize_t i) - Return the *i*th element of *o* or *NULL* on failure. Macro form of + Return the *i*\ th element of *o* or *NULL* on failure. Macro form of :cfunc:`PySequence_GetItem` but without checking that :cfunc:`PySequence_Check(o)` is true and without adjustment for negative indices. diff --git a/Doc/conf.py b/Doc/conf.py index 551452b..352c15f 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -46,6 +46,9 @@ unused_docs = [ 'library/xml.etree', ] +# Ignore .rst in Sphinx its self. +exclude_trees = ['tools/sphinx'] + # Relative filename of the reference count data file. refcount_file = 'data/refcounts.dat' diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index ba80478..039289a 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1207,8 +1207,7 @@ constructs a new Python object each time! Variable-sized data types ^^^^^^^^^^^^^^^^^^^^^^^^^ -``ctypes`` provides some support for variable-sized arrays and structures (this -was added in version 0.9.9.7). +``ctypes`` provides some support for variable-sized arrays and structures. The ``resize`` function can be used to resize the memory buffer of an existing ctypes object. The function takes the object as first argument, and the diff --git a/Doc/library/email-examples.rst b/Doc/library/email-examples.rst index f606f9b..c1b16da 100644 --- a/Doc/library/email-examples.rst +++ b/Doc/library/email-examples.rst @@ -1,3 +1,5 @@ +.. _email-examples: + :mod:`email`: Examples ---------------------- diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index 7d8e1b3..43fa9b0 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -73,9 +73,9 @@ The following exceptions are only used as base classes for other exceptions. .. exception:: LookupError - The base class for the exceptions that are raised when a key or index used on a - mapping or sequence is invalid: :exc:`IndexError`, :exc:`KeyError`. This can be - raised directly by :func:`sys.setdefaultencoding`. + The base class for the exceptions that are raised when a key or index used on + a mapping or sequence is invalid: :exc:`IndexError`, :exc:`KeyError`. This + can be raised directly by :func:`codecs.lookup`. .. exception:: EnvironmentError diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index f0c7195..732dfa2 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1209,7 +1209,7 @@ are always available. They are listed here in alphabetical order. >>> list(zipped) [(1, 4), (2, 5), (3, 6)] >>> x2, y2 = zip(*zip(x, y)) - >>> x == x2, y == y2 + >>> x == list(x2) and y == list(y2) True @@ -1272,7 +1272,7 @@ are always available. They are listed here in alphabetical order. names. If you simply want to import a module (potentially within a package) by name, - you can get it from :data:`sys.modules`:: + you can call :func:`__import__` and then look it up in :data:`sys.modules`:: >>> import sys >>> name = 'foo.bar.baz' diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index 8362948..3632242 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -384,6 +384,8 @@ HTTPConnection Objects Set the debugging level (the amount of debugging output printed). The default debug level is ``0``, meaning no debugging output is printed. + .. versionadded:: 2.7 + .. method:: HTTPConnection.connect() diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 2213740..9bb2fc6 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -386,9 +386,9 @@ by file descriptors. .. note:: This function is intended for low-level I/O and must be applied to a file - descriptor as returned by :func:`open` or :func:`pipe`. To close a "file + descriptor as returned by :func:`os.open` or :func:`pipe`. To close a "file object" returned by the built-in function :func:`open` or by :func:`popen` or - :func:`fdopen`, use its :meth:`close` method. + :func:`fdopen`, use its :meth:`~file.close` method. .. function:: closerange(fd_low, fd_high) @@ -439,6 +439,9 @@ by file descriptors. Force write of file with filedescriptor *fd* to disk. Does not force update of metadata. Availability: Unix. + .. note:: + This function is not available on MacOS. + .. function:: fpathconf(fd, name) @@ -514,8 +517,8 @@ by file descriptors. .. note:: This function is intended for low-level I/O. For normal usage, use the built-in - function :func:`open`, which returns a "file object" with :meth:`read` and - :meth:`write` methods (and many more). To wrap a file descriptor in a "file + function :func:`open`, which returns a "file object" with :meth:`~file.read` and + :meth:`~file.write` methods (and many more). To wrap a file descriptor in a "file object", use :func:`fdopen`. @@ -544,22 +547,22 @@ by file descriptors. .. note:: This function is intended for low-level I/O and must be applied to a file - descriptor as returned by :func:`open` or :func:`pipe`. To read a "file object" + descriptor as returned by :func:`os.open` or :func:`pipe`. To read a "file object" returned by the built-in function :func:`open` or by :func:`popen` or - :func:`fdopen`, or :data:`sys.stdin`, use its :meth:`read` or :meth:`readline` - methods. + :func:`fdopen`, or :data:`sys.stdin`, use its :meth:`~file.read` or + :meth:`~file.readline` methods. .. function:: tcgetpgrp(fd) Return the process group associated with the terminal given by *fd* (an open - file descriptor as returned by :func:`open`). Availability: Unix. + file descriptor as returned by :func:`os.open`). Availability: Unix. .. function:: tcsetpgrp(fd, pg) Set the process group associated with the terminal given by *fd* (an open file - descriptor as returned by :func:`open`) to *pg*. Availability: Unix. + descriptor as returned by :func:`os.open`) to *pg*. Availability: Unix. .. function:: ttyname(fd) @@ -577,13 +580,13 @@ by file descriptors. .. note:: This function is intended for low-level I/O and must be applied to a file - descriptor as returned by :func:`open` or :func:`pipe`. To write a "file + descriptor as returned by :func:`os.open` or :func:`pipe`. To write a "file object" returned by the built-in function :func:`open` or by :func:`popen` or - :func:`fdopen`, or :data:`sys.stdout` or :data:`sys.stderr`, use its :meth:`write` - method. + :func:`fdopen`, or :data:`sys.stdout` or :data:`sys.stderr`, use its + :meth:`~file.write` method. The following constants are options for the *flags* parameter to the -:func:`open` function. They can be combined using the bitwise OR operator +:func:`~os.open` function. They can be combined using the bitwise OR operator ``|``. Some of them are not available on all platforms. For descriptions of their availability and use, consult the :manpage:`open(2)` manual page on Unix or `the MSDN ` on Windows. @@ -660,7 +663,7 @@ Files and Directories .. note:: Using :func:`access` to check if a user is authorized to e.g. open a file before - actually doing so using :func:`open` creates a security hole, because the user + actually doing so using :func:`open` creates a security hole, because the user might exploit the short time interval between checking and opening the file to manipulate it. diff --git a/Doc/library/rlcompleter.rst b/Doc/library/rlcompleter.rst index 293160a..6b3befc 100644 --- a/Doc/library/rlcompleter.rst +++ b/Doc/library/rlcompleter.rst @@ -52,7 +52,7 @@ Completer objects have the following method: .. method:: Completer.complete(text, state) - Return the *state*th completion for *text*. + Return the *state*\ th completion for *text*. If called for *text* that doesn't include a period character (``'.'``), it will complete from names currently defined in :mod:`__main__`, :mod:`builtins` and diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index 5363120..070220e 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -364,3 +364,8 @@ example doesn't do any processing of the :rfc:`822` headers. In particular, the server.sendmail(fromaddr, toaddrs, msg) server.quit() +.. note:: + + In general, you will want to use the :mod:`email` package's features to + construct an email message, which you can then convert to a string and send + via :meth:`sendmail`; see :ref:`email-examples`. diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 9853e62..3318d43 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -34,9 +34,12 @@ This module defines one class called :class:`Popen`: Arguments are: *args* should be a string, or a sequence of program arguments. The program - to execute is normally the first item in the args sequence or the string if a - string is given, but can be explicitly set by using the *executable* - argument. + to execute is normally the first item in the args sequence or the string if + a string is given, but can be explicitly set by using the *executable* + argument. When *executable* is given, the first item in the args sequence + is still treated by most programs as the command name, which can then be + different from the actual executable name. On Unix, it becomes the display + name for the executing program in utilities such as :program:`ps`. On Unix, with *shell=False* (default): In this case, the Popen class uses :meth:`os.execvp` to execute the child program. *args* should normally be a diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index dc8d2cf..ced3398 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -815,12 +815,8 @@ then you will end up importing ``pkg.mod``. If you execute ``from ..subpkg2 imprt mod`` from within ``pkg.subpkg1`` you will import ``pkg.subpkg2.mod``. The specification for relative imports is contained within :pep:`328`. - -.. index:: builtin: __import__ - -The built-in function :func:`__import__` is provided to support applications -that determine which modules need to be loaded dynamically; refer to -:ref:`built-in-funcs` for additional information. +:func:`importlib.import_module` is provided to support applications that +determine which modules need to be loaded dynamically. .. _future: diff --git a/Lib/gettext.py b/Lib/gettext.py index d62ac07..4c957c0 100644 --- a/Lib/gettext.py +++ b/Lib/gettext.py @@ -415,7 +415,6 @@ def translation(domain, localedir=None, languages=None, if fallback: return NullTranslations() raise IOError(ENOENT, 'No translation file found for domain', domain) - # TBD: do we need to worry about the file pointer getting collected? # Avoid opening, reading, and parsing the .mo file after it's been done # once. result = None @@ -423,7 +422,8 @@ def translation(domain, localedir=None, languages=None, key = os.path.abspath(mofile) t = _translations.get(key) if t is None: - t = _translations.setdefault(key, class_(open(mofile, 'rb'))) + with open(mofile, 'rb') as fp: + t = _translations.setdefault(key, class_(fp)) # Copy the translation object to allow setting fallbacks and # output charset. All other instance data is shared with the # cached object. diff --git a/Lib/idlelib/macosxSupport.py b/Lib/idlelib/macosxSupport.py index b23221e..b794a83 100644 --- a/Lib/idlelib/macosxSupport.py +++ b/Lib/idlelib/macosxSupport.py @@ -88,6 +88,7 @@ def overrideRootMenu(root, flist): # on an EditorWindow instance that is then passed as the first # argument to ConfigDialog) root.instance_dict = flist.inversedict + root.instance_dict = flist.inversedict configDialog.ConfigDialog(root, 'Settings') diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 517a7a9..9780c83 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -720,8 +720,12 @@ class Handler(Filterer): """ if raiseExceptions: ei = sys.exc_info() - traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr) - del ei + try: + traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr) + except IOError: + pass # see issue 5971 + finally: + del ei class StreamHandler(Handler): """ diff --git a/Lib/test/support.py b/Lib/test/support.py index df114a2..b91d732 100644 --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -5,6 +5,7 @@ if __name__ != 'test.support': import contextlib import errno +import functools import socket import sys import os @@ -933,6 +934,16 @@ def threading_cleanup(num_active, num_limbo): count += 1 time.sleep(0.1) +def reap_threads(func): + @functools.wraps(func) + def decorator(*args): + key = threading_setup() + try: + return func(*args) + finally: + threading_cleanup(*key) + return decorator + def reap_children(): """Use this function at the end of test_main() whenever sub-processes are started. This will help ensure that no extra children (zombies) diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py index 594f5dd..5bfea6b 100644 --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -267,10 +267,9 @@ class HashLibTestCase(unittest.TestCase): self.assertEqual(expected_hash, hasher.hexdigest()) - +@support.reap_threads def test_main(): support.run_unittest(HashLibTestCase) - if __name__ == "__main__": test_main() diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index c680d8d..0600cfc 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -35,9 +35,7 @@ class FileTests(unittest.TestCase): retries += 1 if retries > 10: # XXX test skipped - print("couldn't allocate two consecutive fds, " - "skipping test_closerange", file=sys.stderr) - return + self.skipTest("couldn't allocate two consecutive fds") first, second = second, os.dup(second) finally: os.close(second) diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py index ea33180..858f24b 100644 --- a/Lib/test/test_unittest.py +++ b/Lib/test/test_unittest.py @@ -3175,7 +3175,7 @@ class TestCleanUp(TestCase): result = MockResult() test = TestableTest('testNothing') - test._result = result + test._resultForDoCleanups = result exc1 = Exception('foo') exc2 = Exception('bar') diff --git a/Lib/unittest.py b/Lib/unittest.py index cdccd8c..9c3024a 100644 --- a/Lib/unittest.py +++ b/Lib/unittest.py @@ -353,7 +353,7 @@ class TestCase(object): not have a method with the specified name. """ self._testMethodName = methodName - self._result = None + self._resultForDoCleanups = None try: testMethod = getattr(self, methodName) except AttributeError: @@ -457,7 +457,7 @@ class TestCase(object): if startTestRun is not None: startTestRun() - self._result = result + self._resultForDoCleanups = result result.startTest(self) if getattr(self.__class__, "__unittest_skip__", False): # If the whole class was skipped. @@ -511,7 +511,7 @@ class TestCase(object): def doCleanups(self): """Execute all cleanup functions. Normally called for you after tearDown.""" - result = self._result + result = self._resultForDoCleanups ok = True while self._cleanups: function, args, kwargs = self._cleanups.pop(-1) @@ -732,23 +732,32 @@ class TestCase(object): if seq1 == seq2: return + seq1_repr = repr(seq1) + seq2_repr = repr(seq2) + if len(seq1_repr) > 30: + seq1_repr = seq1_repr[:30] + '...' + if len(seq2_repr) > 30: + seq2_repr = seq2_repr[:30] + '...' + elements = (seq_type_name.capitalize(), seq1_repr, seq2_repr) + differing = '%ss differ: %s != %s\n' % elements + for i in range(min(len1, len2)): try: item1 = seq1[i] except (TypeError, IndexError, NotImplementedError): - differing = ('Unable to index element %d of first %s\n' % + differing += ('\nUnable to index element %d of first %s\n' % (i, seq_type_name)) break try: item2 = seq2[i] except (TypeError, IndexError, NotImplementedError): - differing = ('Unable to index element %d of second %s\n' % + differing += ('\nUnable to index element %d of second %s\n' % (i, seq_type_name)) break if item1 != item2: - differing = ('First differing element %d:\n%s\n%s\n' % + differing += ('\nFirst differing element %d:\n%s\n%s\n' % (i, item1, item2)) break else: @@ -756,28 +765,26 @@ class TestCase(object): type(seq1) != type(seq2)): # The sequences are the same, but have differing types. return - # A catch-all message for handling arbitrary user-defined - # sequences. - differing = '%ss differ:\n' % seq_type_name.capitalize() - if len1 > len2: - differing = ('First %s contains %d additional ' - 'elements.\n' % (seq_type_name, len1 - len2)) - try: - differing += ('First extra element %d:\n%s\n' % - (len2, seq1[len2])) - except (TypeError, IndexError, NotImplementedError): - differing += ('Unable to index element %d ' - 'of first %s\n' % (len2, seq_type_name)) - elif len1 < len2: - differing = ('Second %s contains %d additional ' - 'elements.\n' % (seq_type_name, len2 - len1)) - try: - differing += ('First extra element %d:\n%s\n' % - (len1, seq2[len1])) - except (TypeError, IndexError, NotImplementedError): - differing += ('Unable to index element %d ' - 'of second %s\n' % (len1, seq_type_name)) - standardMsg = differing + '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(), + + if len1 > len2: + differing += ('\nFirst %s contains %d additional ' + 'elements.\n' % (seq_type_name, len1 - len2)) + try: + differing += ('First extra element %d:\n%s\n' % + (len2, seq1[len2])) + except (TypeError, IndexError, NotImplementedError): + differing += ('Unable to index element %d ' + 'of first %s\n' % (len2, seq_type_name)) + elif len1 < len2: + differing += ('\nSecond %s contains %d additional ' + 'elements.\n' % (seq_type_name, len2 - len1)) + try: + differing += ('First extra element %d:\n%s\n' % + (len1, seq2[len1])) + except (TypeError, IndexError, NotImplementedError): + differing += ('Unable to index element %d ' + 'of second %s\n' % (len1, seq_type_name)) + standardMsg = differing + '\n' + '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(), pprint.pformat(seq2).splitlines())) msg = self._formatMessage(msg, standardMsg) self.fail(msg) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 5f2efb9..5f24187 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1055,28 +1055,27 @@ class ZipFile: self.fp.write(zinfo.FileHeader()) return - fp = io.open(filename, "rb") - # Must overwrite CRC and sizes with correct data later - zinfo.CRC = CRC = 0 - zinfo.compress_size = compress_size = 0 - zinfo.file_size = file_size = 0 - self.fp.write(zinfo.FileHeader()) - if zinfo.compress_type == ZIP_DEFLATED: - cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, - zlib.DEFLATED, -15) - else: - cmpr = None - while 1: - buf = fp.read(1024 * 8) - if not buf: - break - file_size = file_size + len(buf) - CRC = crc32(buf, CRC) & 0xffffffff - if cmpr: - buf = cmpr.compress(buf) - compress_size = compress_size + len(buf) - self.fp.write(buf) - fp.close() + with open(filename, "rb") as fp: + # Must overwrite CRC and sizes with correct data later + zinfo.CRC = CRC = 0 + zinfo.compress_size = compress_size = 0 + zinfo.file_size = file_size = 0 + self.fp.write(zinfo.FileHeader()) + if zinfo.compress_type == ZIP_DEFLATED: + cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, + zlib.DEFLATED, -15) + else: + cmpr = None + while 1: + buf = fp.read(1024 * 8) + if not buf: + break + file_size = file_size + len(buf) + CRC = crc32(buf, CRC) & 0xffffffff + if cmpr: + buf = cmpr.compress(buf) + compress_size = compress_size + len(buf) + self.fp.write(buf) if cmpr: buf = cmpr.flush() compress_size = compress_size + len(buf) @@ -1400,9 +1399,8 @@ def main(args = None): tgtdir = os.path.dirname(tgt) if not os.path.exists(tgtdir): os.makedirs(tgtdir) - fp = io.open(tgt, 'wb') - fp.write(zf.read(path)) - fp.close() + with open(tgt, 'wb') as fp: + fp.write(zf.read(path)) zf.close() elif args[0] == '-c': diff --git a/Tools/freeze/makeconfig.py b/Tools/freeze/makeconfig.py index e2a181c..8eb0879 100644 --- a/Tools/freeze/makeconfig.py +++ b/Tools/freeze/makeconfig.py @@ -3,7 +3,7 @@ import re # Write the config.c file -never = ['marshal', '__main__', 'builtins', 'sys', 'exceptions'] +never = ['marshal', '__main__', 'builtins', 'sys', 'exceptions', '_warnings'] def makeconfig(infp, outfp, modules, with_ifdef=0): m1 = re.compile('-- ADDMODULE MARKER 1 --') -- cgit v0.12