Source code for dsw_document_template_tool._template_transform.workspace

"""Filesystem helpers for expanded template workspaces."""

from __future__ import annotations

import os
import shutil
from pathlib import Path

from .models import TemplateTransformError

MANIFEST_PATH = Path(".transform") / "manifest.json"
UPSTREAM_README_NAME = "UPSTREAM-README.md"


[docs] def reset_dir(path: Path) -> None: """Replace one directory with an empty directory.""" if path.exists(): shutil.rmtree(path) path.mkdir(parents=True, exist_ok=True)
[docs] def validate_template_dir(source_dir: Path) -> None: """Ensure one directory looks like a DSW document template.""" template_json = source_dir / "template.json" if not template_json.is_file(): raise TemplateTransformError(f"Missing template.json in {source_dir}") for root, directory_names, file_names in os.walk(source_dir, followlinks=False): root_path = Path(root) for name in directory_names + file_names: path = root_path / name if path.is_symlink(): relative_path = path.relative_to(source_dir) raise TemplateTransformError( f"Template contains unsupported symbolic link: {relative_path}" )
[docs] def snapshot_tree(root_dir: Path) -> dict[str, bytes]: """Return one deterministic file snapshot for content comparisons.""" snapshot: dict[str, bytes] = {} for path in sorted(root_dir.rglob("*")): if not path.is_file(): continue relative_path = path.relative_to(root_dir).as_posix() snapshot[relative_path] = path.read_bytes() return snapshot
[docs] def rewrite_workspace_readme(*, source_dir: Path, output_dir: Path) -> None: """Write the translator-facing README while preserving the upstream README.""" source_readme = source_dir / "README.md" output_readme = output_dir / "README.md" upstream_readme = output_dir / UPSTREAM_README_NAME if source_readme.is_file(): upstream_readme.write_text(source_readme.read_text(encoding="utf-8"), encoding="utf-8") output_readme.write_text( "\n".join( [ "# Translation Workspace", "", "This folder is the sentence-preserving workspace generated from the", "compact DSW template.", "", "- Edit `src/**/*.j2` in place.", "- Generated `__tr_block_####` comment markers keep whole headings,", " paragraphs, and list items together so later string extraction can work", " on complete units without changing Jinja scope.", "- Run `make compact-template` to rebuild a DSW-uploadable template.", "- Do not edit `.transform/manifest.json` manually.", "", f"The original upstream README is preserved in `{UPSTREAM_README_NAME}`.", "", ] ), encoding="utf-8", )