diff --git a/optional_plugins/html/avocado_result_html/__init__.py b/optional_plugins/html/avocado_result_html/__init__.py
index 29b037b536c416a13f9e516b2492e4e720b9b7f5..933e7f84d7daaab10323434b10fc884a7416a27f 100644
--- a/optional_plugins/html/avocado_result_html/__init__.py
+++ b/optional_plugins/html/avocado_result_html/__init__.py
@@ -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)
diff --git a/optional_plugins/html/avocado_result_html/resources/templates/report.mustache b/optional_plugins/html/avocado_result_html/resources/templates/report.mustache
deleted file mode 100644
index 7cee7d8fadb7d3eb20dbd4339b2200ba6f114bf4..0000000000000000000000000000000000000000
--- a/optional_plugins/html/avocado_result_html/resources/templates/report.mustache
+++ /dev/null
@@ -1,873 +0,0 @@
-
-
-
-
-
-
- Avocado Job Report
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Summary
-
-
-
-
- ID | {{job_unique_id}} |
-
-
- Host | {{hostname}} |
-
-
- Results Dir | {{results_dir_basename}} |
-
-
- Cumulative test time | {{tests_total_time}} s |
-
-
- Stats | From {{tests_total}} tests executed, {{passed}} passed and {{warned}} warned - success rate of {{rate}}% (excluding SKIP and CANCEL) |
-
-
-
-
-
-
- Start Time |
- UID |
- Test Name |
- Variant |
- Status |
- Time (sec) |
- Info |
- Debug Log |
-
-
- {{#tests}}
-
- {{time_start}} |
- {{uid}} |
- {{name}} |
- {{variant}} |
- {{status}} |
- {{time}} |
- {{& fail_reason}} |
- {{logfile_basename}} |
-
- {{/tests}}
-
-
-
-
-
-
Sysinfo
-
-
-
-
-
-
-
-
-
-
- {{#sysinfo_pre}}
-
-
-
-
-
{{contents}}
- {{& err}}
-
-
-
- {{/sysinfo_pre}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{#sysinfo_post}}
-
- {{/sysinfo_post}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{#sysinfo_profile}}
-
- {{/sysinfo_profile}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/optional_plugins/html/avocado_result_html/templates/results.j2 b/optional_plugins/html/avocado_result_html/templates/results.html
similarity index 88%
rename from optional_plugins/html/avocado_result_html/templates/results.j2
rename to optional_plugins/html/avocado_result_html/templates/results.html
index c1c1a0b0dc046e49f8d7860abc6df58bd15f3b51..ed4cf5af721b48ae90556673f3029dc5560c253c 100644
--- a/optional_plugins/html/avocado_result_html/templates/results.j2
+++ b/optional_plugins/html/avocado_result_html/templates/results.html
@@ -29,23 +29,26 @@
ID |
- {{ job_unique_id }} |
+ {{ data.result.job_unique_id }} |
Host |
- {{ hostname }} |
+ {{ data.hostname }} |
Results Dir |
- {{ results_dir_basename }} |
+ {{ data.results_dir_basename() }} |
Cumulative test time |
- {{ tests_total_time }} s |
+ {{ '%.2f'|format(data.result.tests_total_time) }} s |
Stats |
- From {{ tests_total }} tests executed, {{ passed }} passed and {{ warned }} warned - success rate of {{ rate }}% (excluding SKIP and CANCEL) |
+ 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) |
@@ -63,16 +66,16 @@
Debug Log |
- {% for test in tests %}
-
+ {% for test in data.tests %}
+
{{ test.time_start }} |
{{ test.uid }} |
{{ test.name }} |
{{ test.variant }} |
{{ test.status }} |
{{ test.time }} |
- {{ test.fail_reason }} |
- {{ logfile_basename }} |
+ {{ test.fail_reason|safe }} |
+ {{ test.logfile_basename }} |
{% endfor %}
@@ -92,7 +95,7 @@
- {% for sysinfo in sysinfo_pre %}
+ {% for sysinfo in data.sysinfo_pre %}
@@ -102,7 +105,7 @@
{{ sysinfo.contents }}
- {{ sysinfo.err }}
+ {{ sysinfo.err|safe }}
@@ -123,7 +126,7 @@
- {% for sysinfo in sysinfo_post %}
+ {% for sysinfo in data.sysinfo_post %}
@@ -151,7 +154,7 @@
- {% for sysinfo in sysinfo_profile %}
+ {% for sysinfo in data.sysinfo_profile %}
diff --git a/optional_plugins/html/setup.py b/optional_plugins/html/setup.py
index 52de4a7b3ecf2fa5b5f71c30a7d2a4172f6d4b02..51db3c5abb29854ec7a1118631d5e38a78c9b6bf 100644
--- a/optional_plugins/html/setup.py
+++ b/optional_plugins/html/setup.py
@@ -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',
diff --git a/selftests/functional/test_basic.py b/selftests/functional/test_basic.py
index 52c67f55911ad38e725060247e5596521ae51d21..038f2e99038ef2de5019c32bf9e2b203dd38c1f3 100644
--- a/selftests/functional/test_basic.py
+++ b/selftests/functional/test_basic.py
@@ -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-'________'") in html_results)
+ "1-'________'") in html_results)
self.assertTrue(test1_href)
# sysinfo replaces "_" with " "
sysinfo = ("echo '________'" in html_results or
- "echo '________'" in html_results)
+ "echo '________'" in html_results)
self.assertTrue(sysinfo)
def test_non_absolute_path(self):