Skip to content

Commit a3ed9f9

Browse files
committed
address Heitor's suggestion
1 parent a6c05a5 commit a3ed9f9

File tree

5 files changed

+51
-49
lines changed

5 files changed

+51
-49
lines changed

aws_lambda_powertools/utilities/data_classes/__init__.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
from .event_source import event_source
1616
from .kafka_event import KafkaEvent
1717
from .kinesis_firehose_event import (
18+
KinesisFirehoseDataTransformationRecord,
19+
KinesisFirehoseDataTransformationRecordMetadata,
20+
KinesisFirehoseDataTransformationResponse,
1821
KinesisFirehoseEvent,
19-
KinesisFirehoseResponse,
20-
KinesisFirehoseResponseRecord,
21-
KinesisFirehoseResponseRecordMetadata,
2222
)
2323
from .kinesis_stream_event import KinesisStreamEvent
2424
from .lambda_function_url_event import LambdaFunctionUrlEvent
@@ -42,9 +42,9 @@
4242
"KafkaEvent",
4343
"KinesisFirehoseEvent",
4444
"KinesisStreamEvent",
45-
"KinesisFirehoseResponse",
46-
"KinesisFirehoseResponseRecord",
47-
"KinesisFirehoseResponseRecordMetadata",
45+
"KinesisFirehoseDataTransformationResponse",
46+
"KinesisFirehoseDataTransformationRecord",
47+
"KinesisFirehoseDataTransformationRecordMetadata",
4848
"LambdaFunctionUrlEvent",
4949
"S3Event",
5050
"S3EventBridgeNotificationEvent",

aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py

+29-27
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import base64
22
import json
3-
from dataclasses import dataclass
3+
from dataclasses import dataclass, field
44
from typing import Any, Callable, Dict, Iterator, List, Optional
55

66
from typing_extensions import Literal
@@ -9,7 +9,7 @@
99

1010

1111
@dataclass
12-
class KinesisFirehoseResponseRecordMetadata:
12+
class KinesisFirehoseDataTransformationRecordMetadata:
1313
"""
1414
Documentation:
1515
--------------
@@ -18,14 +18,14 @@ class KinesisFirehoseResponseRecordMetadata:
1818

1919
partition_keys: Optional[Dict[str, str]]
2020

21-
def asdict(self) -> Optional[Dict]:
21+
def asdict(self) -> Dict:
2222
if self.partition_keys is not None:
2323
return {"partitionKeys": self.partition_keys}
24-
return None
24+
return {}
2525

2626

2727
@dataclass
28-
class KinesisFirehoseResponseRecord:
28+
class KinesisFirehoseDataTransformationRecord:
2929
"""Record in Kinesis Data Firehose response object
3030
3131
Documentation:
@@ -36,13 +36,13 @@ class KinesisFirehoseResponseRecord:
3636
# Record ID; uniquely identifies this record within the current batch"""
3737
record_id: str
3838
# Processing result, supported value: Ok, Dropped, ProcessingFailed"""
39-
result: Literal["Ok", "Dropped", "ProcessingFailed"]
39+
result: Literal["Ok", "Dropped", "ProcessingFailed"] = "Ok"
4040
# data blob, base64-encoded, optional at init. Allows pass in base64-encoded data directly or
4141
# use either function like `data_from_text`, `data_from_json` to populate data"""
4242
data: Optional[str] = None
4343
# Optional: Metadata associated with this record; can contain partition keys
4444
# See - https://docs.aws.amazon.com/firehose/latest/dev/dynamic-partitioning.html
45-
metadata: Optional[KinesisFirehoseResponseRecordMetadata] = None
45+
metadata: Optional[KinesisFirehoseDataTransformationRecordMetadata] = None
4646
_json_data: Optional[Any] = None
4747
json_serializer: Callable = json.dumps
4848
json_deserializer: Callable = json.loads
@@ -70,31 +70,31 @@ def asdict(self) -> Dict:
7070
return r
7171

