Merged revisions 61913,61915-61916,61918-61919,61922-61926,61928-61929,61931,61935,61938,61943 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r61913 | benjamin.peterson | 2008-03-25 22:14:42 +0100 (Tue, 25 Mar 2008) | 2 lines

  Merged the ACKS from py3k
........
  r61915 | thomas.heller | 2008-03-25 22:18:39 +0100 (Tue, 25 Mar 2008) | 1 line

  Make _ctypes.c PY_SSIZE_T_CLEAN.
........
  r61916 | benjamin.peterson | 2008-03-25 22:55:50 +0100 (Tue, 25 Mar 2008) | 3 lines

  Opps! I merged the revisions, but forgot to add
  the header to ACKS
........
  r61918 | andrew.kuchling | 2008-03-26 01:16:50 +0100 (Wed, 26 Mar 2008) | 1 line

  Minor docstring typos
........
  r61919 | andrew.kuchling | 2008-03-26 01:30:02 +0100 (Wed, 26 Mar 2008) | 1 line

  Add various items
........
  r61922 | neal.norwitz | 2008-03-26 05:55:51 +0100 (Wed, 26 Mar 2008) | 6 lines

  Try to get this test to be less flaky.  It was failing sometimes because
  the connect would succeed before the timeout occurred.  Try using an
  address and port that hopefully doesn't exist to ensure we get no response.
  If this doesn't work, we can use a public address close to python.org
  and hopefully that address never gets taken.
........
  r61923 | jerry.seutter | 2008-03-26 06:03:03 +0100 (Wed, 26 Mar 2008) | 1 line

  Changed test so it no longer runs as a side effect of importing.
........
  r61924 | neal.norwitz | 2008-03-26 06:19:41 +0100 (Wed, 26 Mar 2008) | 5 lines

  Ensure that the mailbox is closed to prevent problems on Windows with removing
  an open file.  This doesn't seem to be a problem in 2.6, but that appears
  to be somewhat accidental (specific to reference counting).  When this
  gets merged to 3.0, it will make the 3.0 code simpler.
........
  r61925 | jerry.seutter | 2008-03-26 06:32:51 +0100 (Wed, 26 Mar 2008) | 1 line

  Changed test so it no longer runs as a side effect of importing.
........
  r61926 | jerry.seutter | 2008-03-26 06:58:14 +0100 (Wed, 26 Mar 2008) | 1 line

  Changed test so it no longer runs as a side effect of importing.
........
  r61928 | georg.brandl | 2008-03-26 10:04:36 +0100 (Wed, 26 Mar 2008) | 2 lines

  Add Josiah.
........
  r61929 | georg.brandl | 2008-03-26 10:32:46 +0100 (Wed, 26 Mar 2008) | 2 lines

  Add an example for an RFC 822 continuation.
........
  r61931 | benjamin.peterson | 2008-03-26 12:57:47 +0100 (Wed, 26 Mar 2008) | 2 lines

  Added help options to PDB
........
  r61935 | christian.heimes | 2008-03-26 13:32:49 +0100 (Wed, 26 Mar 2008) | 1 line

  Prepare integration of bytearray backport branch
........
  r61938 | christian.heimes | 2008-03-26 13:50:43 +0100 (Wed, 26 Mar 2008) | 3 lines

  Removed merge tracking for "svnmerge" for
  svn+ssh://pythondev@svn.python.org/python/branches/trunk-bytearray
........
  r61943 | georg.brandl | 2008-03-26 13:57:47 +0100 (Wed, 26 Mar 2008) | 2 lines

  Fix and simplify error handling, silencing a compiler warning.
........
This commit is contained in:
Christian Heimes 2008-03-26 13:45:42 +00:00
parent 41be953df0
commit f6cd967e2c
12 changed files with 514 additions and 408 deletions

View file

@ -29,18 +29,20 @@ easily.
The configuration file consists of sections, led by a ``[section]`` header and The configuration file consists of sections, led by a ``[section]`` header and
followed by ``name: value`` entries, with continuations in the style of followed by ``name: value`` entries, with continuations in the style of
:rfc:`822`; ``name=value`` is also accepted. Note that leading whitespace is :rfc:`822` (see section 3.1.1, "LONG HEADER FIELDS"); ``name=value`` is also
removed from values. The optional values can contain format strings which refer accepted. Note that leading whitespace is removed from values. The optional
to other values in the same section, or values in a special ``DEFAULT`` section. values can contain format strings which refer to other values in the same
Additional defaults can be provided on initialization and retrieval. Lines section, or values in a special ``DEFAULT`` section. Additional defaults can be
beginning with ``'#'`` or ``';'`` are ignored and may be used to provide provided on initialization and retrieval. Lines beginning with ``'#'`` or
comments. ``';'`` are ignored and may be used to provide comments.
For example:: For example::
[My Section] [My Section]
foodir: %(dir)s/whatever foodir: %(dir)s/whatever
dir=frob dir=frob
long: this value continues
in the next line
would resolve the ``%(dir)s`` to the value of ``dir`` (``frob`` in this case). would resolve the ``%(dir)s`` to the value of ``dir`` (``frob`` in this case).
All reference expansions are done on demand. All reference expansions are done on demand.

View file

