Skip to content

Commit 9abeb32

Browse files
feat(event-sources): cache parsed json in data class (aws-powertools#909)
1 parent 149a660 commit 9abeb32

File tree

6 files changed

+25
-8
lines changed

6 files changed

+25
-8
lines changed

aws_lambda_powertools/utilities/data_classes/active_mq_event.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ def decoded_data(self) -> str:
2727
@property
2828
def json_data(self) -> Any:
2929
"""Parses the data as json"""
30-
return json.loads(self.decoded_data)
30+
if self._json_data is None:
31+
self._json_data = json.loads(self.decoded_data)
32+
return self._json_data
3133

3234
@property
3335
def connection_id(self) -> str:

aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ def user_parameters(self) -> str:
2323
@property
2424
def decoded_user_parameters(self) -> Dict[str, Any]:
2525
"""Json Decoded user parameters"""
26-
return json.loads(self.user_parameters)
26+
if self._json_data is None:
27+
self._json_data = json.loads(self.user_parameters)
28+
return self._json_data
2729

2830

2931
class CodePipelineActionConfiguration(DictWrapper):

aws_lambda_powertools/utilities/data_classes/common.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class DictWrapper:
88

99
def __init__(self, data: Dict[str, Any]):
1010
self._data = data
11+
self._json_data: Optional[Any] = None
1112

1213
def __getitem__(self, key: str) -> Any:
1314
return self._data[key]
@@ -65,7 +66,9 @@ def body(self) -> Optional[str]:
6566
@property
6667
def json_body(self) -> Any:
6768
"""Parses the submitted body as json"""
68-
return json.loads(self.decoded_body)
69+
if self._json_data is None:
70+
self._json_data = json.loads(self.decoded_body)
71+
return self._json_data
6972

7073
@property
7174
def decoded_body(self) -> str:

aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ def decoded_data(self) -> str:
8888
@property
8989
def json_data(self) -> Any:
9090
"""Parses the data as json"""
91-
return json.loads(self.decoded_data)
91+
if self._json_data is None:
92+
self._json_data = json.loads(self.decoded_data)
93+
return self._json_data
9294

9395

9496
class RabbitMQEvent(DictWrapper):

tests/functional/data_classes/test_amazon_mq.py

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def test_active_mq_event():
3434
messages = list(event.messages)
3535
message = messages[1]
3636
assert message.json_data["timeout"] == 0
37+
assert message.json_data["data"] == "CZrmf0Gw8Ov4bqLQxD4E"
3738

3839

3940
def test_rabbit_mq_event():
@@ -47,6 +48,7 @@ def test_rabbit_mq_event():
4748
assert message.data is not None
4849
assert message.decoded_data is not None
4950
assert message.json_data["timeout"] == 0
51+
assert message.json_data["data"] == "CZrmf0Gw8Ov4bqLQxD4E"
5052

5153
assert isinstance(message, RabbitMessage)
5254
properties = message.basic_properties

tests/functional/test_data_classes.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,8 @@ def test_cognito_pre_token_generation_trigger_event():
272272
claims_override_details.set_group_configuration_groups_to_override(expected_groups)
273273
assert claims_override_details.group_configuration.groups_to_override == expected_groups
274274
assert event["response"]["claimsOverrideDetails"]["groupOverrideDetails"]["groupsToOverride"] == expected_groups
275+
claims_override_details = event.response.claims_override_details
276+
assert claims_override_details["groupOverrideDetails"]["groupsToOverride"] == expected_groups
275277

276278
claims_override_details.set_group_configuration_iam_roles_to_override(["role"])
277279
assert claims_override_details.group_configuration.iam_roles_to_override == ["role"]
@@ -1054,6 +1056,7 @@ def test_base_proxy_event_json_body():
10541056
data = {"message": "Foo"}
10551057
event = BaseProxyEvent({"body": json.dumps(data)})
10561058
assert event.json_body == data
1059+
assert event.json_body["message"] == "Foo"
10571060

10581061

10591062
def test_base_proxy_event_decode_body_key_error():
@@ -1084,7 +1087,7 @@ def test_base_proxy_event_json_body_with_base64_encoded_data():
10841087
event = BaseProxyEvent({"body": encoded_data, "isBase64Encoded": True})
10851088

10861089
# WHEN calling json_body
1087-
# THEN then base64 decode and json load
1090+
# THEN base64 decode and json load
10881091
assert event.json_body == data
10891092

10901093

@@ -1120,7 +1123,8 @@ def test_kinesis_stream_event_json_data():
11201123
json_value = {"test": "value"}
11211124
data = base64.b64encode(bytes(json.dumps(json_value), "utf-8")).decode("utf-8")
11221125
event = KinesisStreamEvent({"Records": [{"kinesis": {"data": data}}]})
1123-
assert next(event.records).kinesis.data_as_json() == json_value
1126+
record = next(event.records)
1127+
assert record.kinesis.data_as_json() == json_value
11241128

11251129

11261130
def test_alb_event():
@@ -1392,9 +1396,11 @@ def test_code_pipeline_event_decoded_data():
13921396
event = CodePipelineJobEvent(load_event("codePipelineEventData.json"))
13931397

13941398
assert event.data.continuation_token is None
1395-
decoded_params = event.data.action_configuration.configuration.decoded_user_parameters
1399+
configuration = event.data.action_configuration.configuration
1400+
decoded_params = configuration.decoded_user_parameters
13961401
assert decoded_params == event.decoded_user_parameters
1397-
assert "VALUE" == decoded_params["KEY"]
1402+
assert decoded_params["KEY"] == "VALUE"
1403+
assert configuration.decoded_user_parameters["KEY"] == "VALUE"
13981404

13991405
assert "my-pipeline-SourceArtifact" == event.data.input_artifacts[0].name
14001406

0 commit comments

Comments
 (0)