Skip to content

Commit dc5bcae

Browse files
Changing highlights + import
1 parent 8eeeaae commit dc5bcae

10 files changed

+136
-182
lines changed

docs/utilities/parser.md

Lines changed: 42 additions & 89 deletions
Large diffs are not rendered by default.
Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
import json
2-
from typing import Any, Dict, Optional, TypeVar, Union
3-
from aws_lambda_powertools.utilities.parser import BaseEnvelope, BaseModel
2+
from typing import Any, Dict, Optional, Type, TypeVar, Union
3+
4+
from pydantic import BaseModel
5+
6+
from aws_lambda_powertools.utilities.parser import BaseEnvelope, event_parser
47
from aws_lambda_powertools.utilities.parser.models import EventBridgeModel
5-
from aws_lambda_powertools.utilities.parser import event_parser
68
from aws_lambda_powertools.utilities.typing import LambdaContext
79

810
Model = TypeVar("Model", bound=BaseModel)
911

12+
1013
class EventBridgeEnvelope(BaseEnvelope):
11-
def parse(self, data: Optional[Union[Dict[str, Any], Any]], model: type[Model]) -> Optional[Model]:
14+
def parse(self, data: Optional[Union[Dict[str, Any], Any]], model: Type[Model]) -> Optional[Model]:
1215
if data is None:
1316
return None
1417

15-
parsed_envelope = EventBridgeModel.parse_obj(data)
18+
parsed_envelope = EventBridgeModel.model_validate(data)
1619
return self._parse(data=parsed_envelope.detail, model=model)
1720

21+
1822
class OrderDetail(BaseModel):
1923
order_id: str
2024
amount: float
2125
customer_id: str
2226

27+
2328
@event_parser(model=OrderDetail, envelope=EventBridgeEnvelope)
2429
def lambda_handler(event: OrderDetail, context: LambdaContext):
2530
try:
@@ -32,16 +37,15 @@ def lambda_handler(event: OrderDetail, context: LambdaContext):
3237

3338
return {
3439
"statusCode": 200,
35-
"body": json.dumps({
36-
"message": f"Order {event.order_id} processed successfully",
37-
"order_id": event.order_id,
38-
"amount": event.amount,
39-
"customer_id": event.customer_id
40-
})
40+
"body": json.dumps(
41+
{
42+
"message": f"Order {event.order_id} processed successfully",
43+
"order_id": event.order_id,
44+
"amount": event.amount,
45+
"customer_id": event.customer_id,
46+
},
47+
),
4148
}
4249
except Exception as e:
4350
print(f"Error processing order: {str(e)}")
44-
return {
45-
"statusCode": 500,
46-
"body": json.dumps({"error": "Internal server error"})
47-
}
51+
return {"statusCode": 500, "body": json.dumps({"error": "Internal server error"})}
Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
1-
from aws_lambda_powertools.utilities.parser import BaseModel, parse, Field, ValidationError
1+
from pydantic import Field, ValidationError
2+
3+
from aws_lambda_powertools.utilities.parser import parse
24
from aws_lambda_powertools.utilities.parser.models import EventBridgeModel
35

6+
47
# Define a custom EventBridge model by extending the built-in EventBridgeModel
58
class MyCustomEventBridgeModel(EventBridgeModel):
69
detail_type: str = Field(alias="detail-type")
710
source: str
811
detail: dict
912

13+
1014
def lambda_handler(event: dict, context):
1115
try:
1216
# Manually parse the incoming event into the custom model
1317
parsed_event: MyCustomEventBridgeModel = parse(model=MyCustomEventBridgeModel, event=event)
1418

15-
return {
16-
"statusCode": 200,
17-
"body": f"Event from {parsed_event.source}, type: {parsed_event.detail_type}"
18-
}
19+
return {"statusCode": 200, "body": f"Event from {parsed_event.source}, type: {parsed_event.detail_type}"}
1920
except ValidationError as e:
20-
return {
21-
"statusCode": 400,
22-
"body": f"Validation error: {str(e)}"
23-
}
21+
return {"statusCode": 400, "body": f"Validation error: {str(e)}"}
Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
1-
from aws_lambda_powertools.utilities.parser import event_parser, BaseModel
2-
from aws_lambda_powertools.utilities.parser import envelopes
1+
from pydantic import BaseModel
2+
3+
from aws_lambda_powertools.utilities.parser import envelopes, event_parser
34
from aws_lambda_powertools.utilities.typing import LambdaContext
45