@ -555,10 +555,11 @@ adding a colon followed by a format specifier. For example::
Format specifiers can reference other fields through nesting:: Format specifiers can reference other fields through nesting::
fmt = '{0:{1}}' fmt = '{0:{1}}'
fmt.format('Invoice #1234', width) ->
'Invoice #1234 '
fmt.format('Invoice #1234', 15) -> fmt.format('Invoice #1234', 15) ->
'Invoice #1234 ' 'Invoice #1234 '
width = 35
fmt.format('Invoice #1234', width) ->
'Invoice #1234 '
The alignment of a field within the desired width can be specified: The alignment of a field within the desired width can be specified:
@ -571,11 +572,38 @@ Character Effect
= (For numeric types only) Pad after the sign. = (For numeric types only) Pad after the sign.
================ ============================================ ================ ============================================
Format data types:: Format specifiers can also include a presentation type, which
controls how the value is formatted. For example, floating-point numbers
can be formatted as a general number or in exponential notation:
... XXX take table from PEP 3101 >>> '{0:g}'.format(3.75)
'3.75'
>>> '{0:e}'.format(3.75)
'3.750000e+00'
Classes and types can define a __format__ method to control how it's A variety of presentation types are available. Consult the 2.6
documentation for a complete list (XXX add link, once it's in the 2.6
docs), but here's a sample::
'b' - Binary. Outputs the number in base 2.
'c' - Character. Converts the integer to the corresponding
Unicode character before printing.
'd' - Decimal Integer. Outputs the number in base 10.
'o' - Octal format. Outputs the number in base 8.
'x' - Hex format. Outputs the number in base 16, using lower-
case letters for the digits above 9.
'e' - Exponent notation. Prints the number in scientific
notation using the letter 'e' to indicate the exponent.
'g' - General format. This prints the number as a fixed-point
number, unless the number is too large, in which case
it switches to 'e' exponent notation.
'n' - Number. This is the same as 'g', except that it uses the
current locale setting to insert the appropriate
number separator characters.
'%' - Percentage. Multiplies the number by 100 and displays
in fixed ('f') format, followed by a percent sign.
Classes and types can define a __format__ method to control how they're
formatted. It receives a single argument, the format specifier:: formatted. It receives a single argument, the format specifier::
def __format__(self, format_spec): def __format__(self, format_spec):
@ -610,7 +638,6 @@ function from somewhere else.
Python 2.6 has a ``__future__`` import that removes ``print`` as language Python 2.6 has a ``__future__`` import that removes ``print`` as language
syntax, letting you use the functional form instead. For example:: syntax, letting you use the functional form instead. For example::
XXX need to check
from __future__ import print_function from __future__ import print_function
print('# of entries', len(dictionary), file=sys.stderr) print('# of entries', len(dictionary), file=sys.stderr)
@ -701,6 +728,21 @@ and it also supports the ``b''`` notation.
.. ====================================================================== .. ======================================================================
.. _pep-3118:
PEP 3118: Revised Buffer Protocol
=====================================================
The buffer protocol is a C-level API that lets Python extensions
XXX
.. seealso::
:pep:`3118` - Revising the buffer protocol
PEP written by Travis Oliphant and Carl Banks.
.. ======================================================================
.. _pep-3119: .. _pep-3119:
PEP 3119: Abstract Base Classes PEP 3119: Abstract Base Classes
@ -1082,7 +1124,7 @@ Optimizations
by using pymalloc for the Unicode string's data. by using pymalloc for the Unicode string's data.
* The ``with`` statement now stores the :meth:`__exit__` method on the stack, * The ``with`` statement now stores the :meth:`__exit__` method on the stack,
producing a small speedup. (Implemented by Nick Coghlan.) producing a small speedup. (Implemented by Jeffrey Yasskin.)
* To reduce memory usage, the garbage collector will now clear internal * To reduce memory usage, the garbage collector will now clear internal
free lists when garbage-collecting the highest generation of objects. free lists when garbage-collecting the highest generation of objects.
@ -1361,10 +1403,8 @@ complete list of changes, or look through the CVS logs for all the details.
the forward search. the forward search.
(Contributed by John Lenton.) (Contributed by John Lenton.)
* The :mod:`new` module has been removed from Python 3.0. * (3.0-warning mode) The :mod:`new` module has been removed from
Importing it therefore Python 3.0. Importing it therefore triggers a warning message.
triggers a warning message when Python is running in 3.0-warning
mode.
* The :mod:`operator` module gained a * The :mod:`operator` module gained a
:func:`methodcaller` function that takes a name and an optional :func:`methodcaller` function that takes a name and an optional
@ -1483,6 +1523,14 @@ complete list of changes, or look through the CVS logs for all the details.
.. Issue 1727780 .. Issue 1727780
The new ``triangular(low, high, mode)`` function returns random
numbers following a triangular distribution. The returned values
are between *low* and *high*, not including *high* itself, and
with *mode* as the mode, the most frequently occurring value
in the distribution. (Contributed by Raymond Hettinger. XXX check)
.. Patch 1681432
* Long regular expression searches carried out by the :mod:`re` * Long regular expression searches carried out by the :mod:`re`
module will now check for signals being delivered, so especially module will now check for signals being delivered, so especially
long searches can now be interrupted. long searches can now be interrupted.
@ -1500,6 +1548,16 @@ complete list of changes, or look through the CVS logs for all the details.
.. Patch 1861 .. Patch 1861
* The :mod:`select` module now has wrapper functions
for the Linux :cfunc:`epoll` and BSD :cfunc:`kqueue` system calls.
Also, a :meth:`modify` method was added to the existing :class:`poll`
objects; ``pollobj.modify(fd, eventmask)`` takes a file descriptor
or file object and an event mask,
(Contributed by XXX.)
.. Patch 1657
* The :mod:`sets` module has been deprecated; it's better to * The :mod:`sets` module has been deprecated; it's better to
use the built-in :class:`set` and :class:`frozenset` types. use the built-in :class:`set` and :class:`frozenset` types.
@ -1948,9 +2006,8 @@ Some of the more notable changes are:
Porting to Python 2.6 Porting to Python 2.6
===================== =====================
This section lists previously described changes, and a few This section lists previously described changes and other bugfixes
esoteric bugfixes, that may require changes to your that may require changes to your code:
code:
* The :meth:`__init__` method of :class:`collections.deque` * The :meth:`__init__` method of :class:`collections.deque`
now clears any existing contents of the deque now clears any existing contents of the deque
@ -1986,7 +2043,11 @@ code:
.. Issue 1330538 .. Issue 1330538
* In 3.0-warning mode, inequality comparisons between two dictionaries * (3.0-warning mode) The :class:`Exception` class now warns
when accessed using slicing or index access; having
:class:`Exception` behave like a tuple is being phased out.
* (3.0-warning mode) inequality comparisons between two dictionaries
or two objects that don't implement comparison methods are reported or two objects that don't implement comparison methods are reported
as warnings. ``dict1 == dict2`` still works, but ``dict1 < dict2`` as warnings. ``dict1 == dict2`` still works, but ``dict1 < dict2``
is being phased out. is being phased out.

View file

@ -1233,7 +1233,7 @@ def help():
print('along the Python search path') print('along the Python search path')
def main(): def main():
if not sys.argv[1:]: if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
print("usage: pdb.py scriptfile [arg] ...") print("usage: pdb.py scriptfile [arg] ...")
sys.exit(2) sys.exit(2)

View file

