commit fa95a1a067192839f22a6063a72ec7db69c04e43
parent f5f2726ec3b615ca2fbe9d4c6194f6f78e6181f5
Author: Andy Khramtsov <>
Date: Sat, 30 May 2026 03:59:48 +0300
feat: bump ui revision on full generate
Diffstat:
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/src/deps/pages/home.py b/src/deps/pages/home.py
@@ -1,6 +1,7 @@
import base64
import io
import tomllib
+import typing
from dataclasses import dataclass
import dash
@@ -330,7 +331,7 @@ def compute_node_positions(df_graph: DfGraph) -> dict[str, tuple[int | float, in
def compute_adjacency_list(df_graph: DfGraph) -> dict[str, set[str]]:
- adjacency_list = {node: set() for node in df_graph.nodes["node_id"]}
+ adjacency_list = {str(node): set() for node in df_graph.nodes["node_id"]}
for row in df_graph.arcs.iter_rows(named=True):
if not row["target"]:
@@ -342,13 +343,20 @@ def compute_adjacency_list(df_graph: DfGraph) -> dict[str, set[str]]:
return adjacency_list
+def wrap_adjacency_list(adjacency_list: dict[str, set[str]]) -> dict[str, list[str]]:
+ return {node: list(neighbors) for node, neighbors in adjacency_list.items()}
+
+
+def unwrap_adjacency_list(adjacency_list: dict[str, list[str]]) -> dict[str, set[str]]:
+ return {node: set(neighbors) for node, neighbors in adjacency_list.items()}
+
+
def draw_graph_figure(
df_graph: DfGraph,
positions: dict[str, tuple[float, float]],
+ adjacency_list: dict[str, set[str]],
selected_node=None,
) -> go.Figure:
- adjacency_list = compute_adjacency_list(df_graph)
-
highlight_nodes = set()
if selected_node and selected_node in adjacency_list:
highlight_nodes.add(selected_node)
@@ -631,6 +639,7 @@ def visualize(inputs, state):
or state["cache"].get("positions") is None
or state["cache"].get("df_graph_nodes") is None
or state["cache"].get("df_graph_arcs") is None
+ or state["cache"].get("adjacency_list") is None
):
clean = True
else:
@@ -659,13 +668,16 @@ def visualize(inputs, state):
raise PreventUpdate from error
df_graph = files_into_graph(cargo_toml, cargo_lock)
positions = compute_node_positions(df_graph)
+ adjacency_list = compute_adjacency_list(df_graph)
cache = {
"positions": positions,
+ "adjacency_list": wrap_adjacency_list(adjacency_list),
"df_graph_nodes": df_graph.nodes.serialize(format="json"),
"df_graph_arcs": df_graph.arcs.serialize(format="json"),
}
else:
positions = state["cache"]["positions"]
+ adjacency_list = unwrap_adjacency_list(state["cache"]["adjacency_list"])
df_graph = DfGraph(
nodes=pl.DataFrame.deserialize(io.StringIO(state["cache"]["df_graph_nodes"]), format="json"),
arcs=pl.DataFrame.deserialize(io.StringIO(state["cache"]["df_graph_arcs"]), format="json"),
@@ -682,8 +694,11 @@ def visualize(inputs, state):
for item in (part, html.Br())
]
- fig = draw_graph_figure(df_graph, positions, selected)
- fig.update_layout(uirevision="1")
+ old_fig = state["figure"]
+ old_uirevision = old_fig.get("layout", {}).get("uirevision", 0)
+
+ fig = draw_graph_figure(df_graph, positions, adjacency_list, selected)
+ fig.update_layout(uirevision=old_uirevision + 1 if clean else old_uirevision)
return dict(
graph=fig,