Source code for jamb.storage.document_config
"""Document configuration for jamb's native storage layer."""
from dataclasses import dataclass, field
from pathlib import Path
from typing import Any
import yaml
[docs]
@dataclass
class DocumentConfig:
"""Configuration for a requirements document.
Attributes:
prefix (str): Unique identifier prefix for items in this document
(e.g. ``"REQ"``).
parents (list[str]): Prefixes of parent documents in the document DAG.
digits (int): Number of zero-padded digits in generated UIDs
(e.g. ``3`` produces ``REQ001``).
sep (str): Separator between the prefix and numeric part of a UID
(e.g. ``"-"`` produces ``REQ-001``).
"""
prefix: str
parents: list[str] = field(default_factory=list)
digits: int = 3
sep: str = ""
[docs]
def load_document_config(path: Path) -> DocumentConfig:
"""Load document config from a .jamb.yml file.
Args:
path: Path to the config file (.jamb.yml).
Returns:
DocumentConfig parsed from the file.
Raises:
ValueError: If the config file is missing required fields.
"""
with open(path, encoding="utf-8") as f:
data = yaml.safe_load(f)
if not data or "settings" not in data:
raise ValueError(f"Invalid config file: {path}")
settings = data["settings"]
prefix = settings.get("prefix")
if not prefix:
raise ValueError(f"Config file missing 'prefix': {path}")
parents: list[str] = []
if "parents" in settings:
raw = settings["parents"]
if isinstance(raw, list):
parents = [str(p) for p in raw]
elif raw is not None:
parents = [str(raw)]
return DocumentConfig(
prefix=prefix,
parents=parents,
digits=settings.get("digits", 3),
sep=settings.get("sep", ""),
)
[docs]
def save_document_config(config: DocumentConfig, directory: Path) -> None:
"""Save document config as .jamb.yml in the given directory.
Args:
config: The document configuration to save.
directory: The directory to write .jamb.yml into.
"""
settings: dict[str, Any] = {
"prefix": config.prefix,
"digits": config.digits,
"sep": config.sep,
}
if config.parents:
settings["parents"] = config.parents
data = {"settings": settings}
directory.mkdir(parents=True, exist_ok=True)
config_path = directory / ".jamb.yml"
with open(config_path, "w", encoding="utf-8") as f:
yaml.safe_dump(data, f, default_flow_style=False, sort_keys=False)