1
0
Fork 0
Code Issues Pull requests Projects Releases 2 Packages Wiki Activity Actions Pages

feat: add deterministic preview rendering

This commit is contained in:
Andraxion 2026-07-22 03:32:05 -04:00
parent 8c75f4f44d
commit 411f417670
23 changed files with 1413 additions and 142 deletions

View file

@ -19,7 +19,7 @@ from .changeset_contract import (
validate_id,
)
from .errors import DocForgeError
from .models import Node, ProjectSnapshot, ProposalWriter
from .models import Edge, Node, ProjectSnapshot, ProposalWriter
from .project import Project, project_root_fingerprint
from .proposal_projection import ProposalProjector
@ -250,6 +250,21 @@ class ChangesetStore:
)
return self._result(snapshot, document, valid=True, changes=changes)
def projected_snapshot(self, changeset_id: str) -> tuple[ProjectSnapshot, str]:
"""Return a validated in-memory proposal projection for derived preview use."""
validate_id(changeset_id, "changeset_id")
with self._lock():
snapshot, document, nodes, edges = self._validate_locked(changeset_id)
projected = ProjectSnapshot(
descriptor=snapshot.descriptor,
nodes=tuple(sorted(nodes.values(), key=lambda node: node.node_id)),
edges=tuple(Edge(*edge) for edge in sorted(edges)),
source_hash=snapshot.source_hash,
revision=snapshot.revision,
)
return projected, document_hash(document)
def _append(
self,
changeset_id: str,
@ -409,6 +424,8 @@ class ChangesetStore:
raise DocForgeError("path_escape", "Changeset files may not be symbolic links")
if not path.is_file():
raise DocForgeError("missing_changeset", "Changeset does not exist", path=path.name)
if path.stat().st_size > self.project.descriptor.limits.max_changeset_bytes:
raise DocForgeError("changeset_too_large", "Changeset exceeds configured size limit")
raw = path.read_bytes()
if len(raw) > self.project.descriptor.limits.max_changeset_bytes:
raise DocForgeError("changeset_too_large", "Changeset exceeds configured size limit")