diff --git a/pyproject.toml b/pyproject.toml index a0491598..eed94e6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,11 +63,11 @@ dev = [ "stackscope>=0.2.2,<0.3", # ^ requires this? "typing-extensions>=4.14.1", - "pyperclip>=1.9.0", "prompt-toolkit>=3.0.50", "xonsh>=0.19.2", "psutil>=7.0.0", + "platformdirs>=4.4.0", ] # TODO, add these with sane versions; were originally in # `requirements-docs.txt`.. diff --git a/tractor/_state.py b/tractor/_state.py index 2a47e548..f01abb79 100644 --- a/tractor/_state.py +++ b/tractor/_state.py @@ -22,7 +22,6 @@ from __future__ import annotations from contextvars import ( ContextVar, ) -import os from pathlib import Path from typing import ( Any, @@ -30,6 +29,7 @@ from typing import ( TYPE_CHECKING, ) +import platformdirs from trio.lowlevel import current_task if TYPE_CHECKING: @@ -172,22 +172,31 @@ def current_ipc_ctx( return ctx -# std ODE (mutable) app state location -_rtdir: Path = Path(os.environ['XDG_RUNTIME_DIR']) - def get_rt_dir( - subdir: str = 'tractor' + subdir: str|Path|None = None, ) -> Path: ''' - Return the user "runtime dir" where most userspace apps stick - their IPC and cache related system util-files; we take hold - of a `'XDG_RUNTIME_DIR'/tractor/` subdir by default. + Return the user "runtime dir", the file-sys location where most + userspace apps stick their IPC and cache related system + util-files. + + On linux we take use a `'${XDG_RUNTIME_DIR}/tractor/` subdir by + default but equivalents are mapped for each platform using + the lovely `platformdirs`. ''' - rtdir: Path = _rtdir / subdir + _rt_dir: Path = Path( + platformdirs.user_runtime_dir( + appname='tractor', + ), + ) + if subdir: + rtdir: Path = _rt_dir / subdir + if not rtdir.is_dir(): rtdir.mkdir() + return rtdir diff --git a/uv.lock b/uv.lock index 3c05dc2f..0cb3cdd3 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.11" [[package]] @@ -236,6 +236,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, ] +[[package]] +name = "platformdirs" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, +] + [[package]] name = "pluggy" version = "1.5.0" @@ -387,6 +396,7 @@ dependencies = [ dev = [ { name = "greenback" }, { name = "pexpect" }, + { name = "platformdirs" }, { name = "prompt-toolkit" }, { name = "psutil" }, { name = "pyperclip" }, @@ -412,6 +422,7 @@ requires-dist = [ dev = [ { name = "greenback", specifier = ">=1.2.1,<2" }, { name = "pexpect", specifier = ">=4.9.0,<5" }, + { name = "platformdirs", specifier = ">=4.4.0" }, { name = "prompt-toolkit", specifier = ">=3.0.50" }, { name = "psutil", specifier = ">=7.0.0" }, { name = "pyperclip", specifier = ">=1.9.0" },