]> granicus.if.org Git - python/commitdiff
Merged revisions 72506,72525-72526,72551,72558,72616,72654-72655,72689,72745,72750...
authorBenjamin Peterson <benjamin@python.org>
Mon, 1 Jun 2009 22:42:33 +0000 (22:42 +0000)
committerBenjamin Peterson <benjamin@python.org>
Mon, 1 Jun 2009 22:42:33 +0000 (22:42 +0000)
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
........

23 files changed:
Doc/c-api/buffer.rst
Doc/c-api/sequence.rst
Doc/conf.py
Doc/library/ctypes.rst
Doc/library/email-examples.rst
Doc/library/exceptions.rst
Doc/library/functions.rst
Doc/library/http.client.rst
Doc/library/os.rst
Doc/library/rlcompleter.rst
Doc/library/smtplib.rst
Doc/library/subprocess.rst
Doc/reference/simple_stmts.rst
Lib/gettext.py
Lib/idlelib/macosxSupport.py
Lib/logging/__init__.py
Lib/test/support.py
Lib/test/test_hashlib.py
Lib/test/test_os.py
Lib/test/test_unittest.py
Lib/unittest.py
Lib/zipfile.py
Tools/freeze/makeconfig.py

index a75e450472fcb9948907c021897846ea88a5a3f8..6ad4f7b5a5ab8a579d23e483ebeea109e28d8db4 100644 (file)
@@ -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
index 6be9810a537ccb01ab8e55060bb4bcab33bbf0e3..d8631770fb613dbdff5026046c3b92694461cbbd 100644 (file)
@@ -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.
index 551452babd4b348a415ef229d50d6da0b7621e69..352c15f41179b5563aaba752800ecd4ace3ad18b 100644 (file)
@@ -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'
 
index ba80478a7cf629b53b36e1d3b4f22a7d1c95e879..039289a0b2192abbe941f5eb4941fee156f1a036 100644 (file)
@@ -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
index f606f9bb3b52585d54dfe7d2554cd440c33d4cd3..c1b16da39471c5b9a5389d3266946585fb2fc48a 100644 (file)
@@ -1,3 +1,5 @@
+.. _email-examples:
+
 :mod:`email`: Examples
 ----------------------
 
index 7d8e1b3c10d493b02d197eb66828cb912ecfa098..43fa9b099d98cfe438cbc4dcdb11db2f2ccbd107 100644 (file)
@@ -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
index f0c7195b2bc57794134d748079237cb45768f8b9..732dfa2a0d993ec3a693c791d76f6b2b8d9d5311 100644 (file)
@@ -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'
index 83629481a3166fa8cca4930d27e8c7395a359e9e..36322421b94c96966013dd1acbbaedd132b72dc3 100644 (file)
@@ -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()
 
index 221374048cfd077e2a9735466b81980d841b908d..9bb2fc627b552461e65128c0479f71175c9f153d 100644 (file)
@@ -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 <http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx>` 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.
 
index 293160a6fca029cec36b685d9497ab3a1147c95d..6b3befcfeeb1c2a9f7027add32a0fe0b72386291 100644 (file)
@@ -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
index 53631207bad80494961dbeb616c8c722ebe165b4..070220e26b12cfed473761abd1b9414449f7af1d 100644 (file)
@@ -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`.
index 9853e62baf1c7c9cb3afdf3e576bdebb9c7f09a0..3318d430ec1ea2837ce4d4ab7a118030f1d71fec 100644 (file)
@@ -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
index dc8d2cf60dc649ce985e02df4891df957f14d789..ced3398535d658de71a306f6f760687c51ea27f6 100644 (file)
@@ -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:
index d62ac07516ada8768511f1ca4533e3f6271af03d..4c957c0c6ad199a84e9ce46f39ea22643d7a2477 100644 (file)
@@ -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.
index b23221e759a77a99cf3c4a1beaa0f64fa3e0c0d9..b794a83bd5292425cfea9ec1e3952ff757d52183 100644 (file)
@@ -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')
 
 
index 517a7a94f09ae2c75025379583bc269b3e18f4e7..9780c830aefccd665b866d1135995d3451aece61 100644 (file)
@@ -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):
     """
index df114a2188f86410284c86706a9cda7e99ac2a5b..b91d7328d41c0599b58abb879881222b97252b18 100644 (file)
@@ -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)
index 594f5dd8850c35213ffd499681f7a2c5f1ca8447..5bfea6b9d2ded19796064cb2d20ce74f1afa2369 100644 (file)
@@ -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()
index c680d8d77a371aaa35d7da9faa6154f017c5b00b..0600cfc0eef943c49bdf083888d423acddcefda3 100644 (file)
@@ -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)
index ea331808b3c13d45cb2084c8b77e58f9d13011a9..858f24b7d48a6968cfacf70f5f72b0c2ac115fdc 100644 (file)
@@ -3175,7 +3175,7 @@ class TestCleanUp(TestCase):
 
         result = MockResult()
         test = TestableTest('testNothing')
-        test._result = result
+        test._resultForDoCleanups = result
 
         exc1 = Exception('foo')
         exc2 = Exception('bar')
index cdccd8c3cc35efc7007cef0f020a5cd303567014..9c3024af69305bbbbf5275b699f75feebb9d2830 100644 (file)
@@ -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)
index 5f2efb9b3cdf0cd0e5da70cbfa8595a3fe837d71..5f2418734dae8e0c4a345146a21b73aae8d42bd6 100644 (file)
@@ -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':
index e2a181ce194637ecf745170ee92e85f3406124c7..8eb0879a2ff1ec80d603ad6df36dff42b4017c53 100644 (file)
@@ -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 --')