Skip to content

Commit 2512cda

Browse files
author
Michael Brewer
committed
chore: Some refactoring
1 parent 2174b91 commit 2512cda

File tree

4 files changed

+19
-18
lines changed

4 files changed

+19
-18
lines changed

aws_lambda_powertools/utilities/idempotency/idempotency.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def idempotent(
5252
--------
5353
**Processes Lambda's event in an idempotent manner**
5454
>>> from aws_lambda_powertools.utilities.idempotency import (
55-
>>> idempotent, DynamoDBPersistenceLayer
55+
>>> idempotent, DynamoDBPersistenceLayer, IdempotencyConfig
5656
>>> )
5757
>>>
5858
>>> persistence_layer = DynamoDBPersistenceLayer(table_name="idempotency_store")
@@ -62,7 +62,7 @@ def idempotent(
6262
>>> return {"StatusCode": 200}
6363
"""
6464

65-
idempotency_handler = IdempotencyHandler(handler, event, context, config, persistence_store)
65+
idempotency_handler = IdempotencyHandler(handler, event, context, config or IdempotencyConfig(), persistence_store)
6666

6767
# IdempotencyInconsistentStateError can happen under rare but expected cases when persistent state changes in the
6868
# small time between put & get requests. In most cases we can retry successfully on this exception.
@@ -105,7 +105,7 @@ def __init__(
105105
persistence_store : BasePersistenceLayer
106106
Instance of persistence layer to store idempotency records
107107
"""
108-
persistence_store.configure(config)
108+
persistence_store._configure(config)
109109
self.persistence_store = persistence_store
110110
self.context = context
111111
self.event = event

aws_lambda_powertools/utilities/idempotency/persistence/base.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,32 +109,33 @@ class BasePersistenceLayer(ABC):
109109
"""
110110

111111
def __init__(self):
112+
"""Initialize the defaults """
112113
self.configured = False
113-
114114
self.event_key_jmespath: Optional[str] = None
115115
self.event_key_compiled_jmespath = None
116116
self.jmespath_options: Optional[dict] = None
117117
self.payload_validation_enabled = False
118118
self.validation_key_jmespath = None
119119
self.raise_on_no_idempotency_key = False
120-
self.expires_after_seconds = None
120+
self.expires_after_seconds: int = 60 * 60 # 1 hour default
121121
self.use_local_cache = False
122122
self._cache: Optional[LRUDict] = None
123123
self.hash_function = None
124124

125-
def configure(self, config: IdempotencyConfig,) -> None:
125+
def _configure(self, config: IdempotencyConfig) -> None:
126126
"""
127-
Initialize the base persistence layer
127+
Initialize the base persistence layer from the configuration settings
128128
129129
Parameters
130130
----------
131131
config: IdempotencyConfig
132-
Configuration settings
132+
Idempotency configuration settings
133133
"""
134134
if self.configured:
135-
# Temp hack to prevent being reconfigured.
135+
# Prevent being reconfigured.
136136
return
137137
self.configured = True
138+
138139
self.event_key_jmespath = config.event_key_jmespath
139140
if config.event_key_jmespath:
140141
self.event_key_compiled_jmespath = jmespath.compile(config.event_key_jmespath)
@@ -174,9 +175,9 @@ def _get_hashed_idempotency_key(self, lambda_event: Dict[str, Any]) -> str:
174175
)
175176

176177
if self.is_missing_idempotency_key(data):
177-
warnings.warn(f"No value found for idempotency_key. jmespath: {self.event_key_jmespath}")
178178
if self.raise_on_no_idempotency_key:
179179
raise IdempotencyKeyError("No data found to create a hashed idempotency_key")
180+
warnings.warn(f"No value found for idempotency_key. jmespath: {self.event_key_jmespath}")
180181

181182
return self._generate_hash(data)
182183

examples/__init__.py

Whitespace-only changes.

tests/functional/idempotency/test_idempotency.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def test_idempotent_lambda_first_execution_cached(
225225
Test idempotent decorator when lambda is executed with an event with a previously unknown event key. Ensure
226226
result is cached locally on the persistence store instance.
227227
"""
228-
persistence_store.configure(idempotency_config)
228+
persistence_store._configure(idempotency_config)
229229
save_to_cache_spy = mocker.spy(persistence_store, "_save_to_cache")
230230
retrieve_from_cache_spy = mocker.spy(persistence_store, "_retrieve_from_cache")
231231
stubber = stub.Stubber(persistence_store.table.meta.client)
@@ -625,7 +625,7 @@ def test_data_record_invalid_status_value():
625625
def test_in_progress_never_saved_to_cache(idempotency_config, persistence_store):
626626
# GIVEN a data record with status "INPROGRESS"
627627
# and persistence_store has use_local_cache = True
628-
persistence_store.configure(idempotency_config)
628+
persistence_store._configure(idempotency_config)
629629
data_record = DataRecord("key", status="INPROGRESS")
630630

631631
# WHEN saving to local cache
@@ -638,7 +638,7 @@ def test_in_progress_never_saved_to_cache(idempotency_config, persistence_store)
638638
@pytest.mark.parametrize("idempotency_config", [{"use_local_cache": False}], indirect=True)
639639
def test_user_local_disabled(idempotency_config, persistence_store):
640640
# GIVEN a persistence_store with use_local_cache = False
641-
persistence_store.configure(idempotency_config)
641+
persistence_store._configure(idempotency_config)
642642

643643
# WHEN calling any local cache options
644644
data_record = DataRecord("key", status="COMPLETED")
@@ -658,7 +658,7 @@ def test_user_local_disabled(idempotency_config, persistence_store):
658658
@pytest.mark.parametrize("idempotency_config", [{"use_local_cache": True}], indirect=True)
659659
def test_delete_from_cache_when_empty(idempotency_config, persistence_store):
660660
# GIVEN use_local_cache is True AND the local cache is empty
661-
persistence_store.configure(idempotency_config)
661+
persistence_store._configure(idempotency_config)
662662

663663
try:
664664
# WHEN we _delete_from_cache
@@ -692,7 +692,7 @@ def test_is_missing_idempotency_key():
692692
)
693693
def test_default_no_raise_on_missing_idempotency_key(idempotency_config, persistence_store):
694694
# GIVEN a persistence_store with use_local_cache = False and event_key_jmespath = "body"
695-
persistence_store.configure(idempotency_config)
695+
persistence_store._configure(idempotency_config)
696696
assert persistence_store.use_local_cache is False
697697
assert "body" in persistence_store.event_key_jmespath
698698

@@ -708,7 +708,7 @@ def test_default_no_raise_on_missing_idempotency_key(idempotency_config, persist
708708
)
709709
def test_raise_on_no_idempotency_key(idempotency_config, persistence_store):
710710
# GIVEN a persistence_store with raise_on_no_idempotency_key and no idempotency key in the request
711-
persistence_store.configure(idempotency_config)
711+
persistence_store._configure(idempotency_config)
712712
persistence_store.raise_on_no_idempotency_key = True
713713
assert persistence_store.use_local_cache is False
714714
assert "body" in persistence_store.event_key_jmespath
@@ -724,7 +724,7 @@ def test_raise_on_no_idempotency_key(idempotency_config, persistence_store):
724724
def test_jmespath_with_powertools_json(persistence_store):
725725
# GIVEN an event_key_jmespath with powertools_json custom function
726726
config = IdempotencyConfig(event_key_jmespath="[requestContext.authorizer.claims.sub, powertools_json(body).id]")
727-
persistence_store.configure(config)
727+
persistence_store._configure(config)
728728
sub_attr_value = "cognito_user"
729729
key_attr_value = "some_key"
730730
expected_value = [sub_attr_value, key_attr_value]
@@ -744,7 +744,7 @@ def test_jmespath_with_powertools_json(persistence_store):
744744
def test_custom_jmespath_function_overrides_builtin_functions(config_with_jmespath_options, persistence_store):
745745
# GIVEN an persistence store with a custom jmespath_options
746746
# AND use a builtin powertools custom function
747-
persistence_store.configure(config_with_jmespath_options)
747+
persistence_store._configure(config_with_jmespath_options)
748748
with pytest.raises(jmespath.exceptions.UnknownFunctionError, match="Unknown function: powertools_json()"):
749749
# WHEN calling _get_hashed_idempotency_key
750750
# THEN raise unknown function

0 commit comments

Comments
 (0)