Source code for coord2region.utils.paths
"""Working directory helpers for Coord2Region projects."""
from __future__ import annotations
import os
from pathlib import Path
[docs]
PathLike = str | os.PathLike | None
[docs]
def resolve_working_directory(base: PathLike = None) -> Path:
"""Return the root working directory for coord2region assets.
Parameters
----------
base : str or None, optional
User supplied base directory. If ``None`` (default) the path
``~/coord2region`` is returned. Relative paths are interpreted
relative to the user's home directory.
Returns
-------
pathlib.Path
Absolute path to the working directory.
"""
if base is None:
return Path.home() / "coord2region"
if "\x00" in str(base):
raise ValueError(f"Invalid path containing null byte: {base}")
try:
expanded = Path(base).expanduser()
expanded.resolve()
except (OSError, RuntimeError, ValueError) as exc:
# platform dependent
raise ValueError(f"Invalid path: {base}") from exc
if expanded.is_absolute():
return expanded.resolve()
return (Path.home() / expanded).resolve()
[docs]
def ensure_mne_data_directory(base: PathLike = None) -> Path:
"""Ensure the MNE data directory exists and is registered with MNE."""
import mne
base_dir = resolve_working_directory(base)
candidates = []
env_candidate = os.environ.get("MNE_DATA")
if env_candidate:
candidates.append(env_candidate)
try:
config_candidate = mne.get_config("MNE_DATA", None)
except Exception: # pragma: no cover - defensive
config_candidate = None
if config_candidate:
candidates.append(config_candidate)
target: Path | None = None
for candidate in candidates:
candidate_path = Path(candidate).expanduser()
if not candidate_path.is_absolute():
candidate_path = (base_dir / candidate_path).resolve()
target = candidate_path
break
if target is None:
target = (base_dir / "mne_data").resolve()
try:
os.makedirs(target, exist_ok=True)
except OSError as exc: # pragma: no cover - filesystem permissions
raise ValueError(
f"Cannot create MNE data directory at {target}: {exc}"
) from exc
current_env = os.environ.get("MNE_DATA")
if current_env != str(target):
os.environ["MNE_DATA"] = str(target)
try:
current_config = mne.get_config("MNE_DATA", None)
except Exception: # pragma: no cover - defensive
current_config = None
if current_config != str(target):
mne.utils.set_config("MNE_DATA", str(target), set_env=True)
return target