Commit f47ed4a0 authored by Benjamin Peterson's avatar Benjamin Peterson

Merged revisions...

Merged revisions 70912,70944,70968,71033,71041,71208,71263,71286,71395-71396,71405-71406,71485,71492,71494 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r70912 | georg.brandl | 2009-03-31 17:35:46 -0500 (Tue, 31 Mar 2009) | 1 line

  #5617: add a handy function to print a unicode string to gdbinit.
........
  r70944 | georg.brandl | 2009-03-31 23:32:39 -0500 (Tue, 31 Mar 2009) | 1 line

  #5631: add upload to list of possible commands, which is presented in --help-commands.
........
  r70968 | michael.foord | 2009-04-01 13:25:38 -0500 (Wed, 01 Apr 2009) | 1 line

  Adding Wing project file
........
  r71033 | brett.cannon | 2009-04-01 22:34:53 -0500 (Wed, 01 Apr 2009) | 3 lines

  Fix two issues introduced by issue #71031 by changing the signature of
  PyImport_AppendInittab() to take a const char *.
........
  r71041 | jesse.noller | 2009-04-02 00:17:26 -0500 (Thu, 02 Apr 2009) | 1 line

  Add custom initializer argument to multiprocess.Manager*, courtesy of lekma
........
  r71208 | michael.foord | 2009-04-04 20:15:01 -0500 (Sat, 04 Apr 2009) | 4 lines

  Change the way unittest.TestSuite use their tests to always access them through iteration. Non behavior changing, this allows you to create custom subclasses that override __iter__.

  Issue #5693
........
  r71263 | michael.foord | 2009-04-05 14:19:28 -0500 (Sun, 05 Apr 2009) | 4 lines

  Adding assertIs and assertIsNot methods to unittest.TestCase

  Issue #2578
........
  r71286 | tarek.ziade | 2009-04-05 17:04:38 -0500 (Sun, 05 Apr 2009) | 1 line

  added a simplest test to distutils.spawn._nt_quote_args
........
  r71395 | benjamin.peterson | 2009-04-08 08:27:29 -0500 (Wed, 08 Apr 2009) | 1 line

  these must be installed to correctly run tests
........
  r71396 | benjamin.peterson | 2009-04-08 08:29:41 -0500 (Wed, 08 Apr 2009) | 1 line

  fix syntax
........
  r71405 | andrew.kuchling | 2009-04-09 06:22:47 -0500 (Thu, 09 Apr 2009) | 1 line

  Add items
........
  r71406 | andrew.kuchling | 2009-04-09 06:23:36 -0500 (Thu, 09 Apr 2009) | 1 line

  Typo fixes
........
  r71485 | andrew.kuchling | 2009-04-11 11:12:23 -0500 (Sat, 11 Apr 2009) | 1 line

  Add various items
........
  r71492 | georg.brandl | 2009-04-11 13:19:27 -0500 (Sat, 11 Apr 2009) | 1 line

  Take credit for a patch of mine.
........
  r71494 | benjamin.peterson | 2009-04-11 14:31:00 -0500 (Sat, 11 Apr 2009) | 1 line

  ignore py3_test_grammar when compiling the library
