diff options
Diffstat (limited to 'src/carquinyol/__init__.py')
-rw-r--r-- | src/carquinyol/__init__.py | 59 |
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) |