From 810ddd3da572b96bbfbdc1840b5088cb823f5e27 Mon Sep 17 00:00:00 2001 From: Emanuele Giaquinta Date: Fri, 3 Jul 2026 14:55:08 +0300 Subject: [PATCH 1/3] fix(parser): fix DynamoDB Stream Lambda invocation record model The responseContext.functionError field is null if the error did not occur during function execution. --- .../utilities/parser/models/dynamodb.py | 3 ++- tests/unit/parser/_pydantic/test_dynamodb.py | 26 +++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/models/dynamodb.py b/aws_lambda_powertools/utilities/parser/models/dynamodb.py index d6091d32d7a..595e19068e3 100644 --- a/aws_lambda_powertools/utilities/parser/models/dynamodb.py +++ b/aws_lambda_powertools/utilities/parser/models/dynamodb.py @@ -175,7 +175,8 @@ class ResponseContext(BaseModel): description="The version of the Lambda executed", examples=["$LATEST"], ) - function_error: str = Field( + function_error: Optional[str] = Field( + default=None, description="", examples=["Unhandled"], ) diff --git a/tests/unit/parser/_pydantic/test_dynamodb.py b/tests/unit/parser/_pydantic/test_dynamodb.py index 13ee5610e6d..f21f6d717c3 100644 --- a/tests/unit/parser/_pydantic/test_dynamodb.py +++ b/tests/unit/parser/_pydantic/test_dynamodb.py @@ -1,3 +1,5 @@ +from typing import Any + import pytest from aws_lambda_powertools.utilities.parser import ValidationError, envelopes, parse @@ -86,8 +88,26 @@ def test_validate_event_does_not_conform_with_model(): parse(event=raw_event, model=MyDynamoBusiness, envelope=envelopes.DynamoDBStreamEnvelope) -def test_dynamo_db_stream_lambda_invocation_event(): +@pytest.mark.parametrize( + "response_context", + [ + pytest.param( + {"statusCode": 200, "executedVersion": "$LATEST"}, + id="without function error", + ), + pytest.param( + {"statusCode": 200, "executedVersion": "$LATEST", "functionError": None}, + id="with null function error", + ), + pytest.param( + {"statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled"}, + id="with function error", + ), + ], +) +def test_dynamo_db_stream_lambda_invocation_event(response_context: dict[str, Any]): raw_event = load_event("dynamoStreamLambdaInvocationEvent.json") + raw_event["responseContext"] = response_context parsed_event: DynamoDBStreamLambdaOnFailureDestinationModel = parse( event=raw_event, model=DynamoDBStreamLambdaOnFailureDestinationModel, @@ -111,6 +131,8 @@ def test_dynamo_db_stream_lambda_invocation_event(): ) assert parsed_event.ddb_stream_batch_info.stream_arn == raw_event["DDBStreamBatchInfo"]["streamArn"] assert parsed_event.request_context.model_dump(by_alias=True) == raw_event["requestContext"] - assert parsed_event.response_context.model_dump(by_alias=True) == raw_event["responseContext"] + assert parsed_event.response_context.status_code == response_context["statusCode"] + assert parsed_event.response_context.executed_version == response_context["executedVersion"] + assert parsed_event.response_context.function_error == response_context.get("functionError") assert parsed_event.timestamp.strftime("%Y-%m-%dT%H:%M:%SZ") == raw_event["timestamp"] assert parsed_event.version == raw_event["version"] From 77bfb95d9410e6b136864dd1565bf2a51480d0c6 Mon Sep 17 00:00:00 2001 From: Emanuele Giaquinta Date: Sun, 5 Jul 2026 16:22:47 +0300 Subject: [PATCH 2/3] chore: fix ruff B905 errors --- .../event_handler/events_appsync/appsync_events.py | 2 +- .../required_dependencies/test_bedrock_agent_function_event.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/event_handler/events_appsync/appsync_events.py b/aws_lambda_powertools/event_handler/events_appsync/appsync_events.py index ee03db5c625..ad718cca104 100644 --- a/aws_lambda_powertools/event_handler/events_appsync/appsync_events.py +++ b/aws_lambda_powertools/event_handler/events_appsync/appsync_events.py @@ -321,7 +321,7 @@ async def _call_publish_event_async_resolver( if isinstance(ret, Exception) else {"id": e.get("id"), "payload": ret} ) - for e, ret in zip(self.current_event.events, results) + for e, ret in zip(self.current_event.events, results, strict=True) ], ) diff --git a/tests/unit/data_classes/required_dependencies/test_bedrock_agent_function_event.py b/tests/unit/data_classes/required_dependencies/test_bedrock_agent_function_event.py index e055c894604..2ff81a21bb8 100644 --- a/tests/unit/data_classes/required_dependencies/test_bedrock_agent_function_event.py +++ b/tests/unit/data_classes/required_dependencies/test_bedrock_agent_function_event.py @@ -32,7 +32,7 @@ def test_bedrock_agent_function_event(): raw_parameters = raw_event["parameters"] assert len(parameters) == len(raw_parameters) - for param, raw_param in zip(parameters, raw_parameters): + for param, raw_param in zip(parameters, raw_parameters, strict=True): assert param.name == raw_param["name"] assert param.type == raw_param["type"] assert param.value == raw_param["value"] From dbdcd735c63e1f714cb323cecac7bc47e8158d5c Mon Sep 17 00:00:00 2001 From: Emanuele Giaquinta Date: Sun, 5 Jul 2026 16:23:04 +0300 Subject: [PATCH 3/3] chore: bump ruff target version to 3.10 Also add temporary ignores for some upgrade rules, as there are 1017 corresponding errors. --- ruff.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ruff.toml b/ruff.toml index fa89816a7de..6761e206cdc 100644 --- a/ruff.toml +++ b/ruff.toml @@ -41,6 +41,10 @@ lint.ignore = [ "A005", "TC006", # https://docs.astral.sh/ruff/rules/runtime-cast-value/ "PLC0415", # https://docs.astral.sh/ruff/rules/import-outside-top-level/ + "UP006", + "UP007", + "UP035", + "UP045", ] # Exclude files and directories @@ -62,7 +66,7 @@ exclude = [ # Maximum line length line-length = 120 -target-version = "py38" +target-version = "py310" fix = true lint.fixable = ["I", "COM812", "W"]