[Python-3000-checkins] r57113 - in python/branches/py3k: Doc/tools/roman.py Lib/decimal.py Lib/test/test_exceptions.py Lib/test/test_import.py Lib/test/test_macostools.py Lib/test/test_pep352.py Lib/test/test_random.py Lib/test/test_re.py Lib/test/test_struct.py Lib/test/test_sundry.py Lib/test/test_support.py Lib/test/test_warnings.py Lib/test/test_xmlrpc.py Misc/build.sh Misc/developers.txt Tools/msi/msi.py

guido.van.rossum python-3000-checkins at python.org
Fri Aug 17 01:48:47 CEST 2007


Author: guido.van.rossum
Date: Fri Aug 17 01:48:43 2007
New Revision: 57113

Added:
   python/branches/py3k/Doc/tools/roman.py   (contents, props changed)
Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Lib/decimal.py
   python/branches/py3k/Lib/test/test_exceptions.py
   python/branches/py3k/Lib/test/test_import.py
   python/branches/py3k/Lib/test/test_macostools.py
   python/branches/py3k/Lib/test/test_pep352.py
   python/branches/py3k/Lib/test/test_random.py
   python/branches/py3k/Lib/test/test_re.py
   python/branches/py3k/Lib/test/test_struct.py
   python/branches/py3k/Lib/test/test_sundry.py
   python/branches/py3k/Lib/test/test_support.py
   python/branches/py3k/Lib/test/test_warnings.py
   python/branches/py3k/Lib/test/test_xmlrpc.py
   python/branches/py3k/Misc/build.sh
   python/branches/py3k/Misc/developers.txt
   python/branches/py3k/Tools/msi/msi.py
Log:
First merge from the trunk straight into the py3k branch.  I'm not
using the message generated by svnmerge, because it contains a lot of
stuff about the Doc tree, which I'm not merging this time due to the
way the Doc tree was initially added.  I am however adding roman.py
which was added later to Doc/tools.  I'll try to diff the two Doc
trees separately to see if there's stuff I missed.


Added: python/branches/py3k/Doc/tools/roman.py
==============================================================================
--- (empty file)
+++ python/branches/py3k/Doc/tools/roman.py	Fri Aug 17 01:48:43 2007
@@ -0,0 +1,80 @@
+"""Convert to and from Roman numerals"""
+
+__author__ = "Mark Pilgrim (f8dy at diveintopython.org)"
+__version__ = "1.4"
+__date__ = "8 August 2001"
+__copyright__ = """Copyright (c) 2001 Mark Pilgrim
+
+This program is part of "Dive Into Python", a free Python tutorial for
+experienced programmers.  Visit http://diveintopython.org/ for the
+latest version.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the Python 2.1.1 license, available at
+http://www.python.org/2.1.1/license.html
+"""
+
+import re
+
+#Define exceptions
+class RomanError(Exception): pass
+class OutOfRangeError(RomanError): pass
+class NotIntegerError(RomanError): pass
+class InvalidRomanNumeralError(RomanError): pass
+
+#Define digit mapping
+romanNumeralMap = (('M',  1000),
+                   ('CM', 900),
+                   ('D',  500),
+                   ('CD', 400),
+                   ('C',  100),
+                   ('XC', 90),
+                   ('L',  50),
+                   ('XL', 40),
+                   ('X',  10),
+                   ('IX', 9),
+                   ('V',  5),
+                   ('IV', 4),
+                   ('I',  1))
+
+def toRoman(n):
+    """convert integer to Roman numeral"""
+    if not (0 < n < 5000):
+        raise OutOfRangeError, "number out of range (must be 1..4999)"
+    if int(n) <> n:
+        raise NotIntegerError, "decimals can not be converted"
+
+    result = ""
+    for numeral, integer in romanNumeralMap:
+        while n >= integer:
+            result += numeral
+            n -= integer
+    return result
+
+#Define pattern to detect valid Roman numerals
+romanNumeralPattern = re.compile("""
+    ^                   # beginning of string
+    M{0,4}              # thousands - 0 to 4 M's
+    (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
+                        #            or 500-800 (D, followed by 0 to 3 C's)
+    (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
+                        #        or 50-80 (L, followed by 0 to 3 X's)
+    (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
+                        #        or 5-8 (V, followed by 0 to 3 I's)
+    $                   # end of string
+    """ ,re.VERBOSE)
+
+def fromRoman(s):
+    """convert Roman numeral to integer"""
+    if not s:
+        raise InvalidRomanNumeralError, 'Input can not be blank'
+    if not romanNumeralPattern.search(s):
+        raise InvalidRomanNumeralError, 'Invalid Roman numeral: %s' % s
+
+    result = 0
+    index = 0
+    for numeral, integer in romanNumeralMap:
+        while s[index:index+len(numeral)] == numeral:
+            result += integer
+            index += len(numeral)
+    return result

