diff --git a/speckle/objects/base.py b/speckle/objects/base.py index 64f107d..dc65e15 100644 --- a/speckle/objects/base.py +++ b/speckle/objects/base.py @@ -30,11 +30,12 @@ class _RegisteringBase(BaseModel): **kwargs: Dict[str, Any], ): # this requires some validation, there is nothing blocking identical keys... - # if speckle_type in cls._type_registry: - # raise ValueError( - # f"The speckle_type: {speckle_type} is already registered. " - # f"Please choose a different type name." - # ) + if speckle_type in cls._type_registry: + raise ValueError( + f"The speckle_type: {speckle_type} is already registered for type: " + f"{cls._type_registry[speckle_type].__name__}. " + f"Please choose a different type name." + ) cls.speckle_type = speckle_type or cls.__name__ cls._type_registry[cls.speckle_type] = cls # type: ignore super().__init_subclass__(**kwargs) @@ -49,9 +50,20 @@ class Base(_RegisteringBase): _chunk_size_default: int = 1000 _detachable: List[str] = [] # list of defined detachable props - def __init__(self, **kwargs: Dict[str, Any]) -> None: - super().__init__() - self.__dict__.update(kwargs) + # def __init__(self, **kwargs: Dict[str, Any]) -> None: + # super().__init__(**kwargs) + + # """ + # based on my testing, the __dict__ update is not required, + # even works with extra init arguments, that are not part of the basic object + # definition. It is even possible, that the custom __init__ definition could go + # away all together + + # >>> base = Base(foo="bar") + # >>> base.foo + # "bar" + # """ + # # self.__dict__.update(kwargs) def __repr__(self) -> str: return ( diff --git a/tests/test_base.py b/tests/test_base.py index 93e9686..2c7cece 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -37,5 +37,9 @@ def test_fake_base_serialization() -> None: deserialized = operations.deserialize(serialized) assert fake_model.get_id() == deserialized.get_id() - # assert isinstance(base.test_bases[0], Base) - # assert base["@detach"].name == deserialized["@detach"].name \ No newline at end of file + + +def test_duplicate_speckle_type_raises_error(): + with pytest.raises(ValueError): + class NaughtyClass(Base, speckle_type="Base"): + """This class has a speckle_type that is already taken.""" \ No newline at end of file