aws-lambda-powertools 3.0.0.dev9__py3-none-any.whl → 3.0.0.dev11__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.
- aws_lambda_powertools/event_handler/openapi/constants.py +0 -4
- aws_lambda_powertools/event_handler/openapi/models.py +4 -5
- aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +1 -1
- aws_lambda_powertools/event_handler/openapi/types.py +2 -3
- aws_lambda_powertools/shared/version.py +1 -1
- aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py +101 -1
- aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py +57 -1
- aws_lambda_powertools/utilities/data_classes/common.py +114 -1
- aws_lambda_powertools/utilities/data_classes/shared_functions.py +141 -0
- aws_lambda_powertools/utilities/data_classes/vpc_lattice.py +1 -3
- aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +21 -0
- {aws_lambda_powertools-3.0.0.dev9.dist-info → aws_lambda_powertools-3.0.0.dev11.dist-info}/METADATA +1 -1
- {aws_lambda_powertools-3.0.0.dev9.dist-info → aws_lambda_powertools-3.0.0.dev11.dist-info}/RECORD +15 -15
- {aws_lambda_powertools-3.0.0.dev9.dist-info → aws_lambda_powertools-3.0.0.dev11.dist-info}/LICENSE +0 -0
- {aws_lambda_powertools-3.0.0.dev9.dist-info → aws_lambda_powertools-3.0.0.dev11.dist-info}/WHEEL +0 -0
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
from enum import Enum
|
|
3
3
|
from typing import Any, Dict, List, Literal, Optional, Set, Union
|
|
4
4
|
|
|
5
|
-
from pydantic import AnyUrl, BaseModel, Field
|
|
5
|
+
from pydantic import AnyUrl, BaseModel, ConfigDict, Field
|
|
6
6
|
from typing_extensions import Annotated
|
|
7
7
|
|
|
8
8
|
from aws_lambda_powertools.event_handler.openapi.compat import model_rebuild
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
)
|
|
9
|
+
|
|
10
|
+
MODEL_CONFIG_ALLOW = ConfigDict(extra="allow")
|
|
11
|
+
MODEL_CONFIG_IGNORE = ConfigDict(extra="ignore")
|
|
13
12
|
|
|
14
13
|
"""
|
|
15
14
|
The code defines Pydantic models for the various OpenAPI objects like OpenAPI, PathItem, Operation, Parameter etc.
|
|
@@ -4,7 +4,7 @@ from typing import Dict, Optional, Sequence
|
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel, Field, field_validator
|
|
6
6
|
|
|
7
|
-
from aws_lambda_powertools.event_handler.openapi.
|
|
7
|
+
from aws_lambda_powertools.event_handler.openapi.models import (
|
|
8
8
|
MODEL_CONFIG_ALLOW,
|
|
9
9
|
)
|
|
10
10
|
from aws_lambda_powertools.shared.functions import powertools_dev_is_set
|
|
@@ -4,14 +4,13 @@ import types
|
|
|
4
4
|
from enum import Enum
|
|
5
5
|
from typing import TYPE_CHECKING, Any, Callable, Dict, Set, Type, TypedDict, Union
|
|
6
6
|
|
|
7
|
-
from pydantic import BaseModel
|
|
8
|
-
|
|
9
7
|
if TYPE_CHECKING:
|
|
8
|
+
from pydantic import BaseModel # noqa: F401
|
|
10
9
|
from typing_extensions import NotRequired
|
|
11
10
|
|
|
12
11
|
CacheKey = Union[Callable[..., Any], None]
|
|
13
12
|
IncEx = Union[Set[int], Set[str], Dict[int, Any], Dict[str, Any]]
|
|
14
|
-
TypeModelOrEnum = Union[Type[BaseModel], Type[Enum]]
|
|
13
|
+
TypeModelOrEnum = Union[Type["BaseModel"], Type[Enum]]
|
|
15
14
|
ModelNameMap = Dict[TypeModelOrEnum, str]
|
|
16
15
|
UnionType = getattr(types, "UnionType", Union)
|
|
17
16
|
|
|
@@ -2,7 +2,10 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import enum
|
|
4
4
|
import re
|
|
5
|
-
|
|
5
|
+
import warnings
|
|
6
|
+
from typing import Any, overload
|
|
7
|
+
|
|
8
|
+
from typing_extensions import deprecated
|
|
6
9
|
|
|
7
10
|
from aws_lambda_powertools.utilities.data_classes.common import (
|
|
8
11
|
BaseRequestContext,
|
|
@@ -10,6 +13,10 @@ from aws_lambda_powertools.utilities.data_classes.common import (
|
|
|
10
13
|
CaseInsensitiveDict,
|
|
11
14
|
DictWrapper,
|
|
12
15
|
)
|
|
16
|
+
from aws_lambda_powertools.utilities.data_classes.shared_functions import (
|
|
17
|
+
get_header_value,
|
|
18
|
+
)
|
|
19
|
+
from aws_lambda_powertools.warnings import PowertoolsDeprecationWarning
|
|
13
20
|
|
|
14
21
|
|
|
15
22
|
class APIGatewayRouteArn:
|
|
@@ -162,6 +169,55 @@ class APIGatewayAuthorizerRequestEvent(DictWrapper):
|
|
|
162
169
|
def request_context(self) -> BaseRequestContext:
|
|
163
170
|
return BaseRequestContext(self._data)
|
|
164
171
|
|
|
172
|
+
@overload
|
|
173
|
+
def get_header_value(
|
|
174
|
+
self,
|
|
175
|
+
name: str,
|
|
176
|
+
default_value: str,
|
|
177
|
+
case_sensitive: bool = False,
|
|
178
|
+
) -> str: ...
|
|
179
|
+
|
|
180
|
+
@overload
|
|
181
|
+
def get_header_value(
|
|
182
|
+
self,
|
|
183
|
+
name: str,
|
|
184
|
+
default_value: str | None = None,
|
|
185
|
+
case_sensitive: bool = False,
|
|
186
|
+
) -> str | None: ...
|
|
187
|
+
|
|
188
|
+
@deprecated(
|
|
189
|
+
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
|
|
190
|
+
category=None,
|
|
191
|
+
)
|
|
192
|
+
def get_header_value(
|
|
193
|
+
self,
|
|
194
|
+
name: str,
|
|
195
|
+
default_value: str | None = None,
|
|
196
|
+
case_sensitive: bool = False,
|
|
197
|
+
) -> str | None:
|
|
198
|
+
"""Get header value by name
|
|
199
|
+
Parameters
|
|
200
|
+
----------
|
|
201
|
+
name: str
|
|
202
|
+
Header name
|
|
203
|
+
default_value: str, optional
|
|
204
|
+
Default value if no value was found by name
|
|
205
|
+
case_sensitive: bool
|
|
206
|
+
Whether to use a case-sensitive look up
|
|
207
|
+
Returns
|
|
208
|
+
-------
|
|
209
|
+
str, optional
|
|
210
|
+
Header value
|
|
211
|
+
"""
|
|
212
|
+
warnings.warn(
|
|
213
|
+
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
|
|
214
|
+
"no longer has any effect. This function will be removed in the next major version. "
|
|
215
|
+
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
|
|
216
|
+
category=PowertoolsDeprecationWarning,
|
|
217
|
+
stacklevel=2,
|
|
218
|
+
)
|
|
219
|
+
return get_header_value(self.headers, name, default_value, case_sensitive)
|
|
220
|
+
|
|
165
221
|
|
|
166
222
|
class APIGatewayAuthorizerEventV2(DictWrapper):
|
|
167
223
|
"""API Gateway Authorizer Event Format 2.0
|
|
@@ -244,6 +300,50 @@ class APIGatewayAuthorizerEventV2(DictWrapper):
|
|
|
244
300
|
def stage_variables(self) -> dict[str, str]:
|
|
245
301
|
return self.get("stageVariables") or {}
|
|
246
302
|
|
|
303
|
+
@overload
|
|
304
|
+
def get_header_value(self, name: str, default_value: str, case_sensitive: bool = False) -> str: ...
|
|
305
|
+
|
|
306
|
+
@overload
|
|
307
|
+
def get_header_value(
|
|
308
|
+
self,
|
|
309
|
+
name: str,
|
|
310
|
+
default_value: str | None = None,
|
|
311
|
+
case_sensitive: bool = False,
|
|
312
|
+
) -> str | None: ...
|
|
313
|
+
|
|
314
|
+
@deprecated(
|
|
315
|
+
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
|
|
316
|
+
category=None,
|
|
317
|
+
)
|
|
318
|
+
def get_header_value(
|
|
319
|
+
self,
|
|
320
|
+
name: str,
|
|
321
|
+
default_value: str | None = None,
|
|
322
|
+
case_sensitive: bool = False,
|
|
323
|
+
) -> str | None:
|
|
324
|
+
"""Get header value by name
|
|
325
|
+
Parameters
|
|
326
|
+
----------
|
|
327
|
+
name: str
|
|
328
|
+
Header name
|
|
329
|
+
default_value: str, optional
|
|
330
|
+
Default value if no value was found by name
|
|
331
|
+
case_sensitive: bool
|
|
332
|
+
Whether to use a case-sensitive look up
|
|
333
|
+
Returns
|
|
334
|
+
-------
|
|
335
|
+
str, optional
|
|
336
|
+
Header value
|
|
337
|
+
"""
|
|
338
|
+
warnings.warn(
|
|
339
|
+
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
|
|
340
|
+
"no longer has any effect. This function will be removed in the next major version. "
|
|
341
|
+
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
|
|
342
|
+
category=PowertoolsDeprecationWarning,
|
|
343
|
+
stacklevel=2,
|
|
344
|
+
)
|
|
345
|
+
return get_header_value(self.headers, name, default_value, case_sensitive)
|
|
346
|
+
|
|
247
347
|
|
|
248
348
|
class APIGatewayAuthorizerResponseV2:
|
|
249
349
|
"""Api Gateway HTTP API V2 payload authorizer simple response helper
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import warnings
|
|
4
|
+
from typing import Any, overload
|
|
5
|
+
|
|
6
|
+
from typing_extensions import deprecated
|
|
4
7
|
|
|
5
8
|
from aws_lambda_powertools.utilities.data_classes.common import CaseInsensitiveDict, DictWrapper
|
|
9
|
+
from aws_lambda_powertools.utilities.data_classes.shared_functions import (
|
|
10
|
+
get_header_value,
|
|
11
|
+
)
|
|
12
|
+
from aws_lambda_powertools.warnings import PowertoolsDeprecationWarning
|
|
6
13
|
|
|
7
14
|
|
|
8
15
|
def get_identity_object(identity: dict | None) -> Any:
|
|
@@ -212,3 +219,52 @@ class AppSyncResolverEvent(DictWrapper):
|
|
|
212
219
|
stash to pass arbitrary data across request and response mapping templates, and across functions in
|
|
213
220
|
a pipeline resolver."""
|
|
214
221
|
return self.get("stash") or {}
|
|
222
|
+
|
|
223
|
+
@overload
|
|
224
|
+
def get_header_value(
|
|
225
|
+
self,
|
|
226
|
+
name: str,
|
|
227
|
+
default_value: str,
|
|
228
|
+
case_sensitive: bool = False,
|
|
229
|
+
) -> str: ...
|
|
230
|
+
|
|
231
|
+
@overload
|
|
232
|
+
def get_header_value(
|
|
233
|
+
self,
|
|
234
|
+
name: str,
|
|
235
|
+
default_value: str | None = None,
|
|
236
|
+
case_sensitive: bool = False,
|
|
237
|
+
) -> str | None: ...
|
|
238
|
+
|
|
239
|
+
@deprecated(
|
|
240
|
+
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
|
|
241
|
+
category=None,
|
|
242
|
+
)
|
|
243
|
+
def get_header_value(
|
|
244
|
+
self,
|
|
245
|
+
name: str,
|
|
246
|
+
default_value: str | None = None,
|
|
247
|
+
case_sensitive: bool = False,
|
|
248
|
+
) -> str | None:
|
|
249
|
+
"""Get header value by name
|
|
250
|
+
Parameters
|
|
251
|
+
----------
|
|
252
|
+
name: str
|
|
253
|
+
Header name
|
|
254
|
+
default_value: str, optional
|
|
255
|
+
Default value if no value was found by name
|
|
256
|
+
case_sensitive: bool
|
|
257
|
+
Whether to use a case-sensitive look up
|
|
258
|
+
Returns
|
|
259
|
+
-------
|
|
260
|
+
str, optional
|
|
261
|
+
Header value
|
|
262
|
+
"""
|
|
263
|
+
warnings.warn(
|
|
264
|
+
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
|
|
265
|
+
"no longer has any effect. This function will be removed in the next major version. "
|
|
266
|
+
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
|
|
267
|
+
category=PowertoolsDeprecationWarning,
|
|
268
|
+
stacklevel=2,
|
|
269
|
+
)
|
|
270
|
+
return get_header_value(self.request_headers, name, default_value, case_sensitive)
|
|
@@ -2,12 +2,23 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import base64
|
|
4
4
|
import json
|
|
5
|
+
import warnings
|
|
5
6
|
from functools import cached_property
|
|
6
|
-
from typing import TYPE_CHECKING, Any, Callable, Iterator, Mapping
|
|
7
|
+
from typing import TYPE_CHECKING, Any, Callable, Iterator, Mapping, overload
|
|
8
|
+
|
|
9
|
+
from typing_extensions import deprecated
|
|
10
|
+
|
|
11
|
+
from aws_lambda_powertools.warnings import PowertoolsDeprecationWarning
|
|
7
12
|
|
|
8
13
|
if TYPE_CHECKING:
|
|
9
14
|
from aws_lambda_powertools.shared.headers_serializer import BaseHeadersSerializer
|
|
10
15
|
|
|
16
|
+
from aws_lambda_powertools.utilities.data_classes.shared_functions import (
|
|
17
|
+
get_header_value,
|
|
18
|
+
get_multi_value_query_string_values,
|
|
19
|
+
get_query_string_value,
|
|
20
|
+
)
|
|
21
|
+
|
|
11
22
|
|
|
12
23
|
class CaseInsensitiveDict(dict):
|
|
13
24
|
"""Case insensitive dict implementation. Assumes string keys only."""
|
|
@@ -208,6 +219,108 @@ class BaseProxyEvent(DictWrapper):
|
|
|
208
219
|
"""The HTTP method used. Valid values include: DELETE, GET, HEAD, OPTIONS, PATCH, POST, and PUT."""
|
|
209
220
|
return self["httpMethod"]
|
|
210
221
|
|
|
222
|
+
@overload
|
|
223
|
+
def get_query_string_value(self, name: str, default_value: str) -> str: ...
|
|
224
|
+
|
|
225
|
+
@overload
|
|
226
|
+
def get_query_string_value(self, name: str, default_value: str | None = None) -> str | None: ...
|
|
227
|
+
|
|
228
|
+
def get_query_string_value(self, name: str, default_value: str | None = None) -> str | None:
|
|
229
|
+
"""Get query string value by name
|
|
230
|
+
Parameters
|
|
231
|
+
----------
|
|
232
|
+
name: str
|
|
233
|
+
Query string parameter name
|
|
234
|
+
default_value: str, optional
|
|
235
|
+
Default value if no value was found by name
|
|
236
|
+
Returns
|
|
237
|
+
-------
|
|
238
|
+
str, optional
|
|
239
|
+
Query string parameter value
|
|
240
|
+
"""
|
|
241
|
+
return get_query_string_value(
|
|
242
|
+
query_string_parameters=self.query_string_parameters,
|
|
243
|
+
name=name,
|
|
244
|
+
default_value=default_value,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
def get_multi_value_query_string_values(
|
|
248
|
+
self,
|
|
249
|
+
name: str,
|
|
250
|
+
default_values: list[str] | None = None,
|
|
251
|
+
) -> list[str]:
|
|
252
|
+
"""Get multi-value query string parameter values by name
|
|
253
|
+
Parameters
|
|
254
|
+
----------
|
|
255
|
+
name: str
|
|
256
|
+
Multi-Value query string parameter name
|
|
257
|
+
default_values: List[str], optional
|
|
258
|
+
Default values is no values are found by name
|
|
259
|
+
Returns
|
|
260
|
+
-------
|
|
261
|
+
List[str], optional
|
|
262
|
+
List of query string values
|
|
263
|
+
"""
|
|
264
|
+
return get_multi_value_query_string_values(
|
|
265
|
+
multi_value_query_string_parameters=self.multi_value_query_string_parameters,
|
|
266
|
+
name=name,
|
|
267
|
+
default_values=default_values,
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
@overload
|
|
271
|
+
def get_header_value(
|
|
272
|
+
self,
|
|
273
|
+
name: str,
|
|
274
|
+
default_value: str,
|
|
275
|
+
case_sensitive: bool = False,
|
|
276
|
+
) -> str: ...
|
|
277
|
+
|
|
278
|
+
@overload
|
|
279
|
+
def get_header_value(
|
|
280
|
+
self,
|
|
281
|
+
name: str,
|
|
282
|
+
default_value: str | None = None,
|
|
283
|
+
case_sensitive: bool = False,
|
|
284
|
+
) -> str | None: ...
|
|
285
|
+
|
|
286
|
+
@deprecated(
|
|
287
|
+
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
|
|
288
|
+
category=None,
|
|
289
|
+
)
|
|
290
|
+
def get_header_value(
|
|
291
|
+
self,
|
|
292
|
+
name: str,
|
|
293
|
+
default_value: str | None = None,
|
|
294
|
+
case_sensitive: bool = False,
|
|
295
|
+
) -> str | None:
|
|
296
|
+
"""Get header value by name
|
|
297
|
+
Parameters
|
|
298
|
+
----------
|
|
299
|
+
name: str
|
|
300
|
+
Header name
|
|
301
|
+
default_value: str, optional
|
|
302
|
+
Default value if no value was found by name
|
|
303
|
+
case_sensitive: bool
|
|
304
|
+
Whether to use a case-sensitive look up. By default we make a case-insensitive lookup.
|
|
305
|
+
Returns
|
|
306
|
+
-------
|
|
307
|
+
str, optional
|
|
308
|
+
Header value
|
|
309
|
+
"""
|
|
310
|
+
warnings.warn(
|
|
311
|
+
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
|
|
312
|
+
"no longer has any effect. This function will be removed in the next major version. "
|
|
313
|
+
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
|
|
314
|
+
category=PowertoolsDeprecationWarning,
|
|
315
|
+
stacklevel=2,
|
|
316
|
+
)
|
|
317
|
+
return get_header_value(
|
|
318
|
+
headers=self.headers,
|
|
319
|
+
name=name,
|
|
320
|
+
default_value=default_value,
|
|
321
|
+
case_sensitive=case_sensitive,
|
|
322
|
+
)
|
|
323
|
+
|
|
211
324
|
def header_serializer(self) -> BaseHeadersSerializer:
|
|
212
325
|
raise NotImplementedError()
|
|
213
326
|
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import base64
|
|
4
|
+
import warnings
|
|
5
|
+
from typing import Any, overload
|
|
6
|
+
|
|
7
|
+
from typing_extensions import deprecated
|
|
8
|
+
|
|
9
|
+
from aws_lambda_powertools.warnings import PowertoolsDeprecationWarning
|
|
2
10
|
|
|
3
11
|
|
|
4
12
|
def base64_decode(value: str) -> str:
|
|
@@ -16,3 +24,136 @@ def base64_decode(value: str) -> str:
|
|
|
16
24
|
The decoded string value.
|
|
17
25
|
"""
|
|
18
26
|
return base64.b64decode(value).decode("UTF-8")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@overload
|
|
30
|
+
def get_header_value(
|
|
31
|
+
headers: dict[str, Any],
|
|
32
|
+
name: str,
|
|
33
|
+
default_value: str,
|
|
34
|
+
case_sensitive: bool = False,
|
|
35
|
+
) -> str: ...
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@overload
|
|
39
|
+
def get_header_value(
|
|
40
|
+
headers: dict[str, Any],
|
|
41
|
+
name: str,
|
|
42
|
+
default_value: str | None = None,
|
|
43
|
+
case_sensitive: bool = False,
|
|
44
|
+
) -> str | None: ...
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@deprecated(
|
|
48
|
+
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
|
|
49
|
+
category=None,
|
|
50
|
+
)
|
|
51
|
+
def get_header_value(
|
|
52
|
+
headers: dict[str, Any],
|
|
53
|
+
name: str,
|
|
54
|
+
default_value: str | None = None,
|
|
55
|
+
case_sensitive: bool = False,
|
|
56
|
+
) -> str | None:
|
|
57
|
+
"""
|
|
58
|
+
Get the value of a header by its name.
|
|
59
|
+
Parameters
|
|
60
|
+
----------
|
|
61
|
+
headers: Dict[str, str]
|
|
62
|
+
The dictionary of headers.
|
|
63
|
+
name: str
|
|
64
|
+
The name of the header to retrieve.
|
|
65
|
+
default_value: str, optional
|
|
66
|
+
The default value to return if the header is not found. Default is None.
|
|
67
|
+
case_sensitive: bool, optional
|
|
68
|
+
Indicates whether the header name should be case-sensitive. Default is False.
|
|
69
|
+
Returns
|
|
70
|
+
-------
|
|
71
|
+
str, optional
|
|
72
|
+
The value of the header if found, otherwise the default value or None.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
warnings.warn(
|
|
76
|
+
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
|
|
77
|
+
"no longer has any effect. This function will be removed in the next major version. "
|
|
78
|
+
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
|
|
79
|
+
category=PowertoolsDeprecationWarning,
|
|
80
|
+
stacklevel=2,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# If headers is NoneType, return default value
|
|
84
|
+
if not headers:
|
|
85
|
+
return default_value
|
|
86
|
+
|
|
87
|
+
if case_sensitive:
|
|
88
|
+
return headers.get(name, default_value)
|
|
89
|
+
name_lower = name.lower()
|
|
90
|
+
|
|
91
|
+
return next(
|
|
92
|
+
# Iterate over the dict and do a case-insensitive key comparison
|
|
93
|
+
(value for key, value in headers.items() if key.lower() == name_lower),
|
|
94
|
+
# Default value is returned if no matches was found
|
|
95
|
+
default_value,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@overload
|
|
100
|
+
def get_query_string_value(
|
|
101
|
+
query_string_parameters: dict[str, str] | None,
|
|
102
|
+
name: str,
|
|
103
|
+
default_value: str,
|
|
104
|
+
) -> str: ...
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@overload
|
|
108
|
+
def get_query_string_value(
|
|
109
|
+
query_string_parameters: dict[str, str] | None,
|
|
110
|
+
name: str,
|
|
111
|
+
default_value: str | None = None,
|
|
112
|
+
) -> str | None: ...
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def get_query_string_value(
|
|
116
|
+
query_string_parameters: dict[str, str] | None,
|
|
117
|
+
name: str,
|
|
118
|
+
default_value: str | None = None,
|
|
119
|
+
) -> str | None:
|
|
120
|
+
"""
|
|
121
|
+
Retrieves the value of a query string parameter specified by the given name.
|
|
122
|
+
Parameters
|
|
123
|
+
----------
|
|
124
|
+
name: str
|
|
125
|
+
The name of the query string parameter to retrieve.
|
|
126
|
+
default_value: str, optional
|
|
127
|
+
The default value to return if the parameter is not found. Defaults to None.
|
|
128
|
+
Returns
|
|
129
|
+
-------
|
|
130
|
+
str. optional
|
|
131
|
+
The value of the query string parameter if found, or the default value if not found.
|
|
132
|
+
"""
|
|
133
|
+
params = query_string_parameters
|
|
134
|
+
return default_value if params is None else params.get(name, default_value)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def get_multi_value_query_string_values(
|
|
138
|
+
multi_value_query_string_parameters: dict[str, list[str]] | None,
|
|
139
|
+
name: str,
|
|
140
|
+
default_values: list[str] | None = None,
|
|
141
|
+
) -> list[str]:
|
|
142
|
+
"""
|
|
143
|
+
Retrieves the values of a multi-value string parameters specified by the given name.
|
|
144
|
+
Parameters
|
|
145
|
+
----------
|
|
146
|
+
name: str
|
|
147
|
+
The name of the query string parameter to retrieve.
|
|
148
|
+
default_value: list[str], optional
|
|
149
|
+
The default value to return if the parameter is not found. Defaults to None.
|
|
150
|
+
Returns
|
|
151
|
+
-------
|
|
152
|
+
List[str]. optional
|
|
153
|
+
The values of the query string parameter if found, or the default values if not found.
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
default = default_values or []
|
|
157
|
+
params = multi_value_query_string_parameters or {}
|
|
158
|
+
|
|
159
|
+
return params.get(name) or default
|
|
@@ -35,9 +35,7 @@ class VPCLatticeEventBase(BaseProxyEvent):
|
|
|
35
35
|
def decoded_body(self) -> str:
|
|
36
36
|
"""Dynamically base64 decode body as a str"""
|
|
37
37
|
body: str = self["body"]
|
|
38
|
-
if self.is_base64_encoded
|
|
39
|
-
return base64_decode(body)
|
|
40
|
-
return body
|
|
38
|
+
return base64_decode(body) if self.is_base64_encoded else body
|
|
41
39
|
|
|
42
40
|
@property
|
|
43
41
|
def method(self) -> str:
|
|
@@ -92,3 +92,24 @@ class DataRecord:
|
|
|
92
92
|
previous response data deserialized
|
|
93
93
|
"""
|
|
94
94
|
return json.loads(self.response_data) if self.response_data else None
|
|
95
|
+
|
|
96
|
+
def get_expiration_datetime(self) -> datetime.datetime | None:
|
|
97
|
+
"""
|
|
98
|
+
Converts the expiry timestamp to a datetime object.
|
|
99
|
+
|
|
100
|
+
This method checks if an expiry timestamp exists and converts it to a
|
|
101
|
+
datetime object. If no timestamp is present, it returns None.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
-------
|
|
105
|
+
datetime.datetime | None
|
|
106
|
+
A datetime object representing the expiration time, or None if no expiry timestamp is set.
|
|
107
|
+
|
|
108
|
+
Note:
|
|
109
|
+
----
|
|
110
|
+
The returned datetime object is timezone-naive and assumes the timestamp
|
|
111
|
+
is in the system's local timezone. Lambda default timezone is UTC.
|
|
112
|
+
"""
|
|
113
|
+
if self.expiry_timestamp:
|
|
114
|
+
return datetime.datetime.fromtimestamp(int(self.expiry_timestamp))
|
|
115
|
+
return None
|
{aws_lambda_powertools-3.0.0.dev9.dist-info → aws_lambda_powertools-3.0.0.dev11.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: aws-lambda-powertools
|
|
3
|
-
Version: 3.0.0.
|
|
3
|
+
Version: 3.0.0.dev11
|
|
4
4
|
Summary: Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity.
|
|
5
5
|
Home-page: https://github.com/aws-powertools/powertools-lambda-python
|
|
6
6
|
License: MIT
|
{aws_lambda_powertools-3.0.0.dev9.dist-info → aws_lambda_powertools-3.0.0.dev11.dist-info}/RECORD
RENAMED
|
@@ -13,19 +13,19 @@ aws_lambda_powertools/event_handler/middlewares/openapi_validation.py,sha256=ss7
|
|
|
13
13
|
aws_lambda_powertools/event_handler/middlewares/schema_validation.py,sha256=c3i04kuq_T341_1xxiEw_LZr43H_kU0HY80lIHPNDz8,5205
|
|
14
14
|
aws_lambda_powertools/event_handler/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
15
|
aws_lambda_powertools/event_handler/openapi/compat.py,sha256=iY9bpPZMg5bs1ndf8r1ezRFWooiD5sb68PiawtM8u9w,10857
|
|
16
|
-
aws_lambda_powertools/event_handler/openapi/constants.py,sha256=
|
|
16
|
+
aws_lambda_powertools/event_handler/openapi/constants.py,sha256=79IF4spKAHvMAO3bQARCIENM5rIFX5BSwdjfUNl3XT4,64
|
|
17
17
|
aws_lambda_powertools/event_handler/openapi/dependant.py,sha256=RTYgsWmRyV5mOC5FedKbcInR4Q4n57nc7EdOsCn2nrk,12521
|
|
18
18
|
aws_lambda_powertools/event_handler/openapi/encoders.py,sha256=guQRV6CcLgLWUh-XRzfP5rsDPS_kNFz2cGf0xKl_tGU,10220
|
|
19
19
|
aws_lambda_powertools/event_handler/openapi/exceptions.py,sha256=T8Zn4Iq0IeDOrvqDoBi7rQCCkIw0Ya8rl9E1BMwdxP8,559
|
|
20
|
-
aws_lambda_powertools/event_handler/openapi/models.py,sha256=
|
|
20
|
+
aws_lambda_powertools/event_handler/openapi/models.py,sha256=3N7ACecMmlorXpixT2To6ZX-FGu1s4S7YRozLz8pBHk,15551
|
|
21
21
|
aws_lambda_powertools/event_handler/openapi/params.py,sha256=b8V9D35VHH6MGzbMHcMZtPpegTrqSKohSBbvGn53Om4,41119
|
|
22
22
|
aws_lambda_powertools/event_handler/openapi/pydantic_loader.py,sha256=Bud_yzI_Cao7UN_9zx6NeP0H2rQOZJbdbDAjgtthB-g,217
|
|
23
23
|
aws_lambda_powertools/event_handler/openapi/swagger_ui/__init__.py,sha256=52wY3inOe1EPunrNl5cUqVQWHM6FsJHU5wpObSAX7-M,335
|
|
24
24
|
aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py,sha256=z1xLx7obaHUdZYpyuO7HkWfn5PMxn2lQlo4a-DBtCgA,2827
|
|
25
|
-
aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py,sha256=
|
|
25
|
+
aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py,sha256=YEG3ICbwtArNrUYWZARcD4npULajyID5odB3VZ5zpe8,5561
|
|
26
26
|
aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui-bundle.min.js,sha256=s_tWqUyVGy4dmU9BppKMNDoKgC9Q9qzvnB3XJEtGEQk,1265807
|
|
27
27
|
aws_lambda_powertools/event_handler/openapi/swagger_ui/swagger-ui.min.css,sha256=Q0DBjhDAqyjE6KmzTrq1DGYU1UeF7aHQSuTiou_pLS0,151723
|
|
28
|
-
aws_lambda_powertools/event_handler/openapi/types.py,sha256=
|
|
28
|
+
aws_lambda_powertools/event_handler/openapi/types.py,sha256=IcARgTPNeSH8tbU1UFz9n4IZeAnInjXmtdUpQRvBZ4k,1765
|
|
29
29
|
aws_lambda_powertools/event_handler/router.py,sha256=cxL3MtN2Q8_RkPndNtAAcjJSqDJ4WN02dro_O83nxAM,980
|
|
30
30
|
aws_lambda_powertools/event_handler/types.py,sha256=yppbl_2wdyXSK_oTkSnkwPdAlJibc-uTm1IWmlB1RfU,177
|
|
31
31
|
aws_lambda_powertools/event_handler/util.py,sha256=7d_Bl3LouPB_lx3ssiHvkSoEhHMBAk38KKAGce5YvT0,1160
|
|
@@ -79,7 +79,7 @@ aws_lambda_powertools/shared/json_encoder.py,sha256=JQeWNu-4M7_xI_hqYExrxsb3OcEH
|
|
|
79
79
|
aws_lambda_powertools/shared/lazy_import.py,sha256=TbXQm2bcwXdZrYdBaJJXIswyLlumM85RJ_A_0w-h-GU,2019
|
|
80
80
|
aws_lambda_powertools/shared/types.py,sha256=APkI38HbiTpSF19NSNii8Ydx73vmVUVotgEQ9jHruEI,124
|
|
81
81
|
aws_lambda_powertools/shared/user_agent.py,sha256=DrCMFQuT4a4iIrpcWpAIjY37EFqR9-QxlxDGD-Nn9Gg,7081
|
|
82
|
-
aws_lambda_powertools/shared/version.py,sha256=
|
|
82
|
+
aws_lambda_powertools/shared/version.py,sha256=DxZibxPis5bKle-m68iMuw6zd-sFlinFJKUeeLwPdeQ,88
|
|
83
83
|
aws_lambda_powertools/tracing/__init__.py,sha256=Zdk7mE8lUMICbYOnx_1yFjvghzoPOpPmRv-Wkj-kzkU,142
|
|
84
84
|
aws_lambda_powertools/tracing/base.py,sha256=VNqc9CtywKJSuD1H0etuFVzUgpyfskQ9e1N2m_S28R0,4416
|
|
85
85
|
aws_lambda_powertools/tracing/extensions.py,sha256=APOfXOq-hRBKaK5WyfIyrd_6M1_9SWJZ3zxLA9jDZzU,492
|
|
@@ -94,12 +94,12 @@ aws_lambda_powertools/utilities/batch/types.py,sha256=XgUSbOIfzY4d2z3cFntQHAe6hc
|
|
|
94
94
|
aws_lambda_powertools/utilities/data_classes/__init__.py,sha256=Aeo1Z49JN36WxslUojIQxmfe2C8i2IP1Nn_FhWzUyzw,2961
|
|
95
95
|
aws_lambda_powertools/utilities/data_classes/active_mq_event.py,sha256=gJPzcSmw1JsPGKZHUkVGNjveuqQ6OpaibWy6WfJZyHQ,4373
|
|
96
96
|
aws_lambda_powertools/utilities/data_classes/alb_event.py,sha256=3WUxCa9tympp9isYD7-WylR93aD6gB4td0it4W99fH8,1997
|
|
97
|
-
aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py,sha256=
|
|
97
|
+
aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py,sha256=ntT2Wzb1KMsAfGbm3E67Nha5DwpBmv_zV13PYEdfU5U,21288
|
|
98
98
|
aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py,sha256=NzH97yxoJLbkzDlTVALlvM9yJMlZhWZFJEZ5OoiJPX8,10919
|
|
99
99
|
aws_lambda_powertools/utilities/data_classes/appsync/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
100
100
|
aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py,sha256=EjaJKZsPwyM6XY-FrooZzadfAtvZRbYS1BHiyQi-GrQ,2662
|
|
101
101
|
aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py,sha256=49tvu-4w7fB7piJUkyIrS5HoDoK7M8r8AvLJCPTh4Kc,3929
|
|
102
|
-
aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py,sha256=
|
|
102
|
+
aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py,sha256=bqsfH60i7_d8OsNsr-jN-eGx9MyMvMmc0-jn_mQ-wPQ,8994
|
|
103
103
|
aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py,sha256=BwSG8R96yGLlYRgY0qe2Y49k2gGvkXkfsglvMuES38s,12228
|
|
104
104
|
aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py,sha256=u1hYHhZXD1BHrC5NVO6nzdwtAGFt-yhFXQgrRBAbijs,3624
|
|
105
105
|
aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py,sha256=_5IOvCWhyQvbmmzV4Xg6Yee1LKyLe4oBeYmAMxoRlEA,6398
|
|
@@ -108,7 +108,7 @@ aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py,sha256=uu
|
|
|
108
108
|
aws_lambda_powertools/utilities/data_classes/cloudformation_custom_resource_event.py,sha256=EextMoBG9v_e5bS9Q1DlzVvzljGtIL1ddBszt5fgTeY,1191
|
|
109
109
|
aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py,sha256=dj3RXkOnnIyIyxqoUcekeDN_5SJV_6-xgM-pJrDLyhs,8098
|
|
110
110
|
aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py,sha256=VINf71ovp34QtlhDQLcpyhl7_8pNO8UMzqILEGEI7bk,32549
|
|
111
|
-
aws_lambda_powertools/utilities/data_classes/common.py,sha256=
|
|
111
|
+
aws_lambda_powertools/utilities/data_classes/common.py,sha256=JbJBu_9ESITyLqDK3zPqV4A2EEWrLBQXz6V3xVbZ1p4,20374
|
|
112
112
|
aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py,sha256=4_L73ATO-M_2zUD3r0zS4c6I4zoLxTK9l8JQc-dATog,5468
|
|
113
113
|
aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py,sha256=BrgOyFREC9gjj_ULhKB3L_7EbQ6ptV-8Was1TulPeWE,6102
|
|
114
114
|
aws_lambda_powertools/utilities/data_classes/event_bridge_event.py,sha256=TeTtx2jOKyZSVdSPFrtxZUgv0Yt6HW_H7J5NNxy_mHo,2434
|
|
@@ -123,10 +123,10 @@ aws_lambda_powertools/utilities/data_classes/s3_event.py,sha256=pUYnL33eCdMFVl-s
|
|
|
123
123
|
aws_lambda_powertools/utilities/data_classes/s3_object_event.py,sha256=iccgwNIiZF879jQOGGRMuDHIFAthpMzD0Wa38eE2Dn8,12349
|
|
124
124
|
aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py,sha256=5G7Qg04-wCMNHSqKB1KWOGaaPfykEf9rdOxifYsqeMg,869
|
|
125
125
|
aws_lambda_powertools/utilities/data_classes/ses_event.py,sha256=dqZ89HoOxA-ZXr1G_yva9CGhVhtzHHQ4Hf1S-s9Vu00,8844
|
|
126
|
-
aws_lambda_powertools/utilities/data_classes/shared_functions.py,sha256=
|
|
126
|
+
aws_lambda_powertools/utilities/data_classes/shared_functions.py,sha256=zAv_JzSJy_k3ZhLKyARXoX6zH7exqw9pjTDsmGB7qxw,4426
|
|
127
127
|
aws_lambda_powertools/utilities/data_classes/sns_event.py,sha256=bUL57gmObClTGrd_TFBLd1sNobnaurum0QkXyOJoNmI,3853
|
|
128
128
|
aws_lambda_powertools/utilities/data_classes/sqs_event.py,sha256=seWIKCpPbzKpPdXZWvrs94C92Nj2XwfGC1vXcI5gdQA,8804
|
|
129
|
-
aws_lambda_powertools/utilities/data_classes/vpc_lattice.py,sha256=
|
|
129
|
+
aws_lambda_powertools/utilities/data_classes/vpc_lattice.py,sha256=oIyQPFHAPGrNVW6hnlYipKhXSWjGpzzLRb-eKq6pdww,6394
|
|
130
130
|
aws_lambda_powertools/utilities/data_masking/__init__.py,sha256=Ez0MABo8ARkgWKSu8Dog4uFSkkZuHkW7DoWcexJGeyU,108
|
|
131
131
|
aws_lambda_powertools/utilities/data_masking/base.py,sha256=6Z3VGDH0ZmUiCIFoqFhd0_3JeU7v2S4_L6yFDwve60k,10461
|
|
132
132
|
aws_lambda_powertools/utilities/data_masking/constants.py,sha256=hKeeWDE4g53zxCq6fOD0D1vUTjuqVXNrr9oXCv-7mGg,752
|
|
@@ -152,7 +152,7 @@ aws_lambda_powertools/utilities/idempotency/hook.py,sha256=XHj6q0dP65C8Cj-TPJ9a8
|
|
|
152
152
|
aws_lambda_powertools/utilities/idempotency/idempotency.py,sha256=z5Ctxlp5WH5419L6k2CgL9dVnsMGQPwTez74Vkz_K3Q,6097
|
|
153
153
|
aws_lambda_powertools/utilities/idempotency/persistence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
154
154
|
aws_lambda_powertools/utilities/idempotency/persistence/base.py,sha256=VBnWo2E8r09kWfE5Gg45E-A6Bo_nsad1wUGz9hLNmb8,15565
|
|
155
|
-
aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py,sha256=
|
|
155
|
+
aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py,sha256=qqX-Z5GxzoTOE7URFRLyLKesKTOetwE19FCrctulxrQ,3496
|
|
156
156
|
aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py,sha256=ABgvDqtl2PilHrOFeElMa3lzp7QU8J1RZlZNS2tlxCI,13818
|
|
157
157
|
aws_lambda_powertools/utilities/idempotency/persistence/redis.py,sha256=TOsKuJLNWQ5_2XZ7i9hVOQ8qLTffXCWrcSmSjX-F3NM,21589
|
|
158
158
|
aws_lambda_powertools/utilities/idempotency/serialization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -239,7 +239,7 @@ aws_lambda_powertools/utilities/validation/envelopes.py,sha256=YD5HOFx6IClQgii0n
|
|
|
239
239
|
aws_lambda_powertools/utilities/validation/exceptions.py,sha256=F-Wpkb3yChHDLgDTKaQy4ngpaMXXH3NJxe27UHoM_dA,2043
|
|
240
240
|
aws_lambda_powertools/utilities/validation/validator.py,sha256=0eMxxPxxKIlANBYWImm3LYShj6SL0V8pxQL-Fv4GQGk,8231
|
|
241
241
|
aws_lambda_powertools/warnings/__init__.py,sha256=vqDVeZz8wGtD8WGYNSkQE7AHwqtIrPGRxuoJR_BBnSs,1193
|
|
242
|
-
aws_lambda_powertools-3.0.0.
|
|
243
|
-
aws_lambda_powertools-3.0.0.
|
|
244
|
-
aws_lambda_powertools-3.0.0.
|
|
245
|
-
aws_lambda_powertools-3.0.0.
|
|
242
|
+
aws_lambda_powertools-3.0.0.dev11.dist-info/LICENSE,sha256=vMHS2eBgmwPUIMPb7LQ4p7ib_FPVQXarVjAasflrTwo,951
|
|
243
|
+
aws_lambda_powertools-3.0.0.dev11.dist-info/METADATA,sha256=igyminRHSEcQgs9xorhVExfQ5TEy5P7Idf3YvhrfK4c,10734
|
|
244
|
+
aws_lambda_powertools-3.0.0.dev11.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
|
|
245
|
+
aws_lambda_powertools-3.0.0.dev11.dist-info/RECORD,,
|
{aws_lambda_powertools-3.0.0.dev9.dist-info → aws_lambda_powertools-3.0.0.dev11.dist-info}/LICENSE
RENAMED
|
File without changes
|
{aws_lambda_powertools-3.0.0.dev9.dist-info → aws_lambda_powertools-3.0.0.dev11.dist-info}/WHEEL
RENAMED
|
File without changes
|