Complete independent projection runtime
This commit is contained in:
parent
1134c2d375
commit
f1fabaf0ca
38 changed files with 4907 additions and 87 deletions
|
|
@ -34,6 +34,11 @@ from .models import (
|
|||
)
|
||||
from .project import project_root_fingerprint
|
||||
from .projection_contract import GraphViewPlanV1, ProjectionReceiptV1, projection_hash
|
||||
from .projection_policy import (
|
||||
PortableGraphProjectionMode,
|
||||
validate_portable_graph_projection_mode,
|
||||
)
|
||||
from .projection_worker import render_projection_in_worker
|
||||
|
||||
GRAPH_RENDERER_ID = "portable_graph_html"
|
||||
GRAPH_RENDERER_VERSION = "1"
|
||||
|
|
@ -45,11 +50,29 @@ MAX_GRAPH_PUBLICATION_BYTES = 256_000
|
|||
class GraphRenderService:
|
||||
"""Publish one declared artifact while keeping planning and rendering independent."""
|
||||
|
||||
def __init__(self, project: ProjectService, *, allow_logic: bool = False) -> None:
|
||||
def __init__(
|
||||
self,
|
||||
project: ProjectService,
|
||||
*,
|
||||
allow_logic: bool = False,
|
||||
portable_graph_policy: PortableGraphProjectionMode = "explicit",
|
||||
) -> None:
|
||||
self.project = project
|
||||
self.allow_logic = allow_logic
|
||||
self.portable_graph_policy = validate_portable_graph_projection_mode(portable_graph_policy)
|
||||
|
||||
def _require_rendering(self, operation: str) -> None:
|
||||
if self.portable_graph_policy == "disabled":
|
||||
raise DocForgeError(
|
||||
"projection_policy_forbids_operation",
|
||||
"Portable graph projection policy disables rendering work",
|
||||
projection="portable_graph",
|
||||
mode=self.portable_graph_policy,
|
||||
operation=operation,
|
||||
)
|
||||
|
||||
def plan(self, view_id: str) -> dict[str, object]:
|
||||
self._require_rendering("plan")
|
||||
snapshot = self.project.load()
|
||||
view = self._view(self._config(snapshot), view_id)
|
||||
plan = self._plan(snapshot, view)
|
||||
|
|
@ -93,6 +116,7 @@ class GraphRenderService:
|
|||
)
|
||||
|
||||
def render(self, view_id: str) -> dict[str, object]:
|
||||
self._require_rendering("render")
|
||||
with self._lock():
|
||||
current_status = self.status(view_id)
|
||||
current_outputs = cast(list[dict[str, object]], current_status["outputs"])
|
||||
|
|
@ -111,9 +135,7 @@ class GraphRenderService:
|
|||
renderer_version=GRAPH_RENDERER_VERSION,
|
||||
max_output_bytes=snapshot.descriptor.limits.max_render_bytes,
|
||||
)
|
||||
from docforge_renderers.graph import PortableGraphHtmlRenderer
|
||||
|
||||
result = PortableGraphHtmlRenderer().render(package)
|
||||
result = render_projection_in_worker(package)
|
||||
if len(result.artifacts) != 1:
|
||||
raise DocForgeError(
|
||||
"invalid_projection",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue