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
``current_process().authkey``. Otherwise *authkey* is used and it
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()
......
......@@ -689,7 +689,7 @@ Test cases
assertLessEqual(first, second, msg=None)
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*::
>>> self.assertGreaterEqual(3, 4)
......@@ -722,7 +722,7 @@ Test cases
.. method:: assertIn(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.
If specified *msg* will be used as the error message on failure.
......@@ -766,7 +766,7 @@ Test cases
.. 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
the missing keys and mismatched values is generated.
......@@ -858,6 +858,23 @@ Test cases
.. 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])
failIf(expr[, msg])
......@@ -951,12 +968,12 @@ Test cases
been asked to compare are exactly *typeobj* (not subclasses).
*function* must take two positional arguments and a third msg=None
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.
One good use of custom equality checking functions for a type
is to raise self.failureException with an error message useful
for debugging the by explaining the inequalities in detail.
is to raise ``self.failureException`` with an error message useful
for debugging the problem by explaining the inequalities in detail.
.. versionadded:: 3.1
......
This diff is collapsed.
......@@ -23,6 +23,7 @@ __all__ = ['build',
'bdist_rpm',
'bdist_wininst',
'check',
'upload',
# These two are reserved for future use:
#'bdist_sdux',
#'bdist_pkgtool',
......
......@@ -27,8 +27,9 @@ try:
self.messages.append((level, message, children, kwargs))
HAS_DOCUTILS = True
except ImportError:
# docutils is not installed
except Exception:
# Catch all exceptions because exceptions besides ImportError probably
# indicate that docutils is not ported to Py3k.
HAS_DOCUTILS = False
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):
dispatch(conn, None, 'dummy')
self._state.value = State.STARTED
def start(self):
def start(self, initializer=None, initargs=()):
'''
Spawn a server process for this manager object
'''
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
reader, writer = connection.Pipe(duplex=False)
......@@ -491,7 +494,7 @@ class BaseManager(object):
self._process = Process(
target=type(self)._run_server,
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)
self._process.name = type(self).__name__ + '-' + ident
......@@ -512,10 +515,14 @@ class BaseManager(object):
)
@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
'''
if initializer is not None:
initializer(*initargs)
# create server
server = cls._Server(registry, address, authkey, serializer)
......
......@@ -92,6 +92,9 @@ class Pool(object):
except NotImplementedError:
processes = 1
if initializer is not None and not hasattr(initializer, '__call__'):
raise TypeError('initializer must be a callable')
self._pool = []
for i in range(processes):
w = self.Process(
......
......@@ -1832,7 +1832,37 @@ class OtherTest(unittest.TestCase):
multiprocessing.connection.answer_challenge,
_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):
# from this TestCase instance but since its a local nothing else
# 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):
animals = {'monkey': 'banana', 'cow': 'grass', 'seal': 'fish'}
......@@ -2454,6 +2464,7 @@ class Test_TestCase(TestCase, TestEquality, TestHashing):
# Test that sequences of unhashable objects can be tested for sameness:
self.assertSameElements([[1, 2], [3, 4]], [[3, 4], [1, 2]])
self.assertSameElements([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}])
self.assertRaises(self.failureException, self.assertSameElements,
[[1]], [[2]])
......@@ -2988,6 +2999,18 @@ class TestLongMessage(TestCase):
"^unexpectedly None$",
"^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
......
......@@ -807,6 +807,18 @@ class TestCase(object):
standardMsg = '%r unexpectedly found in %r' % (member, container)
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):
self.assert_(isinstance(d1, dict), 'First argument is not a dictionary')
self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary')
......@@ -1020,7 +1032,7 @@ class TestSuite(object):
self.addTests(tests)
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):
if not isinstance(other, self.__class__):
......@@ -1035,7 +1047,7 @@ class TestSuite(object):
def countTestCases(self):
cases = 0
for test in self._tests:
for test in self:
cases += test.countTestCases()
return cases
......@@ -1055,7 +1067,7 @@ class TestSuite(object):
self.addTest(test)
def run(self, result):
for test in self._tests:
for test in self:
if result.shouldStop:
break
test(result)
......@@ -1066,7 +1078,7 @@ class TestSuite(object):
def debug(self):
"""Run the tests without collecting errors in a TestResult"""
for test in self._tests:
for test in self:
test.debug()
......
......@@ -841,6 +841,7 @@ LIBSUBDIRS= tkinter site-packages test test/output test/data \
sqlite3 sqlite3/test \
logging bsddb bsddb/test csv wsgiref urllib \
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 \
distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \
importlib importlib/test importlib/test/builtin \
......@@ -908,11 +909,13 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR)
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
-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) \
./$(BUILDPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
-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) \
./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
-d $(LIBDEST)/site-packages -f \
......
......@@ -21,6 +21,7 @@ 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-wing.wpr Wing IDE project file
README The file you're reading now
README.valgrind Information for Valgrind users, see valgrind-python.supp
RFD Request For Discussion about a Python newsgroup
......
......@@ -138,3 +138,16 @@ define pystackv
end
select-frame 0
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