Skip to content

Commit 84954f8

Browse files
fix: add support for Pydantic 2.12+
1 parent d548350 commit 84954f8

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

aws_lambda_powertools/event_handler/openapi/params.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,12 @@ def __init__(
218218
self.openapi_examples = openapi_examples
219219

220220
# Pydantic 2.12+ no longer copies alias to validation_alias automatically
221-
# Set validation_alias to alias when not explicitly provided
221+
# Ensure alias and validation_alias are in sync when only one is provided
222222
if validation_alias is _Unset and alias is not None:
223223
validation_alias = alias
224+
elif alias is None and validation_alias is not _Unset and validation_alias is not None:
225+
alias = validation_alias
226+
kwargs["alias"] = alias
224227

225228
kwargs.update(
226229
{
@@ -724,9 +727,12 @@ def __init__(
724727
current_json_schema_extra = json_schema_extra or extra
725728

726729
# Pydantic 2.12+ no longer copies alias to validation_alias automatically
727-
# Set validation_alias to alias when not explicitly provided
730+
# Ensure alias and validation_alias are in sync when only one is provided
728731
if validation_alias is _Unset and alias is not None:
729732
validation_alias = alias
733+
elif alias is None and validation_alias is not _Unset and validation_alias is not None:
734+
alias = validation_alias
735+
kwargs["alias"] = alias
730736

731737
kwargs.update(
732738
{

tests/functional/event_handler/_pydantic/test_openapi_params.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,3 +1396,43 @@ def get_foo(
13961396
assert result["statusCode"] == 200
13971397
body = json.loads(result["body"])
13981398
assert body["my_param"] == "test_value"
1399+
1400+
1401+
def test_query_validation_alias_only_sets_alias_automatically():
1402+
"""
1403+
Test for issue #7552: When only validation_alias is set (without alias),
1404+
alias should be automatically set to validation_alias value.
1405+
This ensures the middleware can find the parameter in the request.
1406+
"""
1407+
from annotated_types import Ge, Le
1408+
from pydantic import StringConstraints
1409+
1410+
# GIVEN an APIGatewayRestResolver with validation enabled
1411+
app = APIGatewayRestResolver(enable_validation=True)
1412+
1413+
IntQuery = Annotated[int, Ge(1), Le(100)]
1414+
StrQuery = Annotated[str, StringConstraints(min_length=4, max_length=128)]
1415+
1416+
@app.get("/foo")
1417+
def get_foo(
1418+
str_query: Annotated[StrQuery, Query(validation_alias="strQuery")],
1419+
int_query: Annotated[IntQuery, Query(validation_alias="intQuery")],
1420+
):
1421+
return {"int_query": int_query, "str_query": str_query}
1422+
1423+
# WHEN sending a request with validation_alias names
1424+
event = {
1425+
"httpMethod": "GET",
1426+
"path": "/foo",
1427+
"queryStringParameters": {
1428+
"intQuery": "20",
1429+
"strQuery": "fooBarFizzBuzz",
1430+
},
1431+
}
1432+
1433+
# THEN the request should succeed
1434+
result = app(event, {})
1435+
assert result["statusCode"] == 200
1436+
body = json.loads(result["body"])
1437+
assert body["int_query"] == 20
1438+
assert body["str_query"] == "fooBarFizzBuzz"

0 commit comments

Comments
 (0)