6+
57
class UserModel(BaseModel):
6-
username: str
7-
parentid_1: str
8-
parentid_2: str
8+
username: str
9+
parentid_1: str
10+
parentid_2: str
11+
912

1013
@event_parser(model=UserModel, envelope=envelopes.EventBridgeEnvelope)
1114
def lambda_handler(event: UserModel, context: LambdaContext):
12-
if event.parentid_1!= event.parentid_2:
13-
return {
14-
"statusCode": 400,
15-
"body": "Parent ids do not match"
16-
}
15+
if event.parentid_1 != event.parentid_2:
16+
return {"statusCode": 400, "body": "Parent ids do not match"}
1717

1818
# If parentids match, proceed with user registration
1919

20-
return {
21-
"statusCode": 200,
22-
"body": f"User {event.username} registered successfully"
23-
}
20+
return {"statusCode": 200, "body": f"User {event.username} registered successfully"}
Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,22 @@
1-
from aws_lambda_powertools.utilities.parser import parse, BaseModel
2-
from aws_lambda_powertools.utilities.parser import field_validator
1+
from pydantic import BaseModel, field_validator
2+
3+
from aws_lambda_powertools.utilities.parser import parse
34
from aws_lambda_powertools.utilities.typing import LambdaContext
45

6+
57
class HelloWorldModel(BaseModel):
68
message: str
79

8-
@field_validator('message')
10+
@field_validator("message")
911
def is_hello_world(cls, v):
1012
if v != "hello world":
1113
raise ValueError("Message must be hello world!")
1214
return v
1315

16+
1417
def lambda_handler(event: dict, context: LambdaContext):
1518
try:
1619
parsed_event = parse(model=HelloWorldModel, event=event)
17-
return {
18-
"statusCode": 200,
19-
"body": f"Received message: {parsed_event.message}"
20-
}
20+
return {"statusCode": 200, "body": f"Received message: {parsed_event.message}"}
2121
except ValueError as e:
22-
return {
23-
"statusCode": 400,
24-
"body": str(e)
25-
}
22+
return {"statusCode": 400, "body": str(e)}

examples/parser/src/getting_started_with_parser.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
from aws_lambda_powertools.utilities.parser import BaseModel
1+
from pydantic import BaseModel
2+
23
from aws_lambda_powertools.utilities.parser import event_parser
34

5+
46
class MyEvent(BaseModel):
57
id: int
68
name: str
79

10+
811
@event_parser(model=MyEvent)
912
def lambda_handler(event: MyEvent, context):
10-
#if your model is valid, you can return
13+
# if your model is valid, you can return
1114
return {"statusCode": 200, "body": f"Hello {event.name}, your ID is {event.id}"}
12-
Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,31 @@
1+
from pydantic import BaseModel, model_validator
2+
3+
from aws_lambda_powertools.utilities.parser import parse
14
from aws_lambda_powertools.utilities.typing import LambdaContext
2-
from aws_lambda_powertools.utilities.parser import parse, BaseModel
3-
from aws_lambda_powertools.utilities.parser import model_validator
5+
46

57
class UserModel(BaseModel):
6-
username: str
7-
parentid_1: str
8-
parentid_2: str
8+
username: str
9+
parentid_1: str
10+
parentid_2: str
11+
12+
@model_validator(mode="after") # (1)!
13+
def check_parents_match(cls, values):
14+
pi1, pi2 = values.get("parentid_1"), values.get("parentid_2")
15+
if pi1 is not None and pi2 is not None and pi1 != pi2:
16+
raise ValueError("Parent ids do not match")
17+
return values
18+
919

10-
@model_validator(mode='after')
11-
def check_parents_match(cls, values):
12-
pi1, pi2 = values.get('parentid_1'), values.get('parentid_2')
13-
if pi1 is not None and pi2 is not None and pi1 != pi2:
14-
raise ValueError('Parent ids do not match')
15-
return values
1620
def lambda_handler(event: dict, context: LambdaContext):
1721
try:
1822
parsed_event = parse(model=UserModel, event=event)
1923
return {
2024
"statusCode": 200,
21-
"body": f"Received parent id from: {parsed_event.username}"
25+
"body": f"Received parent id from: {parsed_event.username}",
2226
}
2327
except ValueError as e:
2428
return {
2529
"statusCode": 400,
26-
"body": str(e)
27-
}
30+
"body": str(e),
31+
}
Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
1-
from aws_lambda_powertools.utilities.parser import BaseModel, ValidationError
1+
from pydantic import BaseModel, ValidationError
2+
23
from aws_lambda_powertools.utilities.parser import parse
34

