From 804e7cb795a17a5c564493e7cded9d87ac196904 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Wed, 27 Jul 2011 16:33:50 +0000 Subject: [PATCH] Add some debug output utility functions. - Legacy-Id: 3262 --- ietf/utils/debug.py | 74 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 ietf/utils/debug.py diff --git a/ietf/utils/debug.py b/ietf/utils/debug.py new file mode 100644 index 000000000..3f78106e0 --- /dev/null +++ b/ietf/utils/debug.py @@ -0,0 +1,74 @@ + +import sys +import inspect +from pprint import pformat +from django.conf import settings + +# A debug decorator, written by Paul Butler, taken from +# http://paulbutler.org/archives/python-debugging-with-decorators/ + +# Number of times to indent output +# A list is used to force access by reference +__report_indent = [4] +increment = 2 + +def set_indent(i): + __report_indent[0] = i + +def trace(fn): # renamed from 'report' by henrik 16 Jun 2011 + """Decorator to print information about a function + call for use while debugging. + Prints function name, arguments, and call number + when the function is called. Prints this information + again along with the return value when the function + returns. + """ + def fix(s,n=32): + if len(s) > n+3: + s = s[:n]+"..." + s = s.replace('\n',' ') + return s + def wrap(*params,**kwargs): + call = wrap.callcount = wrap.callcount + 1 + + indent = ' ' * __report_indent[0] + fc = "%s(%s)" % (fn.__name__, ', '.join( + [fix(repr(a)) for a in params] + + ["%s = %s" % (a, fix(repr(b))) for a,b in kwargs.items()] + )) + + print "%s* %s [#%s]" % (indent, fc, call) + __report_indent[0] += increment + ret = fn(*params,**kwargs) + __report_indent[0] -= increment + print "%s %s [#%s] ==> %s" % (indent, fc, call, repr(ret)) + + return ret + wrap.callcount = 0 + if settings.DEBUG: + return wrap + else: + return fn + +def show(name): + if settings.DEBUG: + frame = inspect.stack()[1][0] + value = eval(name, frame.f_globals, frame.f_locals) + indent = ' ' * (__report_indent[0]) + print "%s%s: %s" % (indent, name, value) + +def pprint(name): + if settings.DEBUG: + frame = inspect.stack()[1][0] + value = eval(name, frame.f_globals, frame.f_locals) + indent = ' ' * (__report_indent[0]) + sys.stdout.write("%s%s:\n" % (indent, name)) + lines = pformat(value).split('\n') + for line in lines: + sys.stdout.write("%s %s\n"%(indent, line)) + +def say(s): + if settings.DEBUG: + indent = ' ' * (__report_indent[0]) + print "%s%s" % (indent, s) +