Commit e8947311 authored by Laurent Peuch's avatar Laurent Peuch
Browse files

[debug-toolbar/display_source_code] add a pyramid view that display syntax...

[debug-toolbar/display_source_code] add a pyramid view that display syntax highlighted python source file

This will be used for tool building for easier debugging.

Closes #17256791
parent be0864a2eec8
......@@ -28,6 +28,8 @@ import warnings
import wsgicors
from cubicweb.cwconfig import CubicWebConfiguration as cwcfg
from cubicweb.pyramid.debug_source_code import debug_display_source_code, DEBUG_DISPLAY_SOURCE_CODE_PATH
from pyramid.config import Configurator
from pyramid.exceptions import ConfigurationError
from pyramid.settings import asbool, aslist
......@@ -109,6 +111,11 @@ def wsgi_application_from_cwconfig(
config.add_route('profile_ping', '_profile/ping')
config.add_route('profile_cnx', '_profile/cnx')
config.scan('cubicweb.pyramid.profile')
if debugtoolbar:
config.add_route('debug_display_source_code', DEBUG_DISPLAY_SOURCE_CODE_PATH)
config.add_view(debug_display_source_code, route_name='debug_display_source_code')
app = config.make_wsgi_app()
# This replaces completely web/cors.py, which is not used by
# cubicweb.pyramid anymore
......
# copyright 2019 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
#
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
#
# This file is part of CubicWeb.
#
# CubicWeb is free software: you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free
# Software Foundation, either version 2.1 of the License, or (at your option)
# any later version.
#
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
# details.
#
# You should have received a copy of the GNU Lesser General Public License along
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>.
"""
Debug view for pyramid debug toolbar and others to help development
"""
import os
from pyramid.response import Response
from mako.template import Template
from cubicweb.misc.source_highlight import highlight_html, generate_css, has_pygments
DEBUG_DISPLAY_SOURCE_CODE_PATH = '_debug_display_source_code'
def debug_display_source_code(request):
"""
This view display a python source file content for making debugging easier.
It is only activated on debug mode (-D) for pyramid during development.
It will uses pygment if installed to colorize the source code.
"""
if "file" not in request.params:
return Response('Error: you should have end up on this page following a link in the '
'pyramid debug toolbar with the correct parameters.')
source_code_file = request.params["file"]
if not os.path.exists(source_code_file):
return Response("Error: file '%s' doesn't exist on the filesystem." % source_code_file)
try:
content = open(source_code_file, "r").read()
except Exception as e:
return Response("Error: while opening file '%s' got the error: %s" % (source_code_file, e))
lines = []
line_begin = request.params.get("line", None)
if line_begin:
line_end = request.params.get("end", line_begin)
lines = list(range(int(line_begin), int(line_end) + 1))
this_file_directory = os.path.split(os.path.realpath(__file__))[0]
template_filename = os.path.join(this_file_directory,
"debug_toolbar_templates/debug_source_code.mako")
html = Template(filename=template_filename).render(
file_path=source_code_file,
content=content,
has_pygments=has_pygments,
highlight_html=highlight_html,
css=generate_css(),
lines=lines,
)
return Response(html)
<html>
<head>
<title>${file_path}</title>
</head>
<body>
<h2>${file_path}</h2>
% if has_pygments:
${highlight_html(content, "python", linenos=True, hl_lines=lines, lineanchors="line")}
% else:
<table class="rawtable">
% for line_number, source_line in enumerate(content.split("\n"), start=1):
<tr>
<td class="line_number">
<pre>${line_number}</pre>
</td>
<td>
% if line_number in lines:
<a class="highlight-line" name="line-${line_number}">
% else:
<a name="line-${line_number}">
% endif
<pre>${source_line.rstrip()} </pre>
</a>
</td>
</tr>
% endfor
</table>
% endif
<style>
h2 {
text-align: center;
width: 100%%;
color: #fefefe;
background-color: #333333;
padding: 10px;
font-family: sans;
margin: 0;
}
body {
margin: 0;
}
.highlighttable, .rawtable {
margin: auto;
font-size: larger;
border: 2px solid black;
border-top: 0;
border-bottom: 0;
}
.rawtable {
padding: 10px;
}
pre {
margin: 0;
}
.line_number {
text-align: right;
}
.rawtable td {
padding: 0;
}
.hll {
display: block;
}
.highlight-line > pre {
background-color: #ffffcc;
}
${css}
</style>
</body>
</html>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment