@@ -226,6 +226,7 @@ def extract_relationships(self) -> None:
226226 obj .attrs = self .get_attrs (node )
227227 obj .methods = self .get_methods (node )
228228 obj .shape = "class"
229+
229230 # inheritance link
230231 for par_node in node .ancestors (recurs = False ):
231232 try :
@@ -234,19 +235,25 @@ def extract_relationships(self) -> None:
234235 except KeyError :
235236 continue
236237
238+ # Track processed attributes to avoid duplicates
239+ processed_attrs = set ()
240+
237241 # Composition links
238242 for name , values in list (node .compositions_type .items ()):
239243 for value in values :
240244 self .assign_association_relationship (
241245 value , obj , name , "composition"
242246 )
247+ processed_attrs .add (name )
243248
244249 # Aggregation links
245250 for name , values in list (node .aggregations_type .items ()):
246- for value in values :
247- self .assign_association_relationship (
248- value , obj , name , "aggregation"
249- )
251+ if name not in processed_attrs :
252+ for value in values :
253+ self .assign_association_relationship (
254+ value , obj , name , "aggregation"
255+ )
256+ processed_attrs .add (name )
250257
251258 # Association links
252259 associations = node .associations_type .copy ()
@@ -255,10 +262,11 @@ def extract_relationships(self) -> None:
255262 associations [name ] = values
256263
257264 for name , values in associations .items ():
258- for value in values :
259- self .assign_association_relationship (
260- value , obj , name , "association"
261- )
265+ if name not in processed_attrs :
266+ for value in values :
267+ self .assign_association_relationship (
268+ value , obj , name , "association"
269+ )
262270
263271 def assign_association_relationship (
264272 self , value : astroid .NodeNG , obj : ClassEntity , name : str , type_relationship : str
0 commit comments