Modified: python/branches/py3k/Lib/decimal.py
==============================================================================
--- python/branches/py3k/Lib/decimal.py	(original)
+++ python/branches/py3k/Lib/decimal.py	Fri Aug 17 01:48:43 2007
@@ -612,7 +612,8 @@
             except ValueError:
                 self._is_special = True
                 self._sign, self._int, self._exp = \
-                                        context._raise_error(ConversionSyntax)
+                              context._raise_error(ConversionSyntax,
+                                  "Invalid literal for Decimal: %r" % value)
             return self
 
         raise TypeError("Cannot convert %r to Decimal" % value)

Modified: python/branches/py3k/Lib/test/test_exceptions.py
==============================================================================
--- python/branches/py3k/Lib/test/test_exceptions.py	(original)
+++ python/branches/py3k/Lib/test/test_exceptions.py	Fri Aug 17 01:48:43 2007
@@ -5,8 +5,7 @@
 import unittest
 import pickle
 
-from test.test_support import (TESTFN, unlink, run_unittest,
-                                guard_warnings_filter)
+from test.test_support import TESTFN, unlink, run_unittest
 
 # XXX This is not really enough, each *operation* should be tested!
 

Modified: python/branches/py3k/Lib/test/test_import.py
==============================================================================
--- python/branches/py3k/Lib/test/test_import.py	(original)
+++ python/branches/py3k/Lib/test/test_import.py	Fri Aug 17 01:48:43 2007
@@ -1,4 +1,4 @@
-from test.test_support import TESTFN, run_unittest, guard_warnings_filter
+from test.test_support import TESTFN, run_unittest, catch_warning
 
 import unittest
 import os
@@ -151,7 +151,7 @@
         self.assert_(y is test.test_support, y.__name__)
 
     def test_import_initless_directory_warning(self):
-        with guard_warnings_filter():
+        with catch_warning():
             # Just a random non-package directory we always expect to be
             # somewhere in sys.path...
             warnings.simplefilter('error', ImportWarning)

Modified: python/branches/py3k/Lib/test/test_macostools.py
==============================================================================
--- python/branches/py3k/Lib/test/test_macostools.py	(original)
+++ python/branches/py3k/Lib/test/test_macostools.py	Fri Aug 17 01:48:43 2007
@@ -52,7 +52,7 @@
     def test_touched(self):
         # This really only tests that nothing unforeseen happens.
         import warnings
-        with test_support.guard_warnings_filter():
+        with test_support.catch_warning():
             warnings.filterwarnings('ignore', 'macostools.touched*',
                                     DeprecationWarning)
             macostools.touched(test_support.TESTFN)

Modified: python/branches/py3k/Lib/test/test_pep352.py
==============================================================================
--- python/branches/py3k/Lib/test/test_pep352.py	(original)
+++ python/branches/py3k/Lib/test/test_pep352.py	Fri Aug 17 01:48:43 2007
@@ -1,7 +1,7 @@
 import unittest
 import __builtin__
 import warnings
-from test.test_support import run_unittest, guard_warnings_filter
+from test.test_support import run_unittest
 import os
 from platform import system as platform_system
 

Modified: python/branches/py3k/Lib/test/test_random.py
==============================================================================
--- python/branches/py3k/Lib/test/test_random.py	(original)
+++ python/branches/py3k/Lib/test/test_random.py	Fri Aug 17 01:48:43 2007
@@ -182,7 +182,7 @@
 
     def test_bigrand(self):
         # Verify warnings are raised when randrange is too large for random()
-        with test_support.guard_warnings_filter():
+        with test_support.catch_warning():
             warnings.filterwarnings("error", "Underlying random")
             self.assertRaises(UserWarning, self.gen.randrange, 2**60)
 

Modified: python/branches/py3k/Lib/test/test_re.py
==============================================================================
--- python/branches/py3k/Lib/test/test_re.py	(original)
+++ python/branches/py3k/Lib/test/test_re.py	Fri Aug 17 01:48:43 2007
@@ -1,7 +1,7 @@
 import sys
 sys.path = ['.'] + sys.path
 
-from test.test_support import verbose, run_unittest, guard_warnings_filter
+from test.test_support import verbose, run_unittest, catch_warning
 import re
 from re import Scanner
 import sys, os, traceback
@@ -414,7 +414,7 @@
         self.pickle_test(pickle)
         # old pickles expect the _compile() reconstructor in sre module
         import warnings
-        with guard_warnings_filter():
+        with catch_warning():
             warnings.filterwarnings("ignore", "The sre module is deprecated",
                                     DeprecationWarning)
             from sre import _compile

