@@ -226,6 +226,7 @@ def extract_relationships(self) -> None:
226
226
obj .attrs = self .get_attrs (node )
227
227
obj .methods = self .get_methods (node )
228
228
obj .shape = "class"
229
+
229
230
# inheritance link
230
231
for par_node in node .ancestors (recurs = False ):
231
232
try :
@@ -234,19 +235,25 @@ def extract_relationships(self) -> None:
234
235
except KeyError :
235
236
continue
236
237
238
+ # Track processed attributes to avoid duplicates
239
+ processed_attrs = set ()
240
+
237
241
# Composition links
238
242
for name , values in list (node .compositions_type .items ()):
239
243
for value in values :
240
244
self .assign_association_relationship (
241
245
value , obj , name , "composition"
242
246
)
247
+ processed_attrs .add (name )
243
248
244
249
# Aggregation links
245
250
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 )
250
257
251
258
# Association links
252
259
associations = node .associations_type .copy ()
@@ -255,10 +262,11 @@ def extract_relationships(self) -> None:
255
262
associations [name ] = values
256
263
257
264
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
+ )
262
270
263
271
def assign_association_relationship (
264
272
self , value : astroid .NodeNG , obj : ClassEntity , name : str , type_relationship : str
0 commit comments