Refactor: rename rel -> subject in disconnect_rel dispatch

The "mep-pair-fitting" kind added in the previous commit carries an
IfcFlowFitting (the entity whose deletion disconnects the pair), not a
relationship entity, in the dispatch slot — but the slot was named ``rel``
across the function signature and every call site. Rename to ``subject``
so the parameter name reflects the uniform intent: "the entity whose
teardown effects the disconnect", regardless of whether that's a rel or
a fitting.

Sweep covers:

- core.connection.disconnect_rel signature + body
- tool.Connection.find_rels / find_rels_for_element / find_rel docstrings
- The cascade-on-delete call site in tool.Geometry.delete_ifc_object
- DisconnectElements operator in bim.module.model.wall
- All affected test kwargs and AST forward-compat docstring
- Error message: "Unknown rel kind" -> "Unknown kind"

No behaviour change.

Generated with the assistance of an AI coding tool.
This commit is contained in:
Gorgious56
2026-06-23 14:27:29 +02:00
parent 6fa984ce2b
commit 006a24ef32
8 changed files with 76 additions and 74 deletions
@@ -380,9 +380,9 @@ def test_disconnect_dispatches_one_call_per_rel():
assert dispatch.call_count == 2
# Both rels dispatch with elem=elem_a, partner=elem_b regardless of orientation
# — orient_element_top inside disconnect_rel recovers the wall/slab roles.
for call, expected_rel, expected_kind in zip(dispatch.call_args_list, [rel1, rel2], ["path", "element-top"]):
for call, expected_subject, expected_kind in zip(dispatch.call_args_list, [rel1, rel2], ["path", "element-top"]):
kw = call.kwargs
assert kw["rel"] is expected_rel
assert kw["subject"] is expected_subject
assert kw["kind"] == expected_kind
assert kw["elem"] is elem_a
assert kw["partner"] is elem_b
@@ -485,7 +485,7 @@ def test_disconnect_gizmo_direction_symmetry():
# disconnect_rel sees (rel, "element-top") in both runs; elem/partner swap
# by argument order but orient_element_top inside disconnect_rel resolves
# the wall/slab roles symmetrically.
assert wall_first["rel"] is rel and slab_first["rel"] is rel
assert wall_first["subject"] is rel and slab_first["subject"] is rel
assert wall_first["kind"] == slab_first["kind"] == "element-top"
assert {wall_first["elem"], wall_first["partner"]} == {wall, slab}
assert {slab_first["elem"], slab_first["partner"]} == {wall, slab}
@@ -24,7 +24,7 @@ Builds a real IFC scene (two pipe segments joined via ports to a bridging
fitting) and exercises the full chain:
tool.Connection.find_rels(seg_a, seg_b)
→ returns (fitting, "mep-pair-fitting")
→ bonsai.core.connection.disconnect_rel(rel=fitting, kind=...)
→ bonsai.core.connection.disconnect_rel(subject=fitting, kind=...)
→ tool.Geometry.delete_ifc_object(fitting_obj)
→ cascade-on-delete removes the IfcRelConnectsPorts via remove_port
@@ -100,7 +100,7 @@ class TestMEPPairDisconnectEndToEnd(NewFile):
tool.Geometry,
tool.Model,
tool.Connection,
rel=bend,
subject=bend,
kind="mep-pair-fitting",
elem=seg_a,
partner=seg_b,
@@ -127,7 +127,7 @@ class TestMEPPairDisconnectEndToEnd(NewFile):
tool.Geometry,
tool.Model,
tool.Connection,
rel=bend,
subject=bend,
kind="mep-pair-fitting",
elem=bend,
partner=seg_a,
+15 -15
View File
@@ -64,7 +64,7 @@ class TestDisconnectRelPath:
geometry,
model,
connection,
rel="rel",
subject="rel",
kind="path",
elem="elem_a",
partner="elem_b",
@@ -88,7 +88,7 @@ class TestDisconnectRelPath:
geometry,
model,
connection,
rel="rel",
subject="rel",
kind="path",
elem="elem",
partner="partner",
@@ -109,7 +109,7 @@ class TestDisconnectRelPath:
geometry,
model,
connection,
rel="rel",
subject="rel",
kind="path",
elem="elem",
partner="partner",
@@ -130,7 +130,7 @@ class TestDisconnectRelPath:
geometry,
model,
connection,
rel="rel",
subject="rel",
kind="path",
elem="elem",
partner="partner",
@@ -159,7 +159,7 @@ class TestDisconnectRelElementTop:
geometry,
model,
connection,
rel=rel,
subject=rel,
kind="element-top",
elem="elem",
partner="partner",
@@ -182,7 +182,7 @@ class TestDisconnectRelElementTop:
Mock(),
Mock(),
connection,
rel=rel,
subject=rel,
kind="element-top",
elem="slab",
partner="wall",
@@ -205,7 +205,7 @@ class TestDisconnectRelElementTop:
Mock(),
Mock(),
connection,
rel=rel,
subject=rel,
kind="element-top",
elem="wall",
partner="slab",
@@ -229,7 +229,7 @@ class TestDisconnectRelElementTop:
Mock(),
Mock(),
connection,
rel=rel,
subject=rel,
kind="element-top",
elem="slab",
partner="wall",
@@ -250,7 +250,7 @@ class TestDisconnectRelElement:
Mock(),
Mock(),
Mock(),
rel=rel,
subject=rel,
kind="element",
elem="elem_a",
partner="elem_b",
@@ -276,7 +276,7 @@ class TestDisconnectRelMEPPairFitting:
geometry,
Mock(),
Mock(),
rel=fitting,
subject=fitting,
kind="mep-pair-fitting",
elem="seg_a",
partner="seg_b",
@@ -296,7 +296,7 @@ class TestDisconnectRelMEPPairFitting:
geometry,
Mock(),
Mock(),
rel=fitting,
subject=fitting,
kind="mep-pair-fitting",
elem="seg_a",
partner="seg_b",
@@ -316,7 +316,7 @@ class TestDisconnectRelMEPPairFitting:
geometry,
Mock(),
Mock(),
rel=fitting,
subject=fitting,
kind="mep-pair-fitting",
elem=fitting,
partner="other",
@@ -335,7 +335,7 @@ class TestDisconnectRelMEPPairFitting:
geometry,
Mock(),
Mock(),
rel=fitting,
subject=fitting,
kind="mep-pair-fitting",
elem="seg_a",
partner=fitting,
@@ -347,13 +347,13 @@ class TestDisconnectRelMEPPairFitting:
class TestDisconnectRelUnknownKind:
def test_raises_value_error(self):
with pytest.raises(ValueError, match="Unknown rel kind"):
with pytest.raises(ValueError, match="Unknown kind"):
subject.disconnect_rel(
Mock(),
Mock(),
Mock(),
Mock(),
rel="rel",
subject="rel",
kind="bogus",
elem="a",
partner="b",
@@ -19,12 +19,12 @@
# This file was generated with the assistance of an AI coding tool.
"""Forward-compat AST contract: ``core.connection.disconnect_rel`` must have a
branch for every rel ``kind`` emitted by ``tool.connection.Connection`` lookups.
branch for every ``kind`` emitted by ``tool.connection.Connection`` lookups.
Adding a new rel kind (e.g. ``"void"``, ``"fill"``, ``"interferes"``) to
Adding a new kind (e.g. ``"void"``, ``"fill"``, ``"interferes"``) to
``find_rels`` / ``find_rels_for_element`` without extending ``disconnect_rel``
would silently regress the disconnect operator and the cascade-on-delete: a new
kind would reach the dispatch, hit the ``raise ValueError("Unknown rel kind")``
kind would reach the dispatch, hit the ``raise ValueError("Unknown kind")``
fallback, and either crash the operator or leave the cascade half-done. This
guard makes the symmetry mandatory at test time."""