From cbcfeca78c4dbfa312e3fc5e020eaf8032d52135 Mon Sep 17 00:00:00 2001 From: Cristian Vera Date: Mon, 18 Oct 2021 19:15:34 -0300 Subject: [PATCH] Cache.set preserves key order when saving dicts (#9206) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Bruno Oliveira --- AUTHORS | 1 + changelog/9205.improvement.rst | 1 + src/_pytest/cacheprovider.py | 2 +- testing/test_cacheprovider.py | 11 +++++++++++ 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 changelog/9205.improvement.rst diff --git a/AUTHORS b/AUTHORS index bfc2d3e46..0d2364083 100644 --- a/AUTHORS +++ b/AUTHORS @@ -76,6 +76,7 @@ Christopher Gilling Claire Cecil Claudio Madotto CrazyMerlyn +Cristian Vera Cyrus Maden Damian Skrzypczak Daniel Grana diff --git a/changelog/9205.improvement.rst b/changelog/9205.improvement.rst new file mode 100644 index 000000000..edfc30089 --- /dev/null +++ b/changelog/9205.improvement.rst @@ -0,0 +1 @@ +:meth:`pytest.Cache.set` now preserves key order when saving dicts. diff --git a/src/_pytest/cacheprovider.py b/src/_pytest/cacheprovider.py index b3a10882d..78cec7093 100755 --- a/src/_pytest/cacheprovider.py +++ b/src/_pytest/cacheprovider.py @@ -193,7 +193,7 @@ class Cache: return if not cache_dir_exists_already: self._ensure_supporting_files() - data = json.dumps(value, indent=2, sort_keys=True) + data = json.dumps(value, indent=2) try: f = path.open("w") except OSError: diff --git a/testing/test_cacheprovider.py b/testing/test_cacheprovider.py index e43d4d94b..db05c5a76 100644 --- a/testing/test_cacheprovider.py +++ b/testing/test_cacheprovider.py @@ -1210,6 +1210,17 @@ def test_gitignore(pytester: Pytester) -> None: assert gitignore_path.read_text(encoding="UTF-8") == "custom" +def test_preserve_keys_order(pytester: Pytester) -> None: + """Ensure keys order is preserved when saving dicts (#9205).""" + from _pytest.cacheprovider import Cache + + config = pytester.parseconfig() + cache = Cache.for_config(config, _ispytest=True) + cache.set("foo", {"z": 1, "b": 2, "a": 3, "d": 10}) + read_back = cache.get("foo", None) + assert list(read_back.items()) == [("z", 1), ("b", 2), ("a", 3), ("d", 10)] + + def test_does_not_create_boilerplate_in_existing_dirs(pytester: Pytester) -> None: from _pytest.cacheprovider import Cache