mattzh72--articraft
38 行
1.2 KiB
Python
38 行
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
from dataclasses import dataclass, field
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
from storage.layout import StorageLayout
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class StorageRepo:
|
|
root: Path
|
|
data_root: Path | None = None
|
|
layout: StorageLayout = field(init=False)
|
|
|
|
def __post_init__(self) -> None:
|
|
self.root = self.root.resolve()
|
|
if self.data_root is not None:
|
|
self.data_root = self.data_root.expanduser().resolve()
|
|
self.layout = StorageLayout(self.root, self.data_root)
|
|
|
|
def ensure_layout(self) -> None:
|
|
self.layout.ensure_base_dirs()
|
|
|
|
def read_json(self, path: Path, *, default: Any = None) -> Any:
|
|
if not path.exists():
|
|
return default
|
|
return json.loads(path.read_text(encoding="utf-8"))
|
|
|
|
def write_json(self, path: Path, data: Any) -> None:
|
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
path.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
|
|
|
|
def write_text(self, path: Path, text: str) -> None:
|
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
path.write_text(text, encoding="utf-8")
|