diff --git a/labtech/serialization.py b/labtech/serialization.py index bdb94bd..ee8742d 100644 --- a/labtech/serialization.py +++ b/labtech/serialization.py @@ -122,6 +122,16 @@ def deserialize_enum(self, serialized: dict[str, jsonable]) -> Enum: return enum_cls[name] def serialize_class(self, cls: type) -> jsonable: + if '' in cls.__qualname__: + raise SerializationError( + (f'Unable to serialize class "{cls.__qualname__}" because it was defined in a function. ' + 'Please ensure all task and parameter classes are defined at the top-level of a module.') + ) + + if '>' in cls.__qualname__: + # This should never happen, but is here for safety. + raise SerializationError('Unexpected ">" in class __qualname__') + # Handle nested classes by splitting class nesting path by ">". return f'{cls.__module__}.{cls.__qualname__.replace(".", ">")}' diff --git a/tests/labtech/test_serialization.py b/tests/labtech/test_serialization.py new file mode 100644 index 0000000..3030add --- /dev/null +++ b/tests/labtech/test_serialization.py @@ -0,0 +1,18 @@ +import pytest + +from labtech.exceptions import SerializationError +from labtech.serialization import Serializer + + +class TestSerializer: + + class TestSerializeClass: + + def test_local_object(self): + + class Example: + pass + + serializer = Serializer() + with pytest.raises(SerializationError, match=f'Unable to serialize class "{Example.__qualname__}" because it was defined in a function.'): + serializer.serialize_class(Example)