summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/conf.py2
-rw-r--r--Doc/copyright.rst2
-rw-r--r--Doc/library/itertools.rst40
-rw-r--r--Doc/library/logging.rst43
-rw-r--r--Doc/license.rst2
-rw-r--r--Doc/tools/sphinxext/patchlevel.py3
-rw-r--r--Lib/bsddb/test/test_associate.py6
-rw-r--r--Lib/bsddb/test/test_basics.py5
-rw-r--r--Lib/bsddb/test/test_compare.py6
-rw-r--r--Lib/bsddb/test/test_cursor_pget_bug.py6
-rw-r--r--Lib/bsddb/test/test_dbobj.py6
-rw-r--r--Lib/bsddb/test/test_dbshelve.py6
-rw-r--r--Lib/bsddb/test/test_dbtables.py5
-rw-r--r--Lib/bsddb/test/test_env_close.py6
-rw-r--r--Lib/bsddb/test/test_join.py5
-rw-r--r--Lib/bsddb/test/test_lock.py6
-rw-r--r--Lib/bsddb/test/test_misc.py6
-rw-r--r--Lib/bsddb/test/test_pickle.py6
-rw-r--r--Lib/bsddb/test/test_recno.py6
-rw-r--r--Lib/bsddb/test/test_sequence.py5
-rw-r--r--Lib/bsddb/test/test_thread.py6
-rw-r--r--Modules/itertoolsmodule.c17
-rw-r--r--README3
23 files changed, 135 insertions, 63 deletions
diff --git a/Doc/conf.py b/Doc/conf.py
index b7903be..71bc6f7 100644
--- a/Doc/conf.py
+++ b/Doc/conf.py
@@ -87,7 +87,7 @@ html_additional_pages = {
}
# Output file base name for HTML help builder.
-htmlhelp_basename = 'pydoc'
+htmlhelp_basename = 'python' + release.replace('.', '')
# Options for LaTeX output
diff --git a/Doc/copyright.rst b/Doc/copyright.rst
index 9a472af..376b1c4 100644
--- a/Doc/copyright.rst
+++ b/Doc/copyright.rst
@@ -4,7 +4,7 @@ Copyright
Python and this documentation is:
-Copyright © 2001-2007 Python Software Foundation. All rights reserved.
+Copyright © 2001-2008 Python Software Foundation. All rights reserved.
Copyright © 2000 BeOpen.com. All rights reserved.
diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst
index 098972d..9da51aa 100644
--- a/Doc/library/itertools.rst
+++ b/Doc/library/itertools.rst
@@ -102,26 +102,24 @@ loops that truncate the stream.
Each result tuple is ordered to match the input order. So, every
combination is a subsequence of the input *iterable*.
- Example: ``combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)``
-
Equivalent to::
def combinations(iterable, r):
+ 'combinations(range(4), 3) --> (0,1,2) (0,1,3) (0,2,3) (1,2,3)'
pool = tuple(iterable)
n = len(pool)
- assert 0 <= r <= n
- vec = range(r)
- yield tuple(pool[i] for i in vec)
+ indices = range(r)
+ yield tuple(pool[i] for i in indices)
while 1:
for i in reversed(range(r)):
- if vec[i] != i + n - r:
+ if indices[i] != i + n - r:
break
else:
return
- vec[i] += 1
+ indices[i] += 1
for j in range(i+1, r):
- vec[j] = vec[j-1] + 1
- yield tuple(pool[i] for i in vec)
+ indices[j] = indices[j-1] + 1
+ yield tuple(pool[i] for i in indices)
.. versionadded:: 2.6
@@ -356,7 +354,29 @@ loops that truncate the stream.
value. So if the input elements are unique, there will be no repeat
values in each permutation.
- Example: ``permutations(range(3),2) --> (1,2) (1,3) (2,1) (2,3) (3,1) (3,2)``
+ Equivalent to::
+
+ def permutations(iterable, r=None):
+ 'permutations(range(3), 2) --> (0,1) (0,2) (1,0) (1,2) (2,0) (2,1)'
+ pool = tuple(iterable)
+ n = len(pool)
+ r = n if r is None else r
+ indices = range(n)
+ cycles = range(n-r+1, n+1)[::-1]
+ yield tuple(pool[i] for i in indices[:r])
+ while n:
+ for i in reversed(range(r)):
+ cycles[i] -= 1
+ if cycles[i] == 0:
+ indices[i:] = indices[i+1:] + indices[i:i+1]
+ cycles[i] = n - i
+ else:
+ j = cycles[i]
+ indices[i], indices[-j] = indices[-j], indices[i]
+ yield tuple(pool[i] for i in indices[:r])
+ break
+ else:
+ return
.. versionadded:: 2.6
diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst
index 7cdbbd2..a7693fb 100644
--- a/Doc/library/logging.rst
+++ b/Doc/library/logging.rst
@@ -1630,27 +1630,28 @@ timed intervals.
You can use the *when* to specify the type of *interval*. The list of possible
values is, note that they are not case sensitive:
- +----------+-----------------------+
- | Value | Type of interval |
- +==========+=======================+
- | S | Seconds |
- +----------+-----------------------+
- | M | Minutes |
- +----------+-----------------------+
- | H | Hours |
- +----------+-----------------------+
- | D | Days |
- +----------+-----------------------+
- | W | Week day (0=Monday) |
- +----------+-----------------------+
- | midnight | Roll over at midnight |
- +----------+-----------------------+
-
- If *backupCount* is non-zero, the system will save old log files by appending
- extensions to the filename. The extensions are date-and-time based, using the
- strftime format ``%Y-%m-%d_%H-%M-%S`` or a leading portion thereof, depending on
- the rollover interval. At most *backupCount* files will be kept, and if more
- would be created when rollover occurs, the oldest one is deleted.
+ +----------------+-----------------------+
+ | Value | Type of interval |
+ +================+=======================+
+ | ``'S'`` | Seconds |
+ +----------------+-----------------------+
+ | ``'M'`` | Minutes |
+ +----------------+-----------------------+
+ | ``'H'`` | Hours |
+ +----------------+-----------------------+
+ | ``'D'`` | Days |
+ +----------------+-----------------------+
+ | ``'W'`` | Week day (0=Monday) |
+ +----------------+-----------------------+
+ | ``'midnight'`` | Roll over at midnight |
+ +----------------+-----------------------+
+
+ The system will save old log files by appending extensions to the filename.
+ The extensions are date-and-time based, using the strftime format
+ ``%Y-%m-%d_%H-%M-%S`` or a leading portion thereof, depending on the rollover
+ interval. If *backupCount* is nonzero, at most *backupCount* files will be
+ kept, and if more would be created when rollover occurs, the oldest one is
+ deleted.
.. method:: TimedRotatingFileHandler.doRollover()
diff --git a/Doc/license.rst b/Doc/license.rst
index 127fc0d..6ffa65f 100644
--- a/Doc/license.rst
+++ b/Doc/license.rst
@@ -120,7 +120,7 @@ Terms and conditions for accessing or otherwise using Python
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python |release| alone or in any derivative
version, provided, however, that PSF's License Agreement and PSF's notice of
- copyright, i.e., "Copyright © 2001-2007 Python Software Foundation; All Rights
+ copyright, i.e., "Copyright © 2001-2008 Python Software Foundation; All Rights
Reserved" are retained in Python |release| alone or in any derivative version
prepared by Licensee.
diff --git a/Doc/tools/sphinxext/patchlevel.py b/Doc/tools/sphinxext/patchlevel.py
index 971ea61..cb9e35c 100644
--- a/Doc/tools/sphinxext/patchlevel.py
+++ b/Doc/tools/sphinxext/patchlevel.py
@@ -66,3 +66,6 @@ def get_version_info():
print >>sys.stderr, 'Can\'t get version info from Include/patchlevel.h, ' \
'using version of this interpreter (%s).' % release
return version, release
+
+if __name__ == '__main__':
+ print get_header_version_info('.')[1]
diff --git a/Lib/bsddb/test/test_associate.py b/Lib/bsddb/test/test_associate.py
index 1a32460..1c80a88 100644
--- a/Lib/bsddb/test/test_associate.py
+++ b/Lib/bsddb/test/test_associate.py
@@ -24,6 +24,11 @@ except ImportError:
# For Python 2.3
from bsddb import db, dbshelve
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
#----------------------------------------------------------------------
@@ -107,7 +112,6 @@ class AssociateErrorTestCase(unittest.TestCase):
def tearDown(self):
self.env.close()
self.env = None
- from test import test_support
test_support.rmtree(self.homeDir)
def test00_associateDBError(self):
diff --git a/Lib/bsddb/test/test_basics.py b/Lib/bsddb/test/test_basics.py
index 77ef361..00eb9bd 100644
--- a/Lib/bsddb/test/test_basics.py
+++ b/Lib/bsddb/test/test_basics.py
@@ -9,7 +9,6 @@ import errno
import string
import tempfile
from pprint import pprint
-from test import test_support
import unittest
import time
@@ -21,6 +20,10 @@ except ImportError:
from bsddb import db
from bsddb.test.test_all import verbose
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
DASH = b'-'
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
diff --git a/Lib/bsddb/test/test_compare.py b/Lib/bsddb/test/test_compare.py
index 3e9ecce..2c9706a 100644
--- a/Lib/bsddb/test/test_compare.py
+++ b/Lib/bsddb/test/test_compare.py
@@ -16,6 +16,11 @@ except ImportError:
# For Python 2.3
from bsddb import db, dbshelve
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
lexical_cmp = cmp
def lowercase_cmp(left, right):
@@ -84,7 +89,6 @@ class AbstractBtreeKeyCompareTestCase (unittest.TestCase):
if self.env is not None:
self.env.close ()
self.env = None
- from test import test_support
test_support.rmtree(self.homeDir)
def addDataToDB (self, data):
diff --git a/Lib/bsddb/test/test_cursor_pget_bug.py b/Lib/bsddb/test/test_cursor_pget_bug.py
index 6682180..887a69e 100644
--- a/Lib/bsddb/test/test_cursor_pget_bug.py
+++ b/Lib/bsddb/test/test_cursor_pget_bug.py
@@ -6,6 +6,11 @@ import tempfile
from bsddb import db
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
#----------------------------------------------------------------------
@@ -39,7 +44,6 @@ class pget_bugTestCase(unittest.TestCase):
del self.secondary_db
del self.primary_db
del self.env
- from test import test_support
test_support.rmtree(self.homeDir)
def test_pget(self):
diff --git a/Lib/bsddb/test/test_dbobj.py b/Lib/bsddb/test/test_dbobj.py
index 2d0f916..f67af40 100644
--- a/Lib/bsddb/test/test_dbobj.py
+++ b/Lib/bsddb/test/test_dbobj.py
@@ -11,6 +11,11 @@ except ImportError:
# For Python 2.3
from bsddb import db, dbobj
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
#----------------------------------------------------------------------
@@ -29,7 +34,6 @@ class dbobjTestCase(unittest.TestCase):
del self.db
if hasattr(self, 'env'):
del self.env
- from test import test_support
test_support.rmtree(self.homeDir)
def test01_both(self):
diff --git a/Lib/bsddb/test/test_dbshelve.py b/Lib/bsddb/test/test_dbshelve.py
index c66c7c1..99d0c49 100644
--- a/Lib/bsddb/test/test_dbshelve.py
+++ b/Lib/bsddb/test/test_dbshelve.py
@@ -9,6 +9,11 @@ import unittest
from bsddb import db, dbshelve
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
from bsddb.test.test_all import verbose
@@ -279,7 +284,6 @@ class BasicEnvShelveTestCase(DBShelveTestCase):
def tearDown(self):
- from test import test_support
test_support.rmtree(self.homeDir)
self.do_close()
diff --git a/Lib/bsddb/test/test_dbtables.py b/Lib/bsddb/test/test_dbtables.py
index 6c168bc..8964de8 100644
--- a/Lib/bsddb/test/test_dbtables.py
+++ b/Lib/bsddb/test/test_dbtables.py
@@ -34,6 +34,10 @@ except ImportError:
# For Python 2.3
from bsddb import db, dbtables
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
#----------------------------------------------------------------------
@@ -52,7 +56,6 @@ class TableDBTestCase(unittest.TestCase):
def tearDown(self):
self.tdb.close()
- from test import test_support
test_support.rmtree(self.testHomeDir)
def test01(self):
diff --git a/Lib/bsddb/test/test_env_close.py b/Lib/bsddb/test/test_env_close.py
index fa3adad..9f7c853 100644
--- a/Lib/bsddb/test/test_env_close.py
+++ b/Lib/bsddb/test/test_env_close.py
@@ -15,6 +15,11 @@ except ImportError:
# For Python 2.3
from bsddb import db
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
from bsddb.test.test_all import verbose
# We're going to get warnings in this module about trying to close the db when
@@ -41,7 +46,6 @@ class DBEnvClosedEarlyCrash(unittest.TestCase):
tempfile.tempdir = None
def tearDown(self):
- from test import test_support
test_support.rmtree(self.homeDir)
def test01_close_dbenv_before_db(self):
diff --git a/Lib/bsddb/test/test_join.py b/Lib/bsddb/test/test_join.py
index 07e7e01..311835a 100644
--- a/Lib/bsddb/test/test_join.py
+++ b/Lib/bsddb/test/test_join.py
@@ -18,6 +18,10 @@ from bsddb.test.test_all import verbose
from bsddb import db, dbshelve, StringKeys
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
#----------------------------------------------------------------------
@@ -57,7 +61,6 @@ class JoinTestCase(unittest.TestCase):
def tearDown(self):
self.env.close()
- from test import test_support
test_support.rmtree(self.homeDir)
def test01_join(self):
diff --git a/Lib/bsddb/test/test_lock.py b/Lib/bsddb/test/test_lock.py
index ca521de..973bc42 100644
--- a/Lib/bsddb/test/test_lock.py
+++ b/Lib/bsddb/test/test_lock.py
@@ -23,6 +23,11 @@ except ImportError:
# For Python 2.3
from bsddb import db
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
#----------------------------------------------------------------------
@@ -37,7 +42,6 @@ class LockingTestCase(unittest.TestCase):
def tearDown(self):
self.env.close()
- from test import test_support
test_support.rmtree(self.homeDir)
diff --git a/Lib/bsddb/test/test_misc.py b/Lib/bsddb/test/test_misc.py
index 5b9ab0a..0d81288 100644
--- a/Lib/bsddb/test/test_misc.py
+++ b/Lib/bsddb/test/test_misc.py
@@ -14,6 +14,11 @@ except ImportError:
# For the bundled bsddb
from bsddb import db, dbshelve, hashopen
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
#----------------------------------------------------------------------
class MiscTestCase(unittest.TestCase):
@@ -27,7 +32,6 @@ class MiscTestCase(unittest.TestCase):
pass
def tearDown(self):
- from test import test_support
test_support.unlink(self.filename)
test_support.rmtree(self.homeDir)
diff --git a/Lib/bsddb/test/test_pickle.py b/Lib/bsddb/test/test_pickle.py
index 01a5c45..f4c34ab 100644
--- a/Lib/bsddb/test/test_pickle.py
+++ b/Lib/bsddb/test/test_pickle.py
@@ -13,6 +13,11 @@ except ImportError as e:
# For Python 2.3
from bsddb import db
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
#----------------------------------------------------------------------
@@ -31,7 +36,6 @@ class pickleTestCase(unittest.TestCase):
del self.db
if hasattr(self, 'env'):
del self.env
- from test import test_support
test_support.rmtree(self.homeDir)
def _base_test_pickle_DBError(self, pickle):
diff --git a/Lib/bsddb/test/test_recno.py b/Lib/bsddb/test/test_recno.py
index dc15ad1..6855d18 100644
--- a/Lib/bsddb/test/test_recno.py
+++ b/Lib/bsddb/test/test_recno.py
@@ -18,6 +18,11 @@ except ImportError:
# For Python 2.3
from bsddb import db
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
@@ -29,7 +34,6 @@ class SimpleRecnoTestCase(unittest.TestCase):
self.homeDir = None
def tearDown(self):
- from test import test_support
test_support.unlink(self.filename)
if self.homeDir:
test_support.rmtree(self.homeDir)
diff --git a/Lib/bsddb/test/test_sequence.py b/Lib/bsddb/test/test_sequence.py
index fa80e7c..90be5f6 100644
--- a/Lib/bsddb/test/test_sequence.py
+++ b/Lib/bsddb/test/test_sequence.py
@@ -11,6 +11,10 @@ except ImportError:
from bsddb import db
from bsddb.test.test_all import verbose
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
class DBSequenceTest(unittest.TestCase):
@@ -41,7 +45,6 @@ class DBSequenceTest(unittest.TestCase):
self.dbenv.close()
del self.dbenv
- from test import test_support
test_support.rmtree(self.homeDir)
def test_get(self):
diff --git a/Lib/bsddb/test/test_thread.py b/Lib/bsddb/test/test_thread.py
index 7397a50..359c10d 100644
--- a/Lib/bsddb/test/test_thread.py
+++ b/Lib/bsddb/test/test_thread.py
@@ -33,6 +33,11 @@ except ImportError:
# For Python 2.3
from bsddb import db, dbutils
+try:
+ from bsddb3 import test_support
+except ImportError:
+ from test import test_support
+
#----------------------------------------------------------------------
@@ -63,7 +68,6 @@ class BaseThreadedTestCase(unittest.TestCase):
self.d.open(self.filename, self.dbtype, self.dbopenflags|db.DB_CREATE)
def tearDown(self):
- from test import test_support
test_support.rmtree(self.homeDir)
self.d.close()
self.env.close()
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 12e862d..994b452 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -1740,7 +1740,6 @@ static PyTypeObject chain_type = {
typedef struct {
PyObject_HEAD
PyObject *pools; /* tuple of pool tuples */
- Py_ssize_t *maxvec; /* size of each pool */
Py_ssize_t *indices; /* one index per pool */
PyObject *result; /* most recently returned result tuple */
int stopped; /* set to 1 when the product iterator is exhausted */
@@ -1754,7 +1753,6 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
productobject *lz;
Py_ssize_t nargs, npools, repeat=1;
PyObject *pools = NULL;
- Py_ssize_t *maxvec = NULL;
Py_ssize_t *indices = NULL;
Py_ssize_t i;
@@ -1779,9 +1777,8 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
nargs = (repeat == 0) ? 0 : PyTuple_GET_SIZE(args);
npools = nargs * repeat;
- maxvec = PyMem_Malloc(npools * sizeof(Py_ssize_t));
indices = PyMem_Malloc(npools * sizeof(Py_ssize_t));
- if (maxvec == NULL || indices == NULL) {
+ if (indices == NULL) {
PyErr_NoMemory();
goto error;
}
@@ -1795,16 +1792,13 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject *pool = PySequence_Tuple(item);
if (pool == NULL)
goto error;
-
PyTuple_SET_ITEM(pools, i, pool);
- maxvec[i] = PyTuple_GET_SIZE(pool);
indices[i] = 0;
}
for ( ; i < npools; ++i) {
PyObject *pool = PyTuple_GET_ITEM(pools, i - nargs);
Py_INCREF(pool);
PyTuple_SET_ITEM(pools, i, pool);
- maxvec[i] = maxvec[i - nargs];
indices[i] = 0;
}
@@ -1814,7 +1808,6 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
goto error;
lz->pools = pools;
- lz->maxvec = maxvec;
lz->indices = indices;
lz->result = NULL;
lz->stopped = 0;
@@ -1822,8 +1815,6 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return (PyObject *)lz;
error:
- if (maxvec != NULL)
- PyMem_Free(maxvec);
if (indices != NULL)
PyMem_Free(indices);
Py_XDECREF(pools);
@@ -1836,7 +1827,6 @@ product_dealloc(productobject *lz)
PyObject_GC_UnTrack(lz);
Py_XDECREF(lz->pools);
Py_XDECREF(lz->result);
- PyMem_Free(lz->maxvec);
PyMem_Free(lz->indices);
Py_TYPE(lz)->tp_free(lz);
}
@@ -1883,7 +1873,6 @@ product_next(productobject *lz)
}
} else {
Py_ssize_t *indices = lz->indices;
- Py_ssize_t *maxvec = lz->maxvec;
/* Copy the previous result tuple or re-use it if available */
if (Py_REFCNT(result) > 1) {
@@ -1900,14 +1889,14 @@ product_next(productobject *lz)
Py_DECREF(old_result);
}
/* Now, we've got the only copy so we can update it in-place */
- assert (Py_REFCNT(result) == 1);
+ assert (npools==0 || Py_REFCNT(result) == 1);
/* Update the pool indices right-to-left. Only advance to the
next pool when the previous one rolls-over */
for (i=npools-1 ; i >= 0 ; i--) {
pool = PyTuple_GET_ITEM(pools, i);
indices[i]++;
- if (indices[i] == maxvec[i]) {
+ if (indices[i] == PyTuple_GET_SIZE(pool)) {
/* Roll-over and advance to next pool */
indices[i] = 0;
elem = PyTuple_GET_ITEM(pool, 0);
diff --git a/README b/README
index 351df53..ad51d13 100644
--- a/README
+++ b/README
@@ -2,6 +2,9 @@ This is Python version 3.0 alpha 3
==================================
For notes specific to this release, see RELNOTES in this directory.
+Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+Python Software Foundation.
+All rights reserved.
Python 3000 (a.k.a. "Py3k", and released as Python 3.0) is a new
version of the language, which is incompatible with the 2.x line of