@ -1,7 +1,9 @@
from test.test_support import verbose, TestFailed from test.test_support import verbose, TestFailed
import sys import sys
from test.test_support import MAX_Py_ssize_t import test.test_support as test_support
maxsize = MAX_Py_ssize_t import unittest
maxsize = test_support.MAX_Py_ssize_t
# test string formatting operator (I am not sure if this is being tested # test string formatting operator (I am not sure if this is being tested
# elsewhere but, surely, some of the given cases are *not* tested because # elsewhere but, surely, some of the given cases are *not* tested because
@ -33,7 +35,9 @@ def testformat(formatstr, args, output=None, limit=None):
elif output and limit is None and result != output: elif output and limit is None and result != output:
if verbose: if verbose:
print('no') print('no')
print("%r %% %r == %r != %r" %\ #print("%r %% %r == %r != %r" %\
# (formatstr, args, result, output))
raise AssertionError("%r %% %r == %r != %r" %
(formatstr, args, result, output)) (formatstr, args, result, output))
# when 'limit' is specified, it determines how many characters # when 'limit' is specified, it determines how many characters
# must match exactly; lengths must always match. # must match exactly; lengths must always match.
@ -50,169 +54,172 @@ def testformat(formatstr, args, output=None, limit=None):
if verbose: if verbose:
print('yes') print('yes')
testformat("%.1d", (1,), "1")
testformat("%.*d", (sys.maxsize,1)) # expect overflow
testformat("%.100d", (1,), '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001')
testformat("%#.117x", (1,), '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001')
testformat("%#.118x", (1,), '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001')
testformat("%f", (1.0,), "1.000000") class FormatTest(unittest.TestCase):
# these are trying to test the limits of the internal magic-number-length def test_format(self):
# formatting buffer, if that number changes then these tests are less testformat("%.1d", (1,), "1")
# effective testformat("%.*d", (sys.maxsize,1)) # expect overflow
testformat("%#.*g", (109, -1.e+49/3.)) testformat("%.100d", (1,), '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001')
testformat("%#.*g", (110, -1.e+49/3.)) testformat("%#.117x", (1,), '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001')
testformat("%#.*g", (110, -1.e+100/3.)) testformat("%#.118x", (1,), '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001')
# test some ridiculously large precision, expect overflow testformat("%f", (1.0,), "1.000000")
testformat('%12.*f', (123456, 1.0)) # these are trying to test the limits of the internal magic-number-length
# formatting buffer, if that number changes then these tests are less
# check for internal overflow validation on length of precision # effective
overflowrequired = 1 testformat("%#.*g", (109, -1.e+49/3.))
testformat("%#.*g", (110, -1.e+100/3.)) testformat("%#.*g", (110, -1.e+49/3.))
testformat("%#.*G", (110, -1.e+100/3.)) testformat("%#.*g", (110, -1.e+100/3.))
testformat("%#.*f", (110, -1.e+100/3.)) # test some ridiculously large precision, expect overflow
testformat("%#.*F", (110, -1.e+100/3.)) testformat('%12.*f', (123456, 1.0))
overflowrequired = 0 # check for internal overflow validation on length of precision
overflowrequired = 1
# Formatting of long integers. Overflow is not ok testformat("%#.*g", (110, -1.e+100/3.))
overflowok = 0 testformat("%#.*G", (110, -1.e+100/3.))
testformat("%x", 10, "a") testformat("%#.*f", (110, -1.e+100/3.))
testformat("%x", 100000000000, "174876e800") testformat("%#.*F", (110, -1.e+100/3.))
testformat("%o", 10, "12") overflowrequired = 0
testformat("%o", 100000000000, "1351035564000") # Formatting of integers. Overflow is not ok
testformat("%d", 10, "10") overflowok = 0
testformat("%d", 100000000000, "100000000000") testformat("%x", 10, "a")
testformat("%x", 100000000000, "174876e800")
big = 123456789012345678901234567890 testformat("%o", 10, "12")
testformat("%d", big, "123456789012345678901234567890") testformat("%o", 100000000000, "1351035564000")
testformat("%d", -big, "-123456789012345678901234567890") testformat("%d", 10, "10")
testformat("%5d", -big, "-123456789012345678901234567890") testformat("%d", 100000000000, "100000000000")
testformat("%31d", -big, "-123456789012345678901234567890") big = 123456789012345678901234567890
testformat("%32d", -big, " -123456789012345678901234567890") testformat("%d", big, "123456789012345678901234567890")
testformat("%-32d", -big, "-123456789012345678901234567890 ") testformat("%d", -big, "-123456789012345678901234567890")
testformat("%032d", -big, "-0123456789012345678901234567890") testformat("%5d", -big, "-123456789012345678901234567890")
testformat("%-032d", -big, "-123456789012345678901234567890 ") testformat("%31d", -big, "-123456789012345678901234567890")
testformat("%034d", -big, "-000123456789012345678901234567890") testformat("%32d", -big, " -123456789012345678901234567890")
testformat("%034d", big, "0000123456789012345678901234567890") testformat("%-32d", -big, "-123456789012345678901234567890 ")
testformat("%0+34d", big, "+000123456789012345678901234567890") testformat("%032d", -big, "-0123456789012345678901234567890")
testformat("%+34d", big, " +123456789012345678901234567890") testformat("%-032d", -big, "-123456789012345678901234567890 ")
testformat("%34d", big, " 123456789012345678901234567890") testformat("%034d", -big, "-000123456789012345678901234567890")
testformat("%.2d", big, "123456789012345678901234567890") testformat("%034d", big, "0000123456789012345678901234567890")
testformat("%.30d", big, "123456789012345678901234567890") testformat("%0+34d", big, "+000123456789012345678901234567890")
testformat("%.31d", big, "0123456789012345678901234567890") testformat("%+34d", big, " +123456789012345678901234567890")
testformat("%32.31d", big, " 0123456789012345678901234567890") testformat("%34d", big, " 123456789012345678901234567890")
testformat("%d", float(big), "123456________________________", 6) testformat("%.2d", big, "123456789012345678901234567890")
testformat("%.30d", big, "123456789012345678901234567890")
big = 0x1234567890abcdef12345 # 21 hex digits testformat("%.31d", big, "0123456789012345678901234567890")
testformat("%x", big, "1234567890abcdef12345") testformat("%32.31d", big, " 0123456789012345678901234567890")
testformat("%x", -big, "-1234567890abcdef12345") testformat("%d", float(big), "123456________________________", 6)
testformat("%5x", -big, "-1234567890abcdef12345") big = 0x1234567890abcdef12345 # 21 hex digits
testformat("%22x", -big, "-1234567890abcdef12345") testformat("%x", big, "1234567890abcdef12345")
testformat("%23x", -big, " -1234567890abcdef12345") testformat("%x", -big, "-1234567890abcdef12345")
testformat("%-23x", -big, "-1234567890abcdef12345 ") testformat("%5x", -big, "-1234567890abcdef12345")
testformat("%023x", -big, "-01234567890abcdef12345") testformat("%22x", -big, "-1234567890abcdef12345")
testformat("%-023x", -big, "-1234567890abcdef12345 ") testformat("%23x", -big, " -1234567890abcdef12345")
testformat("%025x", -big, "-0001234567890abcdef12345") testformat("%-23x", -big, "-1234567890abcdef12345 ")
testformat("%025x", big, "00001234567890abcdef12345") testformat("%023x", -big, "-01234567890abcdef12345")
testformat("%0+25x", big, "+0001234567890abcdef12345") testformat("%-023x", -big, "-1234567890abcdef12345 ")
testformat("%+25x", big, " +1234567890abcdef12345") testformat("%025x", -big, "-0001234567890abcdef12345")
testformat("%25x", big, " 1234567890abcdef12345") testformat("%025x", big, "00001234567890abcdef12345")
testformat("%.2x", big, "1234567890abcdef12345") testformat("%0+25x", big, "+0001234567890abcdef12345")
testformat("%.21x", big, "1234567890abcdef12345") testformat("%+25x", big, " +1234567890abcdef12345")
testformat("%.22x", big, "01234567890abcdef12345") testformat("%25x", big, " 1234567890abcdef12345")
testformat("%23.22x", big, " 01234567890abcdef12345") testformat("%.2x", big, "1234567890abcdef12345")
testformat("%-23.22x", big, "01234567890abcdef12345 ") testformat("%.21x", big, "1234567890abcdef12345")
testformat("%X", big, "1234567890ABCDEF12345") testformat("%.22x", big, "01234567890abcdef12345")
testformat("%#X", big, "0X1234567890ABCDEF12345") testformat("%23.22x", big, " 01234567890abcdef12345")
testformat("%#x", big, "0x1234567890abcdef12345") testformat("%-23.22x", big, "01234567890abcdef12345 ")
testformat("%#x", -big, "-0x1234567890abcdef12345") testformat("%X", big, "1234567890ABCDEF12345")
testformat("%#.23x", -big, "-0x001234567890abcdef12345") testformat("%#X", big, "0X1234567890ABCDEF12345")
testformat("%#+.23x", big, "+0x001234567890abcdef12345") testformat("%#x", big, "0x1234567890abcdef12345")
testformat("%# .23x", big, " 0x001234567890abcdef12345") testformat("%#x", -big, "-0x1234567890abcdef12345")
testformat("%#+.23X", big, "+0X001234567890ABCDEF12345") testformat("%#.23x", -big, "-0x001234567890abcdef12345")
testformat("%#-+.23X", big, "+0X001234567890ABCDEF12345") testformat("%#+.23x", big, "+0x001234567890abcdef12345")
testformat("%#-+26.23X", big, "+0X001234567890ABCDEF12345") testformat("%# .23x", big, " 0x001234567890abcdef12345")
testformat("%#-+27.23X", big, "+0X001234567890ABCDEF12345 ") testformat("%#+.23X", big, "+0X001234567890ABCDEF12345")
testformat("%#+27.23X", big, " +0X001234567890ABCDEF12345") testformat("%#-+.23X", big, "+0X001234567890ABCDEF12345")
# next one gets two leading zeroes from precision, and another from the testformat("%#-+26.23X", big, "+0X001234567890ABCDEF12345")
# 0 flag and the width testformat("%#-+27.23X", big, "+0X001234567890ABCDEF12345 ")
testformat("%#+027.23X", big, "+0X0001234567890ABCDEF12345") testformat("%#+27.23X", big, " +0X001234567890ABCDEF12345")
# same, except no 0 flag # next one gets two leading zeroes from precision, and another from the
testformat("%#+27.23X", big, " +0X001234567890ABCDEF12345") # 0 flag and the width
testformat("%x", float(big), "123456_______________", 6) testformat("%#+027.23X", big, "+0X0001234567890ABCDEF12345")
# same, except no 0 flag
big = 0o12345670123456701234567012345670 # 32 octal digits testformat("%#+27.23X", big, " +0X001234567890ABCDEF12345")
testformat("%o", big, "12345670123456701234567012345670") testformat("%x", float(big), "123456_______________", 6)
testformat("%o", -big, "-12345670123456701234567012345670") big = 0o12345670123456701234567012345670 # 32 octal digits
testformat("%5o", -big, "-12345670123456701234567012345670") testformat("%o", big, "12345670123456701234567012345670")
testformat("%33o", -big, "-12345670123456701234567012345670") testformat("%o", -big, "-12345670123456701234567012345670")
testformat("%34o", -big, " -12345670123456701234567012345670") testformat("%5o", -big, "-12345670123456701234567012345670")
testformat("%-34o", -big, "-12345670123456701234567012345670 ") testformat("%33o", -big, "-12345670123456701234567012345670")
testformat("%034o", -big, "-012345670123456701234567012345670") testformat("%34o", -big, " -12345670123456701234567012345670")
testformat("%-034o", -big, "-12345670123456701234567012345670 ") testformat("%-34o", -big, "-12345670123456701234567012345670 ")
testformat("%036o", -big, "-00012345670123456701234567012345670") testformat("%034o", -big, "-012345670123456701234567012345670")
testformat("%036o", big, "000012345670123456701234567012345670") testformat("%-034o", -big, "-12345670123456701234567012345670 ")
testformat("%0+36o", big, "+00012345670123456701234567012345670") testformat("%036o", -big, "-00012345670123456701234567012345670")
testformat("%+36o", big, " +12345670123456701234567012345670") testformat("%036o", big, "000012345670123456701234567012345670")
testformat("%36o", big, " 12345670123456701234567012345670") testformat("%0+36o", big, "+00012345670123456701234567012345670")
testformat("%.2o", big, "12345670123456701234567012345670") testformat("%+36o", big, " +12345670123456701234567012345670")
testformat("%.32o", big, "12345670123456701234567012345670") testformat("%36o", big, " 12345670123456701234567012345670")
testformat("%.33o", big, "012345670123456701234567012345670") testformat("%.2o", big, "12345670123456701234567012345670")
testformat("%34.33o", big, " 012345670123456701234567012345670") testformat("%.32o", big, "12345670123456701234567012345670")
testformat("%-34.33o", big, "012345670123456701234567012345670 ") testformat("%.33o", big, "012345670123456701234567012345670")
testformat("%o", big, "12345670123456701234567012345670") testformat("%34.33o", big, " 012345670123456701234567012345670")
testformat("%#o", big, "0o12345670123456701234567012345670") testformat("%-34.33o", big, "012345670123456701234567012345670 ")
testformat("%#o", -big, "-0o12345670123456701234567012345670") testformat("%o", big, "12345670123456701234567012345670")
testformat("%#.34o", -big, "-0o0012345670123456701234567012345670") testformat("%#o", big, "0o12345670123456701234567012345670")
testformat("%#+.34o", big, "+0o0012345670123456701234567012345670") testformat("%#o", -big, "-0o12345670123456701234567012345670")
testformat("%# .34o", big, " 0o0012345670123456701234567012345670") testformat("%#.34o", -big, "-0o0012345670123456701234567012345670")
testformat("%#-+.34o", big, "+0o0012345670123456701234567012345670") testformat("%#+.34o", big, "+0o0012345670123456701234567012345670")
testformat("%#-+39.34o", big, "+0o0012345670123456701234567012345670 ") testformat("%# .34o", big, " 0o0012345670123456701234567012345670")
testformat("%#+39.34o", big, " +0o0012345670123456701234567012345670") testformat("%#+.34o", big, "+0o0012345670123456701234567012345670")
# next one gets one leading zero from precision testformat("%#-+.34o", big, "+0o0012345670123456701234567012345670")
testformat("%.33o", big, "012345670123456701234567012345670") testformat("%#-+37.34o", big, "+0o0012345670123456701234567012345670")
# one leading zero from precision testformat("%#+37.34o", big, "+0o0012345670123456701234567012345670")
testformat("%#.33o", big, "0o012345670123456701234567012345670") # next one gets one leading zero from precision
# leading zero vanishes testformat("%.33o", big, "012345670123456701234567012345670")
testformat("%#.32o", big, "0o12345670123456701234567012345670") # base marker shouldn't change that, since "0" is redundant
# one leading zero from precision, and another from '0' flag & width testformat("%#.33o", big, "0o012345670123456701234567012345670")
testformat("%034.33o", big, "0012345670123456701234567012345670") # but reduce precision, and base marker should add a zero
# max width includes base marker; padding zeroes come after marker testformat("%#.32o", big, "0o12345670123456701234567012345670")
testformat("%0#38.33o", big, "0o000012345670123456701234567012345670") # one leading zero from precision, and another from "0" flag & width
# padding spaces come before marker testformat("%034.33o", big, "0012345670123456701234567012345670")
testformat("%#36.33o", big, " 0o012345670123456701234567012345670") # base marker shouldn't change that
testformat("%o", float(big), "123456__________________________", 6) testformat("%0#34.33o", big, "0o012345670123456701234567012345670")
testformat("%o", float(big), "123456__________________________", 6)
# Some small ints, in both Python int and long flavors). # Some small ints, in both Python int and flavors).
testformat("%d", 42, "42") testformat("%d", 42, "42")
testformat("%d", -42, "-42") testformat("%d", -42, "-42")
testformat("%#x", 1, "0x1") testformat("%d", 42, "42")
testformat("%#X", 1, "0X1") testformat("%d", -42, "-42")
testformat("%#o", 1, "0o1") testformat("%d", 42.0, "42")
testformat("%#o", 1, "0o1") testformat("%#x", 1, "0x1")
testformat("%#o", 0, "0o0") testformat("%#x", 1, "0x1")
testformat("%#o", 0, "0o0") testformat("%#X", 1, "0X1")
testformat("%o", 0, "0") testformat("%#X", 1, "0X1")
testformat("%d", 0, "0") testformat("%#x", 1.0, "0x1")
testformat("%#x", 0, "0x0") testformat("%#o", 1, "0o1")
testformat("%#X", 0, "0X0") testformat("%#o", 1, "0o1")
testformat("%#o", 0, "0o0")
testformat("%x", 0x42, "42") testformat("%#o", 0, "0o0")
testformat("%x", -0x42, "-42") testformat("%o", 0, "0")
testformat("%x", float(0x42), "42") testformat("%o", 0, "0")
testformat("%d", 0, "0")
testformat("%o", 0o42, "42") testformat("%d", 0, "0")
testformat("%o", -0o42, "-42") testformat("%#x", 0, "0x0")
testformat("%o", 0o42, "42") testformat("%#x", 0, "0x0")
testformat("%o", -0o42, "-42") testformat("%#X", 0, "0X0")
testformat("%o", float(0o42), "42") testformat("%#X", 0, "0X0")
testformat("%x", 0x42, "42")
# Test exception for unknown format characters testformat("%x", -0x42, "-42")
if verbose: testformat("%x", 0x42, "42")
testformat("%x", -0x42, "-42")
testformat("%x", float(0x42), "42")
testformat("%o", 0o42, "42")
testformat("%o", -0o42, "-42")
testformat("%o", 0o42, "42")
testformat("%o", -0o42, "-42")
testformat("%o", float(0o42), "42")
# Test exception for unknown format characters
if verbose:
print('Testing exceptions') print('Testing exceptions')
def test_exc(formatstr, args, exception, excmsg):
def test_exc(formatstr, args, exception, excmsg):
try: try:
testformat(formatstr, args) testformat(formatstr, args)
except exception as exc: except exception as exc:
@ -228,25 +235,18 @@ def test_exc(formatstr, args, exception, excmsg):
raise raise
else: else:
raise TestFailed('did not get expected exception: %s' % excmsg) raise TestFailed('did not get expected exception: %s' % excmsg)
test_exc('abc %a', 1, ValueError,
test_exc('abc %a', 1, ValueError,
"unsupported format character 'a' (0x61) at index 5") "unsupported format character 'a' (0x61) at index 5")
test_exc(str(b'abc %\u3000', 'raw-unicode-escape'), 1, ValueError, #test_exc(unicode('abc %\u3000','raw-unicode-escape'), 1, ValueError,
"unsupported format character '?' (0x3000) at index 5") # "unsupported format character '?' (0x3000) at index 5")
test_exc('%d', '1', TypeError, "%d format: a number is required, not str")
#test_exc('%d', '1', TypeError, "an integer is required") test_exc('%g', '1', TypeError, "a float is required")
test_exc('%d', '1', TypeError, '%d format: a number is required, not str') test_exc('no format', '1', TypeError,
test_exc('%g', '1', TypeError, "a float is required")
test_exc('no format', '1', TypeError,
"not all arguments converted during string formatting") "not all arguments converted during string formatting")
test_exc('no format', '1', TypeError, test_exc('no format', '1', TypeError,
"not all arguments converted during string formatting")
test_exc('no format', '1', TypeError,
"not all arguments converted during string formatting")
test_exc('no format', '1', TypeError,
"not all arguments converted during string formatting") "not all arguments converted during string formatting")
if maxsize == 2**31-1: if maxsize == 2**31-1:
# crashes 2.2.1 and earlier: # crashes 2.2.1 and earlier:
try: try:
"%*d"%(maxsize, -127) "%*d"%(maxsize, -127)
@ -254,3 +254,10 @@ if maxsize == 2**31-1:
pass pass
else: else:
raise TestFailed('"%*d"%(maxsize, -127) should fail') raise TestFailed('"%*d"%(maxsize, -127) should fail')
def test_main():
test_support.run_unittest(FormatTest)
if __name__ == "__main__":
unittest.main()

