From fdrake at gmail.com Sat Feb 11 05:40:24 2012 From: fdrake at gmail.com (Fred Drake) Date: Sat, 11 Feb 2012 00:40:24 -0500 (EST) Subject: [Zconfig] SVN: ZConfig/branches/LP-481512-reopen-logs/ZConfig/components/logger/tests/test_logger.py - capture ordering of calls to acquire/release Message-ID: <20120211054024.554D3941C9@cvs.zope.org> Log message for revision 124373: - capture ordering of calls to acquire/release - simplify test implementation Changed: U ZConfig/branches/LP-481512-reopen-logs/ZConfig/components/logger/tests/test_logger.py -=- Modified: ZConfig/branches/LP-481512-reopen-logs/ZConfig/components/logger/tests/test_logger.py =================================================================== --- ZConfig/branches/LP-481512-reopen-logs/ZConfig/components/logger/tests/test_logger.py 2012-02-10 21:44:53 UTC (rev 124372) +++ ZConfig/branches/LP-481512-reopen-logs/ZConfig/components/logger/tests/test_logger.py 2012-02-11 05:40:21 UTC (rev 124373) @@ -540,24 +540,19 @@ def test_filehandler_reopen_thread_safety(self): # The reopen method needs to do locking to avoid a race condition # with emit calls. For simplicity we replace the "acquire" and - # "release" calls with dummy method that counts its calls. - class FakeMethod(object): - def __init__(self): - self.call_count = 0 + # "release" methods with dummies that record calls to them. - def __call__(self): - self.call_count += 1 - fn = self.mktemp() h = self.handler_factory(fn) - h.acquire = FakeMethod() - h.release = FakeMethod() + calls = [] + h.acquire = lambda: calls.append("acquire") + h.release = lambda: calls.append("release") + h.reopen() h.close() - self.assertEqual(1, h.acquire.call_count) - self.assertEqual(1, h.release.call_count) + self.assertEqual(calls, ["acquire", "release"]) class TestReopeningRotatingLogfiles(TestReopeningLogfilesBase): From fdrake at gmail.com Sat Feb 11 06:04:52 2012 From: fdrake at gmail.com (Fred Drake) Date: Sat, 11 Feb 2012 01:04:52 -0500 (EST) Subject: [Zconfig] SVN: ZConfig/trunk/ fix race condition problem with emit when reopening logs Message-ID: <20120211060452.F077E941C9@cvs.zope.org> Log message for revision 124374: fix race condition problem with emit when reopening logs (https://bugs.launchpad.net/zconfig/+bug/481512; patch by Henning Eggers) Changed: U ZConfig/trunk/NEWS.txt U ZConfig/trunk/ZConfig/components/logger/loghandler.py U ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py -=- Modified: ZConfig/trunk/NEWS.txt =================================================================== --- ZConfig/trunk/NEWS.txt 2012-02-11 05:40:21 UTC (rev 124373) +++ ZConfig/trunk/NEWS.txt 2012-02-11 06:04:50 UTC (rev 124374) @@ -6,7 +6,9 @@ ZConfig 2.9.1 (unreleased) -------------------------- +- Make FileHandler.reopen thread safe. + ZConfig 2.9.0 (2011-03-22) -------------------------- Modified: ZConfig/trunk/ZConfig/components/logger/loghandler.py =================================================================== --- ZConfig/trunk/ZConfig/components/logger/loghandler.py 2012-02-11 05:40:21 UTC (rev 124373) +++ ZConfig/trunk/ZConfig/components/logger/loghandler.py 2012-02-11 06:04:50 UTC (rev 124374) @@ -84,8 +84,12 @@ _remove_from_reopenable(self._wr) def reopen(self): - self.stream.close() - self.stream = open(self.baseFilename, self.mode) + self.acquire() + try: + self.stream.close() + self.stream = open(self.baseFilename, self.mode) + finally: + self.release() class Win32FileHandler(FileHandler): Modified: ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py =================================================================== --- ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py 2012-02-11 05:40:21 UTC (rev 124373) +++ ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py 2012-02-11 06:04:50 UTC (rev 124374) @@ -537,7 +537,24 @@ logger.removeHandler(handler) handler.close() + def test_filehandler_reopen_thread_safety(self): + # The reopen method needs to do locking to avoid a race condition + # with emit calls. For simplicity we replace the "acquire" and + # "release" methods with dummies that record calls to them. + fn = self.mktemp() + h = self.handler_factory(fn) + + calls = [] + h.acquire = lambda: calls.append("acquire") + h.release = lambda: calls.append("release") + + h.reopen() + h.close() + + self.assertEqual(calls, ["acquire", "release"]) + + class TestReopeningRotatingLogfiles(TestReopeningLogfilesBase): _sampleconfig_template = """ From fdrake at gmail.com Sat Feb 11 06:16:11 2012 From: fdrake at gmail.com (Fred Drake) Date: Sat, 11 Feb 2012 01:16:11 -0500 (EST) Subject: [Zconfig] SVN: ZConfig/trunk/ prep for release Message-ID: <20120211061611.6A3DB941C9@cvs.zope.org> Log message for revision 124375: prep for release Changed: U ZConfig/trunk/NEWS.txt U ZConfig/trunk/setup.py -=- Modified: ZConfig/trunk/NEWS.txt =================================================================== --- ZConfig/trunk/NEWS.txt 2012-02-11 06:04:50 UTC (rev 124374) +++ ZConfig/trunk/NEWS.txt 2012-02-11 06:16:10 UTC (rev 124375) @@ -3,7 +3,7 @@ ========================== -ZConfig 2.9.1 (unreleased) +ZConfig 2.9.1 (2012-02-11) -------------------------- - Make FileHandler.reopen thread safe. Modified: ZConfig/trunk/setup.py =================================================================== --- ZConfig/trunk/setup.py 2012-02-11 06:04:50 UTC (rev 124374) +++ ZConfig/trunk/setup.py 2012-02-11 06:16:10 UTC (rev 124375) @@ -18,7 +18,7 @@ options = dict( name="ZConfig", - version="2.9.1dev", + version="2.9.1", author="Fred L. Drake, Jr.", author_email="fred at zope.com", maintainer="Zope Foundation and Contributors", From fdrake at gmail.com Sat Feb 11 06:16:49 2012 From: fdrake at gmail.com (Fred Drake) Date: Sat, 11 Feb 2012 01:16:49 -0500 (EST) Subject: [Zconfig] SVN: ZConfig/tags/2.9.1/ release ZConfig 2.9.1 Message-ID: <20120211061649.ADFF6941C9@cvs.zope.org> Log message for revision 124376: release ZConfig 2.9.1 Changed: A ZConfig/tags/2.9.1/ -=- From fdrake at gmail.com Sat Feb 11 06:18:28 2012 From: fdrake at gmail.com (Fred Drake) Date: Sat, 11 Feb 2012 01:18:28 -0500 (EST) Subject: [Zconfig] SVN: ZConfig/trunk/setup.py turdlybump Message-ID: <20120211061828.7FF17941C9@cvs.zope.org> Log message for revision 124377: turdlybump Changed: U ZConfig/trunk/setup.py -=- Modified: ZConfig/trunk/setup.py =================================================================== --- ZConfig/trunk/setup.py 2012-02-11 06:16:49 UTC (rev 124376) +++ ZConfig/trunk/setup.py 2012-02-11 06:18:27 UTC (rev 124377) @@ -18,7 +18,7 @@ options = dict( name="ZConfig", - version="2.9.1", + version="2.9.2dev", author="Fred L. Drake, Jr.", author_email="fred at zope.com", maintainer="Zope Foundation and Contributors", From fdrake at gmail.com Sat Feb 11 20:25:25 2012 From: fdrake at gmail.com (Fred Drake) Date: Sat, 11 Feb 2012 15:25:25 -0500 (EST) Subject: [Zconfig] SVN: ZConfig/trunk/ reduce (but not eliminate) incorrect test discovery under nose Message-ID: <20120211202525.46847941C9@cvs.zope.org> Log message for revision 124378: reduce (but not eliminate) incorrect test discovery under nose Changed: U ZConfig/trunk/NEWS.txt U ZConfig/trunk/ZConfig/components/basic/tests/test_mapping.py U ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py U ZConfig/trunk/ZConfig/tests/support.py U ZConfig/trunk/ZConfig/tests/test_cfgimports.py U ZConfig/trunk/ZConfig/tests/test_cmdline.py U ZConfig/trunk/ZConfig/tests/test_cookbook.py U ZConfig/trunk/ZConfig/tests/test_loader.py U ZConfig/trunk/ZConfig/tests/test_schema.py U ZConfig/trunk/buildout.cfg -=- Modified: ZConfig/trunk/NEWS.txt =================================================================== --- ZConfig/trunk/NEWS.txt 2012-02-11 06:18:27 UTC (rev 124377) +++ ZConfig/trunk/NEWS.txt 2012-02-11 20:25:24 UTC (rev 124378) @@ -3,6 +3,13 @@ ========================== +ZConfig 2.9.2 (unreleased) +-------------------------- + +- Adjust test classes to avoid base classes being considered separate + test cases by (at least) the "nose" test runner. + + ZConfig 2.9.1 (2012-02-11) -------------------------- Modified: ZConfig/trunk/ZConfig/components/basic/tests/test_mapping.py =================================================================== --- ZConfig/trunk/ZConfig/components/basic/tests/test_mapping.py 2012-02-11 06:18:27 UTC (rev 124377) +++ ZConfig/trunk/ZConfig/components/basic/tests/test_mapping.py 2012-02-11 20:25:24 UTC (rev 124378) @@ -15,11 +15,10 @@ """Tests of the 'basic' section types provided as part of ZConfig.components.basic.""" +import ZConfig.tests.support import unittest -from ZConfig.tests import support - SIMPLE_SCHEMA = '''\ @@ -43,7 +42,9 @@ ''' -class BasicSectionTypeTestCase(support.TestBase): +class BasicSectionTypeTestCase( + ZConfig.tests.support.TestHelper, unittest.TestCase): + schema = None def setUp(self): Modified: ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py =================================================================== --- ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py 2012-02-11 06:18:27 UTC (rev 124377) +++ ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py 2012-02-11 20:25:24 UTC (rev 124378) @@ -41,8 +41,11 @@ return sio.getvalue() + "... Don't panic!" -class LoggingTestBase(unittest.TestCase): +class LoggingTestHelper: + # Not derived from unittest.TestCase; some test runners seem to + # think that means this class contains tests. + # XXX This tries to save and restore the state of logging around # the test. Somewhat surgical; there may be a better way. @@ -100,7 +103,7 @@ return conf -class TestConfig(LoggingTestBase): +class TestConfig(LoggingTestHelper, unittest.TestCase): _schematext = """ @@ -404,7 +407,7 @@ return logger -class TestReopeningLogfilesBase(LoggingTestBase): +class TestReopeningLogfilesHelper(LoggingTestHelper): # These tests should not be run on Windows. @@ -458,8 +461,9 @@ self.assert_("message 4" in text2) self.assert_("message 5" in text3) -class TestReopeningLogfiles(TestReopeningLogfilesBase): +class TestReopeningLogfiles(TestReopeningLogfilesHelper, unittest.TestCase): + handler_factory = loghandler.FileHandler _sampleconfig_template = """ @@ -555,7 +559,8 @@ self.assertEqual(calls, ["acquire", "release"]) -class TestReopeningRotatingLogfiles(TestReopeningLogfilesBase): +class TestReopeningRotatingLogfiles( + TestReopeningLogfilesHelper, unittest.TestCase): _sampleconfig_template = """ Modified: ZConfig/trunk/ZConfig/tests/support.py =================================================================== --- ZConfig/trunk/ZConfig/tests/support.py 2012-02-11 06:18:27 UTC (rev 124377) +++ ZConfig/trunk/ZConfig/tests/support.py 2012-02-11 20:25:24 UTC (rev 124378) @@ -16,7 +16,6 @@ import os import StringIO -import unittest import urllib import ZConfig @@ -35,9 +34,12 @@ CONFIG_BASE = "file://%s/" % urllib.pathname2url(d) -class TestBase(unittest.TestCase): +class TestHelper: """Utility methods which can be used with the schema support.""" + # Not derived from unittest.TestCase; some test runners seem to + # think that means this class contains tests. + def load_both(self, schema_url, conf_url): schema = self.load_schema(schema_url) conf = self.load_config(schema, conf_url) Modified: ZConfig/trunk/ZConfig/tests/test_cfgimports.py =================================================================== --- ZConfig/trunk/ZConfig/tests/test_cfgimports.py 2012-02-11 06:18:27 UTC (rev 124377) +++ ZConfig/trunk/ZConfig/tests/test_cfgimports.py 2012-02-11 20:25:24 UTC (rev 124378) @@ -24,7 +24,8 @@ import ZConfig.tests.support -class TestImportFromConfiguration(ZConfig.tests.support.TestBase): +class TestImportFromConfiguration( + ZConfig.tests.support.TestHelper, unittest.TestCase): def test_simple_import(self): schema = self.load_schema_text("") Modified: ZConfig/trunk/ZConfig/tests/test_cmdline.py =================================================================== --- ZConfig/trunk/ZConfig/tests/test_cmdline.py 2012-02-11 06:18:27 UTC (rev 124377) +++ ZConfig/trunk/ZConfig/tests/test_cmdline.py 2012-02-11 20:25:24 UTC (rev 124378) @@ -17,12 +17,12 @@ import unittest import ZConfig +import ZConfig.tests.support from ZConfig.cmdline import ExtendedConfigLoader -from ZConfig.tests.support import TestBase -class CommandLineTest(TestBase): +class CommandLineTest(ZConfig.tests.support.TestHelper, unittest.TestCase): def create_config_loader(self, schema): loader = ExtendedConfigLoader(schema) Modified: ZConfig/trunk/ZConfig/tests/test_cookbook.py =================================================================== --- ZConfig/trunk/ZConfig/tests/test_cookbook.py 2012-02-11 06:18:27 UTC (rev 124377) +++ ZConfig/trunk/ZConfig/tests/test_cookbook.py 2012-02-11 20:25:24 UTC (rev 124378) @@ -20,11 +20,10 @@ """ +import ZConfig.tests.support import unittest -from ZConfig.tests.support import TestBase - def basic_key_mapping_password_to_passwd(key): # Lower-case the key since that's what basic-key does: key = key.lower() @@ -37,7 +36,7 @@ return section -class CookbookTestCase(TestBase): +class CookbookTestCase(ZConfig.tests.support.TestHelper, unittest.TestCase): def test_rewriting_key_names(self): schema = self.load_schema_text(""" Modified: ZConfig/trunk/ZConfig/tests/test_loader.py =================================================================== --- ZConfig/trunk/ZConfig/tests/test_loader.py 2012-02-11 06:18:27 UTC (rev 124377) +++ ZConfig/trunk/ZConfig/tests/test_loader.py 2012-02-11 20:25:24 UTC (rev 124378) @@ -25,7 +25,7 @@ import ZConfig.loader import ZConfig.url -from ZConfig.tests.support import CONFIG_BASE, TestBase +from ZConfig.tests.support import CONFIG_BASE, TestHelper try: @@ -37,7 +37,7 @@ LIBRARY_DIR = os.path.join(os.path.dirname(myfile), "library") -class LoaderTestCase(TestBase): +class LoaderTestCase(TestHelper, unittest.TestCase): def test_schema_caching(self): loader = ZConfig.loader.SchemaLoader() Modified: ZConfig/trunk/ZConfig/tests/test_schema.py =================================================================== --- ZConfig/trunk/ZConfig/tests/test_schema.py 2012-02-11 06:18:27 UTC (rev 124377) +++ ZConfig/trunk/ZConfig/tests/test_schema.py 2012-02-11 20:25:24 UTC (rev 124378) @@ -17,7 +17,7 @@ import ZConfig -from ZConfig.tests.support import TestBase, CONFIG_BASE +from ZConfig.tests.support import TestHelper, CONFIG_BASE def uppercase(value): @@ -40,7 +40,7 @@ return L -class SchemaTestCase(TestBase): +class SchemaTestCase(TestHelper, unittest.TestCase): """Tests of the basic schema support itself.""" def test_minimal_schema(self): Modified: ZConfig/trunk/buildout.cfg =================================================================== --- ZConfig/trunk/buildout.cfg 2012-02-11 06:18:27 UTC (rev 124377) +++ ZConfig/trunk/buildout.cfg 2012-02-11 20:25:24 UTC (rev 124378) @@ -1,8 +1,13 @@ [buildout] develop = . -parts = test +parts = nosetests test prefer-final = true +[nosetests] +recipe = zc.recipe.egg +eggs = nose +scripts = nosetests + [test] recipe = zc.recipe.testrunner eggs = ZConfig From fdrake at gmail.com Sat Feb 11 20:34:49 2012 From: fdrake at gmail.com (Fred Drake) Date: Sat, 11 Feb 2012 15:34:49 -0500 (EST) Subject: [Zconfig] SVN: ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py more refactoring to keep nose from discovering tests defined in mix-ins Message-ID: <20120211203449.B77DD941C9@cvs.zope.org> Log message for revision 124379: more refactoring to keep nose from discovering tests defined in mix-ins Changed: U ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py -=- Modified: ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py =================================================================== --- ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py 2012-02-11 20:25:24 UTC (rev 124378) +++ ZConfig/trunk/ZConfig/components/logger/tests/test_logger.py 2012-02-11 20:34:47 UTC (rev 124379) @@ -407,10 +407,12 @@ return logger -class TestReopeningLogfilesHelper(LoggingTestHelper): +class TestReopeningRotatingLogfiles(LoggingTestHelper, unittest.TestCase): # These tests should not be run on Windows. + handler_factory = loghandler.RotatingFileHandler + _schematext = """ @@ -418,6 +420,40 @@ """ + _sampleconfig_template = """ + + name foo.bar + + path %(path0)s + level debug + max-size 1mb + old-files 10 + + + path %(path1)s + level info + max-size 1mb + old-files 3 + + + path %(path1)s + level info + when D + old-files 3 + + + + + name bar.foo + + path %(path2)s + level info + max-size 10mb + old-files 10 + + + """ + def test_filehandler_reopen(self): def mkrecord(msg): @@ -461,33 +497,6 @@ self.assert_("message 4" in text2) self.assert_("message 5" in text3) - -class TestReopeningLogfiles(TestReopeningLogfilesHelper, unittest.TestCase): - - handler_factory = loghandler.FileHandler - - _sampleconfig_template = """ - - name foo.bar - - path %(path0)s - level debug - - - path %(path1)s - level info - - - - - name bar.foo - - path %(path2)s - level info - - - """ - def test_logfile_reopening(self): # # This test only applies to the simple logfile reopening; it @@ -505,7 +514,6 @@ # Build the loggers from the configuration, and write to them: conf.loggers[0]().info("message 1") conf.loggers[1]().info("message 2") - npaths1 = [self.move(fn) for fn in paths] # # We expect this to re-open the original filenames, so we'll # have six files instead of three. @@ -515,7 +523,6 @@ # Write to them again: conf.loggers[0]().info("message 3") conf.loggers[1]().info("message 4") - npaths2 = [self.move(fn) for fn in paths] # # We expect this to re-open the original filenames, so we'll # have nine files instead of six. @@ -528,11 +535,11 @@ # # We should now have all nine files: for fn in paths: + fn1 = fn + ".1" + fn2 = fn + ".2" self.assert_(os.path.isfile(fn), "%r must exist" % fn) - for fn in npaths1: - self.assert_(os.path.isfile(fn), "%r must exist" % fn) - for fn in npaths2: - self.assert_(os.path.isfile(fn), "%r must exist" % fn) + self.assert_(os.path.isfile(fn1), "%r must exist" % fn1) + self.assert_(os.path.isfile(fn2), "%r must exist" % fn2) # # Clean up: for logger in conf.loggers: @@ -541,48 +548,22 @@ logger.removeHandler(handler) handler.close() - def test_filehandler_reopen_thread_safety(self): - # The reopen method needs to do locking to avoid a race condition - # with emit calls. For simplicity we replace the "acquire" and - # "release" methods with dummies that record calls to them. - fn = self.mktemp() - h = self.handler_factory(fn) +class TestReopeningLogfiles(TestReopeningRotatingLogfiles): - calls = [] - h.acquire = lambda: calls.append("acquire") - h.release = lambda: calls.append("release") + handler_factory = loghandler.FileHandler - h.reopen() - h.close() - - self.assertEqual(calls, ["acquire", "release"]) - - -class TestReopeningRotatingLogfiles( - TestReopeningLogfilesHelper, unittest.TestCase): - _sampleconfig_template = """ name foo.bar path %(path0)s level debug - max-size 1mb - old-files 10 path %(path1)s level info - max-size 1mb - old-files 3 - - path %(path1)s - level info - when D - old-files 3 - @@ -590,14 +571,10 @@ path %(path2)s level info - max-size 10mb - old-files 10 """ - handler_factory = loghandler.RotatingFileHandler - def test_logfile_reopening(self): # # This test only applies to the simple logfile reopening; it @@ -615,6 +592,7 @@ # Build the loggers from the configuration, and write to them: conf.loggers[0]().info("message 1") conf.loggers[1]().info("message 2") + npaths1 = [self.move(fn) for fn in paths] # # We expect this to re-open the original filenames, so we'll # have six files instead of three. @@ -624,6 +602,7 @@ # Write to them again: conf.loggers[0]().info("message 3") conf.loggers[1]().info("message 4") + npaths2 = [self.move(fn) for fn in paths] # # We expect this to re-open the original filenames, so we'll # have nine files instead of six. @@ -636,11 +615,11 @@ # # We should now have all nine files: for fn in paths: - fn1 = fn + ".1" - fn2 = fn + ".2" self.assert_(os.path.isfile(fn), "%r must exist" % fn) - self.assert_(os.path.isfile(fn1), "%r must exist" % fn1) - self.assert_(os.path.isfile(fn2), "%r must exist" % fn2) + for fn in npaths1: + self.assert_(os.path.isfile(fn), "%r must exist" % fn) + for fn in npaths2: + self.assert_(os.path.isfile(fn), "%r must exist" % fn) # # Clean up: for logger in conf.loggers: @@ -649,6 +628,24 @@ logger.removeHandler(handler) handler.close() + def test_filehandler_reopen_thread_safety(self): + # The reopen method needs to do locking to avoid a race condition + # with emit calls. For simplicity we replace the "acquire" and + # "release" methods with dummies that record calls to them. + + fn = self.mktemp() + h = self.handler_factory(fn) + + calls = [] + h.acquire = lambda: calls.append("acquire") + h.release = lambda: calls.append("release") + + h.reopen() + h.close() + + self.assertEqual(calls, ["acquire", "release"]) + + def test_logger_convenience_function_and_ommiting_name_to_get_root_logger(): """ From fdrake at gmail.com Sat Feb 11 20:37:38 2012 From: fdrake at gmail.com (Fred Drake) Date: Sat, 11 Feb 2012 15:37:38 -0500 (EST) Subject: [Zconfig] SVN: ZConfig/trunk/NEWS.txt prep for release Message-ID: <20120211203738.ACC36941C9@cvs.zope.org> Log message for revision 124380: prep for release Changed: U ZConfig/trunk/NEWS.txt -=- Modified: ZConfig/trunk/NEWS.txt =================================================================== --- ZConfig/trunk/NEWS.txt 2012-02-11 20:34:47 UTC (rev 124379) +++ ZConfig/trunk/NEWS.txt 2012-02-11 20:37:38 UTC (rev 124380) @@ -3,7 +3,7 @@ ========================== -ZConfig 2.9.2 (unreleased) +ZConfig 2.9.2 (2012-02-11) -------------------------- - Adjust test classes to avoid base classes being considered separate From fdrake at gmail.com Sat Feb 11 20:39:46 2012 From: fdrake at gmail.com (Fred Drake) Date: Sat, 11 Feb 2012 15:39:46 -0500 (EST) Subject: [Zconfig] SVN: ZConfig/tags/2.9.2/ release ZConfig 2.9.2 Message-ID: <20120211203946.E6D0D941C9@cvs.zope.org> Log message for revision 124381: release ZConfig 2.9.2 Changed: A ZConfig/tags/2.9.2/ U ZConfig/tags/2.9.2/setup.py -=- Modified: ZConfig/tags/2.9.2/setup.py =================================================================== --- ZConfig/trunk/setup.py 2012-02-11 20:37:38 UTC (rev 124380) +++ ZConfig/tags/2.9.2/setup.py 2012-02-11 20:39:46 UTC (rev 124381) @@ -18,7 +18,7 @@ options = dict( name="ZConfig", - version="2.9.2dev", + version="2.9.2", author="Fred L. Drake, Jr.", author_email="fred at zope.com", maintainer="Zope Foundation and Contributors",