diff --git a/speckle/serialization/base_object_serializer.py b/speckle/serialization/base_object_serializer.py index a8399c1..d54dbc2 100644 --- a/speckle/serialization/base_object_serializer.py +++ b/speckle/serialization/base_object_serializer.py @@ -111,7 +111,7 @@ class BaseObjectSerializer: # 4. handle all other cases else: - child_obj = self.traverse_value(value) + child_obj = self.traverse_value(value, detach) object_builder[prop] = child_obj hash = hash_obj(object_builder) @@ -148,7 +148,18 @@ class BaseObjectSerializer: return obj elif isinstance(obj, (list, tuple, set)): - return [self.traverse_value(o) for o in obj] + if not detach: + return [self.traverse_value(o) for o in obj] + + detached_list = [] + for o in obj: + if isinstance(o, Base): + self.detach_lineage.append(detach) + hash, _ = self.traverse_base(o) + detached_list.append(self.detach_helper(ref_hash=hash)) + else: + detached_list.append(self.traverse_value(o, detach)) + return detached_list elif isinstance(obj, dict): for k, v in obj.items(): diff --git a/tests/conftest.py b/tests/conftest.py index 8616aee..2af4225 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -83,6 +83,12 @@ def mesh(): mesh.test_bases = [Base(name=f"test {i}") for i in range(1, 22)] mesh.detach_this = Base(name="predefined detached base") mesh["@detach"] = Base(name="detached base") + mesh["@detached_list"] = [ + 42, + "some text", + [1, 2, 3], + Base(name="detached within a list"), + ] mesh.origin = Point(value=[4, 2, 0]) return mesh diff --git a/tests/test_serialization.py b/tests/test_serialization.py index eedd2b7..307647c 100644 --- a/tests/test_serialization.py +++ b/tests/test_serialization.py @@ -31,6 +31,7 @@ class TestSerialization: assert serialized_dict["detach_this"]["speckle_type"] == "reference" assert serialized_dict["@detach"]["speckle_type"] == "reference" assert serialized_dict["origin"]["speckle_type"] == "reference" + assert serialized_dict["@detached_list"][-1]["speckle_type"] == "reference" assert mesh.get_id(True) == deserialized.get_id() def test_chunking(self, mesh): @@ -71,15 +72,6 @@ class TestSerialization: assert isinstance(received, Base) assert mesh.get_id(True) == received.get_id() - def test_serialize(self, base): - serialized = operations.serialize(base) - deserialized = operations.deserialize(serialized) - - assert base.get_id() == deserialized.get_id() - assert base.units == "mm" - assert isinstance(base.test_bases[0], Base) - assert base["@detach"].name == deserialized["@detach"].name - def test_unknown_type(self): unknown = '{"speckle_type": "mysterious.type"}' deserialised = operations.deserialize(unknown)