Skip to content

Commit 862c67e

Browse files
author
Michal Ploski
committed
Apply PR suggestions
1 parent 0196883 commit 862c67e

File tree

9 files changed

+30
-32
lines changed

9 files changed

+30
-32
lines changed

aws_lambda_powertools/utilities/batch/sqs.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,13 @@ def _get_entries_to_clean(self) -> List[Dict[str, str]]:
9090
"""
9191
Format messages to use in batch deletion
9292
"""
93-
return [
94-
{"Id": msg["messageId"], "ReceiptHandle": msg["receiptHandle"]}
95-
for msg in cast(List[SQSRecord], self.success_messages)
96-
]
93+
entries = []
94+
# success_messages has generic type of union of SQS, Dynamodb and Kinesis Streams records or Pydantic models.
95+
# Here we get SQS Record only
96+
messages = cast(List[SQSRecord], self.success_messages)
97+
for msg in messages:
98+
entries.append({"Id": msg["messageId"], "ReceiptHandle": msg["receiptHandle"]})
99+
return entries
97100

98101
def _process_record(self, record) -> Tuple:
99102
"""

aws_lambda_powertools/utilities/idempotency/persistence/base.py

+7-8
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def __init__(
4040
idempotency_key,
4141
status: str = "",
4242
expiry_timestamp: Optional[int] = None,
43-
response_data: str = "",
43+
response_data: Optional[str] = "",
4444
payload_hash: Optional[str] = None,
4545
) -> None:
4646
"""
@@ -92,16 +92,16 @@ def status(self) -> str:
9292
else:
9393
raise IdempotencyInvalidStatusError(self._status)
9494

95-
def response_json_as_dict(self) -> dict:
95+
def response_json_as_dict(self) -> Optional[dict]:
9696
"""
9797
Get response data deserialized to python dict
9898
9999
Returns
100100
-------
101-
dict
101+
Optional[dict]
102102
previous response data deserialized
103103
"""
104-
return json.loads(self.response_data)
104+
return json.loads(self.response_data) if self.response_data else None
105105

106106

107107
class BasePersistenceLayer(ABC):
@@ -121,7 +121,6 @@ def __init__(self):
121121
self.raise_on_no_idempotency_key = False
122122
self.expires_after_seconds: int = 60 * 60 # 1 hour default
123123
self.use_local_cache = False
124-
self._cache: Optional[LRUDict] = None
125124
self.hash_function = None
126125

127126
def configure(self, config: IdempotencyConfig, function_name: Optional[str] = None) -> None:
@@ -279,14 +278,14 @@ def _save_to_cache(self, data_record: DataRecord):
279278
-------
280279
281280
"""
282-
if not self.use_local_cache or self._cache is None:
281+
if not self.use_local_cache:
283282
return
284283
if data_record.status == STATUS_CONSTANTS["INPROGRESS"]:
285284
return
286285
self._cache[data_record.idempotency_key] = data_record
287286

288287
def _retrieve_from_cache(self, idempotency_key: str):
289-
if not self.use_local_cache or self._cache is None:
288+
if not self.use_local_cache:
290289
return
291290
cached_record = self._cache.get(key=idempotency_key)
292291
if cached_record:
@@ -296,7 +295,7 @@ def _retrieve_from_cache(self, idempotency_key: str):
296295
self._delete_from_cache(idempotency_key=idempotency_key)
297296

298297
def _delete_from_cache(self, idempotency_key: str):
299-
if not self.use_local_cache or self._cache is None:
298+
if not self.use_local_cache:
300299
return
301300
if idempotency_key in self._cache:
302301
del self._cache[idempotency_key]

aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ def _item_to_data_record(self, item: Dict[str, Any]) -> DataRecord:
130130
idempotency_key=item[self.key_attr],
131131
status=item[self.status_attr],
132132
expiry_timestamp=item[self.expiry_attr],
133-
response_data=item.get(self.data_attr, ""),
133+
response_data=item.get(self.data_attr),
134134
payload_hash=item.get(self.validation_key_attr),
135135
)
136136

aws_lambda_powertools/utilities/parameters/ssm.py

+2
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ def __init__(self, config: Optional[Config] = None, boto3_session: Optional[boto
8787

8888
super().__init__()
8989

90+
# We break Liskov substitution principle due to differences in signatures of this method and superclass get method
91+
# We ignore mypy error, as changes to the signature here or in a superclass is a breaking change to users
9092
def get( # type: ignore[override]
9193
self,
9294
name: str,

aws_lambda_powertools/utilities/parser/envelopes/kinesis.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ def parse(self, data: Optional[Union[Dict[str, Any], Any]], model: Type[Model])
3737
logger.debug(f"Parsing incoming data with Kinesis model {KinesisDataStreamModel}")
3838
parsed_envelope: KinesisDataStreamModel = KinesisDataStreamModel.parse_obj(data)
3939
logger.debug(f"Parsing Kinesis records in `body` with {model}")
40-
return [
41-
self._parse(data=cast(bytes, record.kinesis.data).decode("utf-8"), model=model)
42-
for record in parsed_envelope.Records
43-
]
40+
models = []
41+
for record in parsed_envelope.Records:
42+
# We allow either AWS expected contract (bytes) or a custom Model, see #943
43+
data = cast(bytes, record.kinesis.data)
44+
models.append(self._parse(data=cast(bytes, record.kinesis.data).decode("utf-8"), model=model))
45+
return models

aws_lambda_powertools/utilities/parser/envelopes/sns.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ def parse(self, data: Optional[Union[Dict[str, Any], Any]], model: Type[Model])
6969
parsed_envelope = SqsModel.parse_obj(data)
7070
output = []
7171
for record in parsed_envelope.Records:
72-
sns_notification: SnsNotificationModel = SnsNotificationModel.parse_raw(cast(str, record.body))
72+
# We allow either AWS expected contract (str) or a custom Model, see #943
73+
body = cast(str, record.body)
74+
sns_notification = SnsNotificationModel.parse_raw(body)
7375
output.append(self._parse(data=sns_notification.Message, model=model))
7476
return output

mypy.ini

+3
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,6 @@ ignore_missing_imports = True
3131

3232
[mypy-aws_xray_sdk.ext.aiohttp.client]
3333
ignore_missing_imports = True
34+
35+
[mypy-dataclasses]
36+
ignore_missing_imports = True

poetry.lock

+1-13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ mkdocs-material = "^7.3.6"
5454
mkdocs-git-revision-date-plugin = "^0.3.1"
5555
mike = "^0.6.0"
5656
mypy = "^0.931"
57-
types-dataclasses = "^0.6.4"
5857

5958

6059
[tool.poetry.extras]

0 commit comments

Comments
 (0)