7272
@property
73-
def data_as_bytes(self) -> Optional[bytes]:
73+
def data_as_bytes(self) -> bytes:
7474
"""Decoded base64-encoded data as bytes"""
7575
if not self.data:
76-
return None
76+
return b""
7777
return base64.b64decode(self.data)
7878

7979
@property
80-
def data_as_text(self) -> Optional[str]:
80+
def data_as_text(self) -> str:
8181
"""Decoded base64-encoded data as text"""
82-
if not self.data_as_bytes:
83-
return None
82+
if not self.data:
83+
return ""
8484
return self.data_as_bytes.decode("utf-8")
8585

8686
@property
87-
def data_as_json(self) -> Optional[Dict]:
87+
def data_as_json(self) -> Dict:
8888
"""Decoded base64-encoded data loaded to json"""
89-
if not self.data_as_text:
90-
return None
89+
if not self.data:
90+
return {}
9191
if self._json_data is None:
9292
self._json_data = self.json_deserializer(self.data_as_text)
9393
return self._json_data
9494

9595

9696
@dataclass
97-
class KinesisFirehoseResponse:
97+
class KinesisFirehoseDataTransformationResponse:
9898
"""Kinesis Data Firehose response object
9999
100100
Documentation:
@@ -108,13 +108,10 @@ class KinesisFirehoseResponse:
108108
optional parameter at start. can be added later using `add_record` function.
109109
"""
110110

111-
records: Optional[List[KinesisFirehoseResponseRecord]] = None
111+
records: List[KinesisFirehoseDataTransformationRecord] = field(default_factory=list)
112112

113-
def add_record(self, record: KinesisFirehoseResponseRecord):
114-
if self.records:
115-
self.records.append(record)
116-
else:
117-
self.records = [record]
113+
def add_record(self, record: KinesisFirehoseDataTransformationRecord):
114+
self.records.append(record)
118115

119116
def asdict(self) -> Dict:
120117
if not self.records:
@@ -196,12 +193,12 @@ def data_as_json(self) -> dict:
196193
self._json_data = self._json_deserializer(self.data_as_text)
197194
return self._json_data
198195

199-
def create_firehose_response_record(
196+
def build_data_transformation_response(
200197
self,
201-
result: Literal["Ok", "Dropped", "ProcessingFailed"],
198+
result: Literal["Ok", "Dropped", "ProcessingFailed"] = "Ok",
202199
data: Optional[str] = None,
203-
metadata: Optional[KinesisFirehoseResponseRecordMetadata] = None,
204-
) -> KinesisFirehoseResponseRecord:
200+
metadata: Optional[KinesisFirehoseDataTransformationRecordMetadata] = None,
201+
) -> KinesisFirehoseDataTransformationRecord:
205202
"""create a KinesisFirehoseResponseRecord directly using the record_id and given values
206203
Parameters
207204
----------
@@ -214,7 +211,12 @@ def create_firehose_response_record(
214211
Metadata associated with this record; can contain partition keys
215212
- https://docs.aws.amazon.com/firehose/latest/dev/dynamic-partitioning.html
216213
"""
217-
return KinesisFirehoseResponseRecord(record_id=self.record_id, result=result, data=data, metadata=metadata)
214+
return KinesisFirehoseDataTransformationRecord(
215+
record_id=self.record_id,
216+
result=result,
217+
data=data,
218+
metadata=metadata,
219+
)
218220

219221

220222
class KinesisFirehoseEvent(DictWrapper):

examples/event_sources/src/kinesis_firehose_delivery_stream.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from aws_lambda_powertools.utilities.data_classes import (
2+
KinesisFirehoseDataTransformationResponse,
23
KinesisFirehoseEvent,
3-
KinesisFirehoseResponse,
44
event_source,
55
)
66
from aws_lambda_powertools.utilities.typing import LambdaContext
77

88

99
@event_source(data_class=KinesisFirehoseEvent)
1010
def lambda_handler(event: KinesisFirehoseEvent, context: LambdaContext):
11-
result = KinesisFirehoseResponse()
11+
result = KinesisFirehoseDataTransformationResponse()
1212

