Skip to content

Commit 541e9cc

Browse files
committed
testing poc
1 parent 0519fa3 commit 541e9cc

File tree

5 files changed

+86
-14
lines changed

5 files changed

+86
-14
lines changed

aws_lambda_powertools/utilities/data_classes/common.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import base64
22
import json
33
from collections.abc import Mapping
4-
from typing import Any, Callable, Dict, Iterator, List, Optional, overload
4+
from typing import Any, Callable, Dict, Iterator, List, Optional, overload, Type, TypeVar
55

66
from aws_lambda_powertools.shared.headers_serializer import BaseHeadersSerializer
77
from aws_lambda_powertools.utilities.data_classes.shared_functions import (
@@ -93,6 +93,28 @@ def raw_event(self) -> Dict[str, Any]:
9393
"""The original raw event dict"""
9494
return self._data
9595

96+
class EventWrapper(DictWrapper):
97+
NestedEvent = TypeVar("NestedEvent", bound=DictWrapper)
98+
@property
99+
def nested_event_contents(self):
100+
for record in self["Records"]:
101+
yield record["body"]
102+
103+
# @property
104+
def decode_nested_events(self, nested_event_class: Type[NestedEvent], nested_event_content_deserializer = None):
105+
if nested_event_content_deserializer is None:
106+
nested_event_content_deserializer = self._json_deserializer
107+
108+
for content in self.nested_event_contents:
109+
yield nested_event_class(nested_event_content_deserializer(content))
110+
111+
# @property
112+
def decode_nested_event(self, nested_event_class, nested_event_content_deserializer = None):
113+
if nested_event_content_deserializer is None:
114+
nested_event_content_deserializer = self._json_deserializer
115+
116+
for content in self.nested_event_contents:
117+
return nested_event_class(nested_event_content_deserializer(content))
96118

97119
class BaseProxyEvent(DictWrapper):
98120
@property
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import json
2+
3+
from aws_lambda_powertools.utilities.data_classes import S3Event, SQSEvent
4+
# from aws_lambda_powertools.utilities.data_classes.sns_event import SNSMessage
5+
from aws_lambda_powertools.utilities.data_classes import event_source
6+
7+
8+
# @event_source(data_class=SQSEvent)
9+
def lambda_handler(event: SQSEvent, context):
10+
event = SQSEvent(event)
11+
nesteds3event = event.decode_nested_events(S3Event)
12+
for record in event.records: #then how would a for loop work..
13+
nested_event = record.decode_nested_event(S3Event) #for loop must be for same events inside one event
14+
print(nested_event, nested_event)
15+
16+
# event = SQSEvent()
17+
# sns_events = event.decode_nested_events(Iterator[SNSEvent])
18+
# for sns_event in sns_events:
19+
# s3_events = sns_event.decode_nested_events(S3Event)
20+
# for s3_event in s3_events:
21+
# print(s3_event.bucket.name)
22+
23+
24+
25+
26+
event = SQSEvent({
27+
"Records": [
28+
{
29+
"messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
30+
"receiptHandle": "MessageReceiptHandle",
31+
"body": {
32+
"Message": "{\"Records\":[{\"eventVersion\":\"2.1\",\"eventSource\":\"aws:s3\",\"awsRegion\":\"us-east-1\",\"eventTime\":\"2023-01-01T00:00:00.000Z\",\"eventName\":\"ObjectCreated:Put\",\"userIdentity\":{\"principalId\":\"AWS:123456789012:example-user\"},\"requestParameters\":{\"sourceIPAddress\":\"127.0.0.1\"},\"responseElements\":{\"x-amz-request-id\":\"example-request-id\",\"x-amz-id-2\":\"example-id\"},\"s3\":{\"s3SchemaVersion\":\"1.0\",\"configurationId\":\"testConfigRule\",\"bucket\":{\"name\":\"example-bucket\",\"ownerIdentity\":{\"principalId\":\"EXAMPLE\"},\"arn\":\"arn:aws:s3:::example-bucket\"},\"object\":{\"key\":\"example-object.txt\",\"size\":1024,\"eTag\":\"example-tag\",\"versionId\":\"1\",\"sequencer\":\"example-sequencer\"}}}]}"
33+
},
34+
"attributes": {
35+
"ApproximateReceiveCount": "1",
36+
"SentTimestamp": "1523232000000",
37+
"SenderId": "123456789012",
38+
"ApproximateFirstReceiveTimestamp": "1523232000001"
39+
},
40+
"messageAttributes": {},
41+
"md5OfBody": "7b270e59b47ff90a553787216d55d91d",
42+
"eventSource": "aws:sqs",
43+
"eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:MyQueue",
44+
"awsRegion": "us-east-1"
45+
}
46+
]
47+
})
48+
49+
lambda_handler(event, {})

aws_lambda_powertools/utilities/data_classes/s3_event.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Dict, Iterator, Optional
22
from urllib.parse import unquote_plus
33

4-
from aws_lambda_powertools.utilities.data_classes.common import DictWrapper
4+
from aws_lambda_powertools.utilities.data_classes.common import DictWrapper, EventWrapper
55
from aws_lambda_powertools.utilities.data_classes.event_bridge_event import (
66
EventBridgeEvent,
77
)
@@ -151,7 +151,7 @@ def detail(self) -> S3EventBridgeNotificationDetail: # type: ignore[override]
151151
return S3EventBridgeNotificationDetail(self["detail"])
152152

153153

154-
class S3Bucket(DictWrapper):
154+
class S3Bucket(EventWrapper):
155155
@property
156156
def name(self) -> str:
157157
return self["s3"]["bucket"]["name"]
@@ -165,7 +165,7 @@ def arn(self) -> str:
165165
return self["s3"]["bucket"]["arn"]
166166

167167

168-
class S3Object(DictWrapper):
168+
class S3Object(EventWrapper):
169169
@property
170170
def key(self) -> str:
171171
"""Object key"""
@@ -194,7 +194,7 @@ def sequencer(self) -> str:
194194
return self["s3"]["object"]["sequencer"]
195195

196196

197-
class S3Message(DictWrapper):
197+
class S3Message(EventWrapper):
198198
@property
199199
def s3_schema_version(self) -> str:
200200
return self["s3"]["s3SchemaVersion"]
@@ -237,7 +237,7 @@ def restore_event_data(self) -> S3EventRecordGlacierRestoreEventData:
237237
return S3EventRecordGlacierRestoreEventData(self._data)
238238

239239

240-
class S3EventRecord(DictWrapper):
240+
class S3EventRecord(EventWrapper):
241241
@property
242242
def event_version(self) -> str:
243243
"""The eventVersion key value contains a major and minor version in the form <major>.<minor>."""
@@ -293,7 +293,7 @@ def glacier_event_data(self) -> Optional[S3EventRecordGlacierEventData]:
293293
return None if item is None else S3EventRecordGlacierEventData(item)
294294

295295

296-
class S3Event(DictWrapper):
296+
class S3Event(EventWrapper):
297297
"""S3 event notification
298298
299299
Documentation:

aws_lambda_powertools/utilities/data_classes/sns_event.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Dict, Iterator
22

3-
from aws_lambda_powertools.utilities.data_classes.common import DictWrapper
3+
from aws_lambda_powertools.utilities.data_classes.common import DictWrapper, EventWrapper
44

55

66
class SNSMessageAttribute(DictWrapper):
@@ -16,7 +16,7 @@ def value(self) -> str:
1616
return self["Value"]
1717

1818

19-
class SNSMessage(DictWrapper):
19+
class SNSMessage(EventWrapper):
2020
@property
2121
def signature_version(self) -> str:
2222
"""Version of the Amazon SNS signature used."""
@@ -99,7 +99,7 @@ def sns(self) -> SNSMessage:
9999
return SNSMessage(self._data["Sns"])
100100

101101

102-
class SNSEvent(DictWrapper):
102+
class SNSEvent(EventWrapper):
103103
"""SNS Event
104104
105105
Documentation:

aws_lambda_powertools/utilities/data_classes/sqs_event.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Any, Dict, Iterator, Optional, Type, TypeVar
22

33
from aws_lambda_powertools.utilities.data_classes import S3Event
4-
from aws_lambda_powertools.utilities.data_classes.common import DictWrapper
4+
from aws_lambda_powertools.utilities.data_classes.common import DictWrapper, EventWrapper
55
from aws_lambda_powertools.utilities.data_classes.sns_event import SNSMessage
66

77

@@ -82,10 +82,10 @@ def __getitem__(self, key: str) -> Optional[SQSMessageAttribute]: # type: ignor
8282
return None if item is None else SQSMessageAttribute(item) # type: ignore
8383

8484

85-
class SQSRecord(DictWrapper):
85+
class SQSRecord(EventWrapper):
8686
"""An Amazon SQS message"""
8787

88-
NestedEvent = TypeVar("NestedEvent", bound=DictWrapper)
88+
NestedEvent = TypeVar("NestedEvent", bound=EventWrapper)
8989

9090
@property
9191
def message_id(self) -> str:
@@ -236,7 +236,7 @@ def _decode_nested_event(self, nested_event_class: Type[NestedEvent]) -> NestedE
236236
return nested_event_class(self.json_body)
237237

238238

239-
class SQSEvent(DictWrapper):
239+
class SQSEvent(EventWrapper):
240240
"""SQS Event
241241
242242
Documentation:
@@ -246,5 +246,6 @@ class SQSEvent(DictWrapper):
246246

247247
@property
248248
def records(self) -> Iterator[SQSRecord]:
249+
print("in here!!")
249250
for record in self["Records"]:
250251
yield SQSRecord(data=record, json_deserializer=self._json_deserializer)

0 commit comments

Comments
 (0)