From b4efb3d81e8a22f553d92cfb924258f9c3bca415 Mon Sep 17 00:00:00 2001 From: Florent Xicluna Date: Sat, 14 Aug 2010 18:24:40 +0000 Subject: [PATCH] Merged revisions 83212,83829,83833,83838-83839,83878,84019,84025,84028,84032,84036 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ........ r83212 | florent.xicluna | 2010-07-28 18:39:41 +0200 (mer., 28 juil. 2010) | 2 lines Syntax cleanup. ........ r83829 | florent.xicluna | 2010-08-08 18:16:07 +0200 (dim., 08 août 2010) | 2 lines Use unittest specific methods for some urllib test cases. And replace urllib2 with urllib.request in comments. ........ r83833 | florent.xicluna | 2010-08-08 18:25:27 +0200 (dim., 08 août 2010) | 2 lines Add test case for the HTTPResponse being an iterable. Follow-up of issue #4608. ........ r83838 | florent.xicluna | 2010-08-08 20:03:44 +0200 (dim., 08 août 2010) | 2 lines Typo. ........ r83839 | florent.xicluna | 2010-08-08 20:06:13 +0200 (dim., 08 août 2010) | 2 lines Issue #7564: Skip test_ioctl if another process is attached to /dev/tty. ........ r83878 | florent.xicluna | 2010-08-09 10:29:08 +0200 (lun., 09 août 2010) | 1 line Merge the 2to3 script from /sandbox/trunk/2to3/2to3, revision 72867 (latest). ........ r84019 | florent.xicluna | 2010-08-14 17:56:42 +0200 (sam., 14 août 2010) | 11 lines Merged manually from 2.7 branch to 3.x trunk. ------------------------------------------------------------------------ r79925 | nick.coghlan | 2010-04-10 16:24:36 +0200 (sam. 10 avril 2010) Try to turn some buildbots green by allowing test_multiprocessing to pass even if it hits the sys.exc_clear code in the threading module, and improve the test coverage by making the ctypes dependencies a bit more granular (two of the cited ctypes objects don't exist on my system) ------------------------------------------------------------------------ ........ r84025 | florent.xicluna | 2010-08-14 18:56:27 +0200 (sam., 14 août 2010) | 1 line List Misc/python-config.in in Misc/README. Fix few typos. ........ r84028 | florent.xicluna | 2010-08-14 19:02:49 +0200 (sam., 14 août 2010) | 1 line Fix order. ........ r84032 | florent.xicluna | 2010-08-14 19:15:31 +0200 (sam., 14 août 2010) | 1 line Convert to spaces. ........ r84036 | florent.xicluna | 2010-08-14 20:03:19 +0200 (sam., 14 août 2010) | 1 line Remove bad merge (from svnmerge r82301) ........ --- Doc/library/stdtypes.rst | 4 -- Lib/ctypes/test/test_callbacks.py | 2 +- Lib/json/encoder.py | 2 +- Lib/pickletools.py | 2 +- Lib/test/test_binop.py | 2 +- Lib/test/test_ioctl.py | 10 ++++- Lib/test/test_multiprocessing.py | 24 ++++++++---- Lib/test/test_pow.py | 4 +- Lib/test/test_sys.py | 4 +- Lib/test/test_urllib.py | 4 +- Lib/test/test_urllib2.py | 47 +++++++++++------------ Lib/test/test_urllib2_localnet.py | 46 +++++++++++++++------- Misc/NEWS | 2 + Misc/README | 63 ++++++++++++++++--------------- Misc/maintainers.rst | 49 +++++++++++++++--------- Tools/scripts/2to3 | 3 +- 16 files changed, 156 insertions(+), 112 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index ef1fbee8516..8e5412086c2 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1163,10 +1163,6 @@ functions based on regular expressions. You can use :meth:`str.maketrans` to create a translation map from character-to-character mappings in different formats. - You can use the :func:`~string.maketrans` helper function in the :mod:`string` - module to create a translation table. For string objects, set the *table* - argument to ``None`` for translations that only delete characters: - .. note:: An even more flexible approach is to create a custom character mapping diff --git a/Lib/ctypes/test/test_callbacks.py b/Lib/ctypes/test/test_callbacks.py index 1466f26ecc9..0fa2d9dba72 100644 --- a/Lib/ctypes/test/test_callbacks.py +++ b/Lib/ctypes/test/test_callbacks.py @@ -164,7 +164,7 @@ class SampleCallbacksTestCase(unittest.TestCase): result = integrate(0.0, 1.0, CALLBACK(func), 10) diff = abs(result - 1./3.) - self.assertTrue(diff < 0.01, "%s not less than 0.01" % diff) + self.assertLess(diff, 0.01, "%s not less than 0.01" % diff) ################################################################ diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py index 2beb10e358b..d068e722165 100644 --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -397,7 +397,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, yield 'true' elif o is False: yield 'false' - elif isinstance(o, (int, int)): + elif isinstance(o, int): yield str(o) elif isinstance(o, float): yield _floatstr(o) diff --git a/Lib/pickletools.py b/Lib/pickletools.py index 4f1c24f91b5..dc408101dbc 100644 --- a/Lib/pickletools.py +++ b/Lib/pickletools.py @@ -733,7 +733,7 @@ pylong = StackObject( pyinteger_or_bool = StackObject( name='int_or_bool', - obtype=(int, int, bool), + obtype=(int, bool), doc="A Python integer object (short or long), or " "a Python bool.") diff --git a/Lib/test/test_binop.py b/Lib/test/test_binop.py index 5d77f234fe6..523ecbe2989 100644 --- a/Lib/test/test_binop.py +++ b/Lib/test/test_binop.py @@ -15,7 +15,7 @@ def isint(x): def isnum(x): """Test whether an object is an instance of a built-in numeric type.""" - for T in int, int, float, complex: + for T in int, float, complex: if isinstance(x, T): return 1 return 0 diff --git a/Lib/test/test_ioctl.py b/Lib/test/test_ioctl.py index 50597cab4e2..d63fdebabca 100644 --- a/Lib/test/test_ioctl.py +++ b/Lib/test/test_ioctl.py @@ -7,9 +7,17 @@ get_attribute(termios, 'TIOCGPGRP') #Can't run tests without this feature try: tty = open("/dev/tty", "r") - tty.close() except IOError: raise unittest.SkipTest("Unable to open /dev/tty") +else: + # Skip if another process is in foreground + r = fcntl.ioctl(tty, termios.TIOCGPGRP, " ") + tty.close() + rpgrp = struct.unpack("i", r)[0] + if rpgrp not in (os.getpgrp(), os.getsid(0)): + raise unittest.SkipTest("Neither the process group nor the session " + "are attached to /dev/tty") + del tty, r, rpgrp try: import pty diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py index c5aeb14e510..3f6fc8b896c 100644 --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -14,7 +14,6 @@ import os import gc import signal import array -import copy import socket import random import logging @@ -68,11 +67,21 @@ WIN32 = (sys.platform == "win32") # try: - from ctypes import Structure, Value, copy, c_int, c_double + from ctypes import Structure, c_int, c_double except ImportError: Structure = object c_int = c_double = None +try: + from ctypes import Value +except ImportError: + Value = None + +try: + from ctypes import copy as ctypes_copy +except ImportError: + ctypes_copy = None + # # Creates a wrapper for a function which records the time it takes to finish # @@ -1103,11 +1112,9 @@ def baz(): yield i*i class IteratorProxy(BaseProxy): - _exposed_ = ('next', '__next__') + _exposed_ = ('__next__',) def __iter__(self): return self - def __next__(self): - return self._callmethod('next') def __next__(self): return self._callmethod('__next__') @@ -1565,7 +1572,7 @@ class _TestSharedCTypes(BaseTestCase): for i in range(len(arr)): arr[i] *= 2 - @unittest.skipIf(c_int is None, "requires _ctypes") + @unittest.skipIf(Value is None, "requires ctypes.Value") def test_sharedctypes(self, lock=False): x = Value('i', 7, lock=lock) y = Value(ctypes.c_double, 1.0/3.0, lock=lock) @@ -1586,13 +1593,14 @@ class _TestSharedCTypes(BaseTestCase): self.assertAlmostEqual(arr[i], i*2) self.assertEqual(string.value, latin('hellohello')) + @unittest.skipIf(Value is None, "requires ctypes.Value") def test_synchronize(self): self.test_sharedctypes(lock=True) - @unittest.skipIf(c_int is None, "requires _ctypes") + @unittest.skipIf(ctypes_copy is None, "requires ctypes.copy") def test_copy(self): foo = _Foo(2, 5.0) - bar = copy(foo) + bar = ctypes_copy(foo) foo.x = 0 foo.y = 0 self.assertEqual(bar.x, 2) diff --git a/Lib/test/test_pow.py b/Lib/test/test_pow.py index 859c3737b90..60bb5330eb3 100644 --- a/Lib/test/test_pow.py +++ b/Lib/test/test_pow.py @@ -18,14 +18,14 @@ class PowTest(unittest.TestCase): self.assertEquals(pow(2, i), pow2) if i != 30 : pow2 = pow2*2 - for othertype in int, int: + for othertype in (int,): for i in list(range(-10, 0)) + list(range(1, 10)): ii = type(i) for j in range(1, 11): jj = -othertype(j) pow(ii, jj) - for othertype in int, int, float: + for othertype in int, float: for i in range(1, 100): zero = type(0) exp = -othertype(i/10.0) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 398243a7733..ccad44a4d10 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -79,7 +79,6 @@ class SysModuleTest(unittest.TestCase): # Python/pythonrun.c::PyErr_PrintEx() is tricky. def test_exit(self): - import subprocess self.assertRaises(TypeError, sys.exit, 42, 42) @@ -458,7 +457,6 @@ class SysModuleTest(unittest.TestCase): sys._clear_type_cache() def test_ioencoding(self): - import subprocess,os env = dict(os.environ) # Test character: cent sign, encoded as 0x4A (ASCII J) in CP424, @@ -480,7 +478,7 @@ class SysModuleTest(unittest.TestCase): # Issue #7774: Ensure that sys.executable is an empty string if argv[0] # has been set to an non existent program name and Python is unable to # retrieve the real program name - import subprocess + # For a normal installation, it should work without 'cwd' # argument. For test runs in the build directory, see #7774. python_dir = os.path.dirname(os.path.realpath(sys.executable)) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index c573f147f14..80cd8ef313e 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -103,7 +103,7 @@ class urlopen_FileTests(unittest.TestCase): self.assertEqual(self.returned_obj.geturl(), self.pathname) def test_getcode(self): - self.assertEqual(self.returned_obj.getcode(), None) + self.assertIsNone(self.returned_obj.getcode()) def test_iter(self): # Test iterator @@ -132,7 +132,7 @@ class ProxyTests(unittest.TestCase): self.env.set('NO_PROXY', 'localhost') proxies = urllib.request.getproxies_environment() # getproxies_environment use lowered case truncated (no '_proxy') keys - self.assertEquals('localhost', proxies['no']) + self.assertEqual('localhost', proxies['no']) class urlopen_HttpTests(unittest.TestCase): diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 83bd467177b..0f8395e8ca1 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -46,7 +46,7 @@ class TrivialTests(unittest.TestCase): ('a="b\\"c", d="e\\,f", g="h\\\\i"', ['a="b"c"', 'd="e,f"', 'g="h\\i"'])] for string, list in tests: - self.assertEquals(urllib.request.parse_http_list(string), list) + self.assertEqual(urllib.request.parse_http_list(string), list) def test_request_headers_dict(): @@ -744,9 +744,9 @@ class HandlerTests(unittest.TestCase): h.file_open(req) # XXXX remove OSError when bug fixed except (urllib.error.URLError, OSError): - self.assertTrue(not ftp) + self.assertFalse(ftp) else: - self.assertTrue(o.req is req) + self.assertIs(o.req, req) self.assertEqual(req.type, "ftp") self.assertEqual(req.type is "ftp", ftp) @@ -849,19 +849,19 @@ class HandlerTests(unittest.TestCase): # all 2xx are passed through r = MockResponse(200, "OK", {}, "", url) newr = h.http_response(req, r) - self.assertTrue(r is newr) - self.assertTrue(not hasattr(o, "proto")) # o.error not called + self.assertIs(r, newr) + self.assertFalse(hasattr(o, "proto")) # o.error not called r = MockResponse(202, "Accepted", {}, "", url) newr = h.http_response(req, r) - self.assertTrue(r is newr) - self.assertTrue(not hasattr(o, "proto")) # o.error not called + self.assertIs(r, newr) + self.assertFalse(hasattr(o, "proto")) # o.error not called r = MockResponse(206, "Partial content", {}, "", url) newr = h.http_response(req, r) - self.assertTrue(r is newr) - self.assertTrue(not hasattr(o, "proto")) # o.error not called + self.assertIs(r, newr) + self.assertFalse(hasattr(o, "proto")) # o.error not called # anything else calls o.error (and MockOpener returns None, here) r = MockResponse(502, "Bad gateway", {}, "", url) - self.assertTrue(h.http_response(req, r) is None) + self.assertIsNone(h.http_response(req, r)) self.assertEqual(o.proto, "http") # o.error called self.assertEqual(o.args, (req, r, 502, "Bad gateway", {})) @@ -873,12 +873,14 @@ class HandlerTests(unittest.TestCase): req = Request("http://example.com/") r = MockResponse(200, "OK", {}, "") newreq = h.http_request(req) - self.assertTrue(cj.ach_req is req is newreq) - self.assertEquals(req.get_origin_req_host(), "example.com") - self.assertTrue(not req.is_unverifiable()) + self.assertIs(cj.ach_req, req) + self.assertIs(cj.ach_req, newreq) + self.assertEqual(req.get_origin_req_host(), "example.com") + self.assertFalse(req.is_unverifiable()) newr = h.http_response(req, r) - self.assertTrue(cj.ec_req is req) - self.assertTrue(cj.ec_r is r is newr) + self.assertIs(cj.ec_req, req) + self.assertIs(cj.ec_r, r) + self.assertIs(r, newr) def test_redirect(self): from_url = "http://example.com/a.html" @@ -906,7 +908,7 @@ class HandlerTests(unittest.TestCase): try: self.assertEqual(o.req.get_method(), "GET") except AttributeError: - self.assertTrue(not o.req.has_data()) + self.assertFalse(o.req.has_data()) # now it's a GET, there should not be headers regarding content # (possibly dragged from before being a POST) @@ -965,7 +967,7 @@ class HandlerTests(unittest.TestCase): cp = urllib.request.HTTPCookieProcessor(cj) o = build_test_opener(hh, hdeh, hrh, cp) o.open("http://www.example.com/") - self.assertTrue(not hh.req.has_header("Cookie")) + self.assertFalse(hh.req.has_header("Cookie")) def test_proxy(self): o = OpenerDirector() @@ -1199,11 +1201,8 @@ class MiscTests(unittest.TestCase): self.opener_has_handler(o, MyOtherHTTPHandler) def opener_has_handler(self, opener, handler_class): - for h in opener.handlers: - if h.__class__ == handler_class: - break - else: - self.assertTrue(False) + self.assertTrue(any(h.__class__ == handler_class + for h in opener.handlers)) class RequestTests(unittest.TestCase): @@ -1218,7 +1217,7 @@ class RequestTests(unittest.TestCase): self.assertEqual("GET", self.get.get_method()) def test_add_data(self): - self.assertTrue(not self.get.has_data()) + self.assertFalse(self.get.has_data()) self.assertEqual("GET", self.get.get_method()) self.get.add_data("spam") self.assertTrue(self.get.has_data()) @@ -1244,7 +1243,7 @@ class RequestTests(unittest.TestCase): self.assertEqual("www.python.org", req.get_host()) def test_proxy(self): - self.assertTrue(not self.get.has_proxy()) + self.assertFalse(self.get.has_proxy()) self.get.set_proxy("www.perl.org", "http") self.assertTrue(self.get.has_proxy()) self.assertEqual("www.python.org", self.get.get_origin_req_host()) diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py index 365742c8bff..fbd21d2912c 100644 --- a/Lib/test/test_urllib2_localnet.py +++ b/Lib/test/test_urllib2_localnet.py @@ -172,7 +172,7 @@ class DigestAuthHandler: auth_validated = False # MSIE uses short_path in its validation, but Python's - # urllib2 uses the full path, so we're going to see if + # urllib.request uses the full path, so we're going to see if # either of them works here. for path in [request_handler.path, request_handler.short_path]: @@ -298,8 +298,9 @@ def GetRequestHandler(responses): def do_GET(self): body = self.send_head() - if body: - self.wfile.write(body) + while body: + done = self.wfile.write(body) + body = body[done:] def do_POST(self): content_length = self.headers["Content-Length"] @@ -330,7 +331,7 @@ def GetRequestHandler(responses): class TestUrlopen(unittest.TestCase): - """Tests urllib2.urlopen using the network. + """Tests urllib.request.urlopen using the network. These tests are not exhaustive. Assuming that testing using files does a good job overall of some of the basic interface features. There are no @@ -380,8 +381,8 @@ class TestUrlopen(unittest.TestCase): handler = self.start_server(responses) data = self.urlopen("http://localhost:%s/" % handler.port) - self.assertEquals(data, expected_response) - self.assertEquals(handler.requests, ["/", "/somewhere_else"]) + self.assertEqual(data, expected_response) + self.assertEqual(handler.requests, ["/", "/somewhere_else"]) def test_chunked(self): expected_response = b"hello world" @@ -395,7 +396,7 @@ class TestUrlopen(unittest.TestCase): response = [(200, [("Transfer-Encoding", "chunked")], chunked_start)] handler = self.start_server(response) data = self.urlopen("http://localhost:%s/" % handler.port) - self.assertEquals(data, expected_response) + self.assertEqual(data, expected_response) def test_404(self): expected_response = b"Bad bad bad..." @@ -409,23 +410,23 @@ class TestUrlopen(unittest.TestCase): else: self.fail("404 should raise URLError") - self.assertEquals(data, expected_response) - self.assertEquals(handler.requests, ["/weeble"]) + self.assertEqual(data, expected_response) + self.assertEqual(handler.requests, ["/weeble"]) def test_200(self): expected_response = b"pycon 2008..." handler = self.start_server([(200, [], expected_response)]) data = self.urlopen("http://localhost:%s/bizarre" % handler.port) - self.assertEquals(data, expected_response) - self.assertEquals(handler.requests, ["/bizarre"]) + self.assertEqual(data, expected_response) + self.assertEqual(handler.requests, ["/bizarre"]) def test_200_with_parameters(self): expected_response = b"pycon 2008..." handler = self.start_server([(200, [], expected_response)]) data = self.urlopen("http://localhost:%s/bizarre" % handler.port, b"get=with_feeling") - self.assertEquals(data, expected_response) - self.assertEquals(handler.requests, ["/bizarre", b"get=with_feeling"]) + self.assertEqual(data, expected_response) + self.assertEqual(handler.requests, ["/bizarre", b"get=with_feeling"]) def test_sending_headers(self): handler = self.start_server() @@ -489,6 +490,25 @@ class TestUrlopen(unittest.TestCase): urllib.request.urlopen, "http://sadflkjsasf.i.nvali.d./") + def test_iteration(self): + expected_response = b"pycon 2008..." + handler = self.start_server([(200, [], expected_response)]) + data = urllib.request.urlopen("http://localhost:%s" % handler.port) + for line in data: + self.assertEqual(line, expected_response) + + def test_line_iteration(self): + lines = [b"We\n", b"got\n", b"here\n", b"verylong " * 8192 + b"\n"] + expected_response = b"".join(lines) + handler = self.start_server([(200, [], expected_response)]) + data = urllib.request.urlopen("http://localhost:%s" % handler.port) + for index, line in enumerate(data): + self.assertEqual(line, lines[index], + "Fetched line number %s doesn't match expected:\n" + " Expected length was %s, got %s" % + (index, len(lines[index]), len(line))) + self.assertEqual(index + 1, len(lines)) + def test_main(): support.run_unittest(ProxyAuthTests, TestUrlopen) diff --git a/Misc/NEWS b/Misc/NEWS index 230160a2435..478517bc536 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -479,6 +479,8 @@ Build Tests ----- +- Issue #7564: Skip test_ioctl if another process is attached to /dev/tty. + - Issue #8857: Provide a test case for socket.getaddrinfo. - Issue #8433: Fix test_curses failure with newer versions of ncurses. diff --git a/Misc/README b/Misc/README index 8695b60aa09..e7a59c71829 100644 --- a/Misc/README +++ b/Misc/README @@ -7,34 +7,35 @@ documents are only of historic importance. Files found here ---------------- -ACKS Acknowledgements -AIX-NOTES Notes for building Python on AIX -build.sh Script to build and test latest Python from the repository -cheatsheet Quick summary of Python by Ken Manheimer -developers.txt A history of who got developer permissions, and why -gdbinit Handy stuff to put in your .gdbinit file, if you use gdb -HISTORY News from previous releases -- oldest last -indent.pro GNU indent profile approximating my C style -maintainers.txt A list of maintainers for library modules -NEWS News for this release (for some meaning of "this") -NEWS.help How to edit NEWS -Porting Mini-FAQ on porting to new platforms -PURIFY.README Information for Purify users -pymemcompat.h Memory interface compatibility file. -python.man UNIX man page for the python interpreter -python-mode.el Emacs mode for editing Python programs -python.pc.in Package configuration info template for pkg-config -python-wing.wpr Wing IDE project file -README The file you're reading now -README.coverity Information about running Coverity's Prevent on Python -README.klocwork Information about running Klocwork's K7 on Python -README.OpenBSD Help for building problems on OpenBSD -README.valgrind Information for Valgrind users, see valgrind-python.supp -RFD Request For Discussion about a Python newsgroup -RPM (Old) tools to build RPMs -setuid-prog.c C helper program for set-uid Python scripts -SpecialBuilds.txt Describes extra symbols you can set for debug builds -TextMate A TextMate bundle for Python development -valgrind-python.supp Valgrind suppression file, see README.valgrind -vgrindefs Python configuration for vgrind (a generic pretty printer) -Vim Python development utilities for the Vim editor \ No newline at end of file +ACKS Acknowledgements +AIX-NOTES Notes for building Python on AIX +build.sh Script to build and test latest Python from the repository +cheatsheet Quick summary of Python by Ken Manheimer +developers.txt A history of who got developer permissions, and why +gdbinit Handy stuff to put in your .gdbinit file, if you use gdb +HISTORY News from previous releases -- oldest last +indent.pro GNU indent profile approximating my C style +maintainers.rst A list of maintainers for library modules +NEWS News for this release (for some meaning of "this") +NEWS.help How to edit NEWS +Porting Mini-FAQ on porting to new platforms +PURIFY.README Information for Purify users +pymemcompat.h Memory interface compatibility file. +python-config.in Python script template for python-config +python.man UNIX man page for the python interpreter +python-mode.el Emacs mode for editing Python programs +python.pc.in Package configuration info template for pkg-config +python-wing.wpr Wing IDE project file +README The file you're reading now +README.coverity Information about running Coverity's Prevent on Python +README.klocwork Information about running Klocwork's K7 on Python +README.OpenBSD Help for building problems on OpenBSD +README.valgrind Information for Valgrind users, see valgrind-python.supp +RFD Request For Discussion about a Python newsgroup +RPM (Old) tools to build RPMs +setuid-prog.c C helper program for set-uid Python scripts +SpecialBuilds.txt Describes extra symbols you can set for debug builds +TextMate A TextMate bundle for Python development +valgrind-python.supp Valgrind suppression file, see README.valgrind +vgrindefs Python configuration for vgrind (a generic pretty printer) +Vim Python development utilities for the Vim editor diff --git a/Misc/maintainers.rst b/Misc/maintainers.rst index 31708187e22..e7856109d8e 100644 --- a/Misc/maintainers.rst +++ b/Misc/maintainers.rst @@ -11,6 +11,10 @@ final judgement on a feature or bug. If no active maintainer is listed for a given module, then questionable changes should go to python-dev, while any other issues can and should be decided by any committer. +Unless a name is followed by a '*', you should never assign an issue to +that person, only make them nosy. Names followed by a '*' may be assigned +issues involving the module or topic for which the name has a '*'. + The Platform and Interest Area tables list broader fields in which various people have expertise. These people can also be contacted for help, opinions, and decisions when issues involve their areas. @@ -21,8 +25,8 @@ in this list by placing the word 'inactive' in parenthesis behind their tracker id. They are of course free to remove that inactive mark at any time. -Committers should update this table as their areas of expertise widen. -New topics may be added to the third table at will. +Committers should update these tables as their areas of expertise widen. +New topics may be added to the Interest Area table at will. The existence of this list is not meant to indicate that these people *must* be contacted for decisions; it is, rather, a resource to be used @@ -85,10 +89,10 @@ dbm decimal facundobatista, rhettinger, mark.dickinson difflib tim_one dis -distutils tarek +distutils tarek*, eric.araujo* doctest tim_one (inactive) dummy_threading brett.cannon -email barry, r.david.murray +email barry, r.david.murray* encodings lemburg, loewis errno exceptions @@ -147,7 +151,7 @@ optparse aronacher os loewis ossaudiodev parser -pdb georg.brandl +pdb georg.brandl* pickle alexandre.vassalotti, pitrou pickletools alexandre.vassalotti pipes @@ -157,7 +161,8 @@ plistlib poplib posix pprint fdrake -pstats +profile georg.brandl +pstats georg.brandl pty pwd py_compile @@ -167,7 +172,7 @@ pydoc queue rhettinger quopri random rhettinger -re effbot (inactive), pitrou +re effbot (inactive), pitrou, ezio.melotti readline reprlib resource @@ -189,7 +194,7 @@ spwd sqlite3 ghaering ssl janssen, pitrou, giampaolo.rodola stat -string +string georg.brandl* stringprep struct mark.dickinson subprocess astrand (inactive) @@ -202,18 +207,18 @@ syslog jafo tabnanny tim_one tarfile lars.gustaebel telnetlib -tempfile +tempfile georg.brandl termios test -textwrap +textwrap georg.brandl threading pitrou time alexander.belopolsky -timeit +timeit georg.brandl tkinter gpolo token georg.brandl tokenize trace alexander.belopolsky -traceback georg.brandl +traceback georg.brandl* tty turtle gregorlingl types @@ -226,14 +231,21 @@ warnings brett.cannon wave weakref fdrake, pitrou webbrowser georg.brandl -winreg +winreg brian.curtin winsound effbot (inactive) wsgiref pje xdrlib -xml loewis +xml.dom +xml.dom.minidom +xml.dom.pulldom xml.etree effbot (inactive) +xml.parsers.expat +xml.sax +xml.sax.handler +xml.sax.saxutils +xml.sax.xmlreader xmlrpc loewis -zipfile +zipfile alanmcintyre zipimport zlib ================== =========== @@ -243,6 +255,7 @@ zlib Tool Maintainers ------------------ ----------- pybench lemburg +================== =========== ================== =========== @@ -268,6 +281,7 @@ algorithms ast/compiler ncoghlan, benjamin.peterson, brett.cannon, georg.brandl autoconf/makefiles bsd +bug tracker ezio.melotti buildbots bytecode pitrou data formats mark.dickinson, georg.brandl @@ -286,10 +300,9 @@ py3 transition benjamin.peterson release management tarek, lemburg, benjamin.peterson, barry, loewis, gvanrossum, anthonybaxter str.format eric.smith +testing michael.foord, pitrou, giampaolo.rodola +threads pitrou time and dates lemburg -testing michael.foord, pitrou -threads -tracker unicode lemburg, ezio.melotti, haypo version control ================== =========== diff --git a/Tools/scripts/2to3 b/Tools/scripts/2to3 index 2a447cffeaf..fbd4aa6b838 100755 --- a/Tools/scripts/2to3 +++ b/Tools/scripts/2to3 @@ -1,6 +1,5 @@ #!/usr/bin/env python -from lib2to3.main import main import sys -import os +from lib2to3.main import main sys.exit(main("lib2to3.fixes"))