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") return base
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") base["@revit_thing"] = Base.of_type("SpecialRevitFamily", name="secret tho") return base
def test_invalid_send(): client = SpeckleClient() client.account = Account(token="fake_token") transport = ServerTransport("3073b96e86", client) with pytest.raises(SpeckleException): operations.send(Base(), [transport])
def recompose_base(self, obj: dict) -> Base: """Steps through a base object dictionary and recomposes the base object Arguments: obj {dict} -- the dictionary representation of the object Returns: Base -- the base object with all its children attached """ # make sure an obj was passed and create dict if string was somehow passed if not obj: return if isinstance(obj, str): obj = json.loads(obj) if "speckle_type" in obj and obj["speckle_type"] == "reference": obj = self.get_child(obj=obj) speckle_type = obj.get("speckle_type") # if speckle type is not in the object definition, it is treated as a dict if not speckle_type: return obj # get the registered type from base register. object_type = Base.get_registered_type(speckle_type) # initialise the base object using `speckle_type` fall back to base if needed base = object_type() if object_type else Base(speckle_type=speckle_type) # get total children count if "__closure" in obj: if not self.read_transport: raise SpeckleException( message="Cannot resolve reference - no read transport is defined" ) closure = obj.pop("__closure") base.totalChildrenCount = len(closure) for prop, value in obj.items(): # 1. handle primitives (ints, floats, strings, and bools) if isinstance(value, PRIMITIVES): base.__setattr__(prop, value) continue # 2. handle referenced child objects elif "referencedId" in value: ref_hash = value["referencedId"] ref_obj_str = self.read_transport.get_object(id=ref_hash) if not ref_obj_str: raise SpeckleException( f"Could not find the referenced child object of id `{ref_hash}` in the given read transport: {self.read_transport.name}" ) ref_obj = json.loads(ref_obj_str) base.__setattr__(prop, self.recompose_base(obj=ref_obj)) # 3. handle all other cases (base objects, lists, and dicts) else: base.__setattr__(prop, self.handle_value(value)) return base
def mesh(): mesh = FakeMesh() mesh.name = "my_mesh" mesh.vertices = [random.uniform(0, 10) for _ in range(1, 210)] 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=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(x=4, y=2) return mesh
def test_setting_units(): b = Base(units="foot") assert b.units == "ft" with pytest.raises(SpeckleException): b.units = "big" b.units = None # invalid args are skipped b.units = 7 assert b.units == "ft"
def test_empty_prop_names(invalid_prop_name: str) -> None: base = Base() with pytest.raises(ValueError): base[invalid_prop_name] = "🐛️"