4242
4343 from ..client import InfrahubClient , InfrahubClientSync
4444 from ..context import RequestContext
45+ from ..protocols_base import CoreNodeBase
4546 from ..schema import MainSchemaTypesAPI
4647 from ..types import Order
4748
@@ -276,7 +277,7 @@ def get_node_metadata(self) -> NodeMetadata | None:
276277 return self ._metadata
277278
278279 @staticmethod
279- def _field_was_fetched (data : Any , name : str ) -> bool :
280+ def _field_was_fetched (data : object , name : str ) -> bool :
280281 """Return whether a field was present in the response a node was built from.
281282
282283 Key-presence is the only unambiguous "was fetched" signal: an absent field and
@@ -316,7 +317,7 @@ def _get_request_context(self, request_context: RequestContext | None = None) ->
316317 def _init_relationships (self , data : dict | None = None ) -> None :
317318 pass
318319
319- def _merge (self , node : InfrahubNodeBase ) -> None :
320+ def _merge (self , node : InfrahubNodeBase | CoreNodeBase ) -> None :
320321 """Merge a fresher copy of the same node into this one, field by field.
321322
322323 Used by the client store when a node with this UUID is fetched again: fields the
@@ -348,8 +349,8 @@ def _merge(self, node: InfrahubNodeBase) -> None:
348349 self ._merge_raw_field (name = name , stored_data = stored_data , incoming_data = incoming_data )
349350
350351 for container_field in RELATIONSHIP_CONTAINER_FIELDS :
351- incoming_bucket : dict [str , Any ] = getattr (node , container_field , {})
352- stored_bucket : dict [str , Any ] = getattr (self , container_field , {})
352+ incoming_bucket : dict [str , RelatedNodeBase | RelationshipManagerBase ] = getattr (node , container_field , {})
353+ stored_bucket : dict [str , RelatedNodeBase | RelationshipManagerBase ] = getattr (self , container_field , {})
353354 for name , incoming_rel in incoming_bucket .items ():
354355 if self ._merge_relationship (stored_bucket , name , incoming_rel ):
355356 self ._merge_raw_field (name = name , stored_data = stored_data , incoming_data = incoming_data )
@@ -385,29 +386,32 @@ def _merge_attribute(self, name: str, incoming_attr: Attribute) -> bool:
385386 return True
386387
387388 @staticmethod
388- def _merge_relationship (stored_bucket : dict [str , Any ], name : str , incoming_rel : Any ) -> bool :
389+ def _merge_relationship (
390+ stored_bucket : dict [str , RelatedNodeBase | RelationshipManagerBase ],
391+ name : str ,
392+ incoming_rel : RelatedNodeBase | RelationshipManagerBase ,
393+ ) -> bool :
389394 """Merge one relationship entry into ``stored_bucket``; return whether it was taken."""
395+ stored_rel = stored_bucket .get (name )
390396 if isinstance (incoming_rel , RelatedNodeBase ):
391397 if not incoming_rel .is_fetched and not incoming_rel ._peer_has_been_mutated :
392398 return False
393- stored_rel = stored_bucket .get (name )
394- if stored_rel is None :
399+ if not isinstance (stored_rel , RelatedNodeBase ):
395400 stored_bucket [name ] = incoming_rel
396401 elif stored_rel ._peer_has_been_mutated :
397402 return False
398403 else :
399404 stored_rel ._merge (incoming_rel )
400405 return True
401406
402- if not isinstance ( incoming_rel , RelationshipManagerBase ) or not incoming_rel .is_fetched :
407+ if not incoming_rel .is_fetched :
403408 return False
404- stored_manager = stored_bucket .get (name )
405- if stored_manager is None :
409+ if not isinstance (stored_rel , RelationshipManagerBase ):
406410 stored_bucket [name ] = incoming_rel
407- elif stored_manager .has_update :
411+ elif stored_rel .has_update :
408412 return False
409413 else :
410- stored_manager ._merge (incoming_rel )
414+ stored_rel ._merge (incoming_rel )
411415 return True
412416
413417 def _reset_mutation_tracking (self ) -> None :
@@ -421,7 +425,8 @@ def _reset_mutation_tracking(self) -> None:
421425 for attr in self ._attribute_data .values ():
422426 attr .value_has_been_mutated = False
423427 for container_field in RELATIONSHIP_CONTAINER_FIELDS :
424- for rel in getattr (self , container_field , {}).values ():
428+ container : dict [str , RelatedNodeBase | RelationshipManagerBase ] = getattr (self , container_field , {})
429+ for rel in container .values ():
425430 if isinstance (rel , RelatedNodeBase ):
426431 rel ._peer_has_been_mutated = False
427432 elif isinstance (rel , RelationshipManagerBase ):
0 commit comments