1313
for record in event.records:
1414
# if data was delivered as json; caches loaded value
@@ -18,7 +18,7 @@ def lambda_handler(event: KinesisFirehoseEvent, context: LambdaContext):
1818
## generate data to return
1919
new_data = {"tool_used": "powertools_dataclass", "original_payload": data}
2020

21-
processed_record = record.create_firehose_response_record(result="Ok")
21+
processed_record = record.build_data_transformation_response(result="Ok")
2222
processed_record.data_from_json(data=new_data)
2323

2424
result.add_record(processed_record)

examples/event_sources/src/kinesis_firehose_response.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import base64
22

33
from aws_lambda_powertools.utilities.data_classes import (
4-
KinesisFirehoseResponse,
5-
KinesisFirehoseResponseRecord,
4+
KinesisFirehoseDataTransformationRecord,
5+
KinesisFirehoseDataTransformationResponse,
66
)
77

88

99
def lambda_handler(event, context):
10-
result = KinesisFirehoseResponse()
10+
result = KinesisFirehoseDataTransformationResponse()
1111

1212
for record in event["records"]:
1313
print(record["recordId"])
@@ -16,7 +16,7 @@ def lambda_handler(event, context):
1616
## generate data to return
1717
new_data = {"tool_used": "powertools_dataclass", "original_payload": payload}
1818

19-
processed_record = KinesisFirehoseResponseRecord(record_id=record["recordId"], result="Ok")
19+
processed_record = KinesisFirehoseDataTransformationRecord(record_id=record["recordId"], result="Ok")
2020
processed_record.data_from_text(data=new_data)
2121
result.add_record(processed_record)
2222

tests/unit/data_classes/test_kinesis_firehose_response.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from aws_lambda_powertools.utilities.data_classes import (
2+
KinesisFirehoseDataTransformationRecord,
3+
KinesisFirehoseDataTransformationRecordMetadata,
4+
KinesisFirehoseDataTransformationResponse,
25
KinesisFirehoseEvent,
3-
KinesisFirehoseResponse,
4-
KinesisFirehoseResponseRecord,
5-
KinesisFirehoseResponseRecordMetadata,
66
)
77
from tests.functional.utils import load_event
88

@@ -11,13 +11,13 @@ def test_kinesis_firehose_response():
1111
raw_event = load_event("kinesisFirehoseKinesisEvent.json")
1212
parsed_event = KinesisFirehoseEvent(data=raw_event)
1313

14-
response = KinesisFirehoseResponse()
14+
response = KinesisFirehoseDataTransformationResponse()
1515
for record in parsed_event.records:
1616
# if data was delivered as json; caches loaded value
1717
data = record.data_as_text
1818

19-
metadata_partition = KinesisFirehoseResponseRecordMetadata(partition_keys={"year": 2023})
20-
processed_record = KinesisFirehoseResponseRecord(
19+
metadata_partition = KinesisFirehoseDataTransformationRecordMetadata(partition_keys={"year": 2023})
20+
processed_record = KinesisFirehoseDataTransformationRecord(
2121
record_id=record.record_id,
2222
result="Ok",
2323
metadata=metadata_partition,
@@ -43,12 +43,12 @@ def test_kinesis_firehose_create_response():
4343
raw_event = load_event("kinesisFirehoseKinesisEvent.json")
4444
parsed_event = KinesisFirehoseEvent(data=raw_event)
4545

46-
response = KinesisFirehoseResponse()
46+
response = KinesisFirehoseDataTransformationResponse()
4747
for record in parsed_event.records:
4848
# if data was delivered as json; caches loaded value
4949
data = record.data_as_text
50-
metadata_partition = KinesisFirehoseResponseRecordMetadata(partition_keys={"year": 2023})
51-
processed_record = record.create_firehose_response_record(
50+
metadata_partition = KinesisFirehoseDataTransformationRecordMetadata(partition_keys={"year": 2023})
51+
processed_record = record.build_data_transformation_response(
5252
result="Ok",
5353
metadata=metadata_partition,
5454
)

0 commit comments

Comments
 (0)