This commit is contained in:
Christian Heimes 2012-10-06 17:14:02 +02:00
commit d3df2060a6
5 changed files with 40 additions and 24 deletions

View File

@ -61,7 +61,7 @@ The module defines the following items:
.. class:: ZipInfo(filename='NoName', date_time=(1980,1,1,0,0,0)) .. class:: ZipInfo(filename='NoName', date_time=(1980,1,1,0,0,0))
Class used to represent information about a member of an archive. Instances Class used to represent information about a member of an archive. Instances
of this class are returned by the :meth:`getinfo` and :meth:`infolist` of this class are returned by the :meth:`.getinfo` and :meth:`.infolist`
methods of :class:`ZipFile` objects. Most users of the :mod:`zipfile` module methods of :class:`ZipFile` objects. Most users of the :mod:`zipfile` module
will not need to create these, but only use those created by this will not need to create these, but only use those created by this
module. *filename* should be the full name of the archive member, and module. *filename* should be the full name of the archive member, and
@ -87,20 +87,20 @@ The module defines the following items:
.. data:: ZIP_DEFLATED .. data:: ZIP_DEFLATED
The numeric constant for the usual ZIP compression method. This requires the The numeric constant for the usual ZIP compression method. This requires the
zlib module. :mod:`zlib` module.
.. data:: ZIP_BZIP2 .. data:: ZIP_BZIP2
The numeric constant for the BZIP2 compression method. This requires the The numeric constant for the BZIP2 compression method. This requires the
bz2 module. :mod:`bz2` module.
.. versionadded:: 3.3 .. versionadded:: 3.3
.. data:: ZIP_LZMA .. data:: ZIP_LZMA
The numeric constant for the LZMA compression method. This requires the The numeric constant for the LZMA compression method. This requires the
lzma module. :mod:`lzma` module.
.. versionadded:: 3.3 .. versionadded:: 3.3
@ -155,7 +155,7 @@ ZipFile Objects
these extensions. these extensions.
If the file is created with mode ``'a'`` or ``'w'`` and then If the file is created with mode ``'a'`` or ``'w'`` and then
:meth:`close`\ d without adding any files to the archive, the appropriate :meth:`closed <close>` without adding any files to the archive, the appropriate
ZIP structures for an empty archive will be written to the file. ZIP structures for an empty archive will be written to the file.
ZipFile is also a context manager and therefore supports the ZipFile is also a context manager and therefore supports the
@ -169,7 +169,7 @@ ZipFile Objects
Added the ability to use :class:`ZipFile` as a context manager. Added the ability to use :class:`ZipFile` as a context manager.
.. versionchanged:: 3.3 .. versionchanged:: 3.3
Added support for :mod:`bzip2` and :mod:`lzma` compression. Added support for :mod:`bzip2 <bz2>` and :mod:`lzma` compression.
.. method:: ZipFile.close() .. method:: ZipFile.close()
@ -207,7 +207,7 @@ ZipFile Objects
*mode* parameter, if included, must be one of the following: ``'r'`` (the *mode* parameter, if included, must be one of the following: ``'r'`` (the
default), ``'U'``, or ``'rU'``. Choosing ``'U'`` or ``'rU'`` will enable default), ``'U'``, or ``'rU'``. Choosing ``'U'`` or ``'rU'`` will enable
:term:`universal newlines` support in the read-only object. *pwd* is the :term:`universal newlines` support in the read-only object. *pwd* is the
password used for encrypted files. Calling :meth:`open` on a closed password used for encrypted files. Calling :meth:`.open` on a closed
ZipFile will raise a :exc:`RuntimeError`. ZipFile will raise a :exc:`RuntimeError`.
.. note:: .. note::
@ -229,7 +229,7 @@ ZipFile Objects
.. note:: .. note::
The :meth:`open`, :meth:`read` and :meth:`extract` methods can take a filename The :meth:`.open`, :meth:`read` and :meth:`extract` methods can take a filename
or a :class:`ZipInfo` object. You will appreciate this when trying to read a or a :class:`ZipInfo` object. You will appreciate this when trying to read a
ZIP file that contains members with duplicate names. ZIP file that contains members with duplicate names.
@ -335,7 +335,7 @@ ZipFile Objects
:class:`ZipInfo` constructor sets this member to :const:`ZIP_STORED`. :class:`ZipInfo` constructor sets this member to :const:`ZIP_STORED`.
.. versionchanged:: 3.2 .. versionchanged:: 3.2
The *compression_type* argument. The *compress_type* argument.
The following data attributes are also available: The following data attributes are also available:
@ -351,7 +351,7 @@ The following data attributes are also available:
The comment text associated with the ZIP file. If assigning a comment to a The comment text associated with the ZIP file. If assigning a comment to a
:class:`ZipFile` instance created with mode 'a' or 'w', this should be a :class:`ZipFile` instance created with mode 'a' or 'w', this should be a
string no longer than 65535 bytes. Comments longer than this will be string no longer than 65535 bytes. Comments longer than this will be
truncated in the written archive when :meth:`ZipFile.close` is called. truncated in the written archive when :meth:`close` is called.
.. _pyzipfile-objects: .. _pyzipfile-objects:
@ -407,8 +407,8 @@ The :class:`PyZipFile` constructor takes the same parameters as the
ZipInfo Objects ZipInfo Objects
--------------- ---------------
Instances of the :class:`ZipInfo` class are returned by the :meth:`getinfo` and Instances of the :class:`ZipInfo` class are returned by the :meth:`.getinfo` and
:meth:`infolist` methods of :class:`ZipFile` objects. Each object stores :meth:`.infolist` methods of :class:`ZipFile` objects. Each object stores
information about a single member of the ZIP archive. information about a single member of the ZIP archive.
Instances have the following attributes: Instances have the following attributes:

