Skip to content

Commit

Permalink
EnumValue: serialize choices with inner field
Browse files Browse the repository at this point in the history
  • Loading branch information
lafrech committed Aug 25, 2022
1 parent a503d78 commit 7cc1de4
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 11 deletions.
6 changes: 4 additions & 2 deletions src/marshmallow/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -1905,15 +1905,17 @@ class EnumValue(Field):

def __init__(self, cls_or_instance: Field | type, enum: type[Enum], **kwargs):
super().__init__(**kwargs)
self.enum = enum
self.choices = ", ".join([str(m.value) for m in enum])
try:
self.field = resolve_field_instance(cls_or_instance)
except FieldInstanceResolutionError as error:
raise ValueError(
"The enum field must be a subclass or instance of "
"marshmallow.base.FieldABC."
) from error
self.enum = enum
self.choices = ", ".join(
[str(self.field._serialize(m.value, None, None)) for m in enum]
)

def _serialize(self, value, attr, obj, **kwargs):
if value is None:
Expand Down
14 changes: 7 additions & 7 deletions tests/test_deserialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -1118,8 +1118,8 @@ def test_enumvalue_field_deserialization(self):
assert field.deserialize("black hair") == HairColorEnum.black
field = fields.EnumValue(fields.Integer, GenderEnum)
assert field.deserialize(1) == GenderEnum.male
field = fields.EnumValue(fields.Date, DateEnum)
assert field.deserialize("2004-02-29") == DateEnum.date_1
field = fields.EnumValue(fields.Date(format="%d/%m/%Y"), DateEnum)
assert field.deserialize("29/02/2004") == DateEnum.date_1

def test_enumvalue_field_invalid_value(self):
field = fields.EnumValue(fields.String, HairColorEnum)
Expand All @@ -1131,11 +1131,11 @@ def test_enumvalue_field_invalid_value(self):
field = fields.EnumValue(fields.Integer, GenderEnum)
with pytest.raises(ValidationError, match="Must be one of: 1, 2, 3."):
field.deserialize(12)
field = fields.EnumValue(fields.Date, DateEnum)
field = fields.EnumValue(fields.Date(format="%d/%m/%Y"), DateEnum)
with pytest.raises(
ValidationError, match="Must be one of: 2004-02-29, 2008-02-29, 2012-02-29."
ValidationError, match="Must be one of: 29/02/2004, 29/02/2008, 29/02/2012."
):
field.deserialize("2004-02-28")
field.deserialize("28/02/2004")

def test_enumvalue_field_wrong_type(self):
field = fields.EnumValue(fields.String, HairColorEnum)
Expand All @@ -1144,9 +1144,9 @@ def test_enumvalue_field_wrong_type(self):
field = fields.EnumValue(fields.Integer, GenderEnum)
with pytest.raises(ValidationError, match="Not a valid integer."):
field.deserialize("dummy")
field = fields.EnumValue(fields.Date, DateEnum)
field = fields.EnumValue(fields.Date(format="%d/%m/%Y"), DateEnum)
with pytest.raises(ValidationError, match="Not a valid date."):
field.deserialize("2004-02-30")
field.deserialize("30/02/2004")

def test_deserialization_function_must_be_callable(self):
with pytest.raises(TypeError):
Expand Down
4 changes: 2 additions & 2 deletions tests/test_serialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,8 +268,8 @@ def test_enumvalue_field_serialization(self, user):
field = fields.EnumValue(fields.Integer, GenderEnum)
assert field.serialize("sex", user) == 1
user.some_date = DateEnum.date_1
field = fields.EnumValue(fields.Date, DateEnum)
assert field.serialize("some_date", user) == "2004-02-29"
field = fields.EnumValue(fields.Date(format="%d/%m/%Y"), DateEnum)
assert field.serialize("some_date", user) == "29/02/2004"

def test_decimal_field(self, user):
user.m1 = 12
Expand Down

0 comments on commit 7cc1de4

Please sign in to comment.