33import sys
44from dataclasses import dataclass , field
55from datetime import date , datetime
6+ from enum import Enum
67from typing import Any , Dict , Generator , List , Mapping , Optional , Type , TypedDict , Union , cast
78from uuid import uuid4
89
@@ -102,6 +103,17 @@ class NestedItem:
102103 timestamp : datetime = field (default_factory = datetime .utcnow )
103104
104105
106+ class SomeEnum (str , Enum ):
107+ FIELD_ONE = "one"
108+ FIELD_TWO = "two"
109+
110+
111+ @dataclass
112+ class NestedModelWithEnum :
113+ some_enum : SomeEnum
114+ some_str : str
115+
116+
105117@dataclass
106118class MyDerivedModel (MyBaseModel ):
107119 id : str
@@ -121,6 +133,10 @@ class MyDerivedModel(MyBaseModel):
121133 union_date : Union [datetime , None ] = field (default_factory = datetime .utcnow )
122134 bytes_type : Union [bytes , None ] = None
123135 bytearray_type : Union [bytearray , None ] = None
136+ some_enum : SomeEnum = SomeEnum .FIELD_ONE
137+ nested_enum : NestedModelWithEnum = field (
138+ default_factory = lambda : NestedModelWithEnum (some_str = "string" , some_enum = SomeEnum .FIELD_TWO )
139+ )
124140
125141 def get_key (self ) -> _MyModelKey :
126142 return _MyModelKey (my_pk = f"AA#{ self .id } " , my_sk = self .sk_field or "#" )
@@ -489,6 +505,11 @@ async def test_serialize_deserialize_model(store: MyModelStore):
489505 assert isinstance (serialized ["nested_item" ], dict )
490506 assert serialized ["nested_item" ]["event" ] == "created"
491507
508+ assert isinstance (serialized ["some_enum" ], str )
509+ assert serialized ["some_enum" ] == "one"
510+ assert isinstance (serialized ["nested_enum" ], dict )
511+ assert serialized ["nested_enum" ]["some_enum" ] == "two"
512+
492513 assert model .none_string is None
493514 assert "none_thing" not in serialized
494515 assert model .none_list is None
@@ -505,6 +526,25 @@ async def test_serialize_deserialize_model(store: MyModelStore):
505526 assert deserialized .nested_item .event == "created"
506527 assert deserialized .last_modified == model .last_modified
507528 assert deserialized .today == model .today
529+ assert isinstance (deserialized .some_enum , SomeEnum )
530+ assert deserialized .some_enum == SomeEnum .FIELD_ONE
531+ assert isinstance (deserialized .nested_enum , NestedModelWithEnum )
532+ assert isinstance (deserialized .nested_enum .some_enum , SomeEnum )
533+ assert deserialized .nested_enum .some_enum == SomeEnum .FIELD_TWO
534+
535+
536+ async def test_nested_enum_using_deserialise_model_function ():
537+ enum_test_dict = {
538+ "some_str" : "test string" ,
539+ "some_enum" : "two" ,
540+ }
541+
542+ deserialised_model = BaseModelStore .deserialise_model (enum_test_dict , NestedModelWithEnum ) # type: ignore[type-var]
543+
544+ assert isinstance (deserialised_model , NestedModelWithEnum )
545+ assert isinstance (deserialised_model .some_enum , SomeEnum )
546+ assert deserialised_model .some_enum == SomeEnum .FIELD_TWO
547+ assert deserialised_model .some_str == "test string"
508548
509549
510550async def test_transact_get_put_model (store : MyModelStore ):
0 commit comments