blob: 5c4f7818ffd730341ea0110c85e1f7228e3f7440 [file] [log] [blame]
Armin Ronacher19863ef2007-03-02 07:07:57 +01001# -*- coding: utf-8 -*-
2"""
3 jdebug
4 ~~~~~~
5
6 Helper module to simplify jinja debugging. Use
7
8 :copyright: 2006 by Armin Ronacher.
9 :license: BSD, see LICENSE for more details.
10"""
Armin Ronachera6901462007-03-29 20:03:40 +020011import os
12import sys
Armin Ronacher116b91c2007-11-10 12:40:38 +010013import gc
Armin Ronacher19863ef2007-03-02 07:07:57 +010014from jinja import Environment
15from jinja.parser import Parser
Armin Ronacherb9c8ae12007-03-20 00:14:10 +010016from jinja.lexer import Lexer
Armin Ronacher19863ef2007-03-02 07:07:57 +010017from jinja.translators.python import PythonTranslator
18
19
Armin Ronacher116b91c2007-11-10 12:40:38 +010020__all__ = ['e', 't', 'p', 'l', 'm']
Armin Ronacher19863ef2007-03-02 07:07:57 +010021
22e = Environment()
23t = e.from_string
24
Armin Ronachera6901462007-03-29 20:03:40 +020025
26if os.environ.get('JDEBUG_SOURCEPRINT'):
27 original_translate = PythonTranslator.translate
28
29 def debug_translate(self):
30 rv = original_translate(self)
31 sys.stderr.write('## GENERATED SOURCE:\n%s\n' % rv)
32 return rv
33
34 PythonTranslator.translate = debug_translate
35
36
Armin Ronacherfb5bebc2007-04-27 18:24:19 +020037def p(x=None, f=None):
38 if x is None and f is not None:
39 x = e.loader.get_source(f)
Armin Ronacher1cc232c2007-09-07 17:52:41 +020040 print PythonTranslator(e, Parser(e, x, f).parse(), None).translate()
Armin Ronacherb9c8ae12007-03-20 00:14:10 +010041
42def l(x):
Armin Ronacher1cc232c2007-09-07 17:52:41 +020043 for token in e.lexer.tokenize(x):
44 print '%5s %-20s %r' % (item.lineno,
45 item.type,
46 item.value)
Armin Ronacherfb5bebc2007-04-27 18:24:19 +020047
Armin Ronacher116b91c2007-11-10 12:40:38 +010048class MemoryGuard(object):
49
50 def __init__(self):
51 self.guarded_objects = {}
52 self.clear = self.guarded_objects.clear
53
54 def freeze(self):
55 self.clear()
56 self.update()
57
58 def update(self):
59 self.guarded_objects.clear()
60 for obj in gc.get_objects():
61 self.guarded_objects[id(obj)] = True
62
63 def get_delta(self):
64 result = []
65 for obj in gc.get_objects():
66 if id(obj) not in self.guarded_objects:
67 result.append(obj)
68 return result
69
70
71m = MemoryGuard()
72
73
Armin Ronacherfb5bebc2007-04-27 18:24:19 +020074if __name__ == '__main__':
75 if len(sys.argv) > 1:
76 from jinja import FileSystemLoader
77 e.loader = FileSystemLoader(sys.argv[1])
78 if len(sys.argv) > 2:
79 p(f=sys.argv[2])
80 else:
81 p(sys.stdin.read())