Mercurial > p > roundup > code
annotate roundup/cgi/cgitb.py @ 7965:6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
Fix change in pydoc.html.header() signature. It dropped foreground and
background color arguments in 3.11 and newer.
Also enable test code for the html function.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Tue, 14 May 2024 21:27:28 -0400 |
| parents | 6c5f8da9fca7 |
| children | 9c3ec0a5c7fc |
| rev | line source |
|---|---|
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1 # |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
2 # This module was written by Ka-Ping Yee, <ping@lfw.org>. |
|
2426
cafdf8b7cc69
use templating translation service instead of commandline-oriented gettext()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2005
diff
changeset
|
3 # |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
4 |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1947
diff
changeset
|
5 """Extended CGI traceback handler by Ka-Ping Yee, <ping@lfw.org>. |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
6 """ |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
4570
diff
changeset
|
7 from __future__ import print_function |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1947
diff
changeset
|
8 __docformat__ = 'restructuredtext' |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
9 |
|
6983
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
10 import inspect |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
11 import keyword |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
12 import linecache |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
13 import os |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
14 import pydoc |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
15 import sys |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
16 import tokenize |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
17 import traceback |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
18 |
|
5837
883c9e90b403
Fix problem with cgi.escape being depricated a different way. This way
John Rouillard <rouilj@ieee.org>
parents:
5800
diff
changeset
|
19 from roundup.anypy.html import html_escape |
|
6983
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
20 from roundup.anypy.strings import s2b |
| 6201 | 21 from roundup.cgi import TranslationService |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
22 |
| 6201 | 23 |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
24 def get_translator(i18n=None): |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
25 """Return message translation function (gettext) |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
26 |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
27 Parameters: |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
28 i18n - translation service, such as roundup.i18n module |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
29 or TranslationService object. |
|
2426
cafdf8b7cc69
use templating translation service instead of commandline-oriented gettext()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2005
diff
changeset
|
30 |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
31 Return ``gettext`` attribute of the ``i18n`` object, if available |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
32 (must be a message translation function with one argument). |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
33 If ``gettext`` cannot be obtained from ``i18n``, take default |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
34 TranslationService. |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
35 |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
36 """ |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
37 try: |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
38 return i18n.gettext |
| 6201 | 39 except AttributeError: |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
40 return TranslationService.get_translation().gettext |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
41 |
| 6201 | 42 |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
43 def breaker(): |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
44 return ('<body bgcolor="white">' + |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
45 '<font color="white" size="-5"> > </font> ' + |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
46 '</table>' * 5) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
47 |
| 6201 | 48 |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
49 def niceDict(indent, dict): |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
50 l = [] |
|
4362
74476eaac38a
more modernisation
Richard Jones <richard@users.sourceforge.net>
parents:
4264
diff
changeset
|
51 for k in sorted(dict): |
|
4264
b1e614c6759f
Improve error reporting.
Stefan Seefeld <stefan@seefeld.name>
parents:
2564
diff
changeset
|
52 v = dict[k] |
|
6983
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
53 l.append('<tr><td><strong>%s</strong></td><td>%s</td></tr>' % ( |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
54 k, html_escape(repr(v)))) |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
55 return '\n'.join(l) |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
56 |
| 6201 | 57 |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
58 def pt_html(context=5, i18n=None): |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
59 _ = get_translator(i18n) |
|
5800
1a835db41674
Call cgi.escape only on python 2. Replace with html.escapeif it can be
John Rouillard <rouilj@ieee.org>
parents:
5436
diff
changeset
|
60 esc = html_escape |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
61 exc_info = [esc(str(value)) for value in sys.exc_info()[:2]] |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
62 l = [_('<h1>Templating Error</h1>\n' |
| 6201 | 63 '<p><b>%(exc_type)s</b>: %(exc_value)s</p>\n' |
| 64 '<p class="help">Debugging information follows</p>' | |
| 65 ) % {'exc_type': exc_info[0], 'exc_value': exc_info[1]}, | |
| 66 '<ol>', ] | |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
67 from roundup.cgi.PageTemplates.Expressions import TraversalError |
|
1204
b862bbf2067a
Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents:
1136
diff
changeset
|
68 t = inspect.trace(context) |
|
b862bbf2067a
Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents:
1136
diff
changeset
|
69 t.reverse() |
| 7300 | 70 for frame, _file, _lnum, _func, _lines, _index in t: |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
71 args, varargs, varkw, locals = inspect.getargvalues(frame) |
|
4362
74476eaac38a
more modernisation
Richard Jones <richard@users.sourceforge.net>
parents:
4264
diff
changeset
|
72 if '__traceback_info__' in locals: |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
73 ti = locals['__traceback_info__'] |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
74 if isinstance(ti, TraversalError): |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
75 s = [] |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
76 for name, info in ti.path: |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
77 s.append(_('<li>"%(name)s" (%(info)s)</li>') |
| 6201 | 78 % {'name': name, 'info': esc(repr(info))}) |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
79 s = '\n'.join(s) |
|
6983
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
80 l.append(_( |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
81 '<li>Looking for "%(name)s", ' |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
82 'current path:<ol>%(path)s</ol></li>' |
|
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
83 ) % {'name': ti.name, 'path': s}) |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
84 else: |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
85 l.append(_('<li>In %s</li>') % esc(str(ti))) |
|
4362
74476eaac38a
more modernisation
Richard Jones <richard@users.sourceforge.net>
parents:
4264
diff
changeset
|
86 if '__traceback_supplement__' in locals: |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
87 ts = locals['__traceback_supplement__'] |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
88 if len(ts) == 2: |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
89 supp, context = ts |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
90 s = _('A problem occurred in your template "%s".') \ |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
91 % str(context.id) |
|
1204
b862bbf2067a
Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents:
1136
diff
changeset
|
92 if context._v_errors: |
|
b862bbf2067a
Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents:
1136
diff
changeset
|
93 s = s + '<br>' + '<br>'.join( |
|
1396
cce5b4309005
extra info in template error report
Richard Jones <richard@users.sourceforge.net>
parents:
1204
diff
changeset
|
94 [esc(x) for x in context._v_errors]) |
| 6201 | 95 l.append('<li>%s</li>' % s) |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
96 elif len(ts) == 3: |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
97 supp, context, info = ts |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
98 l.append(_(''' |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
99 <li>While evaluating the %(info)r expression on line %(line)d |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
100 <table class="otherinfo" style="font-size: 90%%"> |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
101 <tr><th colspan="2" class="header">Current variables:</th></tr> |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
102 %(globals)s |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
103 %(locals)s |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
104 </table></li> |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
105 ''') % { |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
106 'info': info, |
|
7808
6c5f8da9fca7
fix: cgitb crashes if there is no line number set.
John Rouillard <rouilj@ieee.org>
parents:
7300
diff
changeset
|
107 'line': context.position[0] or -1, |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
108 'globals': niceDict(' ', context.global_vars), |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
109 'locals': niceDict(' ', context.local_vars) |
|
6983
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
110 }) |
|
1079
04b44df7af1d
removed some property name clashes
Richard Jones <richard@users.sourceforge.net>
parents:
1066
diff
changeset
|
111 |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
112 l.append(''' |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
113 </ol> |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
114 <table style="font-size: 80%%; color: gray"> |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
115 <tr><th class="header" align="left">%s</th></tr> |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
116 <tr><td><pre>%s</pre></td></tr> |
|
5800
1a835db41674
Call cgi.escape only on python 2. Replace with html.escapeif it can be
John Rouillard <rouilj@ieee.org>
parents:
5436
diff
changeset
|
117 </table>''' % (_('Full traceback:'), html_escape(''.join( |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
118 traceback.format_exception(*sys.exc_info()) |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
119 )))) |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
120 l.append('<p> </p>') |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
121 return '\n'.join(l) |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
122 |
| 6201 | 123 |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
124 def html(context=5, i18n=None): |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
125 _ = get_translator(i18n) |
|
4362
74476eaac38a
more modernisation
Richard Jones <richard@users.sourceforge.net>
parents:
4264
diff
changeset
|
126 etype, evalue = sys.exc_info()[0], sys.exc_info()[1] |
|
74476eaac38a
more modernisation
Richard Jones <richard@users.sourceforge.net>
parents:
4264
diff
changeset
|
127 if type(etype) is type: |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
128 etype = etype.__name__ |
|
5433
86b6cea7a975
Python 3 preparation: avoid string.split().
Joseph Myers <jsm@polyomino.org.uk>
parents:
5420
diff
changeset
|
129 pyver = 'Python ' + sys.version.split()[0] + '<br>' + sys.executable |
|
7965
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
130 |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
131 if sys.version_info[0:2] >= (3,11): |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
132 head = pydoc.html.heading( |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
133 _('<font size=+1><strong>%(exc_type)s</strong>: ' |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
134 '%(exc_value)s</font>') |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
135 % {'exc_type': etype, 'exc_value': evalue}, pyver) |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
136 else: |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
137 head = pydoc.html.heading( |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
138 _('<font size=+1><strong>%(exc_type)s</strong>: ' |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
139 '%(exc_value)s</font>') |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
140 % {'exc_type': etype, 'exc_value': evalue}, |
|
6763813d9d34
issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
7808
diff
changeset
|
141 '#ffffff', '#777777', pyver) |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
142 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
143 head = head + (_('<p>A problem occurred while running a Python script. ' |
| 6201 | 144 'Here is the sequence of function calls leading up to ' |
| 145 'the error, with the most recent (innermost) call first. ' | |
| 146 'The exception attributes are:')) | |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
147 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
148 indent = '<tt><small>%s</small> </tt>' % (' ' * 5) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
149 traceback = [] |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
150 for frame, file, lnum, func, lines, index in inspect.trace(context): |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
151 if file is None: |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
152 link = _("<file is None - probably inside <tt>eval</tt> " |
| 6201 | 153 "or <tt>exec</tt>>") |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
154 else: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
155 file = os.path.abspath(file) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
156 link = '<a href="file:%s">%s</a>' % (file, pydoc.html.escape(file)) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
157 args, varargs, varkw, locals = inspect.getargvalues(frame) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
158 if func == '?': |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
159 call = '' |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
160 else: |
| 6201 | 161 call = _('in <strong>%s</strong>') % \ |
| 162 func + inspect.formatargvalues( | |
| 163 args, varargs, varkw, locals, | |
| 164 formatvalue=lambda value: '=' + pydoc.html.repr(value)) | |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
165 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
166 level = ''' |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
167 <table width="100%%" bgcolor="#dddddd" cellspacing=0 cellpadding=2 border=0> |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
168 <tr><td>%s %s</td></tr></table>''' % (link, call) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
169 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
170 if index is None or file is None: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
171 traceback.append('<p>' + level) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
172 continue |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
173 |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
174 # do a file inspection |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
175 names = [] |
| 6201 | 176 |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
177 def tokeneater(type, token, start, end, line, names=names): |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
178 if type == tokenize.NAME and token not in keyword.kwlist: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
179 if token not in names: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
180 names.append(token) |
|
6983
3129d73e8535
flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents:
6201
diff
changeset
|
181 if type == tokenize.NEWLINE: raise IndexError # noqa: E701 |
| 6201 | 182 |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
183 def linereader(file=file, lnum=[lnum]): |
|
5436
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
184 line = s2b(linecache.getline(file, lnum[0])) |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
185 lnum[0] = lnum[0] + 1 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
186 return line |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
187 |
|
5436
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
188 # The interface that is tokenize.tokenize in Python 3 is |
|
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
189 # called tokenize.generate_tokens in Python 2. However, |
|
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
190 # Python 2 has tokenize.tokenize with a different interface, |
|
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
191 # and Python 3 has an undocumented generate_tokens function, |
|
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
192 # also with a different interface, so a version check is |
|
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
193 # needed instead of checking for which functions exist. |
|
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
194 if sys.version_info[0] > 2: |
|
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
195 tokenize_fn = tokenize.tokenize |
|
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
196 else: |
|
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
197 tokenize_fn = tokenize.generate_tokens |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
198 try: |
|
5436
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
199 for t in tokenize_fn(linereader): |
|
e70fe1d1215b
Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5434
diff
changeset
|
200 tokeneater(*t) |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
201 except IndexError: |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
202 pass |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
203 lvals = [] |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
204 for name in names: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
205 if name in frame.f_code.co_varnames: |
|
4362
74476eaac38a
more modernisation
Richard Jones <richard@users.sourceforge.net>
parents:
4264
diff
changeset
|
206 if name in locals: |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
207 value = pydoc.html.repr(locals[name]) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
208 else: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
209 value = _('<em>undefined</em>') |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
210 name = '<strong>%s</strong>' % name |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
211 else: |
|
4362
74476eaac38a
more modernisation
Richard Jones <richard@users.sourceforge.net>
parents:
4264
diff
changeset
|
212 if name in frame.f_globals: |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
213 value = pydoc.html.repr(frame.f_globals[name]) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
214 else: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
215 value = _('<em>undefined</em>') |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
216 name = '<em>global</em> <strong>%s</strong>' % name |
| 6201 | 217 lvals.append('%s = %s' % (name, value)) |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
218 if lvals: |
|
5434
1ab2c81a64df
Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents:
5433
diff
changeset
|
219 lvals = ', '.join(lvals) |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
220 lvals = indent + '<small><font color="#909090">%s'\ |
| 6201 | 221 '</font></small><br>' % lvals |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
222 else: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
223 lvals = '' |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
224 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
225 excerpt = [] |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
226 i = lnum - index |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
227 for line in lines: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
228 number = ' ' * (5-len(str(i))) + str(i) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
229 number = '<small><font color="#909090">%s</font></small>' % number |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
230 line = '<tt>%s %s</tt>' % (number, pydoc.html.preformat(line)) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
231 if i == lnum: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
232 line = ''' |
|
1947
0e19e99075e3
fix #white in cgitb
Richard Jones <richard@users.sourceforge.net>
parents:
1396
diff
changeset
|
233 <table width="100%%" bgcolor="white" cellspacing=0 cellpadding=0 border=0> |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
234 <tr><td>%s</td></tr></table>''' % line |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
235 excerpt.append('\n' + line) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
236 if i == lnum: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
237 excerpt.append(lvals) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
238 i = i + 1 |
|
5434
1ab2c81a64df
Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents:
5433
diff
changeset
|
239 traceback.append('<p>' + level + '\n'.join(excerpt)) |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
240 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
241 traceback.reverse() |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
242 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
243 exception = '<p><strong>%s</strong>: %s' % (str(etype), str(evalue)) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
244 attribs = [] |
|
5420
7172c201dec2
Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5376
diff
changeset
|
245 for name in dir(evalue): |
|
7172c201dec2
Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5376
diff
changeset
|
246 value = pydoc.html.repr(getattr(evalue, name)) |
|
7172c201dec2
Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5376
diff
changeset
|
247 attribs.append('<br>%s%s = %s' % (indent, name, value)) |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
248 |
|
5434
1ab2c81a64df
Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents:
5433
diff
changeset
|
249 return head + ' '.join(attribs) + ' '.join(traceback) + '<p> </p>' |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
250 |
| 6201 | 251 |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
252 def handler(): |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
4570
diff
changeset
|
253 print(breaker()) |
|
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
4570
diff
changeset
|
254 print(html()) |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
255 |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
256 # vim: set filetype=python ts=4 sw=4 et si : |
