提交 7880d28c 编写于 作者: C Caio Carrara

html: Replaces pystache by jinja to template definition

Since the pystache project seems to be dead, without recent updates and
has not support planned for Python 3.7+, this change replace it by jinja
template engine.
Signed-off-by: NCaio Carrara <ccarrara@redhat.com>
上级 5f548826
......@@ -23,8 +23,7 @@ import subprocess
import sys
import time
import pkg_resources
import pystache
import jinja2 as jinja
from avocado.core import exit_codes
from avocado.core.output import LOG_UI
......@@ -43,24 +42,6 @@ class ReportModel(object):
self.html_output = html_output
self.html_output_dir = os.path.abspath(os.path.dirname(html_output))
def update(self, **kwargs):
"""
Hook for updates not supported
"""
def get(self, key, default):
value = getattr(self, key, default)
if callable(value):
return value()
else:
return value
def job_unique_id(self):
return self.result.job_unique_id
def tests_total_time(self):
return "%.2f" % self.result.tests_total_time
def results_dir(self, relative_links=True):
results_dir = os.path.abspath(os.path.dirname(
self.result.logfile))
......@@ -72,25 +53,6 @@ class ReportModel(object):
def results_dir_basename(self):
return os.path.basename(self.results_dir(False))
def tests_total(self):
return self.result.tests_total
def passed(self):
return self.result.passed
def warned(self):
return self.result.warned
def rate(self):
total = float(self.result.tests_total - self.result.skipped -
self.result.cancelled)
succeeded = float(self.result.passed + self.result.warned)
if total > 0:
pr = 100 * (succeeded / total)
else:
pr = 0
return "%.2f" % pr
def _get_sysinfo(self, sysinfo_file):
sysinfo_path = os.path.join(self.results_dir(False),
'sysinfo', 'pre', sysinfo_file)
......@@ -101,6 +63,7 @@ class ReportModel(object):
sysinfo_contents = "Error reading %s: %s" % (sysinfo_path, details)
return sysinfo_contents
@property
def hostname(self):
return self._get_sysinfo('hostname').strip()
......@@ -200,12 +163,15 @@ class ReportModel(object):
s_id += 1
return sysinfo_list
@property
def sysinfo_pre(self):
return self._sysinfo_phase('pre')
@property
def sysinfo_profile(self):
return self._sysinfo_phase('profile')
@property
def sysinfo_post(self):
return self._sysinfo_phase('post')
......@@ -234,31 +200,12 @@ class HTMLResult(Result):
preexec_fn=setsid)
def _render(self, result, output_path):
context = ReportModel(result=result, html_output=output_path)
template = pkg_resources.resource_string(
'avocado_result_html',
'resources/templates/report.mustache')
# pylint: disable=E0611
try:
if hasattr(pystache, 'Renderer'):
renderer = pystache.Renderer('utf-8', 'utf-8')
report_contents = renderer.render(template, context)
else:
from pystache import view
v = view.View(template, context)
report_contents = v.render('utf8')
except UnicodeDecodeError as details:
# FIXME: Remove me when UnicodeDecodeError problem is fixed
LOG_UI.critical("\n%s", ("-" * 80))
LOG_UI.critical("HTML failed to render the template: %s\n\n",
template)
LOG_UI.critical("-" * 80)
LOG_UI.critical("%s:\n\n", details)
LOG_UI.critical("%r", getattr(details, "object",
"object not found"))
LOG_UI.critical("-" * 80)
raise
env = jinja.Environment(
loader=jinja.PackageLoader('avocado_result_html'),
autoescape=jinja.select_autoescape(['html', 'xml']),
)
template = env.get_template('results.html')
report_contents = template.render({'data': ReportModel(result, output_path)})
with codecs.open(output_path, 'w', 'utf-8') as report_file:
report_file.write(report_contents)
......
......@@ -29,23 +29,26 @@
<table class="table table-bordered">
<tr>
<td>ID</td>
<td><tt>{{ job_unique_id }}</tt></td>
<td><tt>{{ data.result.job_unique_id }}</tt></td>
</tr>
<tr>
<td>Host</td>
<td><tt>{{ hostname }}</tt></td>
<td><tt>{{ data.hostname }}</tt></td>
</tr>
<tr>
<td>Results Dir</td>
<td><a href="{{ results_dir }}"><tt>{{ results_dir_basename }}</tt></a></td>
<td><a href="{{ data.results_dir() }}"><tt>{{ data.results_dir_basename() }}</tt></a></td>
</tr>
<tr>
<td>Cumulative test time</td>
<td>{{ tests_total_time }} s</td>
<td>{{ '%.2f'|format(data.result.tests_total_time) }} s</td>
</tr>
<tr>
<td>Stats</td>
<td>From {{ tests_total }} tests executed, {{ passed }} passed and {{ warned }} warned - success rate of {{ rate }}% (excluding SKIP and CANCEL)</td>
<td>From {{ data.result.tests_total }} tests executed,
{{ data.result.passed }} passed and
{{ data.result.warned }} warned - success rate of
{{ '%.2f'|format(data.result.rate) }}% (excluding SKIP and CANCEL)</td>
</tr>
</table>
</div>
......@@ -63,16 +66,16 @@
<th>Debug Log</th>
</tr>
</thead>
{% for test in tests %}
<tr class="{{row_class}}">
{% for test in data.tests %}
<tr class="{{ data.row_class }}">
<td>{{ test.time_start }}</td>
<td>{{ test.uid }}</td>
<td><a href="{{ test.logdir }}" title="{{ test.params }}">{{ test.name }}</a></td>
<td>{{ test.variant }}</td>
<td>{{ test.status }}</td>
<td>{{ test.time }}</td>
<td>{{ test.fail_reason }}</td>
<td><a href="{{ logfile }}">{{ logfile_basename }}</a></td>
<td>{{ test.fail_reason|safe }}</td>
<td><a href="{{ test.logfile }}">{{ test.logfile_basename }}</a></td>
</tr>
{% endfor %}
</table>
......@@ -92,7 +95,7 @@
<div id="collapsePre" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingPre">
<div class="panel-body">
<div class="panel-group" id="accordionPre2" role="tablist" aria-multiselectable="true">
{% for sysinfo in sysinfo_pre %}
{% for sysinfo in data.sysinfo_pre %}
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="{{ sysinfo.element_id }}">
<h4 class="panel-title">
......@@ -102,7 +105,7 @@
<div id="{{ sysinfo.collapse_id }}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="{{ sysinfo.element_id }}">
<div class="panel-body">
<pre>{{ sysinfo.contents }}</pre>
{{ sysinfo.err }}
{{ sysinfo.err|safe }}
</div>
</div>
</div>
......@@ -123,7 +126,7 @@
<div id="collapsePost" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingPost">
<div class="panel-body">
<div class="panel-group" id="accordionPost2" role="tablist" aria-multiselectable="true">
{% for sysinfo in sysinfo_post %}
{% for sysinfo in data.sysinfo_post %}
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="{{ sysinfo.element_id }}">
<h4 class="panel-title"><a data-toggle="collapse" data-parent="#accordionPost2" href="#{{ sysinfo.collapse_id }}" aria-expanded="false" aria-controls="{{ sysinfo.collapse_id }}"><tt>{{ sysinfo.file }}</tt></a></h4>
......@@ -151,7 +154,7 @@
<div id="collapseProfile" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingProfile">
<div class="panel-body">
<div class="panel-group" id="accordionProfile2" role="tablist" aria-multiselectable="true">
{% for sysinfo in sysinfo_profile %}
{% for sysinfo in data.sysinfo_profile %}
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="{{ sysinfo.element_id }}">
<h4 class="panel-title">
......
......@@ -24,7 +24,7 @@ setup(name='avocado-framework-plugin-result-html',
url='http://avocado-framework.github.io/',
packages=find_packages(),
include_package_data=True,
install_requires=['avocado-framework', 'pystache'],
install_requires=['avocado-framework', 'jinja2'],
entry_points={
'avocado.plugins.cli': [
'html = avocado_result_html:HTML',
......
......@@ -783,11 +783,11 @@ class RunnerSimpleTest(unittest.TestCase):
test1_href = (os.path.join("test-results",
"1-'________'") in html_results or
os.path.join("test-results",
"1-&#x27;________&#x27;") in html_results)
"1-&#39;________&#39;") in html_results)
self.assertTrue(test1_href)
# sysinfo replaces "_" with " "
sysinfo = ("echo '________'" in html_results or
"echo &#x27;________&#x27;" in html_results)
"echo &#39;________&#39;" in html_results)
self.assertTrue(sysinfo)
def test_non_absolute_path(self):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册