# HG changeset patch # User fschwarz # Date 1299336539 0 # Node ID 36856816299a6a97a746720f6eef80b1dcb8f115 # Parent 3d8e8716989687c0b80972459976409089a81ca6 prevent !CommandLineInterface.run from accumulating logging handlers (fixes #227) diff --git a/babel/messages/frontend.py b/babel/messages/frontend.py --- a/babel/messages/frontend.py +++ b/babel/messages/frontend.py @@ -629,11 +629,17 @@ # 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 --- a/babel/messages/tests/frontend.py +++ b/babel/messages/tests/frontend.py @@ -16,6 +16,7 @@ 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 @@ 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):