File: render.py

package info (click to toggle)
pypy3 7.0.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 111,848 kB
  • sloc: python: 1,291,746; ansic: 74,281; asm: 5,187; cpp: 3,017; sh: 2,533; makefile: 544; xml: 243; lisp: 45; csh: 21; awk: 4
file content (127 lines) | stat: -rw-r--r-- 4,058 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
from pypy.tool.tb_server.server import TBRequestHandler
import py 
html = py.xml.html 

import traceback
import cgi
import urllib

views = TBRequestHandler.views

class URL(object):
    attrs='scm','netloc','path','params','query','fragment'
    attrindex = dict(zip(attrs, range(len(attrs))))
    # XXX authentication part is not parsed

    def __init__(self, string='', **kw):
        from urlparse import urlparse
        for name,value in zip(self.attrs, urlparse(string, 'http')):
            setattr(self, name, value)
        self.__dict__.update(kw)
        self.query = cgi.parse_qs(self.query)

    def link_with_options(self, kw):
        nq = {}
        for k in self.query:
            nq[k] = self.query[k][0]
        nq.update(kw)
        query = urllib.urlencode(nq)
        from urlparse import urlunparse
        return urlunparse(('', self.netloc, self.path,
                           self.params, query, self.fragment))

class Renderer:
    def render(self, path):
        url = URL(path)
        args = url.path.split('/')[2:]
        try:
            inner = self.render_self(url, args)
        except:
            import sys, traceback
            lines = traceback.format_exception(*sys.exc_info())
            inner =  html.pre(
                py.xml.escape(''.join(
                ['Internal Rendering Error, traceback follows\n'] + lines)))
            
        tag = html.html(
            html.head(),
            html.body(
                inner
            )
        )
        return tag.unicode(indent=2)
    

class TracebackView(Renderer):
    def __init__(self, excinfo):
        self.name = 'traceback%d' % len(views) 
        views[self.name] = self
        if not isinstance(excinfo, py.code.ExceptionInfo): 
            excinfo = py.code.ExceptionInfo(excinfo) 
        self.excinfo = excinfo 
        
    def render_self(self, url, args):
        lines = html.div()
        opts = {}
        for k in url.query:
            ent, opt = k.split(':')
            val = int(url.query[k][0])
            opts.setdefault(ent, {})[opt] = val
            
        i = 0
        for tbentry in self.excinfo.traceback: 
            lines.append(self.render_tb(
                                url, tbentry, i,
                                **opts.get('entry' + str(i), {})))
            i += 1
            
        lines.append(html.pre(py.xml.escape(self.excinfo.exconly()))) 
        return lines

    def render_tb(self, url, tbentry, i, showlocals=0):
        lines = html.pre()
        filename = tbentry.frame.code.path 
        lineno = tbentry.lineno + 1
        name = tbentry.frame.code.name 
        link = '/file%s?line=%d#%d' %(filename, lineno, lineno) 
        lines.append('  File "%s", line %d, in %s\n'%(
            html.a(filename, href=link), lineno, name))
        lines.append(html.a('locals', href=url.link_with_options(
            {'entry%d:showlocals' % i : 1-showlocals})))
        lines.append('       ' + 
                     filename.readlines()[lineno-1].lstrip())
        if showlocals:
            for k, v in tbentry.frame.f_locals.items(): 
                if k[0] == '_':
                    continue
                lines.append(py.xml.escape('%s=%s\n'%(k, repr(v)[:1000])))
        return lines
        

def ln(lineno):
    return html.a(name=str(lineno))

class FileSystemView(Renderer):
    def render_self(self, url, args):
        fname = '/' + '/'.join(args)
        lines = html.table()
        i = 1
        hilite = int(url.query.get('line', [-1])[0])
        for line in open(fname):
            if i == hilite:
                kws = {'style': 'font-weight: bold;'}
            else:
                kws = {}
            row = html.tr(
                html.td(html.a("%03d" % i, name=str(i))),
                html.td(
                    html.pre(py.xml.escape(line)[:-1],
                             **kws),
                ), 
            )
            lines.append(row) 
            i += 1
        return lines
    
views['file'] = FileSystemView()