diff --git a/src/pytest_html/basereport.py b/src/pytest_html/basereport.py
index 969a0fee..2f169110 100644
--- a/src/pytest_html/basereport.py
+++ b/src/pytest_html/basereport.py
@@ -16,7 +16,6 @@
from pytest_html import __version__
from pytest_html import extras
from pytest_html.table import Header
-from pytest_html.table import Html
from pytest_html.table import Row
from pytest_html.util import _ansi_styles
from pytest_html.util import cleanup_unserializable
@@ -210,15 +209,18 @@ def pytest_runtest_logreport(self, report):
if row_cells.html is None:
return
data["resultsTableRow"] = row_cells.html
+ for sortable, value in row_cells.sortables.items():
+ data[sortable] = value
- table_html = Html()
- self._config.hook.pytest_html_results_table_html(report=report, data=table_html)
- data["tableHtml"] = table_html.html["html"]
+ processed_logs = _process_logs(report)
+ self._config.hook.pytest_html_results_table_html(
+ report=report, data=processed_logs
+ )
data["result"] = _process_outcome(report)
data["extras"] = self._process_extras(report, test_id)
- if self._report.add_test(data, report, row_cells, table_html.replace_log):
+ if self._report.add_test(data, report, processed_logs):
self._generate_report()
@@ -252,6 +254,24 @@ def _is_error(report):
return report.when in ["setup", "teardown"] and report.outcome == "failed"
+def _process_logs(report):
+ log = []
+ if report.longreprtext:
+ log.append(report.longreprtext.replace("<", "<").replace(">", ">") + "\n")
+ for section in report.sections:
+ header, content = section
+ log.append(f"{' ' + header + ' ':-^80}\n{content}")
+
+ # weird formatting related to logs
+ if "log" in header:
+ log.append("")
+ if "call" in header:
+ log.append("")
+ if not log:
+ log.append("No log output captured.")
+ return log
+
+
def _process_outcome(report):
if _is_error(report):
return "Error"
diff --git a/src/pytest_html/report_data.py b/src/pytest_html/report_data.py
index 77fdb1b8..aee5e938 100644
--- a/src/pytest_html/report_data.py
+++ b/src/pytest_html/report_data.py
@@ -52,21 +52,16 @@ def data(self):
def set_data(self, key, value):
self._data[key] = value
- def add_test(self, test_data, report, row, remove_log=False):
- for sortable, value in row.sortables.items():
- test_data[sortable] = value
-
+ def add_test(self, test_data, report, logs):
# regardless of pass or fail we must add teardown logging to "call"
- if report.when == "teardown" and not remove_log:
+ if report.when == "teardown":
self.update_test_log(report)
# passed "setup" and "teardown" are not added to the html
if report.when == "call" or (
report.when in ["setup", "teardown"] and report.outcome != "passed"
):
- if not remove_log:
- processed_logs = _process_logs(report)
- test_data["log"] = _handle_ansi(processed_logs)
+ test_data["log"] = _handle_ansi("\n".join(logs))
self._data["tests"][report.nodeid].append(test_data)
return True
@@ -79,25 +74,5 @@ def update_test_log(self, report):
for section in report.sections:
header, content = section
if "teardown" in header:
- log.append(f"{' ' + header + ' ':-^80}")
- log.append(content)
+ log.append(f"{' ' + header + ' ':-^80}\n{content}")
test["log"] += _handle_ansi("\n".join(log))
-
-
-def _process_logs(report):
- log = []
- if report.longreprtext:
- log.append(report.longreprtext.replace("<", "<").replace(">", ">") + "\n")
- for section in report.sections:
- header, content = section
- log.append(f"{' ' + header + ' ':-^80}")
- log.append(content)
-
- # weird formatting related to logs
- if "log" in header:
- log.append("")
- if "call" in header:
- log.append("")
- if not log:
- log.append("No log output captured.")
- return "\n".join(log)
diff --git a/src/pytest_html/table.py b/src/pytest_html/table.py
index 54aafa9e..8eea6579 100644
--- a/src/pytest_html/table.py
+++ b/src/pytest_html/table.py
@@ -13,23 +13,9 @@ def __init__(self):
def html(self):
return self._html
-
-class Html(Table):
- def __init__(self):
- super().__init__()
- self.html.setdefault("html", [])
- self._replace_log = False
-
- def __delitem__(self, key):
- # This means the log should be removed
- self._replace_log = True
-
- @property
- def replace_log(self):
- return self._replace_log
-
- def append(self, html):
- self.html["html"].append(html)
+ @html.setter
+ def html(self, value):
+ self._html = value
class Cell(Table):