|
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__ |
@@ -336,6 +336,38 @@ def _append_video(self, extra, extra_index, test_index): |
336 | 336 | ) |
337 | 337 | self.additional_html.append(html.div(html_div, class_="video")) |
338 | 338 |
|
| 339 | + class EnvironmentTable: |
| 340 | + def __init__(self, config): |
| 341 | + self.metadata = getattr(config, "_metadata", []) |
| 342 | + self.config = config |
| 343 | + self.environment_table = [] |
| 344 | + |
| 345 | + rows = [] |
| 346 | + |
| 347 | + header_cells = [html.th("Key"), html.th("Value")] |
| 348 | + self.config.hook.pytest_html_environment_table_header(cells=header_cells) |
| 349 | + rows.append(header_cells) |
| 350 | + if self.metadata: |
| 351 | + keys = [k for k in self.metadata.keys()] |
| 352 | + if not isinstance(self.metadata, OrderedDict): |
| 353 | + keys.sort() |
| 354 | + |
| 355 | + for key in keys: |
| 356 | + value = self.metadata[key] |
| 357 | + if isinstance(value, str) and value.startswith("http"): |
| 358 | + value = html.a(value, href=value, target="_blank") |
| 359 | + elif isinstance(value, (list, tuple, set)): |
| 360 | + value = ", ".join(str(i) for i in sorted(map(str, value))) |
| 361 | + elif isinstance(value, dict): |
| 362 | + sorted_dict = {k: value[k] for k in sorted(value)} |
| 363 | + value = json.dumps(sorted_dict) |
| 364 | + raw_value_string = raw(str(value)) |
| 365 | + row_cells = html.tr(html.td(key), html.td(raw_value_string)) |
| 366 | + self.config.hook.pytest_html_environment_table_row(cells=row_cells) |
| 367 | + rows.append(row_cells) |
| 368 | + |
| 369 | + self.environment_table.append(html.table(rows, id="environment")) |
| 370 | + |
339 | 371 | def _appendrow(self, outcome, report): |
340 | 372 | result = self.TestResult(outcome, report, self.logfile, self.config) |
341 | 373 | if result.row_table is not None: |
@@ -551,30 +583,12 @@ def generate_summary_item(self): |
551 | 583 | return unicode_doc.decode("utf-8") |
552 | 584 |
|
553 | 585 | def _generate_environment(self, config): |
554 | | - if not hasattr(config, "_metadata") or config._metadata is None: |
555 | | - return [] |
556 | | - |
557 | | - metadata = config._metadata |
558 | | - environment = [html.h2("Environment")] |
559 | | - rows = [] |
560 | | - |
561 | | - keys = [k for k in metadata.keys()] |
562 | | - if not isinstance(metadata, OrderedDict): |
563 | | - keys.sort() |
564 | | - |
565 | | - for key in keys: |
566 | | - value = metadata[key] |
567 | | - if isinstance(value, str) and value.startswith("http"): |
568 | | - value = html.a(value, href=value, target="_blank") |
569 | | - elif isinstance(value, (list, tuple, set)) and not isinstance(value, Tag): |
570 | | - value = ", ".join(str(i) for i in sorted(map(str, value))) |
571 | | - elif isinstance(value, dict): |
572 | | - sorted_dict = {k: value[k] for k in sorted(value)} |
573 | | - value = json.dumps(sorted_dict) |
574 | | - raw_value_string = raw(str(value)) |
575 | | - rows.append(html.tr(html.td(key), html.td(raw_value_string))) |
576 | | - |
577 | | - environment.append(html.table(rows, id="environment")) |
| 586 | + environment_table = self.EnvironmentTable(config).environment_table |
| 587 | + if environment_table: |
| 588 | + environment = [html.h2("Environment")] |
| 589 | + environment.append(environment_table) |
| 590 | + else: |
| 591 | + environment = [] |
578 | 592 | return environment |
579 | 593 |
|
580 | 594 | def _save_report(self, report_content): |
|
0 commit comments