mirror of
https://github.com/hansjone/netx.git
synced 2026-10-15 15:53:20 +08:00
Ship gated eye polish, fabric levels, and collection UI refresh.
Topology MCP adds pull/compact/bundle/suggest-hubs with a no-template skill path; API gains fabric level and NE collection policy; web list pages get paging and denser collect/network workflows. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
b1aee86701
commit
b81e5869a6
91 changed files with 10395 additions and 1513 deletions
40
packages/netx-topology-mcp/tests/test_compact_bbox.py
Normal file
40
packages/netx-topology-mcp/tests/test_compact_bbox.py
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
"""Tests for gated compact_bbox."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from netx_topology_mcp.layout_metrics import count_edge_crossings
|
||||
from netx_topology_mcp.layout_ops.compact_bbox import compact_bbox
|
||||
from netx_topology_mcp.layout_ops.graph_util import build_state_from_nodes_edges
|
||||
from netx_topology_mcp.layout_ops.orbit_sweep import _has_any_footprint_overlap
|
||||
|
||||
|
||||
def test_compact_bbox_shrinks_without_raising_crossings():
|
||||
# Two portals + a far leaf; shrink should pull leaf inward.
|
||||
nodes = [
|
||||
{"fabric_node_id": "p1", "name": "P1", "x": 0.0, "y": 0.0},
|
||||
{"fabric_node_id": "p2", "name": "P2", "x": 1000.0, "y": 0.0},
|
||||
{"fabric_node_id": "a", "name": "A", "x": 500.0, "y": 0.0},
|
||||
{"fabric_node_id": "leaf", "name": "Leaf", "x": 500.0, "y": 4000.0},
|
||||
]
|
||||
edges = [
|
||||
{"a_fabric_node_id": "p1", "b_fabric_node_id": "a"},
|
||||
{"a_fabric_node_id": "a", "b_fabric_node_id": "p2"},
|
||||
{"a_fabric_node_id": "a", "b_fabric_node_id": "leaf"},
|
||||
]
|
||||
st = build_state_from_nodes_edges(nodes, edges)
|
||||
g0 = count_edge_crossings(st.positions, st.links)
|
||||
op = compact_bbox(
|
||||
st,
|
||||
portal_ids=["p1", "p2"],
|
||||
min_scale=0.7,
|
||||
step=0.05,
|
||||
max_clearance_slack=50,
|
||||
)
|
||||
assert op.params.get("accepted") is True
|
||||
assert op.params.get("scale", 1.0) < 1.0
|
||||
assert abs(op.state.positions["p1"][0] - 0.0) < 1e-6
|
||||
assert abs(op.state.positions["p2"][0] - 1000.0) < 1e-6
|
||||
assert op.state.positions["leaf"][1] < 4000.0
|
||||
g1 = count_edge_crossings(op.state.positions, op.state.links)
|
||||
assert g1 <= g0
|
||||
assert not _has_any_footprint_overlap(op.state.positions, op.state.names)
|
||||
Loading…
Add table
Add a link
Reference in a new issue