From 2b0edd86db9ccbbf2c946f74c840e9c0b87fa462 Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Sun, 22 Jun 2025 18:59:29 +0200 Subject: fix: generate-inx-files failing with Nix Fixes the following error when attempting to build the Nix package: python bin/generate-inx-files; Traceback (most recent call last): File "/build/inkstitch/bin/generate-inx-files", line 59, in from lib.inx.generate import generate_inx_files File "/build/inkstitch/lib/inx/generate.py", line 6, in from .extensions import generate_extension_inx_files File "/build/inkstitch/lib/inx/extensions.py", line 10, in from ..commands import (COMMANDS, GLOBAL_COMMANDS, LAYER_COMMANDS, File "/build/inkstitch/lib/commands.py", line 16, in from .i18n import N_, _ File "/build/inkstitch/lib/i18n.py", line 10, in from .utils import cache, get_resource_dir File "/build/inkstitch/lib/utils/__init__.py", line 6, in from . import cache as cache_module # Slight hack to allow cache to be imported for monkeypatching ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/build/inkstitch/lib/utils/cache.py", line 13, in from lib.utils.settings import global_settings File "/build/inkstitch/lib/utils/settings.py", line 84, in global_settings = GlobalSettings() ^^^^^^^^^^^^^^^^ File "/build/inkstitch/lib/utils/settings.py", line 48, in __init__ self.__settings_file = os.path.join(get_user_dir(), "settings.json") ^^^^^^^^^^^^^^ File "/build/inkstitch/lib/utils/paths.py", line 50, in get_user_dir os.makedirs(path) File "", line 215, in makedirs File "", line 215, in makedirs File "", line 225, in makedirs PermissionError: [Errno 13] Permission denied: '/homeless-shelter' --- lib/utils/paths.py | 4 ++-- lib/utils/settings.py | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/utils/paths.py b/lib/utils/paths.py index 3bc12c2a..542a0f2d 100755 --- a/lib/utils/paths.py +++ b/lib/utils/paths.py @@ -41,12 +41,12 @@ def get_resource_dir(name): return realpath(os.path.join(dirname(realpath(__file__)), '..', '..', name)) -def get_user_dir(name=None): +def get_user_dir(name=None, create=True): try: path = platformdirs.user_config_dir('inkstitch') except ImportError: path = os.path.expanduser('~/.inkstitch') - if not os.path.exists(path): + if create and not os.path.exists(path): os.makedirs(path) if name is not None: diff --git a/lib/utils/settings.py b/lib/utils/settings.py index 42e6b233..28c52290 100644 --- a/lib/utils/settings.py +++ b/lib/utils/settings.py @@ -45,7 +45,11 @@ DEFAULT_SETTINGS = { class GlobalSettings(MutableMapping): def __init__(self): super().__init__() - self.__settings_file = os.path.join(get_user_dir(), "settings.json") + # We set create=False here because this code is executed on module load + # and via imports also runs on generate-inx-files, which with the Nix + # package manager is executed with a non-writable home directory. + user_dir = get_user_dir(create=False) + self.__settings_file = os.path.join(user_dir, "settings.json") self.__settings = {} for name, value in DEFAULT_METADATA.items(): -- cgit v1.2.3 From 40f1b2eccfc27764e49b20bf712d4f5fa321fcac Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Sun, 22 Jun 2025 18:31:46 +0200 Subject: fix: tests during Nix build Fixes the following error when executing the tests during a Nix build: Traceback (most recent call last): File "/build/inkstitch/lib/elements/element.py", line 714, in handle_unexpected_exceptions yield File "/build/inkstitch/lib/elements/element.py", line 650, in embroider stitch_groups = self._load_cached_stitch_groups(previous_stitch, next_element) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/build/inkstitch/lib/debug/debug.py", line 172, in decorated result = func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/build/inkstitch/lib/elements/element.py", line 541, in _load_cached_stitch_groups stitch_groups = get_stitch_plan_cache().get(cache_key) ^^^^^^^^^^^^^^^^^^^^^^^ File "/build/inkstitch/lib/utils/cache.py", line 31, in get_stitch_plan_cache cache_dir = get_user_dir('cache') ^^^^^^^^^^^^^^^^^^^^^ File "/build/inkstitch/lib/utils/paths.py", line 50, in get_user_dir os.makedirs(path) File "", line 215, in makedirs File "", line 215, in makedirs File "", line 225, in makedirs PermissionError: [Errno 13] Permission denied: '/homeless-shelter' --- lib/utils/__init__.py | 1 - lib/utils/settings.py | 28 ++++++++++++++-------------- 2 files changed, 14 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/utils/__init__.py b/lib/utils/__init__.py index 60a0bd36..b24257be 100644 --- a/lib/utils/__init__.py +++ b/lib/utils/__init__.py @@ -3,7 +3,6 @@ # Copyright (c) 2010 Authors # Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details. -from . import cache as cache_module # Slight hack to allow cache to be imported for monkeypatching from .cache import cache from .dotdict import DotDict from .geometry import * diff --git a/lib/utils/settings.py b/lib/utils/settings.py index 28c52290..501798ac 100644 --- a/lib/utils/settings.py +++ b/lib/utils/settings.py @@ -49,40 +49,40 @@ class GlobalSettings(MutableMapping): # and via imports also runs on generate-inx-files, which with the Nix # package manager is executed with a non-writable home directory. user_dir = get_user_dir(create=False) - self.__settings_file = os.path.join(user_dir, "settings.json") - self.__settings = {} + self._settings_file = os.path.join(user_dir, "settings.json") + self._settings = {} for name, value in DEFAULT_METADATA.items(): - self.__settings[f"default_{name}"] = value + self._settings[f"default_{name}"] = value - self.__settings.update(DEFAULT_SETTINGS) + self._settings.update(DEFAULT_SETTINGS) try: - with open(self.__settings_file, 'r') as settings_file: - self.__settings.update(json.load(settings_file)) + with open(self._settings_file, 'r') as settings_file: + self._settings.update(json.load(settings_file)) except (OSError, json.JSONDecodeError, ValueError): pass def __setitem__(self, item, value): - self.__settings[item] = value + self._settings[item] = value - with open(self.__settings_file, 'w') as settings_file: - json.dump(self.__settings, settings_file) + with open(self._settings_file, 'w') as settings_file: + json.dump(self._settings, settings_file) def __getitem__(self, item): - return self.__settings[item] + return self._settings[item] def __delitem__(self, item): - del self.__settings[item] + del self._settings[item] def __iter__(self): - return iter(self.__settings) + return iter(self._settings) def __len__(self): - return len(self.__settings) + return len(self._settings) def __json__(self): - return self.__settings + return self._settings global_settings = GlobalSettings() -- cgit v1.2.3