View file

@ -1,12 +1,25 @@
import imaplib import imaplib
import time import time
# We can check only that it successfully produces a result, from test import test_support
# not the correctness of the result itself, since the result import unittest
# depends on the timezone the machine is in.
timevalues = [2000000000, 2000000000.0, time.localtime(2000000000),
class TestImaplib(unittest.TestCase):
def test_that_Time2Internaldate_returns_a_result(self):
# We can check only that it successfully produces a result,
# not the correctness of the result itself, since the result
# depends on the timezone the machine is in.
timevalues = [2000000000, 2000000000.0, time.localtime(2000000000),
'"18-May-2033 05:33:20 +0200"'] '"18-May-2033 05:33:20 +0200"']
for t in timevalues: for t in timevalues:
imaplib.Time2Internaldate(t) imaplib.Time2Internaldate(t)
def test_main():
test_support.run_unittest(TestImaplib)
if __name__ == "__main__":
unittest.main()

View file

@ -374,7 +374,7 @@ class TestMailbox(TestBase):
def test_flush(self): def test_flush(self):
# Write changes to disk # Write changes to disk
self._test_flush_or_close(self._box.flush) self._test_flush_or_close(self._box.flush, True)
def test_lock_unlock(self): def test_lock_unlock(self):
# Lock and unlock the mailbox # Lock and unlock the mailbox
@ -386,15 +386,17 @@ class TestMailbox(TestBase):
def test_close(self): def test_close(self):
# Close mailbox and flush changes to disk # Close mailbox and flush changes to disk
self._test_flush_or_close(self._box.close) self._test_flush_or_close(self._box.close, False)
def _test_flush_or_close(self, method): def _test_flush_or_close(self, method, should_call_close):
contents = [self._template % i for i in range(3)] contents = [self._template % i for i in range(3)]
self._box.add(contents[0]) self._box.add(contents[0])
self._box.add(contents[1]) self._box.add(contents[1])
self._box.add(contents[2]) self._box.add(contents[2])
oldbox = self._box oldbox = self._box
method() method()
if should_call_close:
self._box.close()
self._box = self._factory(self._path) self._box = self._factory(self._path)
keys = self._box.keys() keys = self._box.keys()
self.assertEqual(len(keys), 3) self.assertEqual(len(keys), 3)

