3333import temporalio .converter
3434from temporalio .api .common .v1 import Payload as AnotherNameForPayload
3535
36+ # StrEnum is available in 3.11+
37+ if sys .version_info >= (3 , 11 ):
38+ from enum import StrEnum
39+
3640
3741class NonSerializableClass :
3842 pass
@@ -46,6 +50,12 @@ class SerializableEnum(IntEnum):
4650 FOO = 1
4751
4852
53+ if sys .version_info >= (3 , 11 ):
54+
55+ class SerializableStrEnum (StrEnum ):
56+ FOO = "foo"
57+
58+
4959@dataclass
5060class MyDataClass :
5161 foo : str
@@ -107,8 +117,8 @@ async def assert_payload(
107117 await assert_payload (NonSerializableClass (), None , None )
108118 assert "not JSON serializable" in str (excinfo .value )
109119
110- # Bad enum type. We do not allow non-int enums due to ambiguity in
111- # rebuilding and other confusion.
120+ # Bad enum type. We do not allow non-int or non-str enums due to ambiguity
121+ # in rebuilding and other confusion.
112122 with pytest .raises (TypeError ) as excinfo :
113123 await assert_payload (NonSerializableEnum .FOO , None , None )
114124 assert "not JSON serializable" in str (excinfo .value )
@@ -295,6 +305,15 @@ def fail(hint: Type, value: Any) -> None:
295305 ok (SerializableEnum , SerializableEnum .FOO )
296306 ok (List [SerializableEnum ], [SerializableEnum .FOO , SerializableEnum .FOO ])
297307
308+ # StrEnum is available in 3.11+
309+ if sys .version_info >= (3 , 11 ):
310+ # StrEnum
311+ ok (SerializableStrEnum , SerializableStrEnum .FOO )
312+ ok (
313+ List [SerializableStrEnum ],
314+ [SerializableStrEnum .FOO , SerializableStrEnum .FOO ],
315+ )
316+
298317 # 3.10+ checks
299318 if sys .version_info >= (3 , 10 ):
300319 ok (list [int ], [1 , 2 ])
0 commit comments