From 9e218379f3ec9bd7f40469c3051a8dfdcaba1f93 Mon Sep 17 00:00:00 2001 From: Jace Browning Date: Thu, 3 May 2018 15:59:25 -0400 Subject: [PATCH] Disable sort on environment table when metadata is ordered --- README.rst | 3 +++ pytest_html/plugin.py | 7 ++++++- testing/test_pytest_html.py | 12 ++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index a08e059f..27d64c30 100644 --- a/README.rst +++ b/README.rst @@ -96,6 +96,9 @@ via the :code:`pytest_configure` hook: def pytest_configure(config): config._metadata['foo'] = 'bar' +The generated table will be sorted alphabetically unless the metadata is a +:code:`collections.OrderedDict`. + Additional summary information ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/pytest_html/plugin.py b/pytest_html/plugin.py index 38c4aa36..89b30e0f 100644 --- a/pytest_html/plugin.py +++ b/pytest_html/plugin.py @@ -5,6 +5,7 @@ from __future__ import absolute_import from base64 import b64encode, b64decode +from collections import OrderedDict from os.path import isfile import datetime import json @@ -465,7 +466,11 @@ def _generate_environment(self, config): environment = [html.h2('Environment')] rows = [] - for key in [k for k in sorted(metadata.keys()) if metadata[k]]: + keys = [k for k in metadata.keys() if metadata[k]] + if not isinstance(metadata, OrderedDict): + keys.sort() + + for key in keys: value = metadata[key] if isinstance(value, basestring) and value.startswith('http'): value = html.a(value, href=value, target='_blank') diff --git a/testing/test_pytest_html.py b/testing/test_pytest_html.py index 2514df00..5efbbea4 100644 --- a/testing/test_pytest_html.py +++ b/testing/test_pytest_html.py @@ -545,6 +545,18 @@ def pytest_configure(config): assert 'Environment' in html assert len(re.findall(expected_html_re, html)) == 1 + def test_environment_ordered(self, testdir): + testdir.makeconftest(""" + from collections import OrderedDict + def pytest_configure(config): + config._metadata = OrderedDict([('ZZZ', 1), ('AAA', 2)]) + """) + testdir.makepyfile('def test_pass(): pass') + result, html = run(testdir) + assert result.ret == 0 + assert 'Environment' in html + assert len(re.findall('ZZZ.+AAA', html, re.DOTALL)) == 1 + @pytest.mark.xfail( sys.version_info < (3, 2) and LooseVersion(pytest.__version__) >= LooseVersion('2.8.0'),