"""XDG directories and library layout.""" from __future__ import annotations import os from dataclasses import dataclass from pathlib import Path APP_DIRNAME = "mhwilds-mod-manager" @dataclass(frozen=True) class Paths: data_dir: Path config_dir: Path @classmethod def default(cls) -> "Paths": home = Path.home() data = Path(os.environ.get("XDG_DATA_HOME") or home / ".local/share") conf = Path(os.environ.get("XDG_CONFIG_HOME") or home / ".config") return cls(data / APP_DIRNAME, conf / APP_DIRNAME) @property def mods_dir(self) -> Path: return self.data_dir / "mods" @property def downloads_dir(self) -> Path: return self.data_dir / "downloads" @property def state_dir(self) -> Path: return self.data_dir / "state" @property def backup_dir(self) -> Path: return self.state_dir / "backup" @property def trash_dir(self) -> Path: return self.state_dir / "trash" @property def manifest_file(self) -> Path: return self.state_dir / "deployed.json" @property def baseline_file(self) -> Path: return self.state_dir / "pak-baseline.json" @property def settings_file(self) -> Path: return self.config_dir / "settings.json" @property def profiles_file(self) -> Path: return self.config_dir / "profiles.json" @property def secrets_file(self) -> Path: return self.config_dir / "secrets.json" def ensure(self) -> None: for d in (self.mods_dir, self.downloads_dir, self.state_dir, self.backup_dir, self.config_dir): d.mkdir(parents=True, exist_ok=True)