........
parent a0a7faab
...@@ -1128,9 +1128,10 @@ their parent process exits. The manager classes are defined in the ...@@ -1128,9 +1128,10 @@ their parent process exits. The manager classes are defined in the
``current_process().authkey``. Otherwise *authkey* is used and it ``current_process().authkey``. Otherwise *authkey* is used and it
must be a string. must be a string.
.. method:: start() .. method:: start([initializer[, initargs]])
Start a subprocess to start the manager. Start a subprocess to start the manager. If *initializer* is not ``None``
then the subprocess will call ``initializer(*initargs)`` when it starts.
.. method:: serve_forever() .. method:: serve_forever()
......
...@@ -689,7 +689,7 @@ Test cases ...@@ -689,7 +689,7 @@ Test cases
assertLessEqual(first, second, msg=None) assertLessEqual(first, second, msg=None)
Test that *first* is respectively >, >=, < or <= than *second* depending Test that *first* is respectively >, >=, < or <= than *second* depending
on the method name. If not, the test will fail with the nice explanation on the method name. If not, the test will fail with an explanation
or with the explanation given by *msg*:: or with the explanation given by *msg*::
>>> self.assertGreaterEqual(3, 4) >>> self.assertGreaterEqual(3, 4)
...@@ -722,7 +722,7 @@ Test cases ...@@ -722,7 +722,7 @@ Test cases
.. method:: assertIn(first, second, msg=None) .. method:: assertIn(first, second, msg=None)
assertNotIn(first, second, msg=None) assertNotIn(first, second, msg=None)
Tests that *first* is or is not in *second* with a nice explanitory error Tests that *first* is or is not in *second* with an explanatory error
message as appropriate. message as appropriate.
If specified *msg* will be used as the error message on failure. If specified *msg* will be used as the error message on failure.
...@@ -766,7 +766,7 @@ Test cases ...@@ -766,7 +766,7 @@ Test cases
.. method:: assertDictContainsSubset(expected, actual, msg=None) .. method:: assertDictContainsSubset(expected, actual, msg=None)
Tests whether the key value pairs in dictionary *actual* are a Tests whether the key/value pairs in dictionary *actual* are a
superset of those in *expected*. If not, an error message listing superset of those in *expected*. If not, an error message listing
the missing keys and mismatched values is generated. the missing keys and mismatched values is generated.
...@@ -858,6 +858,23 @@ Test cases ...@@ -858,6 +858,23 @@ Test cases
.. versionadded:: 3.1 .. versionadded:: 3.1
.. method:: assertIs(expr1, expr2[, msg])
This signals a test failure if *expr1* and *expr2* don't evaluate to the same
object.
.. versionadded:: 2.7
.. method:: assertIsNot(expr1, expr2[, msg])
The inverse of the :meth:`assertIs` method.
This signals a test failure if *expr1* and *expr2* evaluate to the same
object.
.. versionadded:: 2.7
.. method:: assertFalse(expr[, msg]) .. method:: assertFalse(expr[, msg])
failIf(expr[, msg]) failIf(expr[, msg])
...@@ -951,12 +968,12 @@ Test cases ...@@ -951,12 +968,12 @@ Test cases
been asked to compare are exactly *typeobj* (not subclasses). been asked to compare are exactly *typeobj* (not subclasses).
*function* must take two positional arguments and a third msg=None *function* must take two positional arguments and a third msg=None
keyword argument just as :meth:`assertEqual` does. It must raise keyword argument just as :meth:`assertEqual` does. It must raise
self.failureException when inequality between the first two ``self.failureException`` when inequality between the first two
parameters is detected. parameters is detected.
One good use of custom equality checking functions for a type One good use of custom equality checking functions for a type
is to raise self.failureException with an error message useful is to raise ``self.failureException`` with an error message useful
for debugging the by explaining the inequalities in detail. for debugging the problem by explaining the inequalities in detail.
.. versionadded:: 3.1 .. versionadded:: 3.1
......
This diff is collapsed.
...@@ -23,6 +23,7 @@ __all__ = ['build', ...@@ -23,6 +23,7 @@ __all__ = ['build',
'bdist_rpm', 'bdist_rpm',
'bdist_wininst', 'bdist_wininst',
'check', 'check',
'upload',
# These two are reserved for future use: # These two are reserved for future use:
#'bdist_sdux', #'bdist_sdux',
#'bdist_pkgtool', #'bdist_pkgtool',
......
...@@ -27,8 +27,9 @@ try: ...@@ -27,8 +27,9 @@ try:
self.messages.append((level, message, children, kwargs)) self.messages.append((level, message, children, kwargs))
HAS_DOCUTILS = True HAS_DOCUTILS = True
except ImportError: except Exception:
# docutils is not installed # Catch all exceptions because exceptions besides ImportError probably
# indicate that docutils is not ported to Py3k.
HAS_DOCUTILS = False HAS_DOCUTILS = False
class check(Command): class check(Command):
......
"""Tests for distutils.spawn."""
import unittest
from distutils.spawn import _nt_quote_args
class SpawnTestCase(unittest.TestCase):
def test_nt_quote_args(self):
for (args, wanted) in ((['with space', 'nospace'],
['"with space"', 'nospace']),
(['nochange', 'nospace'],
['nochange', 'nospace'])):
res = _nt_quote_args(args)
self.assertEquals(res, wanted)
def test_suite():
return unittest.makeSuite(SpawnTestCase)
if __name__ == "__main__":
unittest.main(defaultTest="test_suite")
...@@ -478,12 +478,15 @@ class BaseManager(object): ...@@ -478,12 +478,15 @@ class BaseManager(object):
dispatch(conn, None, 'dummy') dispatch(conn, None, 'dummy')
self._state.value = State.STARTED self._state.value = State.STARTED
def start(self): def start(self, initializer=None, initargs=()):
''' '''
Spawn a server process for this manager object Spawn a server process for this manager object
''' '''
assert self._state.value == State.INITIAL assert self._state.value == State.INITIAL
if initializer is not None and not hasattr(initializer, '__call__'):
raise TypeError('initializer must be a callable')
# pipe over which we will retrieve address of server # pipe over which we will retrieve address of server
reader, writer = connection.Pipe(duplex=False) reader, writer = connection.Pipe(duplex=False)
...@@ -491,7 +494,7 @@ class BaseManager(object): ...@@ -491,7 +494,7 @@ class BaseManager(object):
self._process = Process( self._process = Process(
target=type(self)._run_server, target=type(self)._run_server,
args=(self._registry, self._address, self._authkey, args=(self._registry, self._address, self._authkey,
self._serializer, writer), self._serializer, writer, initializer, initargs),
) )
ident = ':'.join(str(i) for i in self._process._identity) ident = ':'.join(str(i) for i in self._process._identity)
self._process.name = type(self).__name__ + '-' + ident self._process.name = type(self).__name__ + '-' + ident
...@@ -512,10 +515,14 @@ class BaseManager(object): ...@@ -512,10 +515,14 @@ class BaseManager(object):
) )
@classmethod @classmethod
def _run_server(cls, registry, address, authkey, serializer, writer): def _run_server(cls, registry, address, authkey, serializer, writer,
initializer=None, initargs=()):
''' '''
Create a server, report its address and run it Create a server, report its address and run it
''' '''
if initializer is not None:
initializer(*initargs)
# create server # create server
server = cls._Server(registry, address, authkey, serializer) server = cls._Server(registry, address, authkey, serializer)
......
...@@ -92,6 +92,9 @@ class Pool(object): ...@@ -92,6 +92,9 @@ class Pool(object):
except NotImplementedError: except NotImplementedError:
processes = 1 processes = 1
if initializer is not None and not hasattr(initializer, '__call__'):
raise TypeError('initializer must be a callable')
self._pool = [] self._pool = []
for i in range(processes): for i in range(processes):
w = self.Process( w = self.Process(
......
...@@ -1832,7 +1832,37 @@ class OtherTest(unittest.TestCase): ...@@ -1832,7 +1832,37 @@ class OtherTest(unittest.TestCase):
multiprocessing.connection.answer_challenge, multiprocessing.connection.answer_challenge,
_FakeConnection(), b'abc') _FakeConnection(), b'abc')
testcases_other = [OtherTest, TestInvalidHandle] #
# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585
#
def initializer(ns):
ns.test += 1
class TestInitializers(unittest.TestCase):
def setUp(self):
self.mgr = multiprocessing.Manager()
self.ns = self.mgr.Namespace()
self.ns.test = 0
def tearDown(self):
self.mgr.shutdown()
def test_manager_initializer(self):
m = multiprocessing.managers.SyncManager()
self.assertRaises(TypeError, m.start, 1)
m.start(initializer, (self.ns,))
self.assertEqual(self.ns.test, 1)
m.shutdown()
def test_pool_initializer(self):
self.assertRaises(TypeError, multiprocessing.Pool, initializer=1)
p = multiprocessing.Pool(1, initializer, (self.ns,))
p.close()
p.join()
self.assertEqual(self.ns.test, 1)
testcases_other = [OtherTest, TestInvalidHandle, TestInitializers]
# #
# #
......
...@@ -2311,6 +2311,16 @@ class Test_TestCase(TestCase, TestEquality, TestHashing): ...@@ -2311,6 +2311,16 @@ class Test_TestCase(TestCase, TestEquality, TestHashing):
# from this TestCase instance but since its a local nothing else # from this TestCase instance but since its a local nothing else
# will ever notice that. # will ever notice that.
def testAssertIs(self):
thing = object()
self.assertIs(thing, thing)
self.assertRaises(self.failureException, self.assertIs, thing, object())
def testAssertIsNot(self):
thing = object()
self.assertIsNot(thing, object())
self.assertRaises(self.failureException, self.assertIsNot, thing, thing)
def testAssertIn(self): def testAssertIn(self):
animals = {'monkey': 'banana', 'cow': 'grass', 'seal': 'fish'} animals = {'monkey': 'banana', 'cow': 'grass', 'seal': 'fish'}
...@@ -2454,6 +2464,7 @@ class Test_TestCase(TestCase, TestEquality, TestHashing): ...@@ -2454,6 +2464,7 @@ class Test_TestCase(TestCase, TestEquality, TestHashing):
# Test that sequences of unhashable objects can be tested for sameness: # Test that sequences of unhashable objects can be tested for sameness:
self.assertSameElements([[1, 2], [3, 4]], [[3, 4], [1, 2]]) self.assertSameElements([[1, 2], [3, 4]], [[3, 4], [1, 2]])
self.assertSameElements([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}]) self.assertSameElements([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}])
self.assertRaises(self.failureException, self.assertSameElements, self.assertRaises(self.failureException, self.assertSameElements,
[[1]], [[2]]) [[1]], [[2]])
...@@ -2988,6 +2999,18 @@ class TestLongMessage(TestCase): ...@@ -2988,6 +2999,18 @@ class TestLongMessage(TestCase):
"^unexpectedly None$", "^unexpectedly None$",
"^unexpectedly None : oops$"]) "^unexpectedly None : oops$"])
def testAssertIs(self):
self.assertMessages('assertIs', (None, 'foo'),
["^None is not 'foo'$", "^oops$",
"^None is not 'foo'$",
"^None is not 'foo' : oops$"])
def testAssertIsNot(self):
self.assertMessages('assertIsNot', (None, None),
["^unexpectedly identical: None$", "^oops$",
"^unexpectedly identical: None$",
"^unexpectedly identical: None : oops$"])
###################################################################### ######################################################################
## Main ## Main
......
...@@ -807,6 +807,18 @@ class TestCase(object): ...@@ -807,6 +807,18 @@ class TestCase(object):
standardMsg = '%r unexpectedly found in %r' % (member, container) standardMsg = '%r unexpectedly found in %r' % (member, container)
self.fail(self._formatMessage(msg, standardMsg)) self.fail(self._formatMessage(msg, standardMsg))
def assertIs(self, expr1, expr2, msg=None):
"""Just like self.assertTrue(a is b), but with a nicer default message."""
if expr1 is not expr2:
standardMsg = '%r is not %r' % (expr1, expr2)
self.fail(self._formatMessage(msg, standardMsg))
def assertIsNot(self, expr1, expr2, msg=None):
"""Just like self.assertTrue(a is not b), but with a nicer default message."""
if expr1 is expr2:
standardMsg = 'unexpectedly identical: %r' % (expr1,)
self.fail(self._formatMessage(msg, standardMsg))
def assertDictEqual(self, d1, d2, msg=None): def assertDictEqual(self, d1, d2, msg=None):
self.assert_(isinstance(d1, dict), 'First argument is not a dictionary') self.assert_(isinstance(d1, dict), 'First argument is not a dictionary')
self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary') self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary')
...@@ -1020,7 +1032,7 @@ class TestSuite(object): ...@@ -1020,7 +1032,7 @@ class TestSuite(object):
self.addTests(tests) self.addTests(tests)
def __repr__(self): def __repr__(self):
return "<%s tests=%s>" % (_strclass(self.__class__), self._tests) return "<%s tests=%s>" % (_strclass(self.__class__), list(self))
def __eq__(self, other): def __eq__(self, other):
if not isinstance(other, self.__class__): if not isinstance(other, self.__class__):
...@@ -1035,7 +1047,7 @@ class TestSuite(object): ...@@ -1035,7 +1047,7 @@ class TestSuite(object):
def countTestCases(self): def countTestCases(self):
cases = 0 cases = 0
for test in self._tests: for test in self:
cases += test.countTestCases() cases += test.countTestCases()
return cases return cases
...@@ -1055,7 +1067,7 @@ class TestSuite(object): ...@@ -1055,7 +1067,7 @@ class TestSuite(object):
self.addTest(test) self.addTest(test)
def run(self, result): def run(self, result):
for test in self._tests: for test in self:
if result.shouldStop: if result.shouldStop:
break break
test(result) test(result)
...@@ -1066,7 +1078,7 @@ class TestSuite(object): ...@@ -1066,7 +1078,7 @@ class TestSuite(object):
def debug(self): def debug(self):
"""Run the tests without collecting errors in a TestResult""" """Run the tests without collecting errors in a TestResult"""
for test in self._tests: for test in self:
test.debug() test.debug()
......
...@@ -841,6 +841,7 @@ LIBSUBDIRS= tkinter site-packages test test/output test/data \ ...@@ -841,6 +841,7 @@ LIBSUBDIRS= tkinter site-packages test test/output test/data \
sqlite3 sqlite3/test \ sqlite3 sqlite3/test \
logging bsddb bsddb/test csv wsgiref urllib \ logging bsddb bsddb/test csv wsgiref urllib \
lib2to3 lib2to3/fixes lib2to3/pgen2 lib2to3/tests \ lib2to3 lib2to3/fixes lib2to3/pgen2 lib2to3/tests \
lib2to3/tests/data lib2to3/tests/data/fixes lib2to3/tests/data/fixers/myfixes \
ctypes ctypes/test ctypes/macholib idlelib idlelib/Icons \ ctypes ctypes/test ctypes/macholib idlelib idlelib/Icons \
distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \ distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \
importlib importlib/test importlib/test/builtin \ importlib importlib/test importlib/test/builtin \
...@@ -908,11 +909,13 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) ...@@ -908,11 +909,13 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR)
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ ./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
-d $(LIBDEST) -f \ -d $(LIBDEST) -f \
-x 'bad_coding|badsyntax|site-packages' $(DESTDIR)$(LIBDEST) -x 'bad_coding|badsyntax|site-packages|py2_test_grammar' \
$(DESTDIR)$(LIBDEST)
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
./$(BUILDPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \ ./$(BUILDPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
-d $(LIBDEST) -f \ -d $(LIBDEST) -f \
-x 'bad_coding|badsyntax|site-packages' $(DESTDIR)$(LIBDEST) -x 'bad_coding|badsyntax|site-packages|py2_test_grammar' \
$(DESTDIR)$(LIBDEST)
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ ./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
-d $(LIBDEST)/site-packages -f \ -d $(LIBDEST)/site-packages -f \
......
...@@ -21,6 +21,7 @@ PURIFY.README Information for Purify users ...@@ -21,6 +21,7 @@ PURIFY.README Information for Purify users
pymemcompat.h Memory interface compatibility file. pymemcompat.h Memory interface compatibility file.
python.man UNIX man page for the python interpreter python.man UNIX man page for the python interpreter
python-mode.el Emacs mode for editing Python programs python-mode.el Emacs mode for editing Python programs
python-wing.wpr Wing IDE project file
README The file you're reading now README The file you're reading now
README.valgrind Information for Valgrind users, see valgrind-python.supp README.valgrind Information for Valgrind users, see valgrind-python.supp
RFD Request For Discussion about a Python newsgroup RFD Request For Discussion about a Python newsgroup
......
...@@ -138,3 +138,16 @@ define pystackv ...@@ -138,3 +138,16 @@ define pystackv
end end
select-frame 0 select-frame 0
end end
# generally useful macro to print a Unicode string
def pu
set $uni = $arg0
set $i = 0
while (*$uni && $i++<100)
if (*$uni < 0x80)
print *(char*)$uni++
else
print /x *(short*)$uni++
end
end
end
#!wing
#!version=3.0
##################################################################
# Wing IDE project file #
##################################################################
[project attributes]
proj.directory-list = [{'dirloc': loc('..'),
'excludes': (),
'filter': '*',
'include_hidden': False,
'recursive': True,
'watch_for_changes': True}]
proj.file-type = 'shared'
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment