Skip to content

Commit 93f361e

Browse files
authored
fix: Fix serialization of typing.Any when using serialize_type utility (#8853)
* Fix issue and expand tests * Add reno
1 parent 2ca32ff commit 93f361e

File tree

3 files changed

+70
-7
lines changed

3 files changed

+70
-7
lines changed

haystack/utils/type_serialization.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def serialize_type(target: Any) -> str:
3535
return target
3636

3737
# Determine if the target is a type or an instance of a typing object
38-
is_type_or_typing = isinstance(target, type) or bool(get_origin(target))
38+
is_type_or_typing = isinstance(target, type) or bool(get_origin(target)) or target == Any
3939
type_obj = target if is_type_or_typing else type(target)
4040
type_obj_repr = repr(type_obj)
4141

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
fixes:
3+
- |
4+
Fixes serialization of typing.Any when using serialize_type utility

test/utils/test_type_serialization.py

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
# SPDX-FileCopyrightText: 2022-present deepset GmbH <[email protected]>
22
#
33
# SPDX-License-Identifier: Apache-2.0
4-
import copy
54
import sys
65
import typing
7-
from typing import List, Dict
6+
from typing import Any, List, Dict, Set, Tuple
87

98
import pytest
109

@@ -14,16 +13,59 @@
1413

1514
def test_output_type_serialization():
1615
assert serialize_type(str) == "str"
16+
assert serialize_type(int) == "int"
17+
assert serialize_type(dict) == "dict"
18+
assert serialize_type(float) == "float"
19+
assert serialize_type(bool) == "bool"
20+
21+
22+
def test_output_type_serialization_typing():
23+
assert serialize_type(Any) == "typing.Any"
24+
assert serialize_type(List) == "typing.List"
25+
assert serialize_type(Dict) == "typing.Dict"
26+
assert serialize_type(Set) == "typing.Set"
27+
assert serialize_type(Tuple) == "typing.Tuple"
28+
29+
30+
def test_output_type_serialization_typing_and_type():
31+
# List
32+
assert serialize_type(List[str]) == "typing.List[str]"
1733
assert serialize_type(List[int]) == "typing.List[int]"
34+
assert serialize_type(List[dict]) == "typing.List[dict]"
35+
assert serialize_type(List[float]) == "typing.List[float]"
36+
assert serialize_type(List[bool]) == "typing.List[bool]"
37+
# Dict
38+
assert serialize_type(Dict[str, str]) == "typing.Dict[str, str]"
39+
assert serialize_type(Dict[int, int]) == "typing.Dict[int, int]"
40+
assert serialize_type(Dict[dict, dict]) == "typing.Dict[dict, dict]"
41+
assert serialize_type(Dict[float, float]) == "typing.Dict[float, float]"
42+
assert serialize_type(Dict[bool, bool]) == "typing.Dict[bool, bool]"
43+
# Set
44+
assert serialize_type(Set[str]) == "typing.Set[str]"
45+
assert serialize_type(Set[int]) == "typing.Set[int]"
46+
assert serialize_type(Set[dict]) == "typing.Set[dict]"
47+
assert serialize_type(Set[float]) == "typing.Set[float]"
48+
assert serialize_type(Set[bool]) == "typing.Set[bool]"
49+
# Tuple
50+
assert serialize_type(Tuple[str]) == "typing.Tuple[str]"
51+
assert serialize_type(Tuple[int]) == "typing.Tuple[int]"
52+
assert serialize_type(Tuple[dict]) == "typing.Tuple[dict]"
53+
assert serialize_type(Tuple[float]) == "typing.Tuple[float]"
54+
assert serialize_type(Tuple[bool]) == "typing.Tuple[bool]"
55+
56+
57+
def test_output_type_serialization_nested():
1858
assert serialize_type(List[Dict[str, int]]) == "typing.List[typing.Dict[str, int]]"
19-
assert serialize_type(ChatMessage) == "haystack.dataclasses.chat_message.ChatMessage"
2059
assert serialize_type(typing.List[Dict[str, int]]) == "typing.List[typing.Dict[str, int]]"
60+
61+
62+
def test_output_type_serialization_haystack_dataclasses():
63+
assert serialize_type(ChatMessage) == "haystack.dataclasses.chat_message.ChatMessage"
2164
assert serialize_type(List[ChatMessage]) == "typing.List[haystack.dataclasses.chat_message.ChatMessage]"
2265
assert (
2366
serialize_type(typing.Dict[int, ChatMessage])
2467
== "typing.Dict[int, haystack.dataclasses.chat_message.ChatMessage]"
2568
)
26-
assert serialize_type(int) == "int"
2769
assert serialize_type(ChatMessage.from_user("ciao")) == "haystack.dataclasses.chat_message.ChatMessage"
2870

2971

@@ -41,18 +83,35 @@ def test_output_type_serialization_pep585():
4183

4284
def test_output_type_deserialization():
4385
assert deserialize_type("str") == str
86+
assert deserialize_type("int") == int
87+
assert deserialize_type("dict") == dict
88+
assert deserialize_type("float") == float
89+
assert deserialize_type("bool") == bool
90+
91+
92+
def test_output_type_deserialization_typing():
93+
assert deserialize_type("typing.Any") == Any
94+
assert deserialize_type("typing.List") == List
95+
assert deserialize_type("typing.Dict") == Dict
96+
assert deserialize_type("typing.Set") == Set
97+
assert deserialize_type("typing.Tuple") == Tuple
98+
99+
100+
def test_output_type_deserialization_typing_and_type():
44101
assert deserialize_type("typing.List[int]") == typing.List[int]
45-
assert deserialize_type("typing.List[typing.Dict[str, int]]") == typing.List[Dict[str, int]]
46102
assert deserialize_type("typing.Dict[str, int]") == Dict[str, int]
103+
assert deserialize_type("typing.List[typing.Dict[str, int]]") == typing.List[Dict[str, int]]
47104
assert deserialize_type("typing.Dict[str, typing.List[int]]") == Dict[str, List[int]]
48105
assert deserialize_type("typing.List[typing.Dict[str, typing.List[int]]]") == List[Dict[str, List[int]]]
106+
107+
108+
def test_output_type_deserialization_haystack_dataclasses():
49109
assert deserialize_type("typing.List[haystack.dataclasses.chat_message.ChatMessage]") == typing.List[ChatMessage]
50110
assert (
51111
deserialize_type("typing.Dict[int, haystack.dataclasses.chat_message.ChatMessage]")
52112
== typing.Dict[int, ChatMessage]
53113
)
54114
assert deserialize_type("haystack.dataclasses.chat_message.ChatMessage") == ChatMessage
55-
assert deserialize_type("int") == int
56115

57116

58117
def test_output_type_deserialization_pep585():

0 commit comments

Comments
 (0)