View file

@ -1,123 +1,131 @@
import ntpath import ntpath
from test.test_support import verbose, TestFailed
import os import os
from test.test_support import verbose, TestFailed
import test.test_support as test_support
import unittest
errors = 0
def tester(fn, wantResult): def tester(fn, wantResult):
global errors
fn = fn.replace("\\", "\\\\") fn = fn.replace("\\", "\\\\")
gotResult = eval(fn) gotResult = eval(fn)
if wantResult != gotResult: if wantResult != gotResult:
print("error!") raise TestFailed("%s should return: %s but returned: %s" \
print("evaluated: " + str(fn)) %(str(fn), str(wantResult), str(gotResult)))
print("should be: " + str(wantResult))
print(" returned: " + str(gotResult))
print("")
errors = errors + 1
tester('ntpath.splitext("foo.ext")', ('foo', '.ext'))
tester('ntpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext'))
tester('ntpath.splitext(".ext")', ('.ext', ''))
tester('ntpath.splitext("\\foo.ext\\foo")', ('\\foo.ext\\foo', ''))
tester('ntpath.splitext("foo.ext\\")', ('foo.ext\\', ''))
tester('ntpath.splitext("")', ('', ''))
tester('ntpath.splitext("foo.bar.ext")', ('foo.bar', '.ext'))
tester('ntpath.splitext("xx/foo.bar.ext")', ('xx/foo.bar', '.ext'))
tester('ntpath.splitext("xx\\foo.bar.ext")', ('xx\\foo.bar', '.ext'))
tester('ntpath.splitext("c:a/b\\c.d")', ('c:a/b\\c', '.d'))
tester('ntpath.splitdrive("c:\\foo\\bar")', class TestNtpath(unittest.TestCase):
def test_splitext(self):
tester('ntpath.splitext("foo.ext")', ('foo', '.ext'))
tester('ntpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext'))
tester('ntpath.splitext(".ext")', ('.ext', ''))
tester('ntpath.splitext("\\foo.ext\\foo")', ('\\foo.ext\\foo', ''))
tester('ntpath.splitext("foo.ext\\")', ('foo.ext\\', ''))
tester('ntpath.splitext("")', ('', ''))
tester('ntpath.splitext("foo.bar.ext")', ('foo.bar', '.ext'))
tester('ntpath.splitext("xx/foo.bar.ext")', ('xx/foo.bar', '.ext'))
tester('ntpath.splitext("xx\\foo.bar.ext")', ('xx\\foo.bar', '.ext'))
tester('ntpath.splitext("c:a/b\\c.d")', ('c:a/b\\c', '.d'))
def test_splitdrive(self):
tester('ntpath.splitdrive("c:\\foo\\bar")',
('c:', '\\foo\\bar')) ('c:', '\\foo\\bar'))
tester('ntpath.splitunc("\\\\conky\\mountpoint\\foo\\bar")', tester('ntpath.splitdrive("c:/foo/bar")',
('\\\\conky\\mountpoint', '\\foo\\bar'))
tester('ntpath.splitdrive("c:/foo/bar")',
('c:', '/foo/bar')) ('c:', '/foo/bar'))
tester('ntpath.splitunc("//conky/mountpoint/foo/bar")',
def test_splitunc(self):
tester('ntpath.splitunc("\\\\conky\\mountpoint\\foo\\bar")',
('\\\\conky\\mountpoint', '\\foo\\bar'))
tester('ntpath.splitunc("//conky/mountpoint/foo/bar")',
('//conky/mountpoint', '/foo/bar')) ('//conky/mountpoint', '/foo/bar'))
tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar')) def test_split(self):
tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")', tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar'))
tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")',
('\\\\conky\\mountpoint\\foo', 'bar')) ('\\\\conky\\mountpoint\\foo', 'bar'))
tester('ntpath.split("c:\\")', ('c:\\', '')) tester('ntpath.split("c:\\")', ('c:\\', ''))
tester('ntpath.split("\\\\conky\\mountpoint\\")', tester('ntpath.split("\\\\conky\\mountpoint\\")',
('\\\\conky\\mountpoint', '')) ('\\\\conky\\mountpoint', ''))
tester('ntpath.split("c:/")', ('c:/', '')) tester('ntpath.split("c:/")', ('c:/', ''))
tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint', '')) tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint', ''))
tester('ntpath.isabs("c:\\")', 1) def test_isabs(self):
tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1) tester('ntpath.isabs("c:\\")', 1)
tester('ntpath.isabs("\\foo")', 1) tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1)
tester('ntpath.isabs("\\foo\\bar")', 1) tester('ntpath.isabs("\\foo")', 1)
tester('ntpath.isabs("\\foo\\bar")', 1)
tester('ntpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"])', def test_commonprefix(self):
tester('ntpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"])',
"/home/swen") "/home/swen")
tester('ntpath.commonprefix(["\\home\\swen\\spam", "\\home\\swen\\eggs"])', tester('ntpath.commonprefix(["\\home\\swen\\spam", "\\home\\swen\\eggs"])',
"\\home\\swen\\") "\\home\\swen\\")
tester('ntpath.commonprefix(["/home/swen/spam", "/home/swen/spam"])', tester('ntpath.commonprefix(["/home/swen/spam", "/home/swen/spam"])',
"/home/swen/spam") "/home/swen/spam")
tester('ntpath.join("")', '') def test_join(self):
tester('ntpath.join("", "", "")', '') tester('ntpath.join("")', '')
tester('ntpath.join("a")', 'a') tester('ntpath.join("", "", "")', '')
tester('ntpath.join("/a")', '/a') tester('ntpath.join("a")', 'a')
tester('ntpath.join("\\a")', '\\a') tester('ntpath.join("/a")', '/a')
tester('ntpath.join("a:")', 'a:') tester('ntpath.join("\\a")', '\\a')
tester('ntpath.join("a:", "b")', 'a:b') tester('ntpath.join("a:")', 'a:')
tester('ntpath.join("a:", "/b")', 'a:/b') tester('ntpath.join("a:", "b")', 'a:b')
tester('ntpath.join("a:", "\\b")', 'a:\\b') tester('ntpath.join("a:", "/b")', 'a:/b')
tester('ntpath.join("a", "/b")', '/b') tester('ntpath.join("a:", "\\b")', 'a:\\b')
tester('ntpath.join("a", "\\b")', '\\b') tester('ntpath.join("a", "/b")', '/b')
tester('ntpath.join("a", "b", "c")', 'a\\b\\c') tester('ntpath.join("a", "\\b")', '\\b')
tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c') tester('ntpath.join("a", "b", "c")', 'a\\b\\c')
tester('ntpath.join("a", "b\\", "c")', 'a\\b\\c') tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c')
tester('ntpath.join("a", "b", "\\c")', '\\c') tester('ntpath.join("a", "b\\", "c")', 'a\\b\\c')
tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep') tester('ntpath.join("a", "b", "\\c")', '\\c')
tester('ntpath.join("d:\\", "a", "b")', 'd:\\a\\b') tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep')
tester("ntpath.join('c:', '/a')", 'c:/a') tester('ntpath.join("d:\\", "a", "b")', 'd:\\a\\b')
tester("ntpath.join('c:/', '/a')", 'c:/a') tester("ntpath.join('c:', '/a')", 'c:/a')
tester("ntpath.join('c:/a', '/b')", '/b') tester("ntpath.join('c:/', '/a')", 'c:/a')
tester("ntpath.join('c:', 'd:/')", 'd:/') tester("ntpath.join('c:/a', '/b')", '/b')
tester("ntpath.join('c:/', 'd:/')", 'd:/') tester("ntpath.join('c:', 'd:/')", 'd:/')
tester("ntpath.join('c:/', 'd:/a/b')", 'd:/a/b') tester("ntpath.join('c:/', 'd:/')", 'd:/')
tester("ntpath.join('c:/', 'd:/a/b')", 'd:/a/b')
tester("ntpath.join('')", '') tester("ntpath.join('')", '')
tester("ntpath.join('', '', '', '', '')", '') tester("ntpath.join('', '', '', '', '')", '')
tester("ntpath.join('a')", 'a') tester("ntpath.join('a')", 'a')
tester("ntpath.join('', 'a')", 'a') tester("ntpath.join('', 'a')", 'a')
tester("ntpath.join('', '', '', '', 'a')", 'a') tester("ntpath.join('', '', '', '', 'a')", 'a')
tester("ntpath.join('a', '')", 'a\\') tester("ntpath.join('a', '')", 'a\\')
tester("ntpath.join('a', '', '', '', '')", 'a\\') tester("ntpath.join('a', '', '', '', '')", 'a\\')
tester("ntpath.join('a\\', '')", 'a\\') tester("ntpath.join('a\\', '')", 'a\\')
tester("ntpath.join('a\\', '', '', '', '')", 'a\\') tester("ntpath.join('a\\', '', '', '', '')", 'a\\')
tester("ntpath.normpath('A//////././//.//B')", r'A\B') def test_normpath(self):
tester("ntpath.normpath('A/./B')", r'A\B') tester("ntpath.normpath('A//////././//.//B')", r'A\B')
tester("ntpath.normpath('A/foo/../B')", r'A\B') tester("ntpath.normpath('A/./B')", r'A\B')
tester("ntpath.normpath('C:A//B')", r'C:A\B') tester("ntpath.normpath('A/foo/../B')", r'A\B')
tester("ntpath.normpath('D:A/./B')", r'D:A\B') tester("ntpath.normpath('C:A//B')", r'C:A\B')
tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B') tester("ntpath.normpath('D:A/./B')", r'D:A\B')
tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B')
tester("ntpath.normpath('C:///A//B')", r'C:\A\B') tester("ntpath.normpath('C:///A//B')", r'C:\A\B')
tester("ntpath.normpath('D:///A/./B')", r'D:\A\B') tester("ntpath.normpath('D:///A/./B')", r'D:\A\B')
tester("ntpath.normpath('e:///A/foo/../B')", r'e:\A\B') tester("ntpath.normpath('e:///A/foo/../B')", r'e:\A\B')
tester("ntpath.normpath('..')", r'..') tester("ntpath.normpath('..')", r'..')
tester("ntpath.normpath('.')", r'.') tester("ntpath.normpath('.')", r'.')
tester("ntpath.normpath('')", r'.') tester("ntpath.normpath('')", r'.')
tester("ntpath.normpath('/')", '\\') tester("ntpath.normpath('/')", '\\')
tester("ntpath.normpath('c:/')", 'c:\\') tester("ntpath.normpath('c:/')", 'c:\\')
tester("ntpath.normpath('/../.././..')", '\\') tester("ntpath.normpath('/../.././..')", '\\')
tester("ntpath.normpath('c:/../../..')", 'c:\\') tester("ntpath.normpath('c:/../../..')", 'c:\\')
tester("ntpath.normpath('../.././..')", r'..\..\..') tester("ntpath.normpath('../.././..')", r'..\..\..')
tester("ntpath.normpath('K:../.././..')", r'K:..\..\..') tester("ntpath.normpath('K:../.././..')", r'K:..\..\..')
tester("ntpath.normpath('C:////a/b')", r'C:\a\b') tester("ntpath.normpath('C:////a/b')", r'C:\a\b')
tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b') tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b')
oldenv = os.environ.copy() def test_expandvars(self):
try: oldenv = os.environ.copy()
try:
os.environ.clear() os.environ.clear()
os.environ["foo"] = "bar" os.environ["foo"] = "bar"
os.environ["{foo"] = "baz1" os.environ["{foo"] = "baz1"
@ -141,34 +149,39 @@ try:
tester('ntpath.expandvars("%?bar%")', "%?bar%") tester('ntpath.expandvars("%?bar%")', "%?bar%")
tester('ntpath.expandvars("%foo%%bar")', "bar%bar") tester('ntpath.expandvars("%foo%%bar")', "bar%bar")
tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar") tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar")
finally: finally:
os.environ.clear() os.environ.clear()
os.environ.update(oldenv) os.environ.update(oldenv)
# ntpath.abspath() can only be used on a system with the "nt" module def test_abspath(self):
# (reasonably), so we protect this test with "import nt". This allows # ntpath.abspath() can only be used on a system with the "nt" module
# the rest of the tests for the ntpath module to be run to completion # (reasonably), so we protect this test with "import nt". This allows
# on any platform, since most of the module is intended to be usable # the rest of the tests for the ntpath module to be run to completion
# from any platform. # on any platform, since most of the module is intended to be usable
try: # from any platform.
try:
import nt import nt
except ImportError: except ImportError:
pass pass
else: else:
tester('ntpath.abspath("C:\\")', "C:\\") tester('ntpath.abspath("C:\\")', "C:\\")
currentdir = os.path.split(os.getcwd())[-1] def test_relpath(self):
tester('ntpath.relpath("a")', 'a') currentdir = os.path.split(os.getcwd())[-1]
tester('ntpath.relpath(os.path.abspath("a"))', 'a') tester('ntpath.relpath("a")', 'a')
tester('ntpath.relpath("a/b")', 'a\\b') tester('ntpath.relpath(os.path.abspath("a"))', 'a')
tester('ntpath.relpath("../a/b")', '..\\a\\b') tester('ntpath.relpath("a/b")', 'a\\b')
tester('ntpath.relpath("a", "../b")', '..\\'+currentdir+'\\a') tester('ntpath.relpath("../a/b")', '..\\a\\b')
tester('ntpath.relpath("a/b", "../c")', '..\\'+currentdir+'\\a\\b') tester('ntpath.relpath("a", "../b")', '..\\'+currentdir+'\\a')
tester('ntpath.relpath("a", "b/c")', '..\\..\\a') tester('ntpath.relpath("a/b", "../c")', '..\\'+currentdir+'\\a\\b')
tester('ntpath.relpath("//conky/mountpoint/a", "//conky/mountpoint/b/c")', '..\\..\\a') tester('ntpath.relpath("a", "b/c")', '..\\..\\a')
tester('ntpath.relpath("a", "a")', '.') tester('ntpath.relpath("//conky/mountpoint/a", "//conky/mountpoint/b/c")', '..\\..\\a')
tester('ntpath.relpath("a", "a")', '.')
if errors:
raise TestFailed(str(errors) + " errors.") def test_main():
elif verbose: test_support.run_unittest(TestNtpath)
print("No errors. Thank your lucky stars.")
if __name__ == "__main__":
unittest.main()

