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.
- aws_lambda_powertools/shared/version.py +1 -1
- aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py +40 -0
- aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py +41 -1
- aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +14 -1
- {aws_lambda_powertools-3.12.1a5.dist-info → aws_lambda_powertools-3.12.1a7.dist-info}/METADATA +2 -2
- {aws_lambda_powertools-3.12.1a5.dist-info → aws_lambda_powertools-3.12.1a7.dist-info}/RECORD +8 -8
- {aws_lambda_powertools-3.12.1a5.dist-info → aws_lambda_powertools-3.12.1a7.dist-info}/LICENSE +0 -0
- {aws_lambda_powertools-3.12.1a5.dist-info → aws_lambda_powertools-3.12.1a7.dist-info}/WHEEL +0 -0
@@ -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
|
-
|
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
|
{aws_lambda_powertools-3.12.1a5.dist-info → aws_lambda_powertools-3.12.1a7.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: aws_lambda_powertools
|
3
|
-
Version: 3.12.
|
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,<
|
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
|
{aws_lambda_powertools-3.12.1a5.dist-info → aws_lambda_powertools-3.12.1a7.dist-info}/RECORD
RENAMED
@@ -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=
|
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=
|
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=
|
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=
|
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.
|
272
|
-
aws_lambda_powertools-3.12.
|
273
|
-
aws_lambda_powertools-3.12.
|
274
|
-
aws_lambda_powertools-3.12.
|
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,,
|
{aws_lambda_powertools-3.12.1a5.dist-info → aws_lambda_powertools-3.12.1a7.dist-info}/LICENSE
RENAMED
File without changes
|
File without changes
|