Add HTML5 focused object report
CI / python (push) Has been cancelled
CI / rust (push) Has been cancelled

This commit is contained in:
2026-05-17 00:50:56 +03:00
parent 9c4d02616f
commit 6e89cdcd84
3 changed files with 60 additions and 1 deletions
@@ -339,6 +339,52 @@ def render_html5_project_report(project_id: str, report: dict | None) -> str:
"""
def render_html5_object_report(
project_id: str,
impact: object,
*,
access: object | None = None,
privacy: object | None = None,
runtime: Iterable[object] | None = None,
integrations: Iterable[object] | None = None,
oob: bool = False,
) -> str:
obj = getattr(impact, "object", None)
name = getattr(obj, "qualified_name", None) or getattr(obj, "name", None) or getattr(impact, "object_name", "object")
grants = getattr(access, "grants", []) if access is not None else []
markers = getattr(privacy, "markers", []) if privacy is not None else []
runtime_items = list(runtime or [])
integration_items = list(integrations or [])
metrics = [
("Routines", len(getattr(impact, "routines", []) or [])),
("Commands", len(getattr(impact, "commands", []) or [])),
("Reads", len(getattr(impact, "query_tables", []) or [])),
("Writes", len(getattr(impact, "writes", []) or [])),
("Roles", len(grants) or len(getattr(impact, "roles", []) or [])),
("Runtime", len(runtime_items)),
("Privacy", len(markers)),
("Integrations", len(integration_items)),
]
oob_attr = ' hx-swap-oob="outerHTML"' if oob else ""
return f"""
<div
class="report-panel"
data-html5-project-report
hx-get="/html5/projects/{quote(project_id)}/report"
hx-trigger="every 15s"
hx-swap="outerHTML"
{oob_attr}
>
<div class="panel-title">Отчет объекта</div>
<article class="object-focus">
<strong>{escape(str(name))}</strong>
<span>server focused summary</span>
</article>
<dl class="report-grid">{''.join(_metric(label, value) for label, value in metrics)}</dl>
</div>
"""
def render_html5_review(project_id: str, findings: list[dict] | None) -> str:
if findings is None:
return f"""
+11 -1
View File
@@ -48,6 +48,7 @@ from api_server.html5 import (
render_html5_metadata_apply_result,
render_html5_metadata_preview_result,
render_html5_object_context,
render_html5_object_report,
render_html5_project_setup,
render_html5_project_rows,
render_html5_project_report,
@@ -1784,8 +1785,17 @@ async def html5_project_object_context(project_id: str, object_name: str) -> Res
flowchart_context = render_html5_flowchart(project_id, flowchart, focus=object_name, oob=True)
source_context = render_html5_source(source_node, oob=True) if source_node is not None else ""
symbol_context = render_html5_symbol_detail(project_id, symbol_references, oob=True)
report_context = render_html5_object_report(
project_id,
impact,
access=access,
privacy=privacy,
runtime=runtime,
integrations=integrations,
oob=True,
)
return Response(
object_context + flowchart_context + source_context + symbol_context,
object_context + flowchart_context + source_context + symbol_context + report_context,
media_type="text/html; charset=utf-8",
)
+3
View File
@@ -334,6 +334,9 @@ def test_html5_object_context_fragment(tmp_path: Path):
assert "data-html5-symbol-detail" in context.text
assert "Символ · DOCUMENT" in context.text
assert "HAS_ATTRIBUTE" in context.text
assert "data-html5-project-report" in context.text
assert "Отчет объекта" in context.text
assert "server focused summary" in context.text
assert "1 signals" in context.text
assert "1 errors" in context.text
assert "125.0 ms" in context.text