diff --git a/haystack/utils/base_serialization.py b/haystack/utils/base_serialization.py index fe1929e1cd5..83b35689e28 100644 --- a/haystack/utils/base_serialization.py +++ b/haystack/utils/base_serialization.py @@ -269,7 +269,11 @@ def _deserialize_value(value: dict[str, Any]) -> Any: payload = value["data"] # Custom class where value_type is a qualified class name - cls = import_class_by_name(value_type) + # ValueError covers type names without a module prefix, which import_class_by_name cannot split + try: + cls = import_class_by_name(value_type) + except (ImportError, ValueError) as e: + raise DeserializationError(f"Class '{value_type}' not correctly imported") from e # try from_dict (e.g. Haystack dataclasses and Components) if hasattr(cls, "from_dict") and callable(cls.from_dict): diff --git a/releasenotes/notes/fix-deseri-import-class-5d22bc73b2089ecb.yaml b/releasenotes/notes/fix-deseri-import-class-5d22bc73b2089ecb.yaml new file mode 100644 index 00000000000..7f578563ad8 --- /dev/null +++ b/releasenotes/notes/fix-deseri-import-class-5d22bc73b2089ecb.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixed ``_deserialize_value_with_schema`` raising ``ImportError`` instead of ``DeserializationError`` + when a snapshot references a class that can no longer be imported. diff --git a/test/utils/test_base_serialization.py b/test/utils/test_base_serialization.py index e6cbbb99fc8..ffb9fac7abf 100644 --- a/test/utils/test_base_serialization.py +++ b/test/utils/test_base_serialization.py @@ -423,6 +423,20 @@ def test_deserialize_value_with_wrong_value(): ) +def test_deserialize_value_with_schema_class_not_importable(): + with pytest.raises( + DeserializationError, match="Class 'test_base_serialization.NonExistentClass' not correctly imported" + ): + _deserialize_value_with_schema( + {"serialization_schema": {"type": "test_base_serialization.NonExistentClass"}, "serialized_data": {}} + ) + + +def test_deserialize_value_with_schema_class_name_without_module(): + with pytest.raises(DeserializationError, match="Class 'NonExistentClass' not correctly imported"): + _deserialize_value_with_schema({"serialization_schema": {"type": "NonExistentClass"}, "serialized_data": {}}) + + def test_serialize_and_deserialize_pydantic_model(): model_instance = CustomModel(id=1, name="Test") serialized = _serialize_value_with_schema(model_instance)