test(objects&serialisation): new base features
This commit is contained in:
@@ -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
|
||||
@@ -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]
|
||||
+5
-1
@@ -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")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user