import os
from pathlib import Path
from sys import platform
from loguru import logger
APP_NAME = "Class Widgets"
CW_HOME = Path(__file__).parent
IS_PORTABLE = os.environ.get("CLASSWIDGETS_NOT_PORTABLE", "") == ""
def _ensure_dir(path: Path) -> Path:
path.mkdir(parents=True, exist_ok=True)
return path
def _get_app_dir(
purpose: str,
default_subdir: str,
win_env_var: str,
mac_subpath: str,
xdg_env_var: str,
xdg_fallback: str,
) -> Path:
"""获取应用目录的通用实现"""
if IS_PORTABLE:
return _ensure_dir(CW_HOME / default_subdir)
if custom := os.environ.get(f"CLASSWIDGETS_CUSTOM_{purpose.upper()}_HOME"):
return _ensure_dir(Path(custom))
if platform == "win32":
if base := os.environ.get(win_env_var):
return _ensure_dir(Path(base) / APP_NAME / default_subdir)
logger.error(f"Missing Windows environment variable: {win_env_var}")
return _ensure_dir(CW_HOME / default_subdir)
if platform == "darwin":
return _ensure_dir(Path.home() / mac_subpath / APP_NAME / default_subdir)
base = os.environ.get(xdg_env_var) or str(Path.home() / xdg_fallback)
return _ensure_dir(Path(base) / APP_NAME / default_subdir)
CONFIG_HOME = _get_app_dir(
purpose="CONFIG",
default_subdir="config",
win_env_var="APPDATA",
mac_subpath="Library/Application Support",
xdg_env_var="XDG_CONFIG_HOME",
xdg_fallback=".config",
)
SCHEDULE_DIR = _ensure_dir(CONFIG_HOME / "schedule")
LOG_HOME = _get_app_dir(
purpose="LOG",
default_subdir="log",
win_env_var="TMP",
mac_subpath="Library/Caches",
xdg_env_var="XDG_CACHE_HOME",
xdg_fallback=".cache",
)
CACHE_HOME = _get_app_dir(
purpose="CACHE",
default_subdir="cache",
win_env_var="TMP",
mac_subpath="Library/Caches",
xdg_env_var="XDG_CACHE_HOME",
xdg_fallback=".cache",
)
PLUGIN_HOME = _get_app_dir(
purpose="PLUGIN",
default_subdir="plugins",
win_env_var="APPDATA",
mac_subpath="Library/Application Support",
xdg_env_var="XDG_DATA_HOME",
xdg_fallback=".local/share",
)
THEME_HOME = _get_app_dir(
purpose="THEME",
default_subdir="ui",
win_env_var="APPDATA",
mac_subpath="Library/Application Support",
xdg_env_var="XDG_DATA_HOME",
xdg_fallback=".local/share",
)
THEME_DIRS = [THEME_HOME] if IS_PORTABLE else [CW_HOME / "ui", THEME_HOME]