Coverage for graphica/core/app_paths.py: 100.0%
19 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-12 16:38 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-12 16:38 +0000
1"""
2書き込み可能なユーザー単位のフォルダ(Windows では %LOCALAPPDATA%\\Graphica 配下)。
4読み取り専用の同梱リソースは resource_path() で読む。インストール先(Program Files)は
5書き込めないので、アプリが書くものは必ずここに置く。カレントディレクトリには依存しない。
6"""
7import os
8import re
10from graphica.core.version import APP_NAME
13def get_app_data_dir() -> str:
14 """無ければ作る。LOCALAPPDATA の無い環境では ~/.local/share/Graphica。"""
15 base = os.environ.get('LOCALAPPDATA')
16 if not base:
17 base = os.environ.get('XDG_DATA_HOME') or os.path.join(os.path.expanduser('~'), '.local', 'share')
18 app_dir = os.path.join(base, APP_NAME)
19 os.makedirs(app_dir, exist_ok=True)
20 return app_dir
23def get_user_plugins_dir() -> str:
24 """利用者が zip から入れたプラグインの置き場所。無ければ作る。"""
25 plugins_dir = os.path.join(get_app_data_dir(), 'plugins')
26 os.makedirs(plugins_dir, exist_ok=True)
27 return plugins_dir
30def get_plugin_data_dir(plugin_name: str) -> str:
31 """プラグインごとの書き込み用フォルダ。無ければ作る。名前はフォルダ名に使える文字だけ残す。"""
32 safe_name = re.sub(r'[^\w.-]', '_', plugin_name).strip('.') or '_'
33 data_dir = os.path.join(get_app_data_dir(), 'plugin_data', safe_name)
34 os.makedirs(data_dir, exist_ok=True)
35 return data_dir