View file

@ -107,24 +107,19 @@ class TimeoutTestCase(unittest.TestCase):
self.sock.close() self.sock.close()
def testConnectTimeout(self): def testConnectTimeout(self):
# If we are too close to www.python.org, this test will fail. # Choose a private address that is unlikely to exist to prevent
# Pick a host that should be farther away. # failures due to the connect succeeding before the timeout.
if (socket.getfqdn().split('.')[-2:] == ['python', 'org'] or # Use a dotted IP address to avoid including the DNS lookup time
socket.getfqdn().split('.')[-2:-1] == ['xs4all']):
self.addr_remote = ('tut.fi', 80)
# Lookup the IP address to avoid including the DNS lookup time
# with the connect time. This avoids failing the assertion that # with the connect time. This avoids failing the assertion that
# the timeout occurred fast enough. # the timeout occurred fast enough.
self.addr_remote = (socket.gethostbyname(self.addr_remote[0]), 80) addr = ('10.0.0.0', 12345)
# Test connect() timeout # Test connect() timeout
_timeout = 0.001 _timeout = 0.001
self.sock.settimeout(_timeout) self.sock.settimeout(_timeout)
_t1 = time.time() _t1 = time.time()
self.failUnlessRaises(socket.error, self.sock.connect, self.failUnlessRaises(socket.error, self.sock.connect, addr)
self.addr_remote)
_t2 = time.time() _t2 = time.time()
_delta = abs(_t1 - _t2) _delta = abs(_t1 - _t2)

