From 943a132d0eec7a417dd130310e7495526c8ceb64 Mon Sep 17 00:00:00 2001
From: Matthias Diener <mdiener@illinois.edu>
Date: Tue, 19 Mar 2024 13:11:24 -0500
Subject: [PATCH] PersistentDict: honor XDG_CACHE_HOME on MacOS

---
 pytools/persistent_dict.py           |  9 ++++++++-
 pytools/test/test_persistent_dict.py | 22 ++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/pytools/persistent_dict.py b/pytools/persistent_dict.py
index ed1e803..4e6d64c 100644
--- a/pytools/persistent_dict.py
+++ b/pytools/persistent_dict.py
@@ -556,8 +556,15 @@ class _PersistentDictBase:
             except ImportError:
                 import appdirs
 
+            if sys.platform == "darwin" and os.getenv("XDG_CACHE_HOME") is not None:
+                # appdirs and platformdirs do not handle XDG_CACHE_HOME on macOS
+                # https://github.com/platformdirs/platformdirs/issues/269
+                cache_dir = join(os.getenv("XDG_CACHE_HOME"), "pytools")
+            else:
+                cache_dir = appdirs.user_cache_dir("pytools", "pytools")
+
             container_dir = join(
-                    appdirs.user_cache_dir("pytools", "pytools"),
+                    cache_dir,
                     "pdict-v4-{}-py{}".format(
                         identifier,
                         ".".join(str(i) for i in sys.version_info)))
diff --git a/pytools/test/test_persistent_dict.py b/pytools/test/test_persistent_dict.py
index d0b32c0..2109282 100644
--- a/pytools/test/test_persistent_dict.py
+++ b/pytools/test/test_persistent_dict.py
@@ -582,6 +582,28 @@ def test_attrs_hashing():
     assert keyb(MyAttrs2("hi", 1)) != keyb(MyAttrs("hi", 1))
 
 
+def test_xdg_cache_home():
+    import os
+    xdg_dir = "tmpdir_pytools_xdg_test"
+
+    assert not os.path.exists(xdg_dir)
+
+    try:
+        old_xdg_cache_home = os.getenv("XDG_CACHE_HOME")
+        os.environ["XDG_CACHE_HOME"] = xdg_dir
+
+        PersistentDict("pytools-test")
+
+        assert os.path.exists(xdg_dir)
+    finally:
+        if old_xdg_cache_home is not None:
+            os.environ["XDG_CACHE_HOME"] = old_xdg_cache_home
+        else:
+            del os.environ["XDG_CACHE_HOME"]
+
+        shutil.rmtree(xdg_dir)
+
+
 if __name__ == "__main__":
     if len(sys.argv) > 1:
         exec(sys.argv[1])
-- 
GitLab