1 import logging, sys |
|
2 |
|
3 """ |
|
4 Fancy tree-structured logging output |
|
5 """ |
|
6 |
|
7 log_level = logging.INFO |
|
8 stack = [] |
|
9 |
|
10 class g : |
|
11 out_depth = 0 |
|
12 node = None |
|
13 |
|
14 def title (title, *args) : |
|
15 stack.append(title) |
|
16 |
|
17 print "%s - %s" % (" "*g.out_depth, title % args) |
|
18 |
|
19 g.out_depth += 1 |
|
20 |
|
21 def down (dir_name, *args) : |
|
22 stack.append(dir_name % args) |
|
23 g.node = None |
|
24 |
|
25 def next (fname, *args) : |
|
26 g.node = fname % args |
|
27 |
|
28 def up () : |
|
29 stack.pop(-1) |
|
30 g.node = None |
|
31 g.out_depth = min(g.out_depth, len(stack)) |
|
32 |
|
33 def done () : |
|
34 print "done" |
|
35 |
|
36 def log (level, message, *args, **kwargs) : |
|
37 wait = kwargs.get("wait", False) |
|
38 |
|
39 if level >= log_level : |
|
40 if g.out_depth != len(stack) : |
|
41 for segment in stack[g.out_depth:] : |
|
42 print "%sd %s" % (" "*g.out_depth, segment) |
|
43 g.out_depth += 1 |
|
44 |
|
45 if g.node : |
|
46 print "%sf %s" % (" "*g.out_depth, g.node) |
|
47 g.node = None |
|
48 |
|
49 if wait : |
|
50 print "%s - %s..." % (" "*g.out_depth, message % args), |
|
51 sys.stdout.flush() |
|
52 else : |
|
53 print "%s - %s" % (" "*g.out_depth, message % args) |
|
54 |
|
55 def _level (level) : |
|
56 def _log_func (message, *args, **kwargs) : |
|
57 log(level, message, *args, **kwargs) |
|
58 |
|
59 return _log_func |
|
60 |
|
61 debug = _level(logging.DEBUG) |
|
62 info = _level(logging.INFO) |
|
63 warning = _level(logging.WARNING) |
|
64 error = _level(logging.ERROR) |
|
65 |
|