Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion haystack/utils/base_serialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
14 changes: 14 additions & 0 deletions test/utils/test_base_serialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down