1
1
import logging
2
2
from typing import Any , Callable , Dict , Optional
3
3
4
- from pydantic import BaseModel , ValidationError
5
-
6
4
from ...middleware_factory import lambda_handler_decorator
7
5
from ..typing import LambdaContext
8
- from .envelopes .base import BaseEnvelope
9
- from .exceptions import InvalidEnvelopeError , InvalidModelTypeError , ModelValidationError
6
+ from .envelopes .base import Envelope
7
+ from .exceptions import InvalidEnvelopeError , InvalidModelTypeError
8
+ from .types import Model
10
9
11
10
logger = logging .getLogger (__name__ )
12
11
13
12
14
13
@lambda_handler_decorator
15
14
def event_parser (
16
- handler : Callable [[Dict , Any ], Any ],
15
+ handler : Callable [[Any , LambdaContext ], Any ],
17
16
event : Dict [str , Any ],
18
17
context : LambdaContext ,
19
- model : BaseModel ,
20
- envelope : Optional [BaseEnvelope ] = None ,
18
+ model : Model ,
19
+ envelope : Optional [Envelope ] = None ,
21
20
) -> Any :
22
21
"""Lambda handler decorator to parse & validate events using Pydantic models
23
22
@@ -65,14 +64,14 @@ def handler(event: Order, context: LambdaContext):
65
64
Lambda event to be parsed & validated
66
65
context: LambdaContext
67
66
Lambda context object
68
- model: BaseModel
67
+ model: Model
69
68
Your data model that will replace the event.
70
- envelope: BaseEnvelope
69
+ envelope: Envelope
71
70
Optional envelope to extract the model from
72
71
73
72
Raises
74
73
------
75
- ModelValidationError
74
+ ValidationError
76
75
When input event does not conform with model provided
77
76
InvalidModelTypeError
78
77
When model given does not implement BaseModel
@@ -84,7 +83,7 @@ def handler(event: Order, context: LambdaContext):
84
83
return handler (parsed_event , context )
85
84
86
85
87
- def parse (event : Dict [str , Any ], model : BaseModel , envelope : Optional [BaseEnvelope ] = None ) -> Any :
86
+ def parse (event : Dict [str , Any ], model : Model , envelope : Optional [Envelope ] = None ) -> Model :
88
87
"""Standalone function to parse & validate events using Pydantic models
89
88
90
89
Typically used when you need fine-grained control over error handling compared to event_parser decorator.
@@ -94,7 +93,7 @@ def parse(event: Dict[str, Any], model: BaseModel, envelope: Optional[BaseEnvelo
94
93
95
94
**Lambda handler decorator to parse & validate event**
96
95
97
- from aws_lambda_powertools.utilities.parser.exceptions import ModelValidationError
96
+ from aws_lambda_powertools.utilities.parser import ValidationError
98
97
99
98
class Order(BaseModel):
100
99
id: int
@@ -104,7 +103,7 @@ class Order(BaseModel):
104
103
def handler(event: Order, context: LambdaContext):
105
104
try:
106
105
parse(model=Order)
107
- except ModelValidationError :
106
+ except ValidationError :
108
107
...
109
108
110
109
**Lambda handler decorator to parse & validate event - using built-in envelope**
@@ -117,21 +116,21 @@ class Order(BaseModel):
117
116
def handler(event: Order, context: LambdaContext):
118
117
try:
119
118
parse(model=Order, envelope=envelopes.EVENTBRIDGE)
120
- except ModelValidationError :
119
+ except ValidationError :
121
120
...
122
121
123
122
Parameters
124
123
----------
125
124
event: Dict
126
125
Lambda event to be parsed & validated
127
- model: BaseModel
126
+ model: Model
128
127
Your data model that will replace the event
129
- envelope: BaseEnvelope
128
+ envelope: Envelope
130
129
Optional envelope to extract the model from
131
130
132
131
Raises
133
132
------
134
- ModelValidationError
133
+ ValidationError
135
134
When input event does not conform with model provided
136
135
InvalidModelTypeError
137
136
When model given does not implement BaseModel
@@ -144,13 +143,12 @@ def handler(event: Order, context: LambdaContext):
144
143
return envelope ().parse (data = event , model = model )
145
144
except AttributeError :
146
145
raise InvalidEnvelopeError (f"Envelope must implement BaseEnvelope, envelope={ envelope } " )
147
- except (ValidationError , TypeError ) as e :
148
- raise ModelValidationError (f"Input event does not conform with model, envelope={ envelope } " ) from e
149
146
150
147
try :
151
148
logger .debug ("Parsing and validating event model; no envelope used" )
149
+ if isinstance (event , str ):
150
+ return model .parse_raw (event )
151
+
152
152
return model .parse_obj (event )
153
- except (ValidationError , TypeError ) as e :
154
- raise ModelValidationError ("Input event does not conform with model" ) from e
155
153
except AttributeError :
156
- raise InvalidModelTypeError ("Input model must implement BaseModel" )
154
+ raise InvalidModelTypeError (f "Input model must implement BaseModel, model= { model } " )
0 commit comments