aws-lambda-powertools 2.34.2__py3-none-any.whl → 2.35.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. aws_lambda_powertools/event_handler/api_gateway.py +15 -0
  2. aws_lambda_powertools/event_handler/bedrock_agent.py +163 -1
  3. aws_lambda_powertools/event_handler/openapi/constants.py +1 -1
  4. aws_lambda_powertools/event_handler/openapi/models.py +3 -3
  5. aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js +12 -8
  6. aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css +1 -7
  7. aws_lambda_powertools/logging/__init__.py +1 -0
  8. aws_lambda_powertools/logging/logger.py +19 -21
  9. aws_lambda_powertools/metrics/__init__.py +1 -0
  10. aws_lambda_powertools/middleware_factory/__init__.py +1 -0
  11. aws_lambda_powertools/shared/functions.py +3 -6
  12. aws_lambda_powertools/shared/version.py +1 -1
  13. aws_lambda_powertools/tracing/__init__.py +0 -1
  14. aws_lambda_powertools/tracing/tracer.py +2 -4
  15. aws_lambda_powertools/utilities/batch/base.py +7 -4
  16. aws_lambda_powertools/utilities/batch/exceptions.py +1 -0
  17. aws_lambda_powertools/utilities/data_classes/common.py +1 -1
  18. aws_lambda_powertools/utilities/data_masking/base.py +4 -8
  19. aws_lambda_powertools/utilities/data_masking/provider/kms/aws_encryption_sdk.py +0 -1
  20. aws_lambda_powertools/utilities/idempotency/exceptions.py +0 -1
  21. aws_lambda_powertools/utilities/idempotency/idempotency.py +1 -0
  22. aws_lambda_powertools/utilities/idempotency/serialization/base.py +1 -0
  23. aws_lambda_powertools/utilities/parameters/appconfig.py +0 -1
  24. aws_lambda_powertools/utilities/parameters/base.py +3 -4
  25. aws_lambda_powertools/utilities/parameters/dynamodb.py +0 -1
  26. aws_lambda_powertools/utilities/parameters/secrets.py +0 -1
  27. aws_lambda_powertools/utilities/parameters/ssm.py +13 -24
  28. aws_lambda_powertools/utilities/parser/__init__.py +1 -0
  29. aws_lambda_powertools/utilities/parser/parser.py +2 -4
  30. aws_lambda_powertools/utilities/serialization.py +1 -0
  31. {aws_lambda_powertools-2.34.2.dist-info → aws_lambda_powertools-2.35.0.dist-info}/METADATA +2 -1
  32. {aws_lambda_powertools-2.34.2.dist-info → aws_lambda_powertools-2.35.0.dist-info}/RECORD +34 -34
  33. {aws_lambda_powertools-2.34.2.dist-info → aws_lambda_powertools-2.35.0.dist-info}/LICENSE +0 -0
  34. {aws_lambda_powertools-2.34.2.dist-info → aws_lambda_powertools-2.35.0.dist-info}/WHEEL +0 -0
@@ -1455,10 +1455,25 @@ class ApiGatewayResolver(BaseRouter):
1455
1455
  get_definitions,
1456
1456
  )
1457
1457
  from aws_lambda_powertools.event_handler.openapi.models import OpenAPI, PathItem, Server, Tag
1458
+ from aws_lambda_powertools.event_handler.openapi.pydantic_loader import PYDANTIC_V2
1458
1459
  from aws_lambda_powertools.event_handler.openapi.types import (
1459
1460
  COMPONENT_REF_TEMPLATE,
1460
1461
  )
1461
1462
 
1463
+ # Pydantic V2 has no support for OpenAPI schema 3.0
1464
+ if PYDANTIC_V2 and not openapi_version.startswith("3.1"):
1465
+ warnings.warn(
1466
+ "You are using Pydantic v2, which is incompatible with OpenAPI schema 3.0. Forcing OpenAPI 3.1",
1467
+ stacklevel=2,
1468
+ )
1469
+ openapi_version = "3.1.0"
1470
+ elif not PYDANTIC_V2 and not openapi_version.startswith("3.0"):
1471
+ warnings.warn(
1472
+ "You are using Pydantic v1, which is incompatible with OpenAPI schema 3.1. Forcing OpenAPI 3.0",
1473
+ stacklevel=2,
1474
+ )
1475
+ openapi_version = "3.0.3"
1476
+
1462
1477
  # Start with the bare minimum required for a valid OpenAPI schema
1463
1478
  info: Dict[str, Any] = {"title": title, "version": version}
1464
1479
 
@@ -1,13 +1,15 @@
1
1
  from re import Match
2
- from typing import Any, Dict
2
+ from typing import Any, Callable, Dict, List, Optional
3
3
 
4
4
  from typing_extensions import override
5
5
 
6
6
  from aws_lambda_powertools.event_handler import ApiGatewayResolver
7
7
  from aws_lambda_powertools.event_handler.api_gateway import (
8
+ _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
8
9
  ProxyEventType,
9
10
  ResponseBuilder,
10
11
  )
12
+ from aws_lambda_powertools.event_handler.openapi.types import OpenAPIResponse
11
13
  from aws_lambda_powertools.utilities.data_classes import BedrockAgentEvent
12
14
 
13
15
 
@@ -83,6 +85,166 @@ class BedrockAgentResolver(ApiGatewayResolver):
83
85
  )
84
86
  self._response_builder_class = BedrockResponseBuilder
85
87
 
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
+
86
248
  @override
87
249
  def _convert_matches_into_route_keys(self, match: Match) -> Dict[str, str]:
88
250
  # In Bedrock Agents, all the parameters come inside the "parameters" key, not on the apiPath
@@ -1,2 +1,2 @@
1
1
  DEFAULT_API_VERSION = "1.0.0"
2
- DEFAULT_OPENAPI_VERSION = "3.0.0"
2
+ DEFAULT_OPENAPI_VERSION = "3.0.3"
@@ -45,7 +45,6 @@ class License(BaseModel):
45
45
  # https://swagger.io/specification/#info-object
46
46
  class Info(BaseModel):
47
47
  title: str
48
- summary: Optional[str] = None
49
48
  description: Optional[str] = None
50
49
  termsOfService: Optional[str] = None
51
50
  contact: Optional[Contact] = None
@@ -53,12 +52,13 @@ class Info(BaseModel):
53
52
  version: str
54
53
 
55
54
  if PYDANTIC_V2:
56
- model_config = {"extra": "allow"}
55
+ summary: Optional[str] = None
56
+ model_config = {"extra": "ignore"}
57
57
 
58
58
  else:
59
59
 
60
60
  class Config:
61
- extra = "allow"
61
+ extra = "ignore"
62
62
 
63
63
 
64
64
  # https://swagger.io/specification/#server-variable-object