[IMP] tools.misc.mute_logger can now be used as decorator
authorChristophe Simonis <chs@openerp.com>
Wed, 22 Aug 2012 12:20:13 +0000 (14:20 +0200)
committerChristophe Simonis <chs@openerp.com>
Wed, 22 Aug 2012 12:20:13 +0000 (14:20 +0200)
bzr revid: chs@openerp.com-20120822122013-9uxjwr9oqohseton

openerp/tools/misc.py

index 20f6965..7763b3a 100644 (file)
@@ -55,7 +55,6 @@ try:
     from html2text import html2text
 except ImportError:
     html2text = None
-import contextlib
 
 import openerp.loglevels as loglevels
 import openerp.pooler as pooler
@@ -1142,19 +1141,36 @@ class UnquoteEvalContext(defaultdict):
         return unquote(key)
 
 
-class MuteFilter(logging.Filter):
+class mute_logger(object):
+    """Temporary suppress the logging.
+    Can be used as context manager or decorator.
+
+        @mute_logger('openerp.plic.ploc')
+        def do_stuff():
+            blahblah()
+
+        with mute_logger('openerp.foo.bar'):
+            do_suff()
+
+    """
+    def __init__(self, *loggers):
+        self.loggers = loggers
+
     def filter(self, record):
         return 0
 
-@contextlib.contextmanager
-def mute_logger(*loggers):
-    mute = MuteFilter()
-    for logger in loggers:
-        logging.getLogger(logger).addFilter(mute)
-
-    yield
+    def __enter__(self):
+        for logger in self.loggers:
+            logging.getLogger(logger).addFilter(self)
 
-    for logger in loggers:
-        logging.getLogger(logger).removeFilter(mute)
+    def __exit__(self, exc_type=None, exc_val=None, exc_tb=None):
+        for logger in self.loggers:
+            logging.getLogger(logger).removeFilter(self)
 
+    def __call__(self, func):
+        @wraps(func)
+        def deco(*args, **kwargs):
+            with self:
+                return func(*args, **kwargs)
+        return deco
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: