Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/carquinyol/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/carquinyol/__init__.py')
-rw-r--r--src/carquinyol/__init__.py59
1 files changed, 52 insertions, 7 deletions
diff --git a/src/carquinyol/__init__.py b/src/carquinyol/__init__.py
index 68d961b..2ced987 100644
--- a/src/carquinyol/__init__.py
+++ b/src/carquinyol/__init__.py
@@ -1,15 +1,60 @@
import logging
import decorator
-# TODO: skip positional arguments by name as well
-def trace(skip_args=[], skip_kwargs=[]) :
+
+def filter_maxsize(val, maxsize_list, maxsize_dict, maxsize_string) :
+ if isinstance(val, (list, tuple)) :
+ if len(val) > maxsize_list :
+ return "[...]"
+
+ return [filter_maxsize(child, maxsize_list, maxsize_dict, maxsize_string)
+ for child in val]
+
+ elif isinstance(val, dict) :
+ if len(val) > maxsize_dict :
+ return "{...}"
+
+ return dict([
+ (key, filter_maxsize(child, maxsize_list, maxsize_dict, maxsize_string))
+ for (key, child) in val.items()])
+
+ elif isinstance(val, (basestring, buffer)) :
+ if len(val) > maxsize_string :
+ return "'...'"
+
+ return val
+
+ else :
+ val = repr(val)
+ if len(val) > maxsize_string :
+ return "<...>"
+
+ return val
+
+
+TRACE=9
+logging.addLevelName(TRACE, 'TRACE')
+
+# TODO: lazy evaluation of parameters
+def trace(skip_args=[], skip_kwargs=[], maxsize_list=30, maxsize_dict=30, maxsize_string=300) :
def _trace(f, *args, **kwargs) :
- logging.debug("%s(%s)" % (f.__name__,
- ", ".join(
- [repr(a) for (idx, a) in enumerate(args) if idx not in skip_args]+\
- ['%s=%r' % (k,v) for (k,v) in kwargs.items() if k not in skip_kwargs])))
+ params_formatted = ", ".join(
+ [repr(filter_maxsize(a, maxsize_list, maxsize_dict, maxsize_string))
+ for (idx, a) in enumerate(args) if idx not in skip_args]+\
+ ['%s=%r' % (k,filter_maxsize(v, maxsize_list, maxsize_dict, maxsize_string))
+ for (k,v) in kwargs.items() if k not in skip_kwargs])
+
+ logging.log(TRACE, "%s(%s) invoked", f.__name__, params_formatted)
+
+ try :
+ res=f(*args, **kwargs)
+ except :
+ logging.exception("Exception occured in %s", f.__name__, exc_info=True)
+ raise
- return f(*args, **kwargs)
+ logging.log(TRACE, "%s(%s) returned %r", f.__name__, params_formatted,
+ filter_maxsize(res, maxsize_list, maxsize_dict, maxsize_string))
+ return res
return decorator.decorator(_trace)