aws-lambda-powertools 3.12.1a5__py3-none-any.whl → 3.12.1a7__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.
@@ -1,3 +1,3 @@
1
1
  """Exposes version constant to avoid circular dependencies."""
2
2
 
3
- VERSION = "3.12.1a5"
3
+ VERSION = "3.12.1a7"
@@ -140,12 +140,25 @@ class DynamoDBRecord(DictWrapper):
140
140
  return self.get("userIdentity") or {}
141
141
 
142
142
 
143
+ class DynamoDBStreamWindow(DictWrapper):
144
+ @property
145
+ def start(self) -> str:
146
+ """The time window started"""
147
+ return self["start"]
148
+
149
+ @property
150
+ def end(self) -> str:
151
+ """The time window will end"""
152
+ return self["end"]
153
+
154
+
143
155
  class DynamoDBStreamEvent(DictWrapper):
144
156
  """Dynamo DB Stream Event
145
157
 
146
158
  Documentation:
147
159
  -------------
148
160
  - https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html
161
+ - https://docs.aws.amazon.com/lambda/latest/dg/services-ddb-windows.html
149
162
 
150
163
  Example
151
164
  -------
@@ -167,3 +180,30 @@ class DynamoDBStreamEvent(DictWrapper):
167
180
  def records(self) -> Iterator[DynamoDBRecord]:
168
181
  for record in self["Records"]:
169
182
  yield DynamoDBRecord(record)
183
+
184
+ @property
185
+ def window(self) -> DynamoDBStreamWindow | None:
186
+ window = self.get("window")
187
+ if window:
188
+ return DynamoDBStreamWindow(window)
189
+ return window
190
+
191
+ @property
192
+ def state(self) -> dict[str, Any]:
193
+ return self.get("state") or {}
194
+
195
+ @property
196
+ def shard_id(self) -> str | None:
197
+ return self.get("shardId")
198
+
199
+ @property
200
+ def event_source_arn(self) -> str | None:
201
+ return self.get("eventSourceARN")
202
+
203
+ @property
204
+ def is_final_invoke_for_window(self) -> bool | None:
205
+ return self.get("isFinalInvokeForWindow")
206
+
207
+ @property
208
+ def is_window_terminated_early(self) -> bool | None:
209
+ return self.get("isWindowTerminatedEarly")
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import base64
4
4
  import json
5
5
  import zlib
6
- from typing import TYPE_CHECKING
6
+ from typing import TYPE_CHECKING, Any
7
7
 
8
8
  from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import (
9
9
  CloudWatchLogsDecodedData,
@@ -100,12 +100,25 @@ class KinesisStreamRecord(DictWrapper):
100
100
  return KinesisStreamRecordPayload(self["kinesis"])
101
101
 
102
102
 
103
+ class KinesisStreamWindow(DictWrapper):
104
+ @property
105
+ def start(self) -> str:
106
+ """The time window started"""
107
+ return self["start"]
108
+
109
+ @property
110
+ def end(self) -> str:
111
+ """The time window will end"""
112
+ return self["end"]
113
+
114
+
103
115
  class KinesisStreamEvent(DictWrapper):
104
116
  """Kinesis stream event
105
117
 
106
118
  Documentation:
107
119
  --------------
108
120
  - https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html
