Skip to content

Commit 58d2908

Browse files
committed
Fix attribute updates with original data
1 parent d22626a commit 58d2908

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

infrahub_sdk/node.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,17 +82,18 @@ def __init__(self, name: str, schema: AttributeSchemaAPI, data: Any | dict):
8282

8383
self.id: str | None = data.get("id", None)
8484

85-
self.value: Any | None = data.get("value", None)
85+
self._value: Any | None = data.get("value", None)
86+
self.value_has_been_mutated = False
8687
self.is_default: bool | None = data.get("is_default", None)
8788
self.is_from_profile: bool | None = data.get("is_from_profile", None)
8889

89-
if self.value:
90+
if self._value:
9091
value_mapper: dict[str, Callable] = {
9192
"IPHost": ipaddress.ip_interface,
9293
"IPNetwork": ipaddress.ip_network,
9394
}
9495
mapper = value_mapper.get(schema.kind, lambda value: value)
95-
self.value = mapper(data.get("value"))
96+
self._value = mapper(data.get("value"))
9697

9798
self.is_inherited: bool | None = data.get("is_inherited", None)
9899
self.updated_at: str | None = data.get("updated_at", None)
@@ -107,6 +108,15 @@ def __init__(self, name: str, schema: AttributeSchemaAPI, data: Any | dict):
107108
if data.get(prop_name):
108109
setattr(self, prop_name, NodeProperty(data=data.get(prop_name))) # type: ignore[arg-type]
109110

111+
@property
112+
def value(self) -> Any:
113+
return self._value
114+
115+
@value.setter
116+
def value(self, value: Any) -> None:
117+
self._value = value
118+
self.value_has_been_mutated = True
119+
110120
def _generate_input_data(self) -> dict | None:
111121
data: dict[str, Any] = {}
112122
variables: dict[str, Any] = {}
@@ -975,7 +985,9 @@ def _strip_unmodified(self, data: dict, variables: dict) -> tuple[dict, dict]:
975985
for item in original_data.keys():
976986
if item in data.keys():
977987
if data[item] == original_data[item]:
978-
data.pop(item)
988+
if attr := getattr(self, item, None): # this should never be None, just a safety default value
989+
if isinstance(attr, Attribute) and not attr.value_has_been_mutated:
990+
data.pop(item)
979991
continue
980992
if isinstance(original_data[item], dict):
981993
self._strip_unmodified_dict(data=data, original_data=original_data, variables=variables, item=item)

tests/integration/test_node.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,25 @@ async def test_node_create_with_relationships(
6363
assert node_after.name.value == node.name.value
6464
assert node_after.manufacturer.peer.id == manufacturer_mercedes.id
6565

66+
async def test_node_update_with_original_data(
67+
self,
68+
default_branch: str,
69+
client: InfrahubClient,
70+
initial_schema: None,
71+
):
72+
person_marina = await client.create(kind="TestingPerson", name="marina", age=20)
73+
await person_marina.save()
74+
75+
person_marina = await client.get(kind="TestingPerson", id=person_marina.id)
76+
77+
person_marina.age.value = 30
78+
await person_marina.save()
79+
80+
person_marina.age.value = 20
81+
await person_marina.save()
82+
node = await client.get(kind="TestingPerson", id=person_marina.id)
83+
assert node.age.value == 20, node.age.value
84+
6685
# async def test_node_update_payload_with_relationships(
6786
# self,
6887
# db: InfrahubDatabase,

0 commit comments

Comments
 (0)