From da6f429f5513a45130533d11c1b08e931b931718 Mon Sep 17 00:00:00 2001
From: "Hock, Martin" <martin.hock@fst.tu-darmstadt.de>
Date: Mon, 6 Mar 2023 10:28:45 +0100
Subject: [PATCH] Adjust dict and key/value pair assignments to use deepcopy in
 constructor and clone()

---
 functions/classes.py | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/functions/classes.py b/functions/classes.py
index 014ec6e..5a14dc8 100644
--- a/functions/classes.py
+++ b/functions/classes.py
@@ -8,6 +8,7 @@ import json
 import operator
 from enum import Enum, auto
 from typing import List, Dict, Optional
+from copy import deepcopy
 
 
 class AggregationLayer(Enum):
@@ -83,14 +84,14 @@ class LegoComponent:
         if label is not None:
             self.properties["label"] = label
         if datasheet is not None:
-            self.properties.update(datasheet)
+            self.properties.update(deepcopy(datasheet))
         for prop in more_properties:
             if isinstance(prop, dict):
-                self.properties.update(prop)
+                self.properties.update(deepcopy(prop))
             else:
                 raise ValueError(f"Unexpected argument type: {type(more_properties)}")
         for key, value in kwargs.items():
-            self.properties[key] = value
+            self.properties[key] = deepcopy(value)
 
     def clone(self, new_label: Optional[str] = None) -> LegoComponent:
         """
@@ -113,7 +114,7 @@ class LegoComponent:
         """
         if new_label is None:
             new_label = self.properties["label"]
-        clone = LegoComponent(None, None, self.properties)
+        clone = LegoComponent(None, None, deepcopy(self.properties))
         clone.properties["label"] = new_label
         return clone
 
@@ -207,11 +208,11 @@ class LegoAssembly:
             self.properties["label"] = label
         for prop in properties:
             if isinstance(prop, dict):
-                self.properties.update(prop)
+                self.properties.update(deepcopy(prop))
             else:
                 raise ValueError(f"Unexpected argument type: {type(properties)}")
         for key, value in kwargs.items():
-            self.properties[key] = value
+            self.properties[key] = deepcopy(value)
         self.components: List[LegoComponent] = []
         self.assemblies: List[LegoAssembly] = []
 
@@ -419,7 +420,7 @@ class LegoAssembly:
         """
         if label is None:
             label = self.properties["label"]
-        clone = LegoAssembly(self.layer, None, self.properties)
+        clone = LegoAssembly(self.layer, None, deepcopy(self.properties))
         clone.properties["label"] = label
         for component in self.components:
             clone.add_component(component.clone())
-- 
GitLab