[Merge] lp:~gnuoy/ubuntu/utopic/python-logutils/fix-tests into lp:ubuntu/python-logutils
James Page
james.page at ubuntu.com
Wed Jul 16 10:52:10 UTC 2014
Review: Needs Fixing
Diff comments:
> === modified file '.pc/applied-patches'
> --- .pc/applied-patches 2014-01-09 14:31:16 +0000
> +++ .pc/applied-patches 2014-07-04 13:10:41 +0000
> @@ -1,1 +1,3 @@
> no-network-access-during-doc-build.patch
> +test-failures-fatal.patch
> +fix-dictconf-tests-on-python3.patch
>
> === added directory '.pc/fix-dictconf-tests-on-python3.patch'
> === added file '.pc/fix-dictconf-tests-on-python3.patch/.timestamp'
> === added directory '.pc/fix-dictconf-tests-on-python3.patch/tests'
> === added file '.pc/fix-dictconf-tests-on-python3.patch/tests/test_dictconfig.py'
> --- .pc/fix-dictconf-tests-on-python3.patch/tests/test_dictconfig.py 1970-01-01 00:00:00 +0000
> +++ .pc/fix-dictconf-tests-on-python3.patch/tests/test_dictconfig.py 2014-07-04 13:10:41 +0000
> @@ -0,0 +1,688 @@
> +#
> +# Copyright 2009-2013 by Vinay Sajip. See LICENSE.txt for details.
> +#
> +import logging
> +from logutils.adapter import LoggerAdapter
> +from logutils.dictconfig import dictConfig, named_handlers_supported
> +from logutils.testing import TestHandler, Matcher
> +import sys
> +import unittest
> +
> +try:
> + StandardError
> +except NameError:
> + StandardError = Exception
> +
> +class ExceptionFormatter(logging.Formatter):
> + """A special exception formatter."""
> + def formatException(self, ei):
> + return "Got a [%s]" % ei[0].__name__
> +
> +def formatFunc(format, datefmt=None):
> + return logging.Formatter(format, datefmt)
> +
> +def testHandler():
> + return TestHandler(Matcher())
> +
> +def handlerFunc():
> + return logging.StreamHandler()
> +
> +class CustomHandler(logging.StreamHandler):
> + pass
> +
> +class ConfigDictTest(unittest.TestCase):
> +
> + """Reading logging config from a dictionary."""
> +
> + def setUp(self):
> + self.logger = l = logging.getLogger()
> + self.adapter = LoggerAdapter(l, {})
> +
> + logger_dict = logging.getLogger().manager.loggerDict
> + logging._acquireLock()
> + try:
> + self.saved_handlers = logging._handlers.copy()
> + self.saved_handler_list = logging._handlerList[:]
> + self.saved_loggers = logger_dict.copy()
> + self.saved_level_names = logging._levelNames.copy()
> + finally:
> + logging._releaseLock()
> +
> + self.root_logger = logging.getLogger("")
> + self.original_logging_level = self.root_logger.getEffectiveLevel()
> +
> +
> + def tearDown(self):
> + self.root_logger.setLevel(self.original_logging_level)
> + logging._acquireLock()
> + try:
> + logging._levelNames.clear()
> + logging._levelNames.update(self.saved_level_names)
> + logging._handlers.clear()
> + logging._handlers.update(self.saved_handlers)
> + logging._handlerList[:] = self.saved_handler_list
> + loggerDict = logging.getLogger().manager.loggerDict
> + loggerDict.clear()
> + loggerDict.update(self.saved_loggers)
> + finally:
> + logging._releaseLock()
> +
> + message_num = 0
> +
> + def next_message(self):
> + """Generate a message consisting solely of an auto-incrementing
> + integer."""
> + self.message_num += 1
> + return "%d" % self.message_num
> +
> + # config0 is a standard configuration.
> + config0 = {
> + 'version': 1,
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + '()': testHandler,
> + 'formatter': 'form1',
> + }
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + 'handlers' : ['hand1'],
> + },
> + }
> +
> + # config1 adds a little to the standard configuration.
> + config1 = {
> + 'version': 1,
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + '()': testHandler,
> + 'formatter': 'form1',
> + }
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'DEBUG',
> + 'handlers' : ['hand1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + },
> + }
> +
> + # config2 has a subtle configuration error that should be reported
> + config2 = {
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + 'class' : 'logging.StreamHandler',
> + 'formatter' : 'form1',
> + 'level' : 'NOTSET',
> + 'stream' : 'ext://sys.stdbout',
> + },
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'DEBUG',
> + 'handlers' : ['hand1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + },
> + }
> +
> + #As config1 but with a misspelt level on a handler
> + config2a = {
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + 'class' : 'logging.StreamHandler',
> + 'formatter' : 'form1',
> + 'level' : 'NTOSET',
> + 'stream' : 'ext://sys.stdout',
> + },
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'DEBUG',
> + 'handlers' : ['hand1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + },
> + }
> +
> +
> + #As config1 but with a misspelt level on a logger
> + config2b = {
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + 'class' : 'logging.StreamHandler',
> + 'formatter' : 'form1',
> + 'level' : 'NOTSET',
> + 'stream' : 'ext://sys.stdout',
> + },
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'DEBUG',
> + 'handlers' : ['hand1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'WRANING',
> + },
> + }
> +
> + # config3 has a less subtle configuration error
> + config3 = {
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + 'class' : 'logging.StreamHandler',
> + 'formatter' : 'misspelled_name',
> + 'level' : 'NOTSET',
> + 'stream' : 'ext://sys.stdout',
> + },
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'DEBUG',
> + 'handlers' : ['hand1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + },
> + }
> +
> + # config4 specifies a custom formatter class to be loaded
> + config4 = {
> + 'version': 1,
> + 'formatters': {
> + 'form1' : {
> + '()' : __name__ + '.ExceptionFormatter',
> + 'format' : '%(levelname)s:%(name)s:%(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + '()': testHandler,
> + 'formatter': 'form1',
> + }
> + },
> + 'root' : {
> + 'level' : 'NOTSET',
> + 'handlers' : ['hand1'],
> + },
> + }
> +
> + # As config4 but using an actual callable rather than a string
> + config4a = {
> + 'version': 1,
> + 'formatters': {
> + 'form1' : {
> + '()' : ExceptionFormatter,
> + 'format' : '%(levelname)s:%(name)s:%(message)s',
> + },
> + 'form2' : {
> + '()' : __name__ + '.formatFunc',
> + 'format' : '%(levelname)s:%(name)s:%(message)s',
> + },
> + 'form3' : {
> + '()' : formatFunc,
> + 'format' : '%(levelname)s:%(name)s:%(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + '()': testHandler,
> + 'formatter': 'form1',
> + },
> + 'hand2' : {
> + '()' : handlerFunc,
> + },
> + },
> + 'root' : {
> + 'level' : 'NOTSET',
> + 'handlers' : ['hand1'],
> + },
> + }
> +
> + # config5 specifies a custom handler class to be loaded
> + config5 = {
> + 'version': 1,
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + '()': testHandler,
> + 'formatter': 'form1',
> + }
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'DEBUG',
> + 'handlers' : ['hand1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + },
> + }
> +
> + # config6 specifies a custom handler class to be loaded
> + # but has bad arguments
> + config6 = {
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + 'class' : __name__ + '.CustomHandler',
> + 'formatter' : 'form1',
> + 'level' : 'NOTSET',
> + 'stream' : 'ext://sys.stdout',
> + '9' : 'invalid parameter name',
> + },
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'DEBUG',
> + 'handlers' : ['hand1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + },
> + }
> +
> + #config 7 does not define compiler.parser but defines compiler.lexer
> + #so compiler.parser should be disabled after applying it
> + config7 = {
> + 'version': 1,
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + '()': testHandler,
> + 'formatter': 'form1',
> + }
> + },
> + 'loggers' : {
> + 'compiler.lexer' : {
> + 'level' : 'DEBUG',
> + 'handlers' : ['hand1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + },
> + }
> +
> + config8 = {
> + 'version': 1,
> + 'disable_existing_loggers' : False,
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + '()': testHandler,
> + 'formatter': 'form1',
> + }
> + },
> + 'loggers' : {
> + 'compiler' : {
> + 'level' : 'DEBUG',
> + 'handlers' : ['hand1'],
> + },
> + 'compiler.lexer' : {
> + },
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + },
> + }
> +
> + config9 = {
> + 'version': 1,
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + '()': testHandler,
> + 'formatter': 'form1',
> + }
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'WARNING',
> + 'handlers' : ['hand1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'NOTSET',
> + },
> + }
> +
> + config9a = {
> + 'version': 1,
> + 'incremental' : True,
> + 'handlers' : {
> + 'hand1' : {
> + 'level' : 'WARNING',
> + },
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'INFO',
> + },
> + },
> + }
> +
> + config9b = {
> + 'version': 1,
> + 'incremental' : True,
> + 'handlers' : {
> + 'hand1' : {
> + 'level' : 'INFO',
> + },
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'INFO',
> + },
> + },
> + }
> +
> + #As config1 but with a filter added
> + config10 = {
> + 'version': 1,
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'filters' : {
> + 'filt1' : {
> + 'name' : 'compiler.parser',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + '()': testHandler,
> + 'formatter': 'form1',
> + 'filters' : ['filt1'],
> + }
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'DEBUG',
> + 'filters' : ['filt1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + 'handlers' : ['hand1'],
> + },
> + }
> +
> + # As config10, but declaring a handler in a module using
> + # absolute imports
> + config11 = {
> + 'version': 1,
> + 'formatters': {
> + 'form1' : {
> + 'format' : '%(levelname)s ++ %(message)s',
> + },
> + },
> + 'filters' : {
> + 'filt1' : {
> + 'name' : 'compiler.parser',
> + },
> + },
> + 'handlers' : {
> + 'hand1' : {
> + '()': 'mytest.MyTestHandler',
> + 'formatter': 'form1',
> + 'filters' : ['filt1'],
> + }
> + },
> + 'loggers' : {
> + 'compiler.parser' : {
> + 'level' : 'DEBUG',
> + 'filters' : ['filt1'],
> + },
> + },
> + 'root' : {
> + 'level' : 'WARNING',
> + 'handlers' : ['hand1'],
> + },
> + }
> +
> + def apply_config(self, conf):
> + dictConfig(conf)
> +
> + def test_config0_ok(self):
> + # A simple config which overrides the default settings.
> + self.apply_config(self.config0)
> + logger = logging.getLogger()
> + # Won't output anything
> + logger.info(self.next_message())
> + # Outputs a message
> + logger.error(self.next_message())
> + h = logger.handlers[0]
> + self.assertEqual(1, h.count)
> + self.assertTrue(h.matchall([
> + dict(levelname='ERROR', message='2')
> + ]))
> +
> + def test_config1_ok(self, config=config1):
> + # A config defining a sub-parser as well.
> + self.apply_config(config)
> + logger = logging.getLogger("compiler.parser")
> + # Both will output a message
> + logger.info(self.next_message())
> + logger.error(self.next_message())
> + h = logger.handlers[0]
> + self.assertTrue(h.matchall([
> + dict(levelname='INFO', message='1'),
> + dict(levelname='ERROR', message='2'),
> + ]))
> +
> + def test_config2_failure(self):
> + # A simple config which overrides the default settings.
> + self.assertRaises(StandardError, self.apply_config, self.config2)
> +
> + def test_config2a_failure(self):
> + # A simple config which overrides the default settings.
> + self.assertRaises(StandardError, self.apply_config, self.config2a)
> +
> + def test_config2b_failure(self):
> + # A simple config which overrides the default settings.
> + self.assertRaises(StandardError, self.apply_config, self.config2b)
> +
> + def test_config3_failure(self):
> + # A simple config which overrides the default settings.
> + self.assertRaises(StandardError, self.apply_config, self.config3)
> +
> + def test_config4_ok(self):
> + # A config specifying a custom formatter class.
> + self.apply_config(self.config4)
> + logger = logging.getLogger()
> + h = logger.handlers[0]
> + try:
> + raise RuntimeError()
> + except RuntimeError:
> + logging.exception("just testing")
> + self.assertEquals(h.formatted[0],
> + "ERROR:root:just testing\nGot a [RuntimeError]")
> +
> + def test_config4a_ok(self):
> + # A config specifying a custom formatter class.
> + self.apply_config(self.config4a)
> + logger = logging.getLogger()
> + h = logger.handlers[0]
> + try:
> + raise RuntimeError()
> + except RuntimeError:
> + logging.exception("just testing")
> + self.assertEquals(h.formatted[0],
> + "ERROR:root:just testing\nGot a [RuntimeError]")
> +
> + def test_config5_ok(self):
> + self.test_config1_ok(config=self.config5)
> +
> + def test_config6_failure(self):
> + self.assertRaises(StandardError, self.apply_config, self.config6)
> +
> + def test_config7_ok(self):
> + self.apply_config(self.config1)
> + logger = logging.getLogger("compiler.parser")
> + # Both will output a message
> + logger.info(self.next_message())
> + logger.error(self.next_message())
> + h = logger.handlers[0]
> + self.assertTrue(h.matchall([
> + dict(levelname='INFO', message='1'),
> + dict(levelname='ERROR', message='2'),
> + ]))
> + self.apply_config(self.config7)
> + logger = logging.getLogger("compiler.parser")
> + self.assertTrue(logger.disabled)
> + logger = logging.getLogger("compiler.lexer")
> + # Both will output a message
> + h = logger.handlers[0]
> + logger.info(self.next_message())
> + logger.error(self.next_message())
> + self.assertTrue(h.matchall([
> + dict(levelname='INFO', message='3'),
> + dict(levelname='ERROR', message='4'),
> + ]))
> +
> + #Same as test_config_7_ok but don't disable old loggers.
> + def test_config_8_ok(self):
> + self.apply_config(self.config1)
> + logger = logging.getLogger("compiler.parser")
> + # Both will output a message
> + logger.info(self.next_message())
> + logger.error(self.next_message())
> + h = logger.handlers[0]
> + self.assertTrue(h.matchall([
> + dict(levelname='INFO', message='1'),
> + dict(levelname='ERROR', message='2'),
> + ]))
> + self.apply_config(self.config8)
> + logger = logging.getLogger("compiler.parser")
> + self.assertFalse(logger.disabled)
> + toplogger = logging.getLogger("compiler")
> + # Both will output a message
> + logger.info(self.next_message())
> + logger.error(self.next_message())
> + logger = logging.getLogger("compiler.lexer")
> + # Both will output a message
> + logger.info(self.next_message())
> + logger.error(self.next_message())
> + h = toplogger.handlers[0]
> + self.assertTrue(h.matchall([
> + dict(levelname='INFO', message='3'),
> + dict(levelname='ERROR', message='4'),
> + dict(levelname='INFO', message='5'),
> + dict(levelname='ERROR', message='6'),
> + ]))
> +
> + def test_config_9_ok(self):
> + self.apply_config(self.config9)
> + logger = logging.getLogger("compiler.parser")
> + #Nothing will be output since both handler and logger are set to WARNING
> + logger.info(self.next_message())
> + h = logger.handlers[0]
> + self.assertEqual(0, h.count)
> + self.apply_config(self.config9a)
> + #Nothing will be output since both handler is still set to WARNING
> + logger.info(self.next_message())
> + h = logger.handlers[0]
> + nhs = named_handlers_supported()
> + if nhs:
> + self.assertEqual(0, h.count)
> + else:
> + self.assertEqual(1, h.count)
> + self.apply_config(self.config9b)
> + #Message should now be output
> + logger.info(self.next_message())
> + if nhs:
> + h = logger.handlers[0]
> + self.assertTrue(h.matchall([
> + dict(levelname='INFO', message='3'),
> + ]))
> + else:
> + self.assertEqual(2, h.count)
> +
> + def test_config_10_ok(self):
> + self.apply_config(self.config10)
> + logger = logging.getLogger("compiler.parser")
> + logger.warning(self.next_message())
> + logger = logging.getLogger('compiler')
> + #Not output, because filtered
> + logger.warning(self.next_message())
> + logger = logging.getLogger('compiler.lexer')
> + #Not output, because filtered
> + logger.warning(self.next_message())
> + logger = logging.getLogger("compiler.parser.codegen")
> + #Output, as not filtered
> + logger.error(self.next_message())
> + h = logging.getLogger().handlers[0]
> + self.assertTrue(h.matchall([
> + dict(levelname='WARNING', message='1'),
> + dict(levelname='ERROR', message='4'),
> + ]))
> +
> + def test_config_11_ok(self):
> + self.apply_config(self.config11)
> + h = logging.getLogger().handlers[0]
> + self.assertEqual(h.__module__, 'mytest')
> + self.assertEqual(h.__class__.__name__, 'MyTestHandler')
> +
>
> === added directory '.pc/test-failures-fatal.patch'
> === added file '.pc/test-failures-fatal.patch/.timestamp'
> === added file '.pc/test-failures-fatal.patch/setup.py'
> --- .pc/test-failures-fatal.patch/setup.py 1970-01-01 00:00:00 +0000
> +++ .pc/test-failures-fatal.patch/setup.py 2014-07-04 13:10:41 +0000
> @@ -0,0 +1,63 @@
> +# -*- coding: utf-8 -*-
> +
> +import distutils.core
> +import logutils
> +from os.path import join, dirname, abspath
> +import re
> +
> +
> +def description():
> + f = open(join(dirname(__file__), 'README.txt'))
> + readme = f.read()
> + f.close()
> + regexp = r'^logutils\s*[\d.]*\s*\n=======+\s*\n(.*)Requirements '
> + reqts, = re.findall(regexp, readme, re.DOTALL)
> + regexp = r'Availability & Documentation\s*\n-----+\s*\n(.*)'
> + avail, = re.findall(regexp, readme, re.DOTALL)
> + return reqts + avail
> +
> +class TestCommand(distutils.core.Command):
> + user_options = []
> +
> + def run(self):
> + import sys
> + import unittest
> +
> + sys.path.append(join(dirname(__file__), 'tests'))
> + import logutil_tests
> + loader = unittest.TestLoader()
> + runner = unittest.TextTestRunner()
> + runner.run(loader.loadTestsFromModule(logutil_tests))
> +
> + def initialize_options(self):
> + pass
> +
> + def finalize_options(self):
> + pass
> +
> +distutils.core.setup(
> + name='logutils',
> + version=logutils.__version__,
> + author='Vinay Sajip',
> + author_email='vinay_sajip at red-dove.com',
> + url='http://code.google.com/p/logutils/',
> + description='Logging utilities',
> + long_description = description(),
> + license='Copyright (C) 2010-2013 by Vinay Sajip. All Rights Reserved. See LICENSE.txt for license.',
> + classifiers=[
> + 'Development Status :: 5 - Production/Stable',
> + 'Environment :: Console',
> + 'Intended Audience :: Developers',
> + 'License :: OSI Approved :: BSD License',
> + 'Operating System :: OS Independent',
> + 'Programming Language :: Python',
> + "Programming Language :: Python :: 2",
> + "Programming Language :: Python :: 3",
> + 'Topic :: Software Development',
> + ],
> + packages=['logutils'],
> + cmdclass={
> + 'test': TestCommand,
> + },
> +
> +)
>
> === modified file 'debian/changelog'
> --- debian/changelog 2014-01-09 14:31:16 +0000
> +++ debian/changelog 2014-07-04 13:10:41 +0000
> @@ -1,3 +1,10 @@
> +python-logutils (0.3.3-1ubuntu1) unstable; urgency=medium
This upload should target utopic, not unstable.
> +
> + * Make unit test failures fatal to build
> + * Fix tests failing with python3
This is a style preference: I normally use:
d/p/fix-dictconf-tests-on-python3.patch: Fix tests failing with python3.
> +
> + -- Liam Young <liam.young at canonical.com> Fri, 04 Jul 2014 13:44:06 +0100
> +
> python-logutils (0.3.3-1) unstable; urgency=medium
>
> * Initial release. (Closes: #734687)
>
> === added file 'debian/patches/fix-dictconf-tests-on-python3.patch'
> --- debian/patches/fix-dictconf-tests-on-python3.patch 1970-01-01 00:00:00 +0000
> +++ debian/patches/fix-dictconf-tests-on-python3.patch 2014-07-04 13:10:41 +0000
> @@ -0,0 +1,44 @@
> +Description: Make refernces to _levelNames python2 specific as it does not exist in the python3 version of the module.
> +Author: Liam Young <liam.young at canonical.com>
> +Bug-Ubuntu: https://launchpad.net/bugs/1319909
> +Last-Update: 2014-07-04
These patches are appropriate for upstream submission; please use a pull request and reference this in a Forwarded field.
> +
> +Index: python-logutils/tests/test_dictconfig.py
> +===================================================================
> +--- python-logutils.orig/tests/test_dictconfig.py
> ++++ python-logutils/tests/test_dictconfig.py
> +@@ -27,6 +27,12 @@ def testHandler():
> + def handlerFunc():
> + return logging.StreamHandler()
> +
> ++def is_python2():
> ++ if sys.version_info >= (2, 0) and sys.version_info < (3, 0):
> ++ return True
> ++ else:
> ++ return False
> ++
> + class CustomHandler(logging.StreamHandler):
> + pass
> +
> +@@ -44,7 +50,8 @@ class ConfigDictTest(unittest.TestCase):
> + self.saved_handlers = logging._handlers.copy()
> + self.saved_handler_list = logging._handlerList[:]
> + self.saved_loggers = logger_dict.copy()
> +- self.saved_level_names = logging._levelNames.copy()
> ++ if is_python2():
> ++ self.saved_level_names = logging._levelNames.copy()
> + finally:
> + logging._releaseLock()
> +
> +@@ -56,8 +63,9 @@ class ConfigDictTest(unittest.TestCase):
> + self.root_logger.setLevel(self.original_logging_level)
> + logging._acquireLock()
> + try:
> +- logging._levelNames.clear()
> +- logging._levelNames.update(self.saved_level_names)
> ++ if is_python2():
> ++ logging._levelNames.clear()
> ++ logging._levelNames.update(self.saved_level_names)
> + logging._handlers.clear()
> + logging._handlers.update(self.saved_handlers)
> + logging._handlerList[:] = self.saved_handler_list
>
> === modified file 'debian/patches/series'
> --- debian/patches/series 2014-01-09 14:31:16 +0000
> +++ debian/patches/series 2014-07-04 13:10:41 +0000
> @@ -1,1 +1,3 @@
> no-network-access-during-doc-build.patch
> +test-failures-fatal.patch
> +fix-dictconf-tests-on-python3.patch
>
> === added file 'debian/patches/test-failures-fatal.patch'
> --- debian/patches/test-failures-fatal.patch 1970-01-01 00:00:00 +0000
> +++ debian/patches/test-failures-fatal.patch 2014-07-04 13:10:41 +0000
> @@ -0,0 +1,20 @@
> +Description: Test failures should be fatal to the build process
> +Author: Liam Young <liam.young at canonical.com>
> +Bug-Ubuntu: https://launchpad.net/bugs/1319909
> +Last-Update: 2014-07-04
These patches are appropriate for upstream submission; please use a pull request and reference this in a Forwarded field.
> +
> +Index: python-logutils/setup.py
> +===================================================================
> +--- python-logutils.orig/setup.py
> ++++ python-logutils/setup.py
> +@@ -27,7 +27,9 @@ class TestCommand(distutils.core.Command
> + import logutil_tests
> + loader = unittest.TestLoader()
> + runner = unittest.TextTestRunner()
> +- runner.run(loader.loadTestsFromModule(logutil_tests))
> ++ test_results = runner.run(loader.loadTestsFromModule(logutil_tests))
> ++ if not test_results.wasSuccessful():
> ++ sys.exit(1)
> +
> + def initialize_options(self):
> + pass
>
> === modified file 'setup.py'
> --- setup.py 2014-01-09 14:31:16 +0000
> +++ setup.py 2014-07-04 13:10:41 +0000
> @@ -27,7 +27,9 @@
> import logutil_tests
> loader = unittest.TestLoader()
> runner = unittest.TextTestRunner()
> - runner.run(loader.loadTestsFromModule(logutil_tests))
> + test_results = runner.run(loader.loadTestsFromModule(logutil_tests))
> + if not test_results.wasSuccessful():
> + sys.exit(1)
>
> def initialize_options(self):
> pass
>
> === modified file 'tests/test_dictconfig.py'
> --- tests/test_dictconfig.py 2014-01-09 14:31:16 +0000
> +++ tests/test_dictconfig.py 2014-07-04 13:10:41 +0000
> @@ -27,6 +27,12 @@
> def handlerFunc():
> return logging.StreamHandler()
>
> +def is_python2():
> + if sys.version_info >= (2, 0) and sys.version_info < (3, 0):
> + return True
> + else:
> + return False
> +
> class CustomHandler(logging.StreamHandler):
> pass
>
> @@ -44,7 +50,8 @@
> self.saved_handlers = logging._handlers.copy()
> self.saved_handler_list = logging._handlerList[:]
> self.saved_loggers = logger_dict.copy()
> - self.saved_level_names = logging._levelNames.copy()
> + if is_python2():
> + self.saved_level_names = logging._levelNames.copy()
> finally:
> logging._releaseLock()
>
> @@ -56,8 +63,9 @@
> self.root_logger.setLevel(self.original_logging_level)
> logging._acquireLock()
> try:
> - logging._levelNames.clear()
> - logging._levelNames.update(self.saved_level_names)
> + if is_python2():
> + logging._levelNames.clear()
> + logging._levelNames.update(self.saved_level_names)
> logging._handlers.clear()
> logging._handlers.update(self.saved_handlers)
> logging._handlerList[:] = self.saved_handler_list
>
--
https://code.launchpad.net/~gnuoy/ubuntu/utopic/python-logutils/fix-tests/+merge/225661
Your team Ubuntu branches is subscribed to branch lp:ubuntu/python-logutils.
More information about the Ubuntu-reviews
mailing list