From: Felix Schwarz Date: Sat, 5 Mar 2011 14:48:59 +0000 (+0000) Subject: prevent !CommandLineInterface.run from accumulating logging handlers (fixes #227) X-Git-Tag: 1.0~217 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b5f2bc1f4f0ba5dc8a043508d98f6c25ba707dd6;p=thirdparty%2Fbabel.git prevent !CommandLineInterface.run from accumulating logging handlers (fixes #227) --- diff --git a/babel/messages/frontend.py b/babel/messages/frontend.py index b1ebfb4a..d6b85515 100755 --- a/babel/messages/frontend.py +++ b/babel/messages/frontend.py @@ -629,11 +629,17 @@ class CommandLineInterface(object): # Configure logging self.log = logging.getLogger('babel') self.log.setLevel(options.loglevel) - handler = logging.StreamHandler() + # Don't add a new handler for every instance initialization (#227), this + # would cause duplicated output when the CommandLineInterface as an + # normal Python class. + if self.log.handlers: + handler = self.log.handlers[0] + else: + handler = logging.StreamHandler() + self.log.addHandler(handler) handler.setLevel(options.loglevel) formatter = logging.Formatter('%(message)s') handler.setFormatter(formatter) - self.log.addHandler(handler) if options.list_locales: identifiers = localedata.list() diff --git a/babel/messages/tests/frontend.py b/babel/messages/tests/frontend.py index 374b42e0..00ddcce8 100644 --- a/babel/messages/tests/frontend.py +++ b/babel/messages/tests/frontend.py @@ -16,6 +16,7 @@ from distutils.dist import Distribution from distutils.errors import DistutilsOptionError from distutils.log import _global_log import doctest +import logging import os import shutil from StringIO import StringIO @@ -509,6 +510,14 @@ class CommandLineInterfaceTestCase(unittest.TestCase): sys.argv = ['pybabel'] sys.stdout = StringIO() sys.stderr = StringIO() + + # Logging handlers will be reused if possible (#227). This breaks the + # implicit assumption that our newly created StringIO for sys.stderr + # contains the console output. Removing the old handler ensures that a + # new handler with our new StringIO instance will be used. + log = logging.getLogger('babel') + for handler in log.handlers: + log.removeHandler(handler) self.cli = frontend.CommandLineInterface() def tearDown(self):