Merge pull request #69 from specklesystems/izzy/detached-lists

fix(serializer): detached lists
This commit is contained in:
izzy lyseggen
2021-03-18 11:09:47 +00:00
committed by GitHub
3 changed files with 20 additions and 11 deletions
@@ -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():
+6
View File
@@ -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
+1 -9
View File
@@ -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)