121
+ - https://docs.aws.amazon.com/lambda/latest/dg/services-kinesis-windows.html
109
122
  """
110
123
 
111
124
  @property
@@ -113,6 +126,33 @@ class KinesisStreamEvent(DictWrapper):
113
126
  for record in self["Records"]:
114
127
  yield KinesisStreamRecord(record)
115
128
 
129
+ @property
130
+ def window(self) -> KinesisStreamWindow | None:
131
+ window = self.get("window")
132
+ if window:
133
+ return KinesisStreamWindow(window)
134
+ return window
135
+
136
+ @property
137
+ def state(self) -> dict[str, Any]:
138
+ return self.get("state") or {}
139
+
140
+ @property
141
+ def shard_id(self) -> str | None:
142
+ return self.get("shardId")
143
+
144
+ @property
145
+ def event_source_arn(self) -> str | None:
146
+ return self.get("eventSourceARN")
147
+
148
+ @property
149
+ def is_final_invoke_for_window(self) -> bool | None:
150
+ return self.get("isFinalInvokeForWindow")
151
+
152
+ @property
153
+ def is_window_terminated_early(self) -> bool | None:
154
+ return self.get("isWindowTerminatedEarly")
155
+
116
156
 
117
157
  def extract_cloudwatch_logs_from_event(event: KinesisStreamEvent) -> list[CloudWatchLogsDecodedData]:
118
158
  return [CloudWatchLogsDecodedData(record.kinesis.data_zlib_compressed_as_json()) for record in event.records]
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
+ import zlib
4
5
  from typing import TYPE_CHECKING, Any, cast
5
6
 
6
7
  from aws_lambda_powertools.utilities.parser.envelopes.base import BaseEnvelope
@@ -45,5 +46,17 @@ class KinesisDataStreamEnvelope(BaseEnvelope):
45
46
  for record in parsed_envelope.Records:
46
47
  # We allow either AWS expected contract (bytes) or a custom Model, see #943
47
48
  data = cast(bytes, record.kinesis.data)
48
- models.append(self._parse(data=data.decode("utf-8"), model=model))
49
+ try:
50
+ decoded_data = data.decode("utf-8")
51
+ except UnicodeDecodeError as ude:
52
+ try:
53
+ logger.debug(
54
+ f"{type(ude).__name__}: {str(ude)} encountered. "
55
+ "Data will be decompressed with zlib.decompress().",
56
+ )
57
+ decompressed_data = zlib.decompress(data, zlib.MAX_WBITS | 32)
58
+ decoded_data = decompressed_data.decode("utf-8")
59
+ except Exception as e:
60
+ raise ValueError("Unable to decode and/or decompress data.") from e
61
+ models.append(self._parse(data=decoded_data, model=model))
49
62
  return models
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: aws_lambda_powertools
3
- Version: 3.12.1a5
3
+ Version: 3.12.1a7
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
@@ -34,7 +34,7 @@ Requires-Dist: jmespath (>=1.0.1,<2.0.0)
34
34
  Requires-Dist: jsonpath-ng (>=1.6.0,<2.0.0) ; extra == "all" or extra == "datamasking"
35
35
  Requires-Dist: pydantic (>=2.4.0,<3.0.0) ; extra == "parser" or extra == "all"
36
36
  Requires-Dist: pydantic-settings (>=2.6.1,<3.0.0) ; extra == "all"
37
- Requires-Dist: redis (>=4.4,<6.0) ; extra == "redis"
37
+ Requires-Dist: redis (>=4.4,<7.0) ; extra == "redis"
38
38
  Requires-Dist: typing-extensions (>=4.11.0,<5.0.0)
39
39
  Project-URL: Documentation, https://docs.powertools.aws.dev/lambda/python/
40
40
  Project-URL: Issue tracker, https://github.com/aws-powertools/powertools-lambda-python/issues
@@ -97,7 +97,7 @@ aws_lambda_powertools/shared/json_encoder.py,sha256=JQeWNu-4M7_xI_hqYExrxsb3OcEH
97
97
  aws_lambda_powertools/shared/lazy_import.py,sha256=TbXQm2bcwXdZrYdBaJJXIswyLlumM85RJ_A_0w-h-GU,2019
98
98
  aws_lambda_powertools/shared/types.py,sha256=EZ_tbX3F98LA4Zcra1hTEjzRacpZAtggK957Zcv1oKg,135
99
99
  aws_lambda_powertools/shared/user_agent.py,sha256=DrCMFQuT4a4iIrpcWpAIjY37EFqR9-QxlxDGD-Nn9Gg,7081
100
- aws_lambda_powertools/shared/version.py,sha256=QUHJEmCM4f0f_L5B_IodCkKpwwrqG-fU_bUzgjltcM0,85
100
+ aws_lambda_powertools/shared/version.py,sha256=vHdb2rqyEczcHCuNec4ciWkyQkwsX2Cx-9EjfSts-rQ,85
101
101
  aws_lambda_powertools/tracing/__init__.py,sha256=f4bMThOPBPWTPVcYqcAIErAJPerMsf3H_Z4gCXCsK9I,141
102
102
  aws_lambda_powertools/tracing/base.py,sha256=WSO986XGBOe9K0F2SnG6ustJokIrtO0m0mcL8N7mfno,4544
103
103
  aws_lambda_powertools/tracing/extensions.py,sha256=APOfXOq-hRBKaK5WyfIyrd_6M1_9SWJZ3zxLA9jDZzU,492
@@ -131,13 +131,13 @@ aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py,sha256=2
131
131
  aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py,sha256=oHYYcFYeX5bQp7avtrLtwizWqSmJzLA3qqVvZ4ybj94,40540
132
132
  aws_lambda_powertools/utilities/data_classes/common.py,sha256=s3VqYE1yLsJxq1eQ9Oi4vm4GQlBxasSOIHlS1RuexEs,19564
133
133
  aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py,sha256=4_L73ATO-M_2zUD3r0zS4c6I4zoLxTK9l8JQc-dATog,5468
134
- aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py,sha256=j8OKsS60Ab8hmnnEtvELbUMsk0LGSiUpwh_bZ41fLuY,6167
134
+ aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py,sha256=tKv3Kpw0faLuNr4ac8uB5qDz-DvJPpnXHrDcIAZa3RY,7225
135
135
  aws_lambda_powertools/utilities/data_classes/event_bridge_event.py,sha256=TeTtx2jOKyZSVdSPFrtxZUgv0Yt6HW_H7J5NNxy_mHo,2434
136
136
  aws_lambda_powertools/utilities/data_classes/event_source.py,sha256=CKo1_TY0UcUVsh3PUk39z2WFVC2Bf4QgXWj93eEHbcY,1211
137
137
  aws_lambda_powertools/utilities/data_classes/iot_registry_event.py,sha256=wUa0Gr64maNGkd9qKNxtwFHawIJN-nj9X8uLFdINE7c,10842
138
138
  aws_lambda_powertools/utilities/data_classes/kafka_event.py,sha256=21K9iSH0sv_oj7alGWcommPUNDfto-tovIHspdIdsH4,4119
139
139
  aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py,sha256=5H-Rt6LG80_jVkTlWxhutZH0cv4Xrhzm-fqwkpjPfQM,10508
140
- aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py,sha256=O42TpHCJHM5mz_b3Z65cJJ2DB19sb-b3rxced6bQB_Y,3958
140
+ aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py,sha256=QVDKkcXQRp6T0KfjoZXkr_2U__5w9IT096jZqaoa4hI,5022
141
141
  aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py,sha256=dFhL3IYebW4WeJc1XJJYmF94gI_qYeay6EpT9b2mDZU,633
142
142
  aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py,sha256=30OBp80QTTGYdJb_YoIEFfsR5kmeftll2puB2nEw1jQ,3046
143
143
  aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py,sha256=os7ox3SzTqgwouo0zq8HidhPexfM4jDW62gAkonAowU,8682
@@ -207,7 +207,7 @@ aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py,sha256=xERcckRMA_
207
207
  aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py,sha256=fJyqT7i5dgzwuLkpK3tdvKPo_7g3VuVvKsqFYri3pJA,1731
208
208
  aws_lambda_powertools/utilities/parser/envelopes/event_bridge.py,sha256=JpstsMZsd5abf4oJvMUdo-K7x-gxHf91eR2BB9Z3rVA,1244
209
209
  aws_lambda_powertools/utilities/parser/envelopes/kafka.py,sha256=dt6aOo-ZuR7Yr6vSHWcenvKUK5ZkXi5gJrCeyjDVnWQ,1955
210
- aws_lambda_powertools/utilities/parser/envelopes/kinesis.py,sha256=s4M_O4O3tCKXIIhjZwrMDUmFPBeKdLSO78bbf-CpT-w,1894
210
+ aws_lambda_powertools/utilities/parser/envelopes/kinesis.py,sha256=4PW4Sy_44LDFx77jg9aOhZaPq1GaWqf5DRSwDwu0jjY,2520
211
211
  aws_lambda_powertools/utilities/parser/envelopes/kinesis_firehose.py,sha256=lQC-duOS-AgPOyD3QSeCOCJiqrUBHO3grHtv3mPOPJw,1971
212
212
  aws_lambda_powertools/utilities/parser/envelopes/lambda_function_url.py,sha256=ppOvWaSZ5HvTp7DwrOqQIXBMiZg1Ad21DrC0rYXlzQI,1286
213
213
  aws_lambda_powertools/utilities/parser/envelopes/sns.py,sha256=F7PXKgdj3NBsTBHb4ZgPWD8trLVrZQlBoz8P94k3f1A,2987
@@ -268,7 +268,7 @@ aws_lambda_powertools/utilities/validation/envelopes.py,sha256=YD5HOFx6IClQgii0n
268
268
  aws_lambda_powertools/utilities/validation/exceptions.py,sha256=PKy_19zQMBJGCMMFl-sMkcm-cc0v3zZBn_bhGE4wKNo,2084
269
269
  aws_lambda_powertools/utilities/validation/validator.py,sha256=khCqFhACSdn0nKyYRRPiC5Exht956hTfSfhlV3IRmpg,10099
270
270
  aws_lambda_powertools/warnings/__init__.py,sha256=vqDVeZz8wGtD8WGYNSkQE7AHwqtIrPGRxuoJR_BBnSs,1193
271
- aws_lambda_powertools-3.12.1a5.dist-info/LICENSE,sha256=vMHS2eBgmwPUIMPb7LQ4p7ib_FPVQXarVjAasflrTwo,951
272
- aws_lambda_powertools-3.12.1a5.dist-info/METADATA,sha256=ihnp3xY7rqB6a1-vHfAk5JQJrExCM8fHOroErK8hQ-I,11187
273
- aws_lambda_powertools-3.12.1a5.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
274
- aws_lambda_powertools-3.12.1a5.dist-info/RECORD,,
271
+ aws_lambda_powertools-3.12.1a7.dist-info/LICENSE,sha256=vMHS2eBgmwPUIMPb7LQ4p7ib_FPVQXarVjAasflrTwo,951
272
+ aws_lambda_powertools-3.12.1a7.dist-info/METADATA,sha256=p7BiI08p86kWMmLyALKSlr29XTbk8iZl5QLQPYH4oo0,11187
273
+ aws_lambda_powertools-3.12.1a7.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
274
+ aws_lambda_powertools-3.12.1a7.dist-info/RECORD,,