You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

58 lines
1.6 KiB

from __future__ import annotations
import os
import shutil
from pathlib import Path
PROJECT_ROOT = Path(__file__).resolve().parent
DEFAULT_PROFILE_DATA = '{\n "profiles": {},\n "active_profile": null\n}\n'
def bundle_path(*parts: str) -> Path:
base = Path(os.environ.get("MICE_PROJECT_ROOT", PROJECT_ROOT)).expanduser()
return base.joinpath(*parts)
def resolve_bundle_path(path_like: str | Path) -> Path:
candidate = Path(path_like).expanduser()
if candidate.is_absolute():
return candidate
return bundle_path(*candidate.parts)
def data_root() -> Path:
override = os.environ.get("MICE_DATA_DIR")
if override:
root = Path(override).expanduser()
else:
xdg_data_home = Path(os.environ.get("XDG_DATA_HOME", Path.home() / ".local" / "share"))
root = xdg_data_home / "mice"
root.mkdir(parents=True, exist_ok=True)
return root
def persistent_data_path(
path_like: str | Path,
*,
default_source: str | Path | None = None,
default_text: str = "",
) -> Path:
candidate = Path(path_like).expanduser()
if candidate.is_absolute():
target = candidate
else:
target = data_root().joinpath(*candidate.parts)
target.parent.mkdir(parents=True, exist_ok=True)
if target.exists():
return target
if default_source is not None:
source = resolve_bundle_path(default_source)
if source.exists() and source != target:
shutil.copy2(source, target)
return target
target.write_text(default_text, encoding="utf-8")
return target