Skip to content

Commit 8b45169

Browse files
Merge branch 'develop' into feat/add-cloud-watch-alarm-event-data-class
2 parents f5f4aec + fa235c0 commit 8b45169

File tree

55 files changed

+1974
-373
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1974
-373
lines changed

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,12 +237,12 @@ jobs:
237237

238238
- name: Upload to PyPi prod
239239
if: ${{ !inputs.skip_pypi }}
240-
uses: pypa/gh-action-pypi-publish@e53eb8b103ffcb59469888563dc324e3c8ba6f06 # v1.8.12
240+
uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 # v1.8.14
241241

242242
# PyPi test maintenance affected us numerous times, leaving for history purposes
243243
# - name: Upload to PyPi test
244244
# if: ${{ !inputs.skip_pypi }}
245-
# uses: pypa/gh-action-pypi-publish@e53eb8b103ffcb59469888563dc324e3c8ba6f06 # v1.8.12
245+
# uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 # v1.8.14
246246
# with:
247247
# repository-url: https://test.pypi.org/legacy/
248248

CHANGELOG.md

Lines changed: 66 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,81 @@
44
<a name="unreleased"></a>
55
# Unreleased
66

7+
## Code Refactoring
8+
9+
* **parameters:** improve typing for get_secret method ([#3910](https://github.com/aws-powertools/powertools-lambda-python/issues/3910))
10+
11+
## Maintenance
12+
13+
* **deps:** bump pypa/gh-action-pypi-publish from 1.8.12 to 1.8.14 ([#3918](https://github.com/aws-powertools/powertools-lambda-python/issues/3918))
14+
* **deps-dev:** bump ruff from 0.3.0 to 0.3.2 ([#3925](https://github.com/aws-powertools/powertools-lambda-python/issues/3925))
15+
* **deps-dev:** bump pytest-asyncio from 0.23.5 to 0.23.5.post1 ([#3923](https://github.com/aws-powertools/powertools-lambda-python/issues/3923))
16+
* **deps-dev:** bump the boto-typing group with 2 updates ([#3919](https://github.com/aws-powertools/powertools-lambda-python/issues/3919))
17+
* **deps-dev:** bump mypy from 1.8.0 to 1.9.0 ([#3921](https://github.com/aws-powertools/powertools-lambda-python/issues/3921))
18+
* **deps-dev:** bump bandit from 1.7.7 to 1.7.8 ([#3920](https://github.com/aws-powertools/powertools-lambda-python/issues/3920))
19+
20+
21+
<a name="v2.35.1"></a>
22+
## [v2.35.1] - 2024-03-08
23+
## Bug Fixes
24+
25+
* **data_sources:** ensure correct types on SQSMessageAttributes ([#3898](https://github.com/aws-powertools/powertools-lambda-python/issues/3898))
26+
* **event_handler:** validate POST bodies on BedrockAgentResolver ([#3903](https://github.com/aws-powertools/powertools-lambda-python/issues/3903))
27+
* **internal:** call ruff with correct args ([#3901](https://github.com/aws-powertools/powertools-lambda-python/issues/3901))
28+
29+
## Features
30+
31+
* **event_handler:** use custom serializer during openapi serialization ([#3900](https://github.com/aws-powertools/powertools-lambda-python/issues/3900))
32+
33+
## Maintenance
34+
35+
* version bump
36+
* **deps:** bump aws-xray-sdk from 2.12.1 to 2.13.0 ([#3906](https://github.com/aws-powertools/powertools-lambda-python/issues/3906))
37+
* **deps:** bump the layer-balancer group in /layer/scripts/layer-balancer with 3 updates ([#3911](https://github.com/aws-powertools/powertools-lambda-python/issues/3911))
38+
* **deps:** bump squidfunk/mkdocs-material from `7be068b` to `3678304` in /docs ([#3894](https://github.com/aws-powertools/powertools-lambda-python/issues/3894))
39+
* **deps:** bump datadog-lambda from 5.88.0 to 5.89.0 ([#3907](https://github.com/aws-powertools/powertools-lambda-python/issues/3907))
40+
* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.81 to 0.1.82 ([#3896](https://github.com/aws-powertools/powertools-lambda-python/issues/3896))
41+
* **deps-dev:** bump sentry-sdk from 1.40.6 to 1.41.0 ([#3905](https://github.com/aws-powertools/powertools-lambda-python/issues/3905))
42+
* **deps-dev:** bump mkdocs-material from 9.5.12 to 9.5.13 ([#3895](https://github.com/aws-powertools/powertools-lambda-python/issues/3895))
43+
* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.82 to 0.1.83 ([#3908](https://github.com/aws-powertools/powertools-lambda-python/issues/3908))
44+
* **deps-dev:** bump the boto-typing group with 1 update ([#3904](https://github.com/aws-powertools/powertools-lambda-python/issues/3904))
45+
46+
47+
<a name="v2.35.0"></a>
48+
## [v2.35.0] - 2024-03-06
749
## Bug Fixes
850

951
* **event_handler:** OpenAPI schema version respects Pydantic version ([#3860](https://github.com/aws-powertools/powertools-lambda-python/issues/3860))
1052

53+
## Code Refactoring
54+
55+
* **logger:** improve typing ([#3869](https://github.com/aws-powertools/powertools-lambda-python/issues/3869))
56+
57+
## Documentation
58+
59+
* **event_handler:** add bedrock agent resolver documentation ([#3602](https://github.com/aws-powertools/powertools-lambda-python/issues/3602))
60+
1161
## Maintenance
1262

13-
* **deps:** bump redis from 5.0.1 to 5.0.2 ([#3867](https://github.com/aws-powertools/powertools-lambda-python/issues/3867))
14-
* **deps:** bump codecov/codecov-action from 4.0.2 to 4.1.0 ([#3856](https://github.com/aws-powertools/powertools-lambda-python/issues/3856))
15-
* **deps:** bump actions/download-artifact from 4.1.2 to 4.1.3 ([#3862](https://github.com/aws-powertools/powertools-lambda-python/issues/3862))
16-
* **deps:** bump squidfunk/mkdocs-material from `49d1bfd` to `7be068b` in /docs ([#3872](https://github.com/aws-powertools/powertools-lambda-python/issues/3872))
63+
* version bump
1764
* **deps:** bump docker/setup-buildx-action from 3.0.0 to 3.1.0 ([#3864](https://github.com/aws-powertools/powertools-lambda-python/issues/3864))
65+
* **deps:** bump actions/download-artifact from 4.1.3 to 4.1.4 ([#3875](https://github.com/aws-powertools/powertools-lambda-python/issues/3875))
66+
* **deps:** bump the layer-balancer group in /layer/scripts/layer-balancer with 1 update ([#3884](https://github.com/aws-powertools/powertools-lambda-python/issues/3884))
67+
* **deps:** bump squidfunk/mkdocs-material from `49d1bfd` to `7be068b` in /docs ([#3872](https://github.com/aws-powertools/powertools-lambda-python/issues/3872))
1868
* **deps:** bump squidfunk/mkdocs-material from `43b898a` to `49d1bfd` in /docs ([#3857](https://github.com/aws-powertools/powertools-lambda-python/issues/3857))
69+
* **deps:** bump codecov/codecov-action from 4.0.2 to 4.1.0 ([#3856](https://github.com/aws-powertools/powertools-lambda-python/issues/3856))
70+
* **deps:** bump redis from 5.0.1 to 5.0.2 ([#3867](https://github.com/aws-powertools/powertools-lambda-python/issues/3867))
71+
* **deps:** bump the layer-balancer group in /layer/scripts/layer-balancer with 1 update ([#3887](https://github.com/aws-powertools/powertools-lambda-python/issues/3887))
72+
* **deps:** bump actions/download-artifact from 4.1.2 to 4.1.3 ([#3862](https://github.com/aws-powertools/powertools-lambda-python/issues/3862))
1973
* **deps:** bump pypa/gh-action-pypi-publish from 1.8.11 to 1.8.12 ([#3863](https://github.com/aws-powertools/powertools-lambda-python/issues/3863))
20-
* **deps:** bump actions/download-artifact from 4.1.3 to 4.1.4 ([#3875](https://github.com/aws-powertools/powertools-lambda-python/issues/3875))
74+
* **deps-dev:** bump aws-cdk-lib from 2.130.0 to 2.131.0 ([#3881](https://github.com/aws-powertools/powertools-lambda-python/issues/3881))
75+
* **deps-dev:** bump cfn-lint from 0.85.3 to 0.86.0 ([#3882](https://github.com/aws-powertools/powertools-lambda-python/issues/3882))
2176
* **deps-dev:** bump black from 24.1.1 to 24.2.0 ([#3760](https://github.com/aws-powertools/powertools-lambda-python/issues/3760))
2277
* **deps-dev:** bump cfn-lint from 0.85.2 to 0.85.3 ([#3861](https://github.com/aws-powertools/powertools-lambda-python/issues/3861))
23-
* **deps-dev:** bump ruff from 0.2.2 to 0.3.0 ([#3871](https://github.com/aws-powertools/powertools-lambda-python/issues/3871))
78+
* **deps-dev:** bump aws-cdk from 2.130.0 to 2.131.0 ([#3883](https://github.com/aws-powertools/powertools-lambda-python/issues/3883))
2479
* **deps-dev:** bump mkdocs-material from 9.5.11 to 9.5.12 ([#3870](https://github.com/aws-powertools/powertools-lambda-python/issues/3870))
80+
* **deps-dev:** bump ruff from 0.2.2 to 0.3.0 ([#3871](https://github.com/aws-powertools/powertools-lambda-python/issues/3871))
81+
* **docs:** add Bedrock Agents to feature list ([#3889](https://github.com/aws-powertools/powertools-lambda-python/issues/3889))
2582

2683

2784
<a name="v2.34.2"></a>
@@ -4476,7 +4533,9 @@
44764533
* Merge pull request [#5](https://github.com/aws-powertools/powertools-lambda-python/issues/5) from jfuss/feat/python38
44774534

44784535

4479-
[Unreleased]: https://github.com/aws-powertools/powertools-lambda-python/compare/v2.34.2...HEAD
4536+
[Unreleased]: https://github.com/aws-powertools/powertools-lambda-python/compare/v2.35.1...HEAD
4537+
[v2.35.1]: https://github.com/aws-powertools/powertools-lambda-python/compare/v2.35.0...v2.35.1
4538+
[v2.35.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v2.34.2...v2.35.0
44804539
[v2.34.2]: https://github.com/aws-powertools/powertools-lambda-python/compare/v2.34.1...v2.34.2
44814540
[v2.34.1]: https://github.com/aws-powertools/powertools-lambda-python/compare/v2.34.0...v2.34.1
44824541
[v2.34.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v2.33.1...v2.34.0

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ format:
2121
poetry run black aws_lambda_powertools tests examples
2222

2323
lint: format
24-
poetry run ruff aws_lambda_powertools tests examples
24+
poetry run ruff check aws_lambda_powertools tests examples
2525

2626
lint-docs:
2727
docker run -v ${PWD}:/markdown 06kellyjac/markdownlint-cli "docs"

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverles
2020
* **[Metrics](https://docs.powertools.aws.dev/lambda/python/latest/core/metrics/)** - Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF)
2121
* **[Event handler: AppSync](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/appsync/)** - AWS AppSync event handler for Lambda Direct Resolver and Amplify GraphQL Transformer function
2222
* **[Event handler: API Gateway and ALB](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/)** - Amazon API Gateway REST/HTTP API and ALB event handler for Lambda functions invoked using Proxy integration
23+
* **[Event handler: Agents for Amazon Bedrock](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/bedrock_agents/)** - Create Agents for Amazon Bedrock, automatically generating OpenAPI schemas
2324
* **[Bring your own middleware](https://docs.powertools.aws.dev/lambda/python/latest/utilities/middleware_factory/)** - Decorator factory to create your own middleware to run logic before, and after each Lambda invocation
2425
* **[Parameters utility](https://docs.powertools.aws.dev/lambda/python/latest/utilities/parameters/)** - Retrieve and cache parameter values from Parameter Store, Secrets Manager, or DynamoDB
2526
* **[Batch processing](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/)** - Handle partial failures for AWS SQS batch processing

aws_lambda_powertools/event_handler/api_gateway.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1401,7 +1401,9 @@ def __init__(
14011401
if self._enable_validation:
14021402
from aws_lambda_powertools.event_handler.middlewares.openapi_validation import OpenAPIValidationMiddleware
14031403

1404-
self.use([OpenAPIValidationMiddleware()])
1404+
# Note the serializer argument: only use custom serializer if provided by the caller
1405+
# Otherwise, fully rely on the internal Pydantic based mechanism to serialize responses for validation.
1406+
self.use([OpenAPIValidationMiddleware(validation_serializer=serializer)])
14051407

14061408
def get_openapi_schema(
14071409
self,

aws_lambda_powertools/event_handler/bedrock_agent.py

Lines changed: 163 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
from re import Match
2-
from typing import Any, Dict
2+
from typing import Any, Callable, Dict, List, Optional
33

44
from typing_extensions import override
55

66
from aws_lambda_powertools.event_handler import ApiGatewayResolver
77
from aws_lambda_powertools.event_handler.api_gateway import (
8+
_DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
89
ProxyEventType,
910
ResponseBuilder,
1011
)
12+
from aws_lambda_powertools.event_handler.openapi.types import OpenAPIResponse
1113
from aws_lambda_powertools.utilities.data_classes import BedrockAgentEvent
1214

1315

@@ -83,6 +85,166 @@ def __init__(self, debug: bool = False, enable_validation: bool = True):
8385
)
8486
self._response_builder_class = BedrockResponseBuilder
8587

88+
# Note: we need ignore[override] because we are making the optional `description` field required.
89+
@override
90+
def get( # type: ignore[override]
91+
self,
92+
rule: str,
93+
description: str,
94+
cors: Optional[bool] = None,
95+
compress: bool = False,
96+
cache_control: Optional[str] = None,
97+
summary: Optional[str] = None,
98+
responses: Optional[Dict[int, OpenAPIResponse]] = None,
99+
response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
100+
tags: Optional[List[str]] = None,
101+
operation_id: Optional[str] = None,
102+
include_in_schema: bool = True,
103+
middlewares: Optional[List[Callable[..., Any]]] = None,
104+
) -> Callable[[Callable[..., Any]], Callable[..., Any]]:
105+
return super(BedrockAgentResolver, self).get(
106+
rule,
107+
cors,
108+
compress,
109+
cache_control,
110+
summary,
111+
description,
112+
responses,
113+
response_description,
114+
tags,
115+
operation_id,
116+
include_in_schema,
117+
middlewares,
118+
)
119+
120+
# Note: we need ignore[override] because we are making the optional `description` field required.
121+
@override
122+
def post( # type: ignore[override]
123+
self,
124+
rule: str,
125+
description: str,
126+
cors: Optional[bool] = None,
127+
compress: bool = False,
128+
cache_control: Optional[str] = None,
129+
summary: Optional[str] = None,
130+
responses: Optional[Dict[int, OpenAPIResponse]] = None,
131+
response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
132+
tags: Optional[List[str]] = None,
133+
operation_id: Optional[str] = None,
134+
include_in_schema: bool = True,
135+
middlewares: Optional[List[Callable[..., Any]]] = None,
136+
):
137+
return super().post(
138+
rule,
139+
cors,
140+
compress,
141+
cache_control,
142+
summary,
143+
description,
144+
responses,
145+
response_description,
146+
tags,
147+
operation_id,
148+
include_in_schema,
149+
middlewares,
150+
)
151+
152+
# Note: we need ignore[override] because we are making the optional `description` field required.
153+
@override
154+
def put( # type: ignore[override]
155+
self,
156+
rule: str,
157+
description: str,
158+
cors: Optional[bool] = None,
159+
compress: bool = False,
160+
cache_control: Optional[str] = None,
161+
summary: Optional[str] = None,
162+
responses: Optional[Dict[int, OpenAPIResponse]] = None,
163+
response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
164+
tags: Optional[List[str]] = None,
165+
operation_id: Optional[str] = None,
166+
include_in_schema: bool = True,
167+
middlewares: Optional[List[Callable[..., Any]]] = None,
168+
):
169+
return super().put(
170+
rule,
171+
cors,
172+
compress,
173+
cache_control,
174+
summary,
175+
description,
176+
responses,
177+
response_description,
178+
tags,
179+
operation_id,
180+
include_in_schema,
181+
middlewares,
182+
)
183+
184+
# Note: we need ignore[override] because we are making the optional `description` field required.
185+
@override
186+
def patch( # type: ignore[override]
187+
self,
188+
rule: str,
189+
description: str,
190+
cors: Optional[bool] = None,
191+
compress: bool = False,
192+
cache_control: Optional[str] = None,
193+
summary: Optional[str] = None,
194+
responses: Optional[Dict[int, OpenAPIResponse]] = None,
195+
response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
196+
tags: Optional[List[str]] = None,
197+
operation_id: Optional[str] = None,
198+
include_in_schema: bool = True,
199+
middlewares: Optional[List[Callable]] = None,
200+
):
201+
return super().patch(
202+
rule,
203+
cors,
204+
compress,
205+
cache_control,
206+
summary,
207+
description,
208+
responses,
209+
response_description,
210+
tags,
211+
operation_id,
212+
include_in_schema,
213+
middlewares,
214+
)
215+
216+
# Note: we need ignore[override] because we are making the optional `description` field required.
217+
@override
218+
def delete( # type: ignore[override]
219+
self,
220+
rule: str,
221+
description: str,
222+
cors: Optional[bool] = None,
223+
compress: bool = False,
224+
cache_control: Optional[str] = None,
225+
summary: Optional[str] = None,
226+
responses: Optional[Dict[int, OpenAPIResponse]] = None,
227+
response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
228+
tags: Optional[List[str]] = None,
229+
operation_id: Optional[str] = None,
230+
include_in_schema: bool = True,
231+
middlewares: Optional[List[Callable[..., Any]]] = None,
232+
):
233+
return super().delete(
234+
rule,
235+
cors,
236+
compress,
237+
cache_control,
238+
summary,
239+
description,
240+
responses,
241+
response_description,
242+
tags,
243+
operation_id,
244+
include_in_schema,
245+
middlewares,
246+
)
247+
86248
@override
87249
def _convert_matches_into_route_keys(self, match: Match) -> Dict[str, str]:
88250
# In Bedrock Agents, all the parameters come inside the "parameters" key, not on the apiPath

aws_lambda_powertools/event_handler/middlewares/openapi_validation.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import json
33
import logging
44
from copy import deepcopy
5-
from typing import Any, Dict, List, Mapping, Optional, Sequence, Tuple
5+
from typing import Any, Callable, Dict, List, Mapping, Optional, Sequence, Tuple
66

77
from pydantic import BaseModel
88

@@ -55,6 +55,18 @@ def get_todos(): List[Todo]:
5555
```
5656
"""
5757

58+
def __init__(self, validation_serializer: Optional[Callable[[Any], str]] = None):
59+
"""
60+
Initialize the OpenAPIValidationMiddleware.
61+
62+
Parameters
63+
----------
64+
validation_serializer : Callable, optional
65+
Optional serializer to use when serializing the response for validation.
66+
Use it when you have a custom type that cannot be serialized by the default jsonable_encoder.
67+
"""
68+
self._validation_serializer = validation_serializer
69+
5870
def handler(self, app: EventHandlerInstance, next_middleware: NextMiddleware) -> Response:
5971
logger.debug("OpenAPIValidationMiddleware handler")
6072

@@ -181,10 +193,11 @@ def _serialize_response(
181193
exclude_unset=exclude_unset,
182194
exclude_defaults=exclude_defaults,
183195
exclude_none=exclude_none,
196+
custom_serializer=self._validation_serializer,
184197
)
185198
else:
186199
# Just serialize the response content returned from the handler
187-
return jsonable_encoder(response_content)
200+
return jsonable_encoder(response_content, custom_serializer=self._validation_serializer)
188201

189202
def _prepare_response_content(
190203
self,

0 commit comments

Comments
 (0)