[REF] refactor the debug decorator 'logged'
authorChristophe Simonis <christophe@tinyerp.com>
Fri, 12 Dec 2008 10:51:23 +0000 (11:51 +0100)
committerChristophe Simonis <christophe@tinyerp.com>
Fri, 12 Dec 2008 10:51:23 +0000 (11:51 +0100)
bzr revid: christophe@tinyerp.com-20081212105123-f2tyuykyb6dy8icu

bin/tools/misc.py

index 183f172..06a6654 100644 (file)
@@ -688,40 +688,30 @@ def human_size(sz):
         i = i + 1
     return "%0.2f %s" % (s, units[i])
 
-def logged(when):
-    import netsvc
-    def log(f, res, *args, **kwargs):
-        vector = ['Call -> function: %s' % f]
+def logged(f):
+    from functools import wraps
+    
+    @wraps(f)
+    def wrapper(*args, **kwargs):
+        import netsvc
+        from pprint import pformat
+
+        vector = ['Call -> function: %r' % f]
         for i, arg in enumerate(args):
-            vector.append( '  arg %02d: %r' % ( i, arg ) )
+            vector.append('  arg %02d: %s' % (i, pformat(arg)))
         for key, value in kwargs.items():
-            vector.append( '  kwarg %10s: %r' % ( key, value ) )
-        vector.append( '  result: %r' % res )
-        netsvc.Logger().notifyChannel('logged', netsvc.LOG_DEBUG, vector)
-
-    def pre_logged(f):
-        def wrapper(*args, **kwargs):
-            res = f(*args, **kwargs)
-            log(f, res, *args, **kwargs)
-            return res
-        return wrapper
-
-    def post_logged(f):
-        def wrapper(*args, **kwargs):
-            now = time.time()
-            res = None
-            try:
-                res = f(*args, **kwargs)
-                return res
-            finally:
-                log(f, res, *args, **kwargs)
-                netsvc.Logger().notifyChannel('logged', netsvc.LOG_DEBUG, "time delta: %s" % (time.time() - now))
-        return wrapper
+            vector.append('  kwarg %10s: %s' % (key, pformat(value)))
+
+        timeb4 = time.time()
+        res = f(*args, **kwargs)
+        
+        vector.append('  result: %s' % pformat(res))
+        vector.append('  time delta: %s' % (time.time() - timeb4))
+        #netsvc.Logger().notifyChannel('logged', netsvc.LOG_DEBUG, '\n'.join(vector))
+        return res
+
+    return wrapper
 
-    try:
-        return { "pre" : pre_logged, "post" : post_logged}[when]
-    except KeyError, e:
-        raise ValueError(e), "must to be 'pre' or 'post'"
 
 icons = map(lambda x: (x,x), ['STOCK_ABOUT', 'STOCK_ADD', 'STOCK_APPLY', 'STOCK_BOLD',
 'STOCK_CANCEL', 'STOCK_CDROM', 'STOCK_CLEAR', 'STOCK_CLOSE', 'STOCK_COLOR_PICKER',