diff --git a/python_modules/dagster/dagster/_serdes/serdes.py b/python_modules/dagster/dagster/_serdes/serdes.py index 9822d2a8f28f3..90e886588fcb5 100644 --- a/python_modules/dagster/dagster/_serdes/serdes.py +++ b/python_modules/dagster/dagster/_serdes/serdes.py @@ -829,10 +829,13 @@ def _pack_value( if isinstance(val, Enum): klass_name = val.__class__.__name__ if not whitelist_map.has_enum_entry(klass_name): + if isinstance(val, str): # serialize StrEnums in their string value + return val.value raise SerializationError( "Can only serialize whitelisted Enums, received" f" {klass_name}.\nDescent path: {descent_path}", ) + enum_serializer = whitelist_map.get_enum_entry(klass_name) return {"__enum__": enum_serializer.pack(val, whitelist_map, descent_path)} if ( diff --git a/python_modules/dagster/dagster_tests/general_tests/test_serdes.py b/python_modules/dagster/dagster_tests/general_tests/test_serdes.py index 289936ade559c..dafcb4c982025 100644 --- a/python_modules/dagster/dagster_tests/general_tests/test_serdes.py +++ b/python_modules/dagster/dagster_tests/general_tests/test_serdes.py @@ -2,9 +2,9 @@ import re import string from collections import namedtuple -from enum import Enum +from enum import Enum, auto from typing import AbstractSet, Any, Dict, List, Mapping, NamedTuple, Optional, Sequence - +from strenum import LowercaseStrEnum import pydantic import pytest from dagster._check import ParameterCheckError, inst_param, set_param @@ -180,6 +180,19 @@ class Corge(Enum): assert deserialized == Corge.FOO_FOO + +def test_str_enum_serialization_deserialisation(): + """ + Checks that (de)serializing an StrEnum from the strenum lib does not produces any error and returns the string value of the enum + """ + class MyStrEnum(LowercaseStrEnum): + ONE_STR_ENUM = auto() + + enum_val = MyStrEnum.ONE_STR_ENUM + serialized_value = serialize_value(val=enum_val) + assert serialized_value == f'"{enum_val.value}"' + assert deserialize_value(serialized_value) == enum_val.value + def test_backward_compat_serdes(): test_map = WhitelistMap.create() diff --git a/python_modules/dagster/setup.py b/python_modules/dagster/setup.py index 5c27de9dd5b4d..fa3ccc4445b07 100644 --- a/python_modules/dagster/setup.py +++ b/python_modules/dagster/setup.py @@ -129,6 +129,7 @@ def get_version() -> str: "syrupy<4", # 3.7 compatible, "tox==3.25.0", "morefs[asynclocal]; python_version>='3.8'", + "strenum", ], "mypy": [ "mypy==0.991",