1
1
from datetime import datetime
2
2
from typing import Any , Dict , List , Optional , Type , Union
3
3
4
- from pydantic import BaseModel
4
+ from pydantic import BaseModel , field_validator
5
5
6
6
from aws_lambda_powertools .shared .dynamodb_deserializer import TypeDeserializer
7
7
from aws_lambda_powertools .utilities .parser .types import Literal
8
8
9
+ _DESERIALIZER = TypeDeserializer ()
9
10
10
- class DynamoDBStreamChangedRecordModel (BaseModel ):
11
- _deserializer = TypeDeserializer ()
12
11
12
+ class DynamoDBStreamChangedRecordModel (BaseModel ):
13
13
ApproximateCreationDateTime : Optional [datetime ] = None
14
- Keys : Dict [str , Dict [ str , Any ] ]
14
+ Keys : Dict [str , Any ]
15
15
NewImage : Optional [Union [Dict [str , Any ], Type [BaseModel ], BaseModel ]] = None
16
16
OldImage : Optional [Union [Dict [str , Any ], Type [BaseModel ], BaseModel ]] = None
17
17
SequenceNumber : str
@@ -29,66 +29,9 @@ class DynamoDBStreamChangedRecordModel(BaseModel):
29
29
# raise TypeError("DynamoDB streams model failed validation, missing both new & old stream images") # noqa: ERA001,E501
30
30
# return values # noqa: ERA001
31
31
32
- def __init__ (self , ** data : Any ):
33
- """DynamoDBStreamChangedRecordModel constructor
34
- Parameters
35
- ----------
36
- data: Any
37
- Represents the model data
38
- """
39
- super ().__init__ (** data )
40
- self ._deserializer = TypeDeserializer ()
41
-
42
- def _deserialize_dynamodb_dict (self , key : str ) -> Optional [Dict [str , Any ]]:
43
- """Deserialize DynamoDB records available in `Keys`, `NewImage`, and `OldImage`
44
-
45
- Parameters
46
- ----------
47
- key : str
48
- DynamoDB key (e.g., Keys, NewImage, or OldImage)
49
-
50
- Returns
51
- -------
52
- Optional[Dict[str, Any]]
53
- Deserialized records in Python native types
54
- """
55
- dynamodb_dict = getattr (self , key )
56
- if dynamodb_dict is None :
57
- return None
58
-
59
- return {k : self ._deserializer .deserialize (v ) for k , v in dynamodb_dict .items ()}
60
-
61
- @property
62
- def approximate_creation_date_time (self ) -> Optional [datetime ]:
63
- """The approximate date and time when the stream record was created, in UNIX epoch time format."""
64
- item = self .ApproximateCreationDateTime
65
- return None if item is None else item
66
-
67
- @property
68
- def keys (self ) -> Optional [Dict [str , Any ]]:
69
- """The primary key attribute(s) for the DynamoDB item that was modified."""
70
- return self ._deserialize_dynamodb_dict ("Keys" )
71
-
72
- @property
73
- def new_image (self ) -> Optional [Dict [str , Any ]]:
74
- """The item in the DynamoDB table as it appeared after it was modified."""
75
- return self ._deserialize_dynamodb_dict ("NewImage" )
76
-
77
- @property
78
- def old_image (self ) -> Optional [Dict [str , Any ]]:
79
- """The item in the DynamoDB table as it appeared before it was modified."""
80
- return self ._deserialize_dynamodb_dict ("OldImage" )
81
-
82
- @property
83
- def sequence_number (self ) -> Optional [str ]:
84
- """The sequence number of the stream record."""
85
- return self .SequenceNumber
86
-
87
- @property
88
- def size_bytes (self ) -> Optional [int ]:
89
- """The size of the stream record, in bytes."""
90
- item = self .SizeBytes
91
- return None if item is None else int (item )
32
+ @field_validator ("Keys" , "NewImage" , "OldImage" , mode = "before" )
33
+ def deserialize_field (cls , value ):
34
+ return {k : _DESERIALIZER .deserialize (v ) for k , v in value .items ()}
92
35
93
36
94
37
class UserIdentity (BaseModel ):
0 commit comments