View file

@ -1,3 +1,14 @@
Acknowledgements
----------------
This list is not complete and not in any useful order, but I would
like to thank everybody who contributed in any way, with code, hints,
bug reports, ideas, moral support, endorsement, or even complaints....
Without you I would've stopped working on Python long ago!
--Guido
PS: In the standard Python distribution this file is encoded in Latin-1.
David Abrahams David Abrahams
Jim Ahlstrom Jim Ahlstrom

View file

@ -17,6 +17,9 @@ the format to accommodate documentation needs as they arise.
Permissions History Permissions History
------------------- -------------------
- Josiah Carlson was given SVN access on 26 March 2008 by Georg Brandl,
for work on asyncore/asynchat.
- Benjamin Peterson was given SVN access on 25 March 2008 by Georg - Benjamin Peterson was given SVN access on 25 March 2008 by Georg
Brandl, for bug triage work. Brandl, for bug triage work.

View file

@ -99,6 +99,8 @@ bytes(cdata)
* *
*/ */
#define PY_SSIZE_T_CLEAN
#include "Python.h" #include "Python.h"
#include "structmember.h" #include "structmember.h"
@ -2273,7 +2275,7 @@ static PyObject *
CData_setstate(PyObject *_self, PyObject *args) CData_setstate(PyObject *_self, PyObject *args)
{ {
void *data; void *data;
int len; Py_ssize_t len;
int res; int res;
PyObject *dict, *mydict; PyObject *dict, *mydict;
CDataObject *self = (CDataObject *)_self; CDataObject *self = (CDataObject *)_self;
@ -3007,7 +3009,7 @@ CFuncPtr_FromVtblIndex(PyTypeObject *type, PyObject *args, PyObject *kwds)
char *name = NULL; char *name = NULL;
PyObject *paramflags = NULL; PyObject *paramflags = NULL;
GUID *iid = NULL; GUID *iid = NULL;
int iid_len = 0; Py_ssize_t iid_len = 0;
if (!PyArg_ParseTuple(args, "is|Oz#", &index, &name, &paramflags, &iid, &iid_len)) if (!PyArg_ParseTuple(args, "is|Oz#", &index, &name, &paramflags, &iid, &iid_len))
return NULL; return NULL;

View file

@ -409,7 +409,7 @@ poll_register(pollObject *self, PyObject *args)
PyDoc_STRVAR(poll_modify_doc, PyDoc_STRVAR(poll_modify_doc,
"modify(fd, eventmask) -> None\n\n\ "modify(fd, eventmask) -> None\n\n\
Modify an already register file descriptor.\n\ Modify an already registered file descriptor.\n\
fd -- either an integer, or an object with a fileno() method returning an\n\ fd -- either an integer, or an object with a fileno() method returning an\n\
int.\n\ int.\n\
events -- an optional bitmask describing the type of events to check for"); events -- an optional bitmask describing the type of events to check for");
@ -915,10 +915,10 @@ pyepoll_register(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
PyDoc_STRVAR(pyepoll_register_doc, PyDoc_STRVAR(pyepoll_register_doc,
"register(fd[, eventmask]) -> bool\n\ "register(fd[, eventmask]) -> bool\n\
\n\ \n\
Registers a new fd or modifies an already registered fd. register returns\n\ Registers a new fd or modifies an already registered fd. register() returns\n\
True if a new fd was registered or False if the event mask for fd was modified.\n\ True if a new fd was registered or False if the event mask for fd was modified.\n\
fd is the target file descriptor of the operation\n\ fd is the target file descriptor of the operation.\n\
events is a bit set composed of the various EPOLL constants, the default\n\ events is a bit set composed of the various EPOLL constants; the default\n\
is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\ is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\
\n\ \n\
The epoll interface supports all file descriptors that support poll."); The epoll interface supports all file descriptors that support poll.");
@ -988,6 +988,7 @@ pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
else if (dtimeout * 1000.0 > INT_MAX) { else if (dtimeout * 1000.0 > INT_MAX) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"timeout is too large"); "timeout is too large");
return NULL;
} }
else { else {
timeout = (int)(dtimeout * 1000.0); timeout = (int)(dtimeout * 1000.0);
@ -1024,19 +1025,15 @@ pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
} }
for (i = 0; i < nfds; i++) { for (i = 0; i < nfds; i++) {
etuple = Py_BuildValue("iI", evs[i].data.fd, etuple = Py_BuildValue("iI", evs[i].data.fd, evs[i].events);
evs[i].events);
if (etuple == NULL) { if (etuple == NULL) {
Py_CLEAR(elist);
goto error; goto error;
} }
PyList_SET_ITEM(elist, i, etuple); PyList_SET_ITEM(elist, i, etuple);
} }
if (0) {
error: error:
Py_CLEAR(elist);
Py_XDECREF(etuple);
}
PyMem_Free(evs); PyMem_Free(evs);
return elist; return elist;
} }
@ -1716,7 +1713,7 @@ that are ready.\n\
\n\ \n\
*** IMPORTANT NOTICE ***\n\ *** IMPORTANT NOTICE ***\n\
On Windows and OpenVMS, only sockets are supported; on Unix, all file\n\ On Windows and OpenVMS, only sockets are supported; on Unix, all file\n\
descriptors."); descriptors can be used.");
static PyMethodDef select_methods[] = { static PyMethodDef select_methods[] = {
{"select", select_select, METH_VARARGS, select_doc}, {"select", select_select, METH_VARARGS, select_doc},