changeset 521:36856816299a

prevent !CommandLineInterface.run from accumulating logging handlers (fixes #227)
author fschwarz
date Sat, 05 Mar 2011 14:48:59 +0000
parents 3d8e87169896
children 918569a5a855
files babel/messages/frontend.py babel/messages/tests/frontend.py
diffstat 2 files changed, 17 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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()
--- 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):
Copyright (C) 2012-2017 Edgewall Software