From 0576dde282e8e760721a674e57235369c65fa9a2 Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Sat, 6 Mar 2021 22:40:59 -0800 Subject: [PATCH 1/5] fix(idempotency): is_missing_idempotency_key and int Fix for: TypeError: 'int' object is not iterable --- .../utilities/idempotency/persistence/base.py | 2 +- .../idempotency/test_idempotency.py | 36 +++++++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/base.py b/aws_lambda_powertools/utilities/idempotency/persistence/base.py index 58f67a292e7..d7e26092158 100644 --- a/aws_lambda_powertools/utilities/idempotency/persistence/base.py +++ b/aws_lambda_powertools/utilities/idempotency/persistence/base.py @@ -183,7 +183,7 @@ def _get_hashed_idempotency_key(self, lambda_event: Dict[str, Any]) -> str: @staticmethod def is_missing_idempotency_key(data) -> bool: - return data is None or not data or all(x is None for x in data) + return data is None or not data or (type(data).__name__ in ("tuple", "list") and all(x is None for x in data)) def _get_hashed_payload(self, lambda_event: Dict[str, Any]) -> str: """ diff --git a/tests/functional/idempotency/test_idempotency.py b/tests/functional/idempotency/test_idempotency.py index 2f541587227..1dab2139008 100644 --- a/tests/functional/idempotency/test_idempotency.py +++ b/tests/functional/idempotency/test_idempotency.py @@ -677,22 +677,36 @@ def test_delete_from_cache_when_empty( def test_is_missing_idempotency_key(): + # GIVEN an empty tuple THEN is_missing_idempotency_key is True + assert BasePersistenceLayer.is_missing_idempotency_key(()) + # GIVEN an empty list THEN is_missing_idempotency_key is True + assert BasePersistenceLayer.is_missing_idempotency_key([]) + # GIVEN an empty dictionary THEN is_missing_idempotency_key is True + assert BasePersistenceLayer.is_missing_idempotency_key({}) + # GIVEN an empty str THEN is_missing_idempotency_key is True + assert BasePersistenceLayer.is_missing_idempotency_key("") + # GIVEN False THEN is_missing_idempotency_key is True + assert BasePersistenceLayer.is_missing_idempotency_key(False) + # GIVEN number 0 THEN is_missing_idempotency_key is True + assert BasePersistenceLayer.is_missing_idempotency_key(0) + # GIVEN None THEN is_missing_idempotency_key is True assert BasePersistenceLayer.is_missing_idempotency_key(None) # GIVEN a list of Nones THEN is_missing_idempotency_key is True assert BasePersistenceLayer.is_missing_idempotency_key([None, None]) - # GIVEN a list of all not None THEN is_missing_idempotency_key is false - assert BasePersistenceLayer.is_missing_idempotency_key([None, "Value"]) is False - # GIVEN a str THEN is_missing_idempotency_key is false + # GIVEN a tuples of Nones THEN is_missing_idempotency_key is True + assert BasePersistenceLayer.is_missing_idempotency_key((None, None)) + + # GIVEN a str THEN is_missing_idempotency_key is False assert BasePersistenceLayer.is_missing_idempotency_key("Value") is False - # GIVEN an empty tuple THEN is_missing_idempotency_key is false - assert BasePersistenceLayer.is_missing_idempotency_key(()) - # GIVEN an empty list THEN is_missing_idempotency_key is false - assert BasePersistenceLayer.is_missing_idempotency_key([]) - # GIVEN an empty dictionary THEN is_missing_idempotency_key is false - assert BasePersistenceLayer.is_missing_idempotency_key({}) - # GIVEN an empty str THEN is_missing_idempotency_key is false - assert BasePersistenceLayer.is_missing_idempotency_key("") + # GIVEN str "False" THEN is_missing_idempotency_key is False + assert BasePersistenceLayer.is_missing_idempotency_key("False") is False + # GIVEN an number THEN is_missing_idempotency_key is False + assert BasePersistenceLayer.is_missing_idempotency_key(1000) is False + # GIVEN a float THEN is_missing_idempotency_key is False + assert BasePersistenceLayer.is_missing_idempotency_key(10.01) is False + # GIVEN a list of all not None THEN is_missing_idempotency_key is False + assert BasePersistenceLayer.is_missing_idempotency_key([None, "Value"]) is False @pytest.mark.parametrize( From 038190c2d1ff136e3a24ee3bfc41a0f5edad0b50 Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Sat, 6 Mar 2021 23:01:26 -0800 Subject: [PATCH 2/5] refactor: Broke logic into multiple lines --- .../utilities/idempotency/persistence/base.py | 9 ++++++++- tests/functional/idempotency/test_idempotency.py | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/base.py b/aws_lambda_powertools/utilities/idempotency/persistence/base.py index d7e26092158..5d74efcaaad 100644 --- a/aws_lambda_powertools/utilities/idempotency/persistence/base.py +++ b/aws_lambda_powertools/utilities/idempotency/persistence/base.py @@ -183,7 +183,14 @@ def _get_hashed_idempotency_key(self, lambda_event: Dict[str, Any]) -> str: @staticmethod def is_missing_idempotency_key(data) -> bool: - return data is None or not data or (type(data).__name__ in ("tuple", "list") and all(x is None for x in data)) + if data is None: + return True + elif not data: + return True + elif type(data).__name__ in ("tuple", "list", "dict"): + return all(x is None for x in data) + else: + return False def _get_hashed_payload(self, lambda_event: Dict[str, Any]) -> str: """ diff --git a/tests/functional/idempotency/test_idempotency.py b/tests/functional/idempotency/test_idempotency.py index 1dab2139008..6f5ba74a7aa 100644 --- a/tests/functional/idempotency/test_idempotency.py +++ b/tests/functional/idempotency/test_idempotency.py @@ -696,6 +696,8 @@ def test_is_missing_idempotency_key(): assert BasePersistenceLayer.is_missing_idempotency_key([None, None]) # GIVEN a tuples of Nones THEN is_missing_idempotency_key is True assert BasePersistenceLayer.is_missing_idempotency_key((None, None)) + # GIVEN a dict of Nones THEN is_missing_idempotency_key is True + assert BasePersistenceLayer.is_missing_idempotency_key({None: None}) # GIVEN a str THEN is_missing_idempotency_key is False assert BasePersistenceLayer.is_missing_idempotency_key("Value") is False From b82db92b91166e4291327697a8445ffc750a7a7a Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Sat, 6 Mar 2021 23:27:02 -0800 Subject: [PATCH 3/5] refactor: Clean up ifs --- .../utilities/idempotency/persistence/base.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/base.py b/aws_lambda_powertools/utilities/idempotency/persistence/base.py index 5d74efcaaad..aa23886c4dd 100644 --- a/aws_lambda_powertools/utilities/idempotency/persistence/base.py +++ b/aws_lambda_powertools/utilities/idempotency/persistence/base.py @@ -183,14 +183,11 @@ def _get_hashed_idempotency_key(self, lambda_event: Dict[str, Any]) -> str: @staticmethod def is_missing_idempotency_key(data) -> bool: - if data is None: + if data is None or not data: return True - elif not data: - return True - elif type(data).__name__ in ("tuple", "list", "dict"): + if type(data).__name__ in ("tuple", "list", "dict"): return all(x is None for x in data) - else: - return False + return False def _get_hashed_payload(self, lambda_event: Dict[str, Any]) -> str: """ From 0be68bdeed929be00c83c3bf99599d3f993b50b6 Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Sun, 7 Mar 2021 00:03:26 -0800 Subject: [PATCH 4/5] refactor: Rely on python truthy --- aws_lambda_powertools/utilities/idempotency/persistence/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/base.py b/aws_lambda_powertools/utilities/idempotency/persistence/base.py index aa23886c4dd..4ee6eb7d523 100644 --- a/aws_lambda_powertools/utilities/idempotency/persistence/base.py +++ b/aws_lambda_powertools/utilities/idempotency/persistence/base.py @@ -183,7 +183,7 @@ def _get_hashed_idempotency_key(self, lambda_event: Dict[str, Any]) -> str: @staticmethod def is_missing_idempotency_key(data) -> bool: - if data is None or not data: + if not data: return True if type(data).__name__ in ("tuple", "list", "dict"): return all(x is None for x in data) From f935e6943656338030c0db960cfa23b9671cc376 Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Sun, 7 Mar 2021 00:06:03 -0800 Subject: [PATCH 5/5] refactor: Even simplier --- .../utilities/idempotency/persistence/base.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/base.py b/aws_lambda_powertools/utilities/idempotency/persistence/base.py index 4ee6eb7d523..de726115d95 100644 --- a/aws_lambda_powertools/utilities/idempotency/persistence/base.py +++ b/aws_lambda_powertools/utilities/idempotency/persistence/base.py @@ -183,11 +183,9 @@ def _get_hashed_idempotency_key(self, lambda_event: Dict[str, Any]) -> str: @staticmethod def is_missing_idempotency_key(data) -> bool: - if not data: - return True if type(data).__name__ in ("tuple", "list", "dict"): return all(x is None for x in data) - return False + return not data def _get_hashed_payload(self, lambda_event: Dict[str, Any]) -> str: """