5+
46
# Define a Pydantic model for the expected structure of the input
57
class MyEvent(BaseModel):
68
id: int
79
name: str
810

11+
912
def lambda_handler(event: dict, context):
1013
try:
1114
# Manually parse the incoming event into MyEvent model
1215
parsed_event: MyEvent = parse(model=MyEvent, event=event)
13-
return {
14-
"statusCode": 200,
15-
"body": f"Hello {parsed_event.name}, your ID is {parsed_event.id}"
16-
}
16+
return {"statusCode": 200, "body": f"Hello {parsed_event.name}, your ID is {parsed_event.id}"}
1717
except ValidationError as e:
1818
# Catch validation errors and return a 400 response
19-
return {
20-
"statusCode": 400,
21-
"body": f"Validation error: {str(e)}"
22-
}
19+
return {"statusCode": 400, "body": f"Validation error: {str(e)}"}
Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
1-
from aws_lambda_powertools.utilities.parser import parse, BaseModel
1+
from pydantic import BaseModel
2+
23
from aws_lambda_powertools.logging import Logger
4+
from aws_lambda_powertools.utilities.parser import parse
35
from aws_lambda_powertools.utilities.typing import LambdaContext
46

57
logger = Logger()
68

9+
710
class UserModel(BaseModel):
811
username: str
912
parentid_1: str
1013
parentid_2: str
1114

15+
1216
def validate_user(event):
1317
try:
1418
user = parse(model=UserModel, event=event)
15-
return {
16-
"statusCode": 200,
17-
"body": user.model_dump_json()
18-
}
19+
return {"statusCode": 200, "body": user.model_dump_json()}
1920
except Exception as e:
2021
logger.exception("Validation error")
21-
return {
22-
"statusCode": 400,
23-
"body": str(e)
24-
}
22+
return {"statusCode": 400, "body": str(e)}
23+
2524

2625
@logger.inject_lambda_context
2726
def lambda_handler(event: dict, context: LambdaContext) -> dict:
@@ -37,9 +36,6 @@ def lambda_handler(event: dict, context: LambdaContext) -> dict:
3736
user_dict = user.model_dump()
3837
user_json = user.model_dump_json()
3938

40-
logger.debug("User serializations", extra={
41-
"dict": user_dict,
42-
"json": user_json
43-
})
39+
logger.debug("User serializations", extra={"dict": user_dict, "json": user_json})
4440

45-
return result
41+
return result
Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
from typing import Any, Type
2-
from aws_lambda_powertools.utilities.parser import event_parser, BaseEnvelope, BaseModel
2+
3+
from pydantic import BaseModel, Json
4+
5+
from aws_lambda_powertools.utilities.parser import BaseEnvelope, event_parser
36
from aws_lambda_powertools.utilities.typing import LambdaContext
4-
from aws_lambda_powertools.utilities.parser.types import Json
7+
58

69
class CancelOrder(BaseModel):
710
order_id: int
811
reason: str
912

13+
1014
class CancelOrderModel(BaseModel):
1115
body: Json[CancelOrder]
1216

17+
1318
class CustomEnvelope(BaseEnvelope):
1419
def parse(self, data: dict, model: Type[BaseModel]) -> Any:
1520
return model.model_validate({"body": data.get("body", {})})
1621

22+
1723
@event_parser(model=CancelOrderModel, envelope=CustomEnvelope)
1824
def lambda_handler(event: CancelOrderModel, context: LambdaContext):
1925
cancel_order: CancelOrder = event.body
@@ -25,5 +31,5 @@ def lambda_handler(event: CancelOrderModel, context: LambdaContext):
2531

2632
return {
2733
"statusCode": 200,
28-
"body": f"Order {cancel_order.order_id} cancelled successfully"
29-
}
34+
"body": f"Order {cancel_order.order_id} cancelled successfully",
35+
}

0 commit comments

Comments
 (0)