From deaf7dd1abb1d695213f58744c8a54e194014426 Mon Sep 17 00:00:00 2001 From: goodboy Date: Tue, 10 Mar 2026 17:43:42 -0400 Subject: [PATCH] Use `platformdirs` for `.config.get_app_dir()` Replace hand-rolled `click`-based platform branching using the much saner `platformdirs.user_config_path()`. Deats, - remove Windows/macOS/Unix `if/elif` platform dispatch (~25 lines) in favour of single `user_config_path()` call. - move `_posixify()` inside `force_posix` branch since it's only used there. - add `log.info()` reporting platform name and resolved dirs. Also, - drop now unneeded `sys` import. - reformat `assert` in `repodir()` to multiline style. - convert docstring from `r"""..."""` to `'''...'''` style. (this commit msg was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code --- piker/config.py | 76 ++++++++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 45 deletions(-) diff --git a/piker/config.py b/piker/config.py index e6d3e60a..bcdf8121 100644 --- a/piker/config.py +++ b/piker/config.py @@ -19,7 +19,6 @@ Platform configuration (files) mgmt. """ import platform -import sys import os import shutil from typing import ( @@ -29,6 +28,7 @@ from typing import ( from pathlib import Path from bidict import bidict +import platformdirs import tomlkit try: import tomllib @@ -41,7 +41,7 @@ from .log import get_logger log = get_logger('broker-config') -# XXX NOTE: taken from `click` +# XXX NOTE: orig impl was taken from `click` # |_https://github.com/pallets/click/blob/main/src/click/utils.py#L449 # # (since apparently they have some super weirdness with SIGINT and @@ -54,44 +54,21 @@ def get_app_dir( force_posix: bool = False, ) -> str: - r"""Returns the config folder for the application. The default behavior + ''' + Returns the config folder for the application. The default behavior is to return whatever is most appropriate for the operating system. - To give you an idea, for an app called ``"Foo Bar"``, something like - the following folders could be returned: + ---- + NOTE, below is originally from `click` impl fn, we can prolly remove? + ---- - Mac OS X: - ``~/Library/Application Support/Foo Bar`` - Mac OS X (POSIX): - ``~/.foo-bar`` - Unix: - ``~/.config/foo-bar`` - Unix (POSIX): - ``~/.foo-bar`` - Win XP (roaming): - ``C:\Documents and Settings\\Local Settings\Application Data\Foo`` - Win XP (not roaming): - ``C:\Documents and Settings\\Application Data\Foo Bar`` - Win 7 (roaming): - ``C:\Users\\AppData\Roaming\Foo Bar`` - Win 7 (not roaming): - ``C:\Users\\AppData\Local\Foo Bar`` - - .. versionadded:: 2.0 - - :param app_name: the application name. This should be properly capitalized - and can contain whitespace. :param roaming: controls if the folder should be roaming or not on Windows. Has no affect otherwise. :param force_posix: if this is set to `True` then on any POSIX system the folder will be stored in the home folder with a leading dot instead of the XDG config home or darwin's application support folder. - """ - - def _posixify(name): - return "-".join(name.split()).lower() - + ''' # NOTE: for testing with `pytest` we leverage the `tmp_dir` # fixture to generate (and clean up) a test-request-specific # directory for isolated configuration files such that, @@ -117,23 +94,30 @@ def get_app_dir( # assert testdirpath.exists(), 'piker test harness might be borked!?' # app_name = str(testdirpath) - if platform.system() == 'Windows': - key = "APPDATA" if roaming else "LOCALAPPDATA" - folder = os.environ.get(key) - if folder is None: - folder = os.path.expanduser("~") - return os.path.join(folder, app_name) + os_name: str = platform.system() + conf_dir: Path = platformdirs.user_config_path() + app_dir: Path = conf_dir / app_name + + # ?TODO, from `click`; can remove? if force_posix: + def _posixify(name): + return "-".join(name.split()).lower() + return os.path.join( - os.path.expanduser("~/.{}".format(_posixify(app_name)))) - if sys.platform == "darwin": - return os.path.join( - os.path.expanduser("~/Library/Application Support"), app_name + os.path.expanduser( + "~/.{}".format( + _posixify(app_name) + ) + ) ) - return os.path.join( - os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), - _posixify(app_name), + + log.info( + f'Using user config directory,\n' + f'platform.system(): {os_name!r}\n' + f'conf_dir: {conf_dir!r}\n' + f'app_dir: {conf_dir!r}\n' ) + return app_dir _click_config_dir: Path = Path(get_app_dir('piker')) @@ -250,7 +234,9 @@ def repodir() -> Path: repodir: Path = Path(os.environ.get('GITHUB_WORKSPACE')) confdir: Path = repodir / 'config' - assert confdir.is_dir(), f'{confdir} DNE, {repodir} is likely incorrect!' + assert confdir.is_dir(), ( + f'{confdir} DNE, {repodir} is likely incorrect!' + ) return repodir