View File

@ -96,8 +96,7 @@ class MinNode(object):
def leaves(self): def leaves(self):
"Generator that returns the leaves of the tree" "Generator that returns the leaves of the tree"
for child in self.children: for child in self.children:
for x in child.leaves(): yield from child.leaves()
yield x
if not self.children: if not self.children:
yield self yield self
@ -277,7 +276,6 @@ def rec_test(sequence, test_func):
sub-iterables""" sub-iterables"""
for x in sequence: for x in sequence:
if isinstance(x, (list, tuple)): if isinstance(x, (list, tuple)):
for y in rec_test(x, test_func): yield from rec_test(x, test_func)
yield y
else: else:
yield test_func(x) yield test_func(x)

View File

@ -194,8 +194,7 @@ class Base(object):
def leaves(self): def leaves(self):
for child in self.children: for child in self.children:
for x in child.leaves(): yield from child.leaves()
yield x
def depth(self): def depth(self):
if self.parent is None: if self.parent is None:
@ -274,16 +273,14 @@ class Node(Base):
def post_order(self): def post_order(self):
"""Return a post-order iterator for the tree.""" """Return a post-order iterator for the tree."""
for child in self.children: for child in self.children:
for node in child.post_order(): yield from child.post_order()
yield node
yield self yield self
def pre_order(self): def pre_order(self):
"""Return a pre-order iterator for the tree.""" """Return a pre-order iterator for the tree."""
yield self yield self
for child in self.children: for child in self.children:
for node in child.pre_order(): yield from child.pre_order()
yield node
def _prefix_getter(self): def _prefix_getter(self):
""" """

View File

@ -192,6 +192,28 @@ class ProcessTestCase(BaseTestCase):
p.wait() p.wait()
self.assertEqual(p.stderr, None) self.assertEqual(p.stderr, None)
@unittest.skipIf(mswindows, "path not included in Windows message")
def test_path_in_arg_not_found_message(self):
# Check that the error message displays the path not found when
# args[0] is not found.
self.assertRaisesRegex(FileNotFoundError, "notfound_blahblah",
subprocess.Popen, ["notfound_blahblah"])
@unittest.skipIf(mswindows, "path not displayed in Windows message")
def test_path_in_executable_not_found_message(self):
# Check that the error message displays the executable argument (and
# not args[0]) when the executable argument is not found
# (issue #16114).
# We call sys.exit() inside the code to prevent the test runner
# from hanging if the test fails and finds python.
self.assertRaisesRegex(FileNotFoundError, "notfound_blahblah",
subprocess.Popen, [sys.executable, "-c",
"import sys; sys.exit(47)"],
executable="notfound_blahblah")
self.assertRaisesRegex(FileNotFoundError, "exenotfound_blahblah",
subprocess.Popen, ["argnotfound_blahblah"],
executable="exenotfound_blahblah")
# For use in the test_cwd* tests below. # For use in the test_cwd* tests below.
def _normalize_cwd(self, cwd): def _normalize_cwd(self, cwd):
# Normalize an expected cwd (for Tru64 support). # Normalize an expected cwd (for Tru64 support).

View File

@ -291,8 +291,7 @@ class TestLoader(object):
# tests loaded from package file # tests loaded from package file
yield tests yield tests
# recurse into the package # recurse into the package
for test in self._find_tests(full_path, pattern): yield from self._find_tests(full_path, pattern)
yield test
else: else:
try: try:
yield load_tests(self, tests, pattern) yield load_tests(self, tests, pattern)