mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-31 08:56:34 +00:00
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:
@@ -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,
|
||||
|
||||
@@ -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."""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user