Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/455.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Update InfrahubNode creation to include __typename, display_label, and kind from a RelatedNode
32 changes: 22 additions & 10 deletions infrahub_sdk/node/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -507,11 +507,17 @@ def _init_relationships(self, data: dict | RelatedNode | None = None) -> None:

if rel_schema.cardinality == "one":
if isinstance(rel_data, RelatedNode):
peer_id_data: dict[str, Any] = {}
if rel_data.id:
peer_id_data["id"] = rel_data.id
if rel_data.hfid:
peer_id_data["hfid"] = rel_data.hfid
peer_id_data: dict[str, Any] = {
key: value
for key, value in (
("id", rel_data.id),
("hfid", rel_data.hfid),
("__typename", rel_data.typename),
("kind", rel_data.kind),
("display_label", rel_data.display_label),
)
if value is not None
}
if peer_id_data:
rel_data = peer_id_data
else:
Expand Down Expand Up @@ -1090,11 +1096,17 @@ def _init_relationships(self, data: dict | None = None) -> None:

if rel_schema.cardinality == "one":
if isinstance(rel_data, RelatedNodeSync):
peer_id_data: dict[str, Any] = {}
if rel_data.id:
peer_id_data["id"] = rel_data.id
if rel_data.hfid:
peer_id_data["hfid"] = rel_data.hfid
peer_id_data: dict[str, Any] = {
key: value
for key, value in (
("id", rel_data.id),
("hfid", rel_data.hfid),
("__typename", rel_data.typename),
("kind", rel_data.kind),
("display_label", rel_data.display_label),
)
if value is not None
}
if peer_id_data:
rel_data = peer_id_data
else:
Expand Down
7 changes: 7 additions & 0 deletions infrahub_sdk/node/related_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
self._hfid: list[str] | None = None
self._display_label: str | None = None
self._typename: str | None = None
self._kind: str | None = None

if isinstance(data, (CoreNodeBase)):
self._peer = data
Expand Down Expand Up @@ -118,6 +119,12 @@
return self._peer.typename
return self._typename

@property
def kind(self) -> str | None:
if self._peer:
return self._peer.get_kind()

Check warning on line 125 in infrahub_sdk/node/related_node.py

View check run for this annotation

Codecov / codecov/patch

infrahub_sdk/node/related_node.py#L125

Added line #L125 was not covered by tests
return self._kind

def _generate_input_data(self, allocate_from_pool: bool = False) -> dict[str, Any]:
data: dict[str, Any] = {}

Expand Down
1 change: 1 addition & 0 deletions tests/integration/test_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ async def test_node_create_with_relationships_using_related_node(
assert node_after.name.value == node.name.value
assert node_after.manufacturer.peer.id == manufacturer_mercedes.id
assert node_after.owner.peer.id == person_joe.id
assert node_after.owner.peer.typename == "TestingPerson"

async def test_node_update_with_original_data(
self,
Expand Down
11 changes: 10 additions & 1 deletion tests/unit/sdk/test_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,13 @@ async def test_init_node_data_user_with_relationships(client, location_schema: N


@pytest.mark.parametrize("client_type", client_types)
@pytest.mark.parametrize("rel_data", [{"id": "pppppppp"}, {"hfid": ["pppp", "pppp"]}])
@pytest.mark.parametrize(
"rel_data",
[
{"id": "pppppppp", "__typename": "BuiltinTag"},
{"hfid": ["pppp", "pppp"], "display_label": "mmmm", "kind": "BuiltinTag"},
],
)
async def test_init_node_data_user_with_relationships_using_related_node(
client, location_schema: NodeSchemaAPI, client_type, rel_data
):
Expand Down Expand Up @@ -231,6 +237,9 @@ async def test_init_node_data_user_with_relationships_using_related_node(
assert isinstance(node.primary_tag, RelatedNodeBase)
assert node.primary_tag.id == rel_data.get("id")
assert node.primary_tag.hfid == rel_data.get("hfid")
assert node.primary_tag.typename == rel_data.get("__typename")
assert node.primary_tag.kind == rel_data.get("kind")
assert node.primary_tag.display_label == rel_data.get("display_label")

keys = dir(node)
assert "name" in keys
Expand Down