Merge pull request #69 from specklesystems/izzy/detached-lists
fix(serializer): detached lists
This commit is contained in:
@@ -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():
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user