|
25 | 25 | # ansi2html is not installed
|
26 | 26 | ANSI = False
|
27 | 27 |
|
28 |
| -from py.xml import html, raw, Tag |
| 28 | +from py.xml import html, raw |
29 | 29 |
|
30 | 30 | from . import extras
|
31 | 31 | from . import __version__, __pypi_url__
|
@@ -341,6 +341,38 @@ def _append_video(self, extra, extra_index, test_index):
|
341 | 341 | )
|
342 | 342 | self.additional_html.append(html.div(html_div, class_="video"))
|
343 | 343 |
|
| 344 | + class EnvironmentTable: |
| 345 | + def __init__(self, config): |
| 346 | + self.metadata = getattr(config, "_metadata", []) |
| 347 | + self.config = config |
| 348 | + self.environment_table = [] |
| 349 | + |
| 350 | + rows = [] |
| 351 | + |
| 352 | + header_cells = [html.th("Key"), html.th("Value")] |
| 353 | + self.config.hook.pytest_html_environment_table_header(cells=header_cells) |
| 354 | + rows.append(header_cells) |
| 355 | + if self.metadata: |
| 356 | + keys = [k for k in self.metadata.keys()] |
| 357 | + if not isinstance(self.metadata, OrderedDict): |
| 358 | + keys.sort() |
| 359 | + |
| 360 | + for key in keys: |
| 361 | + value = self.metadata[key] |
| 362 | + if isinstance(value, str) and value.startswith("http"): |
| 363 | + value = html.a(value, href=value, target="_blank") |
| 364 | + elif isinstance(value, (list, tuple, set)): |
| 365 | + value = ", ".join(str(i) for i in sorted(map(str, value))) |
| 366 | + elif isinstance(value, dict): |
| 367 | + sorted_dict = {k: value[k] for k in sorted(value)} |
| 368 | + value = json.dumps(sorted_dict) |
| 369 | + raw_value_string = raw(str(value)) |
| 370 | + row_cells = html.tr(html.td(key), html.td(raw_value_string)) |
| 371 | + self.config.hook.pytest_html_environment_table_row(cells=row_cells) |
| 372 | + rows.append(row_cells) |
| 373 | + |
| 374 | + self.environment_table.append(html.table(rows, id="environment")) |
| 375 | + |
344 | 376 | def _appendrow(self, outcome, report):
|
345 | 377 | result = self.TestResult(outcome, report, self.logfile, self.config)
|
346 | 378 | if result.row_table is not None:
|
@@ -556,30 +588,12 @@ def generate_summary_item(self):
|
556 | 588 | return unicode_doc.decode("utf-8")
|
557 | 589 |
|
558 | 590 | def _generate_environment(self, config):
|
559 |
| - if not hasattr(config, "_metadata") or config._metadata is None: |
560 |
| - return [] |
561 |
| - |
562 |
| - metadata = config._metadata |
563 |
| - environment = [html.h2("Environment")] |
564 |
| - rows = [] |
565 |
| - |
566 |
| - keys = [k for k in metadata.keys()] |
567 |
| - if not isinstance(metadata, OrderedDict): |
568 |
| - keys.sort() |
569 |
| - |
570 |
| - for key in keys: |
571 |
| - value = metadata[key] |
572 |
| - if isinstance(value, str) and value.startswith("http"): |
573 |
| - value = html.a(value, href=value, target="_blank") |
574 |
| - elif isinstance(value, (list, tuple, set)) and not isinstance(value, Tag): |
575 |
| - value = ", ".join(str(i) for i in sorted(map(str, value))) |
576 |
| - elif isinstance(value, dict): |
577 |
| - sorted_dict = {k: value[k] for k in sorted(value)} |
578 |
| - value = json.dumps(sorted_dict) |
579 |
| - raw_value_string = raw(str(value)) |
580 |
| - rows.append(html.tr(html.td(key), html.td(raw_value_string))) |
581 |
| - |
582 |
| - environment.append(html.table(rows, id="environment")) |
| 591 | + environment_table = self.EnvironmentTable(config).environment_table |
| 592 | + if environment_table: |
| 593 | + environment = [html.h2("Environment")] |
| 594 | + environment.append(environment_table) |
| 595 | + else: |
| 596 | + environment = [] |
583 | 597 | return environment
|
584 | 598 |
|
585 | 599 | def _save_report(self, report_content):
|
|
0 commit comments