aws-lambda-powertools 3.9.1a7__py3-none-any.whl → 3.9.1a9__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.
@@ -357,19 +357,25 @@ class LambdaPowertoolsFormatter(BasePowertoolsFormatter):
357
357
  return message
358
358
 
359
359
  def _serialize_stacktrace(self, log_record: logging.LogRecord) -> LogStackTrace | None:
360
- if log_record.exc_info:
360
+ # Check if the first element of exc_info has the __name__ attribute,
361
+ # which indicates it is likely an exception class or object.
362
+ # See: https://github.com/aws-powertools/powertools-lambda-python/issues/6358
363
+ if isinstance(log_record.exc_info, tuple) and hasattr(log_record.exc_info[0], "__name__"):
361
364
  exception_info: LogStackTrace = {
362
365
  "type": log_record.exc_info[0].__name__, # type: ignore
363
366
  "value": log_record.exc_info[1], # type: ignore
364
367
  "module": log_record.exc_info[1].__class__.__module__,
365
- "frames": [],
368
+ "frames": [
369
+ {
370
+ "file": fs.filename,
371
+ "line": fs.lineno,
372
+ "function": fs.name,
373
+ "statement": fs.line,
374
+ }
375
+ for fs in traceback.extract_tb(log_record.exc_info[2])
376
+ ],
366
377
  }
367
378
 
368
- exception_info["frames"] = [
369
- {"file": fs.filename, "line": fs.lineno, "function": fs.name, "statement": fs.line}
370
- for fs in traceback.extract_tb(log_record.exc_info[2])
371
- ]
372
-
373
379
  return exception_info
374
380
 
375
381
  return None
@@ -387,7 +393,7 @@ class LambdaPowertoolsFormatter(BasePowertoolsFormatter):
387
393
  log_record: tuple[str, str] | tuple[None, None]
388
394
  Log record with constant traceback info and exception name
