Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61064,61066-61080 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r61063 | andrew.kuchling | 2008-02-25 17:29:19 +0100 (Mon, 25 Feb 2008) | 1 line

  Move .setupterm() output so that we don't try to call endwin() if it fails
........
  r61064 | andrew.kuchling | 2008-02-25 17:29:58 +0100 (Mon, 25 Feb 2008) | 1 line

  Use file descriptor for real stdout
........
  r61067 | facundo.batista | 2008-02-25 19:06:00 +0100 (Mon, 25 Feb 2008) | 4 lines


  Issue 2117.  Update compiler module to handle class decorators.
  Thanks Thomas Herve
........
  r61069 | georg.brandl | 2008-02-25 21:17:56 +0100 (Mon, 25 Feb 2008) | 2 lines

  Rename sphinx.addons to sphinx.ext.
........
  r61071 | georg.brandl | 2008-02-25 21:20:45 +0100 (Mon, 25 Feb 2008) | 2 lines

  Revert r61029.
........
  r61072 | facundo.batista | 2008-02-25 23:33:55 +0100 (Mon, 25 Feb 2008) | 4 lines


  Issue 2168. gdbm and dbm needs to be iterable; this fixes a
  failure in the shelve module.  Thanks Thomas Herve.
........
  r61073 | raymond.hettinger | 2008-02-25 23:42:32 +0100 (Mon, 25 Feb 2008) | 1 line

  Make sure the itertools filter functions give the same performance for func=bool as func=None.
........
  r61074 | raymond.hettinger | 2008-02-26 00:17:41 +0100 (Tue, 26 Feb 2008) | 1 line

  Revert part of r60927 which made invalid assumptions about the API offered by db modules.
........
  r61075 | facundo.batista | 2008-02-26 00:46:02 +0100 (Tue, 26 Feb 2008) | 3 lines


  Coerced PyBool_Type to be able to compare it.
........
  r61076 | raymond.hettinger | 2008-02-26 03:46:54 +0100 (Tue, 26 Feb 2008) | 1 line

  Docs for itertools.combinations().  Implementation in forthcoming checkin.
........
  r61077 | neal.norwitz | 2008-02-26 05:50:37 +0100 (Tue, 26 Feb 2008) | 3 lines

  Don't use a hard coded port.  This test could hang/fail if the port is in use.
  Speed this test up by avoiding a sleep and using the event.
........
  r61078 | neal.norwitz | 2008-02-26 06:12:50 +0100 (Tue, 26 Feb 2008) | 1 line

  Whitespace normalization
........
  r61079 | neal.norwitz | 2008-02-26 06:23:51 +0100 (Tue, 26 Feb 2008) | 1 line

  Whitespace normalization
........
  r61080 | georg.brandl | 2008-02-26 07:40:10 +0100 (Tue, 26 Feb 2008) | 2 lines

  Banish tab.
........
diff --git a/Lib/curses/__init__.py b/Lib/curses/__init__.py
index c3f2f25..bd7d5f6 100644
--- a/Lib/curses/__init__.py
+++ b/Lib/curses/__init__.py
@@ -15,6 +15,7 @@
 from _curses import *
 from curses.wrapper import wrapper
 import os as _os
+import sys as _sys
 
 # Some constants, most notably the ACS_* ones, are only added to the C
 # _curses module's dictionary after initscr() is called.  (Some
@@ -28,7 +29,8 @@
     import _curses, curses
     # we call setupterm() here because it raises an error
     # instead of calling exit() in error cases.
-    setupterm(term=_os.environ.get("TERM", "unknown"))
+    setupterm(term=_os.environ.get("TERM", "unknown"),
+              fd=_sys.__stdout__.fileno())
     stdscr = _curses.initscr()
     for key, value in _curses.__dict__.items():
         if key[0:4] == 'ACS_' or key in ('LINES', 'COLS'):
diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py
index 64d6536..d50d81d 100644
--- a/Lib/test/test_curses.py
+++ b/Lib/test/test_curses.py
@@ -269,13 +269,12 @@
     curses.wrapper(main)
     unit_tests()
 else:
+    # testing setupterm() inside initscr/endwin
+    # causes terminal breakage
+    curses.setupterm(fd=sys.__stdout__.fileno())
     try:
-        # testing setupterm() inside initscr/endwin
-        # causes terminal breakage
-        curses.setupterm(fd=sys.__stdout__.fileno())
         stdscr = curses.initscr()
         main(stdscr)
     finally:
         curses.endwin()
-
     unit_tests()
diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
index d782c53..1ff8d08 100644
--- a/Lib/test/test_ftplib.py
+++ b/Lib/test/test_ftplib.py
@@ -6,34 +6,48 @@
 from unittest import TestCase
 from test import test_support
 
-def server(evt, ready):
+server_port = None
+
+# This function sets the evt 3 times:
+#  1) when the connection is ready to be accepted.
+#  2) when it is safe for the caller to close the connection
+#  3) when we have closed the socket
+def server(evt):
+    global server_port
     serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     serv.settimeout(3)
     serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-    serv.bind(("", 9091))
+    server_port = test_support.bind_port(serv, "", 9091)
     serv.listen(5)
-    ready.set()
+
+    # (1) Signal the caller that we are ready to accept the connection.
+    evt.set()
     try:
         conn, addr = serv.accept()
     except socket.timeout:
         pass
     else:
         conn.send(b"1 Hola mundo\n")
+        # (2) Signal the caller that it is safe to close the socket.
+        evt.set()
         conn.close()
     finally:
         serv.close()
+        # (3) Signal the caller that we are done.
         evt.set()
 
 class GeneralTests(TestCase):
 
     def setUp(self):
-        ftplib.FTP.port = 9091
         self.evt = threading.Event()
-        ready = threading.Event()
-        threading.Thread(target=server, args=(self.evt, ready)).start()
-        ready.wait()
+        threading.Thread(target=server, args=(self.evt,)).start()
+        # Wait for the server to be ready.
+        self.evt.wait()
+        self.evt.clear()
+        ftplib.FTP.port = server_port
 
     def tearDown(self):
+        # Wait on the closing of the socket (this shouldn't be necessary).
         self.evt.wait()
 
     def testBasic(self):
@@ -42,30 +56,35 @@
 
         # connects
         ftp = ftplib.FTP("localhost")
+        self.evt.wait()
         ftp.sock.close()
 
     def testTimeoutDefault(self):
         # default
         ftp = ftplib.FTP("localhost")
         self.assertTrue(ftp.sock.gettimeout() is None)
+        self.evt.wait()
         ftp.sock.close()
 
     def testTimeoutValue(self):
         # a value
         ftp = ftplib.FTP("localhost", timeout=30)
         self.assertEqual(ftp.sock.gettimeout(), 30)
+        self.evt.wait()
         ftp.sock.close()
 
     def testTimeoutConnect(self):
         ftp = ftplib.FTP()
         ftp.connect("localhost", timeout=30)
         self.assertEqual(ftp.sock.gettimeout(), 30)
+        self.evt.wait()
         ftp.sock.close()
 
     def testTimeoutDifferentOrder(self):
         ftp = ftplib.FTP(timeout=30)
         ftp.connect("localhost")
         self.assertEqual(ftp.sock.gettimeout(), 30)
+        self.evt.wait()
         ftp.sock.close()
 
     def testTimeoutDirectAccess(self):
@@ -73,6 +92,7 @@
         ftp.timeout = 30
         ftp.connect("localhost")
         self.assertEqual(ftp.sock.gettimeout(), 30)
+        self.evt.wait()
         ftp.sock.close()
 
     def testTimeoutNone(self):
@@ -84,10 +104,10 @@
         finally:
             socket.setdefaulttimeout(previous)
         self.assertEqual(ftp.sock.gettimeout(), 30)
+        self.evt.wait()
         ftp.close()
 
 
-
 def test_main(verbose=None):
     test_support.run_unittest(GeneralTests)
 
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py
index 744b344..63ca17b 100644
--- a/Lib/test/test_itertools.py
+++ b/Lib/test/test_itertools.py
@@ -177,6 +177,7 @@
     def test_ifilter(self):
         self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
         self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
+        self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
         self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
         self.assertRaises(TypeError, ifilter)
         self.assertRaises(TypeError, ifilter, lambda x:x)
@@ -187,6 +188,7 @@
     def test_ifilterfalse(self):
         self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
         self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
+        self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
         self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
         self.assertRaises(TypeError, ifilterfalse)
         self.assertRaises(TypeError, ifilterfalse, lambda x:x)
diff --git a/Lib/token.py b/Lib/token.py
index eb48e76..da4d29b 100755
--- a/Lib/token.py
+++ b/Lib/token.py
@@ -72,6 +72,7 @@
 for _name, _value in list(globals().items()):
     if type(_value) is type(0):
         tok_name[_value] = _name
+del _name, _value
 
 
 def ISTERMINAL(x):