Adding indentation to traces
[theonering] / src / gtk_toolbox.py
index da9accc..09ce9fe 100644 (file)
@@ -12,6 +12,9 @@ import threading
 import Queue
 
 
+_moduleLogger = logging.getLogger("gtk_toolbox")
+
+
 @contextlib.contextmanager
 def flock(path, timeout=-1):
        WAIT_FOREVER = -1
@@ -137,7 +140,7 @@ def comap(function, target):
                        mappedItem = function(*item)
                        target.send(mappedItem)
                except Exception, e:
-                       logging.exception("Forwarding exception!")
+                       _moduleLogger.exception("Forwarding exception!")
                        target.throw(e.__class__, str(e))
 
 
@@ -210,9 +213,68 @@ def safecall(f, errorDisplay=None, default=None, exception=Exception):
        '''
        def _safecall(*args, **argv):
                try:
-                       return f(*args,**argv)
+                       return f(*args, **argv)
                except exception, e:
                        if errorDisplay is not None:
                                errorDisplay.push_exception(e)
                        return default
        return _safecall
+
+
+def log_call(logger):
+
+       def log_call_decorator(func):
+
+               @functools.wraps(func)
+               def wrapper(*args, **kwds):
+                       _moduleLogger.info("-> %s" % (func.__name__, ))
+                       try:
+                               return func(*args, **kwds)
+                       finally:
+                               _moduleLogger.info("<- %s" % (func.__name__, ))
+
+               return wrapper
+
+       return log_call_decorator
+
+
+def log_exception(logger):
+
+       def log_exception_decorator(func):
+
+               @functools.wraps(func)
+               def wrapper(*args, **kwds):
+                       try:
+                               return func(*args, **kwds)
+                       except Exception:
+                               logger.exception(func.__name__)
+                               raise
+
+               return wrapper
+
+       return log_exception_decorator
+
+
+_indentationLevel = [0]
+
+
+def trace(logger):
+
+       def trace_decorator(func):
+
+               @functools.wraps(func)
+               def wrapper(*args, **kwds):
+                       try:
+                               logger.debug("%s> %s" % (" " * _indentationLevel[0], func.__name__, ))
+                               _indentationLevel[0] += 1
+                               return func(*args, **kwds)
+                       except Exception:
+                               logger.exception(func.__name__)
+                               raise
+                       finally:
+                               _indentationLevel[0] -= 1
+                               logger.debug("%s< %s" % (" " * _indentationLevel[0], func.__name__, ))
+
+               return wrapper
+
+       return trace_decorator