389
395
  """
390
- if log_record.exc_info:
396
+ if isinstance(log_record.exc_info, tuple) and hasattr(log_record.exc_info[0], "__name__"):
391
397
  return self.formatException(log_record.exc_info), log_record.exc_info[0].__name__ # type: ignore
392
398
 
393
399
  return None, None
@@ -1,3 +1,3 @@
1
1
  """Exposes version constant to avoid circular dependencies."""
2
2
 
3
- VERSION = "3.9.1a7"
3
+ VERSION = "3.9.1a9"
@@ -123,6 +123,14 @@ class APIGatewayWebSocketEvent(DictWrapper):
123
123
  def multi_value_headers(self) -> dict[str, list[str]]:
124
124
  return CaseInsensitiveDict(self.get("multiValueHeaders"))
125
125
 
126
+ @property
127
+ def query_string_parameters(self) -> dict[str, str]:
128
+ return CaseInsensitiveDict(self.get("queryStringParameters"))
129
+
130
+ @property
131
+ def multi_value_query_string_parameters(self) -> dict[str, list[str]]:
132
+ return CaseInsensitiveDict(self.get("multiValueQueryStringParameters"))
133
+
126
134
  @property
127
135
  def request_context(self) -> APIGatewayWebSocketEventRequestContext:
128
136
  return APIGatewayWebSocketEventRequestContext(self["requestContext"])
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import json
3
4
  from typing import Any, Literal
4
5
 
5
6
  from aws_lambda_powertools.utilities.data_classes.common import (
@@ -44,7 +45,7 @@ class TransferFamilyAuthorizerResponse:
44
45
  role_arn: str,
45
46
  policy: str | None = None,
46
47
  home_directory: str | None = None,
47
- home_directory_details: dict | None = None,
48
+ home_directory_details: list[dict] | None = None,
48
49
  home_directory_type: Literal["LOGICAL", "PATH"] = "PATH",
49
50
  user_gid: int | None = None,
50
51
  user_uid: int | None = None,
@@ -62,7 +63,7 @@ class TransferFamilyAuthorizerResponse:
62
63
  if not home_directory_details:
63
64
  raise ValueError("home_directory_details must be set when home_directory_type is LOGICAL")
64
65
 
65
- response["HomeDirectoryDetails"] = [home_directory_details]
66
+ response["HomeDirectoryDetails"] = json.dumps(home_directory_details)
66
67
 
67
68
  else:
68
69
  raise ValueError(f"Invalid home_directory_type: {home_directory_type}")
@@ -88,7 +89,7 @@ class TransferFamilyAuthorizerResponse:
88
89
  user_uid: int,
89
90
  policy: str | None = None,
90
91
  home_directory: str | None = None,
91
- home_directory_details: dict | None = None,
92
+ home_directory_details: list[dict] | None = None,
92
93
  home_directory_type: Literal["LOGICAL", "PATH"] = "PATH",
93
94
  public_keys: str | None = None,
94
95
  ) -> dict[str, Any]:
@@ -143,7 +144,7 @@ class TransferFamilyAuthorizerResponse:
143
144
  role_arn: str,
144
145
  policy: str | None = None,
145
146
  home_directory: str | None = None,
146
- home_directory_details: dict | None = None,
147
+ home_directory_details: list[dict] | None = None,
147
148
  home_directory_type: Literal["LOGICAL", "PATH"] = "PATH",
148
149
  public_keys: str | None = None,
149
150
  ) -> dict[str, Any]:
@@ -27,6 +27,9 @@ from .apigwv2 import (
27
27
  RequestContextV2AuthorizerJwt,
28
28
  RequestContextV2Http,
29
29
  )
30
+ from .appsync import (
31
+ AppSyncResolverEventModel,
32
+ )
30
33
  from .bedrock_agent import (
31
34
  BedrockAgentEventModel,
32
35
  BedrockAgentModel,
@@ -137,6 +140,7 @@ __all__ = [
137
140
  "AlbModel",
138
141
  "AlbRequestContext",
139
142
  "AlbRequestContextData",
143
+ "AppSyncResolverEventModel",
140
144
  "DynamoDBStreamModel",
141
145
  "EventBridgeModel",
142
146
  "DynamoDBStreamChangedRecordModel",
@@ -0,0 +1,72 @@
1
+ from typing import Any, Dict, List, Optional, Union
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class AppSyncIamIdentity(BaseModel):
7
+ accountId: str
8
+ cognitoIdentityPoolId: Optional[str]
9
+ cognitoIdentityId: Optional[str]
10
+ sourceIp: List[str]
11
+ username: str
12
+ userArn: str
13
+ cognitoIdentityAuthType: Optional[str]
14
+ cognitoIdentityAuthProvider: Optional[str]
15
+
16
+
17
+ class AppSyncCognitoIdentity(BaseModel):
18
+ sub: str
19
+ issuer: str
20
+ username: str
21
+ claims: Dict[str, Any]
22
+ sourceIp: List[str]
23
+ defaultAuthStrategy: str
24
+ groups: Optional[List[str]]
25
+
26
+
27
+ class AppSyncOidcIdentity(BaseModel):
28
+ claims: Dict[str, Any]
29
+ issuer: str
30
+ sub: str
31
+
32
+
33
+ class AppSyncLambdaIdentity(BaseModel):
34
+ resolverContext: Dict[str, Any]
35
+
36
+
37
+ AppSyncIdentity = Union[
38
+ AppSyncIamIdentity,
39
+ AppSyncCognitoIdentity,
40
+ AppSyncOidcIdentity,
41
+ AppSyncLambdaIdentity,
42
+ ]
43
+
44
+
45
+ class AppSyncRequestModel(BaseModel):
46
+ domainName: Optional[str]
47
+ headers: Dict[str, str]
48
+
49
+
50
+ class AppSyncInfoModel(BaseModel):
51
+ selectionSetList: List[str]
52
+ selectionSetGraphQL: str
53
+ parentTypeName: str
54
+ fieldName: str
55
+ variables: Dict[str, Any]
56
+
57
+
58
+ class AppSyncPrevModel(BaseModel):
59
+ result: Dict[str, Any]
60
+
61
+
62
+ class AppSyncResolverEventModel(BaseModel):
63
+ arguments: Dict[str, Any]
64
+ identity: Optional[AppSyncIdentity]
65
+ source: Optional[Dict[str, Any]]
66
+ request: AppSyncRequestModel
67
+ info: AppSyncInfoModel
68
+ prev: Optional[AppSyncPrevModel]
69
+ stash: Dict[str, Any]
70
+
71
+
72
+ AppSyncBatchResolverEventModel = List[AppSyncResolverEventModel]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: aws_lambda_powertools
3
- Version: 3.9.1a7
3
+ Version: 3.9.1a9
4
4
  Summary: Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity.
5
5
  License: MIT
6
6
  Keywords: aws_lambda_powertools,aws,tracing,logging,lambda,powertools,feature_flags,idempotency,middleware
@@ -45,7 +45,7 @@ aws_lambda_powertools/logging/constants.py,sha256=P0XgbCmG4NiP96kx0qxe6QUC3ShN12
45
45
  aws_lambda_powertools/logging/correlation_paths.py,sha256=uHHrl03aWzpOsrGHZ-9E6PNoMFyKjv3APNMMkI1EN_c,411
46
46
  aws_lambda_powertools/logging/exceptions.py,sha256=Fe_jk8O9vgUSUHxxOkz6Ev521aXsgPkMgA9Hb1nBn6g,232
47
47
  aws_lambda_powertools/logging/filters.py,sha256=icet1o3-QSSvrmj2udL4ZYT0msf5b3rXj5l7p6dAxAs,523
48
- aws_lambda_powertools/logging/formatter.py,sha256=dmE6XXmkWVkYbWdy1Kg69TYJJ0yDXfbK7LY6lLex_Mc,18618
48
+ aws_lambda_powertools/logging/formatter.py,sha256=hWyxAubdJeiHEuCNH2JnPYWEACh0ApLqVfCedEJHrEU,19072
49
49
  aws_lambda_powertools/logging/formatters/__init__.py,sha256=OqddpJcWMqRYhx5SFy-SPqtt72tkRZbfpEi_oCC47eI,301
50
50
  aws_lambda_powertools/logging/formatters/datadog.py,sha256=NwaaBOp7jIlOAH158NzyvW-EwmWqqnYX9f7Uu_nIUYQ,3169
51
51
  aws_lambda_powertools/logging/lambda_context.py,sha256=VHst_6hxMpXgScoxNwaC61UXPTIdd3AEBHTPzb4esPc,1736
@@ -88,7 +88,7 @@ aws_lambda_powertools/shared/json_encoder.py,sha256=JQeWNu-4M7_xI_hqYExrxsb3OcEH
88
88
  aws_lambda_powertools/shared/lazy_import.py,sha256=TbXQm2bcwXdZrYdBaJJXIswyLlumM85RJ_A_0w-h-GU,2019
89
89
  aws_lambda_powertools/shared/types.py,sha256=APkI38HbiTpSF19NSNii8Ydx73vmVUVotgEQ9jHruEI,124
90
90
  aws_lambda_powertools/shared/user_agent.py,sha256=DrCMFQuT4a4iIrpcWpAIjY37EFqR9-QxlxDGD-Nn9Gg,7081
91
- aws_lambda_powertools/shared/version.py,sha256=9VykkNPi5Q1nSrWafqVGCm7KwfYdiltz6WNhv90NLq0,84
91
+ aws_lambda_powertools/shared/version.py,sha256=nYtbRI1F1gKQqHYK75BqTxsNe1gX02ki7UnyyxdXBcw,84
92
92
  aws_lambda_powertools/tracing/__init__.py,sha256=f4bMThOPBPWTPVcYqcAIErAJPerMsf3H_Z4gCXCsK9I,141
93
93
  aws_lambda_powertools/tracing/base.py,sha256=DbLD8OSK05KLdSV36oNA5wDSGv8KbcOD19qMUqoXh58,4513
94
94
  aws_lambda_powertools/tracing/extensions.py,sha256=APOfXOq-hRBKaK5WyfIyrd_6M1_9SWJZ3zxLA9jDZzU,492
@@ -105,7 +105,7 @@ aws_lambda_powertools/utilities/data_classes/active_mq_event.py,sha256=gJPzcSmw1
105
105
  aws_lambda_powertools/utilities/data_classes/alb_event.py,sha256=cHfLaAWwhSuIk-H52xIA4Mq1nx8b0tDxN0slPy0ZamQ,1836
106
106
  aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py,sha256=dmoR9aIbhqRIrFKX__BFxvbkYl3fr72RbLct7hG5f04,27034
107
107
  aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py,sha256=X5SxZDjVROT4h9xxw3CqZ5YAPD6m1w48CSG4sPpUPe8,10412
108
- aws_lambda_powertools/utilities/data_classes/api_gateway_websocket_event.py,sha256=B_B5tMJhwqGjVKwLjlu9CqOauP3c3_eByPvFPbU1_pc,3214
108
+ aws_lambda_powertools/utilities/data_classes/api_gateway_websocket_event.py,sha256=6Ou7KMRn1OA-ri3zrBaqLpirL6NgXDJ7ba9ogq8rZBw,3526
109
109
  aws_lambda_powertools/utilities/data_classes/appsync/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
110
  aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py,sha256=EjaJKZsPwyM6XY-FrooZzadfAtvZRbYS1BHiyQi-GrQ,2662
111
111
  aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py,sha256=312D_hbPpCFK3978Ruhu91du5pj0N-5GeJ0rj9jZxk4,3833
@@ -138,7 +138,7 @@ aws_lambda_powertools/utilities/data_classes/ses_event.py,sha256=ViKTSB4N-7Kljfu
138
138
  aws_lambda_powertools/utilities/data_classes/shared_functions.py,sha256=zAv_JzSJy_k3ZhLKyARXoX6zH7exqw9pjTDsmGB7qxw,4426
139
139
  aws_lambda_powertools/utilities/data_classes/sns_event.py,sha256=bUL57gmObClTGrd_TFBLd1sNobnaurum0QkXyOJoNmI,3853
140
140
  aws_lambda_powertools/utilities/data_classes/sqs_event.py,sha256=seWIKCpPbzKpPdXZWvrs94C92Nj2XwfGC1vXcI5gdQA,8804
141
- aws_lambda_powertools/utilities/data_classes/transfer_family_event.py,sha256=oagD9jtaplGRMeKx0-hiL0og_Hfv5g_nI_UWzQ1jXaA,6816
141
+ aws_lambda_powertools/utilities/data_classes/transfer_family_event.py,sha256=gfPvQeur8bBXl5gq46sc_z3Oz3JTnRlM7iXUK5cbjic,6856
142
142
  aws_lambda_powertools/utilities/data_classes/vpc_lattice.py,sha256=SEZUvRTMsI-iQi7hcpqaKqYtJLYqIxX5ijqmeTSrf9E,6363
143
143
  aws_lambda_powertools/utilities/data_masking/__init__.py,sha256=Ez0MABo8ARkgWKSu8Dog4uFSkkZuHkW7DoWcexJGeyU,108
144
144
  aws_lambda_powertools/utilities/data_masking/base.py,sha256=66zN6M9B0gEEdoGqp9MKnORv_RMQdEeW8W_IrwfHa1I,16707
@@ -206,11 +206,12 @@ aws_lambda_powertools/utilities/parser/envelopes/vpc_lattice.py,sha256=RIwj1CQJ_
206
206
  aws_lambda_powertools/utilities/parser/envelopes/vpc_latticev2.py,sha256=DGLibAGblJPPe1wC-9gvNWR8LusAzTeTLxwc3cizHzY,1264
207
207
  aws_lambda_powertools/utilities/parser/exceptions.py,sha256=y6DXKUg48xgvswqMAxOYaUGRAqJgg8sm_F8JORgCa1U,207
208
208
  aws_lambda_powertools/utilities/parser/functions.py,sha256=OOcp9xFPrS4e1U8-zHP8bcJ4iTUNmEVYf1EN2yqaCiY,2497
209
- aws_lambda_powertools/utilities/parser/models/__init__.py,sha256=kmDLqM3ABDisce2-57uk8UAeGCaCJ6g0jCnyUFB1iRw,6268
209
+ aws_lambda_powertools/utilities/parser/models/__init__.py,sha256=WgO-VvHed50FDQzU4HZjYAjiiuW9yLjeLrf-PYx-7Lo,6357
210
210
  aws_lambda_powertools/utilities/parser/models/alb.py,sha256=lJPWPjz0_4Hz9Pkpap3NRvScSI3RWC7o4dFYt4F7LLM,439
211
211
  aws_lambda_powertools/utilities/parser/models/apigw.py,sha256=_UbZXcfdcz7U-MrixXor4sc-VkNIuJAj9uwqjJTlhKg,3494
212
212
  aws_lambda_powertools/utilities/parser/models/apigw_websocket.py,sha256=Pi3R9qFudSrujGz_s3m7BfpX_r7FebcYtbomDAetIrA,3004
213
213
  aws_lambda_powertools/utilities/parser/models/apigwv2.py,sha256=x-v1vwVFwf2pGrkZfRri6ZmhHazeVPr1mHyD3R_vH30,2134
214
+ aws_lambda_powertools/utilities/parser/models/appsync.py,sha256=mFzfTZgQ98zxwPKQoNRTTx9tQknumJ0J4PaiGaNzHu8,1554
214
215
  aws_lambda_powertools/utilities/parser/models/bedrock_agent.py,sha256=YFu2cFxBZtb2ndweS3Q2iz4E94jyb8lB4xq14xPwq00,1241
215
216
  aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py,sha256=DySFMeZ50qOZ1FkwSzM70IlcCmjKkoynmmKqLYfTL6E,1465
216
217
  aws_lambda_powertools/utilities/parser/models/cloudwatch.py,sha256=1y2WmgBbIo6GkEtw75YzNaz9qREHl_-ThT0Iz7Ntd_k,1291
@@ -257,7 +258,7 @@ aws_lambda_powertools/utilities/validation/envelopes.py,sha256=YD5HOFx6IClQgii0n
257
258
  aws_lambda_powertools/utilities/validation/exceptions.py,sha256=PKy_19zQMBJGCMMFl-sMkcm-cc0v3zZBn_bhGE4wKNo,2084
258
259
  aws_lambda_powertools/utilities/validation/validator.py,sha256=x_1qpuKJBuWpgNU-zCD3Di-vXrZfyUu7oA5RmjZjr84,10034
259
260
  aws_lambda_powertools/warnings/__init__.py,sha256=vqDVeZz8wGtD8WGYNSkQE7AHwqtIrPGRxuoJR_BBnSs,1193
260
- aws_lambda_powertools-3.9.1a7.dist-info/LICENSE,sha256=vMHS2eBgmwPUIMPb7LQ4p7ib_FPVQXarVjAasflrTwo,951
261
- aws_lambda_powertools-3.9.1a7.dist-info/METADATA,sha256=7fPfp1bRMDG85BI8ug82SlfEX05aRuvYPouCS88H-70,11186
262
- aws_lambda_powertools-3.9.1a7.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
263
- aws_lambda_powertools-3.9.1a7.dist-info/RECORD,,
261
+ aws_lambda_powertools-3.9.1a9.dist-info/LICENSE,sha256=vMHS2eBgmwPUIMPb7LQ4p7ib_FPVQXarVjAasflrTwo,951
262
+ aws_lambda_powertools-3.9.1a9.dist-info/METADATA,sha256=GDxtPE_niHzpDeIGa21J0EEMf55zXoaHPIWdDyejWuw,11186
263
+ aws_lambda_powertools-3.9.1a9.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
264
+ aws_lambda_powertools-3.9.1a9.dist-info/RECORD,,