Modified: python/branches/py3k/Lib/test/test_struct.py
==============================================================================
--- python/branches/py3k/Lib/test/test_struct.py	(original)
+++ python/branches/py3k/Lib/test/test_struct.py	Fri Aug 17 01:48:43 2007
@@ -50,7 +50,7 @@
 
 def with_warning_restore(func):
     def _with_warning_restore(*args, **kw):
-        with test.test_support.guard_warnings_filter():
+        with test.test_support.catch_warning():
             # Grrr, we need this function to warn every time.  Without removing
             # the warningregistry, running test_tarfile then test_struct would fail
             # on 64-bit platforms.

Modified: python/branches/py3k/Lib/test/test_sundry.py
==============================================================================
--- python/branches/py3k/Lib/test/test_sundry.py	(original)
+++ python/branches/py3k/Lib/test/test_sundry.py	Fri Aug 17 01:48:43 2007
@@ -1,10 +1,10 @@
 """Do a minimal test of all the modules that aren't otherwise tested."""
 
-from test.test_support import guard_warnings_filter
+from test.test_support import catch_warning
 import sys
 import warnings
 
-with guard_warnings_filter():
+with catch_warning():
     from test.test_support import verbose
 
     import BaseHTTPServer

Modified: python/branches/py3k/Lib/test/test_support.py
==============================================================================
--- python/branches/py3k/Lib/test/test_support.py	(original)
+++ python/branches/py3k/Lib/test/test_support.py	Fri Aug 17 01:48:43 2007
@@ -261,14 +261,6 @@
     fn, _ = urllib.urlretrieve(url, filename)
     return open(fn)
 
- at contextlib.contextmanager
-def guard_warnings_filter():
-    """Guard the warnings filter from being permanently changed."""
-    original_filters = warnings.filters[:]
-    try:
-        yield
-    finally:
-        warnings.filters = original_filters
 
 class WarningMessage(object):
     "Holds the result of the latest showwarning() call"
@@ -292,7 +284,7 @@
 
     Use like this:
 
-        with catch_warning as w:
+        with catch_warning() as w:
             warnings.warn("foo")
             assert str(w.message) == "foo"
     """

Modified: python/branches/py3k/Lib/test/test_warnings.py
==============================================================================
--- python/branches/py3k/Lib/test/test_warnings.py	(original)
+++ python/branches/py3k/Lib/test/test_warnings.py	Fri Aug 17 01:48:43 2007
@@ -61,7 +61,7 @@
     def test_options(self):
         # Uses the private _setoption() function to test the parsing
         # of command-line warning arguments
-        with test_support.guard_warnings_filter():
+        with test_support.catch_warning():
             self.assertRaises(warnings._OptionError,
                               warnings._setoption, '1:2:3:4:5:6')
             self.assertRaises(warnings._OptionError,

Modified: python/branches/py3k/Lib/test/test_xmlrpc.py
==============================================================================
--- python/branches/py3k/Lib/test/test_xmlrpc.py	(original)
+++ python/branches/py3k/Lib/test/test_xmlrpc.py	Fri Aug 17 01:48:43 2007
@@ -4,6 +4,8 @@
 import time
 import unittest
 import xmlrpclib
+import SimpleXMLRPCServer
+import threading
 from test import test_support
 
 alist = [{'astring': 'foo at bar.baz.spam',
@@ -239,10 +241,108 @@
         self.assertEqual(str(t2), d)
 
 
+PORT = None
+
+def http_server(evt, numrequests):
+    class TestInstanceClass:
+        def div(self, x, y):
+            '''This is the div function'''
+            return x // y
+
+
+    serv = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 0),
+                    logRequests=False, bind_and_activate=False)
+
+    try:
+        serv.socket.settimeout(3)
+        serv.server_bind()
+        global PORT
+        PORT = serv.socket.getsockname()[1]
+        serv.server_activate()
+        serv.register_introspection_functions()
+        serv.register_multicall_functions()
+        serv.register_function(pow)
+        serv.register_function(lambda x,y: x+y, 'add')
+        serv.register_instance(TestInstanceClass())
+
+        # handle up to 'numrequests' requests
+        while numrequests > 0:
+            serv.handle_request()
+            numrequests -= 1
+
+    except socket.timeout:
+        pass
+    finally:
+        serv.socket.close()
+        PORT = None
+        evt.set()
+
+
+class HTTPTestCase(unittest.TestCase):
+    def setUp(self):
+        self.evt = threading.Event()
+        # start server thread to handle just one request
+        threading.Thread(target=http_server, args=(self.evt,2)).start()
+
+        # wait for port to be assigned to server
+        n = 1000
+        while n > 0 and PORT is None:
+            time.sleep(0.001)
+            n -= 1
+
+        time.sleep(0.5)
+
+    def tearDown(self):
+        # wait on the server thread to terminate
+        self.evt.wait()
+
+    def test_simple1(self):
+        p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
+        self.assertEqual(p.pow(6,8), 6**8)
+
+    def test_introspection1(self):
+        p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
+        meth = p.system.listMethods()
+        expected_methods = set(['pow', 'div', 'add', 'system.listMethods',
+            'system.methodHelp', 'system.methodSignature', 'system.multicall'])
+        self.assertEqual(set(meth), expected_methods)
+
+    def test_introspection2(self):
+        p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
+        divhelp = p.system.methodHelp('div')
+        self.assertEqual(divhelp, 'This is the div function')
+
+    def test_introspection3(self):
+        # the SimpleXMLRPCServer doesn't support signatures, but
+        # at least check that we can try
+        p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
+        divsig = p.system.methodSignature('div')
+        self.assertEqual(divsig, 'signatures not supported')
+
+    def test_multicall(self):
+        p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
+        multicall = xmlrpclib.MultiCall(p)
+        multicall.add(2,3)
+        multicall.pow(6,8)
+        multicall.div(127,42)
+        add_result, pow_result, div_result = multicall()
+        self.assertEqual(add_result, 2+3)
+        self.assertEqual(pow_result, 6**8)
+        self.assertEqual(div_result, 127//42)
+
+
 def test_main():
-    test_support.run_unittest(XMLRPCTestCase, HelperTestCase,
-            DateTimeTestCase, BinaryTestCase, FaultTestCase)
+    xmlrpc_tests = [XMLRPCTestCase, HelperTestCase, DateTimeTestCase,
+         BinaryTestCase, FaultTestCase]
+
+    # The test cases against a SimpleXMLRPCServer raise a socket error
+    # 10035 (WSAEWOULDBLOCK) in the server thread handle_request call when
+    # run on Windows. This only happens on the first test to run, but it
+    # fails every time and so these tests are skipped on win32 platforms.
+    if sys.platform != 'win32':
+        xmlrpc_tests.append(HTTPTestCase)
 
+    test_support.run_unittest(*xmlrpc_tests)
 
 if __name__ == "__main__":
     test_main()

Modified: python/branches/py3k/Misc/build.sh
==============================================================================
--- python/branches/py3k/Misc/build.sh	(original)
+++ python/branches/py3k/Misc/build.sh	Fri Aug 17 01:48:43 2007
@@ -220,7 +220,6 @@
 # after the first release of 2.6a1 or 3.0a1.  At that point, it will be clear
 # if there will be a similar problem with the new doc system.
 
-# At that point, it should be clear if this code is needed or not.
 # Doc/commontex/boilerplate.tex is expected to always have an outstanding
 # modification for the date.  When a release is cut, a conflict occurs.
 # This allows us to detect this problem and not try to build the docs

Modified: python/branches/py3k/Misc/developers.txt
==============================================================================
--- python/branches/py3k/Misc/developers.txt	(original)
+++ python/branches/py3k/Misc/developers.txt	Fri Aug 17 01:48:43 2007
@@ -17,13 +17,14 @@
 Permissions History
 -------------------
 
-- Senthil Kumaran  was given SVN access on June 16 2007
-  by MvL, for his Summer-of-Code project, mentored by
-  Skip Montanaro.
-
-- Alexandre Vassalotti was given SVN access on May 21 2007
-  by MvL, for his Summer-of-Code project, mentored by
-  Brett Cannon.
+- Jeffrey Yasskin was given SVN access on 9 August 2007 by NCN,
+  for his work on PEPs and other general patches. 
+
+- Senthil Kumaran was given SVN access on 16 June 2007 by MvL,
+  for his Summer-of-Code project, mentored by Skip Montanaro.
+
+- Alexandre Vassalotti was given SVN access on 21 May 2007 by MvL,
+  for his Summer-of-Code project, mentored by Brett Cannon.
 
 - Travis Oliphant was given SVN access on 17 Apr 2007 by MvL,
   for implementing the extended buffer protocol.

Modified: python/branches/py3k/Tools/msi/msi.py
==============================================================================
--- python/branches/py3k/Tools/msi/msi.py	(original)
+++ python/branches/py3k/Tools/msi/msi.py	Fri Aug 17 01:48:43 2007
@@ -104,6 +104,7 @@
 pythondll_uuid = {
     "24":"{9B81E618-2301-4035-AC77-75D9ABEB7301}",
     "25":"{2e41b118-38bd-4c1b-a840-6977efd1b911}"
+    "26":"{34ebecac-f046-4e1c-b0e3-9bac3cdaacfa}",
     } [major+minor]
 
 # Build the mingw import library, libpythonXY.a


More information about the Python-3000-checkins mailing list