From 82f7ee6f0ad4ea4021705dbe3d3666482a5feec1 Mon Sep 17 00:00:00 2001 From: izzy lyseggen Date: Tue, 26 Jan 2021 10:04:00 +0000 Subject: [PATCH] test(objects&serialisation): new base features --- speckle/objects/fakemesh.py | 14 ++++++++++++++ speckle/objects/point.py | 25 +++++++++++++++++++++++++ tests/conftest.py | 6 +++++- tests/test_objects.py | 8 +++----- tests/test_serialization.py | 25 +++++++++++++++++++++++-- 5 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 speckle/objects/point.py diff --git a/speckle/objects/fakemesh.py b/speckle/objects/fakemesh.py index 991c4d9..96458ca 100644 --- a/speckle/objects/fakemesh.py +++ b/speckle/objects/fakemesh.py @@ -1,3 +1,4 @@ +from speckle.objects.point import Point from typing import List, Optional from .base import Base @@ -10,6 +11,8 @@ CHUNKABLE_PROPS = { "test_bases": 10, } +DETACHABLE = ["detach_this", "origin"] + class FakeMesh(Base): vertices: List[float] = None @@ -17,7 +20,18 @@ class FakeMesh(Base): colors: List[int] = None textureCoordinates: List[float] = None test_bases: List[Base] = None + detach_this: Base = None + _origin: Point = None def __init__(self, **kwargs) -> None: super().__init__(**kwargs) self._chunkable.update(CHUNKABLE_PROPS) + self._detachable.extend(DETACHABLE) + + @property + def origin(self): + return self._origin + + @origin.setter + def origin(self, value: Point): + self._origin = value \ No newline at end of file diff --git a/speckle/objects/point.py b/speckle/objects/point.py new file mode 100644 index 0000000..ea3994e --- /dev/null +++ b/speckle/objects/point.py @@ -0,0 +1,25 @@ +from typing import List +from pydantic import BaseModel +from speckle.objects.base import Base + + +class Point(Base): + value: List[float] = [0, 0, 0] + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(value: {self.value}, id: {self.id}, speckle_type: {self.speckle_type})" + + def __str__(self) -> str: + return self.__repr__() + + @property + def x(self): + return self.value[0] + + @property + def y(self): + return self.value[1] + + @property + def z(self): + return self.value[2] diff --git a/tests/conftest.py b/tests/conftest.py index 43e2f7c..3afed23 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,6 +5,7 @@ import requests from speckle.api.models import Stream from speckle.api.client import SpeckleClient from speckle.objects.base import Base +from speckle.objects.point import Point from speckle.objects.fakemesh import FakeMesh @@ -79,8 +80,10 @@ def mesh(): mesh.faces = [i for i in range(1, 210)] mesh["@(100)colours"] = [random.uniform(0, 10) for _ in range(1, 210)] mesh["@()default_chunk"] = [random.uniform(0, 10) for _ in range(1, 210)] - mesh.test_bases = [Base(name=i) for i in range(1, 22)] + 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.origin = Point(value=[4, 2, 0]) return mesh @@ -88,6 +91,7 @@ def mesh(): def base(): base = Base() base.name = "my_base" + base.units = "millimetres" base.vertices = [random.uniform(0, 10) for _ in range(1, 120)] base.test_bases = [Base(name=i) for i in range(1, 22)] base["@detach"] = Base(name="detached base") diff --git a/tests/test_objects.py b/tests/test_objects.py index 3d6774b..61e096b 100644 --- a/tests/test_objects.py +++ b/tests/test_objects.py @@ -32,10 +32,8 @@ class TestObject: fetched_base = client.object.get( stream_id=stream.id, object_id=base.get_id(True) ) - print(base.name) - print(fetched_base.__dict__) assert isinstance(fetched_base, Base) - assert fetched_base.data["name"] == base["name"] - assert "vertices" in fetched_base.data - assert "@detach" in fetched_base.data + assert fetched_base.name == base.name + assert isinstance(fetched_base.vertices, list) + assert fetched_base["@detach"]["speckle_type"] == "reference" diff --git a/tests/test_serialization.py b/tests/test_serialization.py index 0ca8509..c9b5881 100644 --- a/tests/test_serialization.py +++ b/tests/test_serialization.py @@ -1,10 +1,12 @@ import json -from speckle.objects.base import Base import pytest from speckle.api import operations from speckle.transports.server import ServerTransport from speckle.transports.memory import MemoryTransport from speckle.serialization.base_object_serializer import BaseObjectSerializer +from speckle.objects.base import Base +from speckle.objects.point import Point +from speckle.objects.fakemesh import FakeMesh @pytest.mark.run(order=3) @@ -14,6 +16,22 @@ class TestSerialization: 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_detaching(self, mesh): + transport = MemoryTransport() + s = BaseObjectSerializer(write_transports=[transport], read_transport=transport) + _, serialized = s.write_json(mesh) + deserialized = s.read_json(serialized) + + serialized_dict = json.loads(serialized) + + assert serialized_dict["detach_this"]["speckle_type"] == "reference" + assert serialized_dict["@detach"]["speckle_type"] == "reference" + assert serialized_dict["origin"]["speckle_type"] == "reference" + assert mesh.get_id(True) == deserialized.get_id() def test_chunking(self, mesh): transport = MemoryTransport() @@ -39,7 +57,10 @@ class TestSerialization: hash, remote_transport=transport, local_transport=MemoryTransport() ) - assert isinstance(received, Base) + assert isinstance(received, FakeMesh) + assert received.vertices == mesh.vertices + assert isinstance(received.origin, Point) + assert received.origin.value == mesh.origin.value assert mesh.get_id(True) == received.get_id() mesh.id = hash # populate with decomposed id for use in proceeding tests