diff --git a/src/aws_durable_execution_sdk_python/execution.py b/src/aws_durable_execution_sdk_python/execution.py index 95c086d..8f3a9c2 100644 --- a/src/aws_durable_execution_sdk_python/execution.py +++ b/src/aws_durable_execution_sdk_python/execution.py @@ -4,7 +4,9 @@ import logging from dataclasses import dataclass from enum import Enum +from functools import wraps from typing import TYPE_CHECKING, Any +from warnings import deprecated from aws_durable_execution_sdk_python.context import DurableContext, ExecutionState from aws_durable_execution_sdk_python.exceptions import ( @@ -187,7 +189,7 @@ def create_succeeded(cls, result: str) -> DurableExecutionInvocationOutput: # endregion Invocation models -def durable_handler( +def durable_execution( func: Callable[[Any, DurableContext], Any], ) -> Callable[[Any, LambdaContext], Any]: logger.debug("Starting durable execution handler...") @@ -308,3 +310,9 @@ def wrapper(event: Any, context: LambdaContext) -> MutableMapping[str, Any]: ).to_dict() return wrapper + + +@deprecated("Use `durable_execution` instead.") +@wraps(durable_execution) +def durable_handler(*args, **kwargs): + return durable_execution(*args, **kwargs) diff --git a/src/aws_durable_execution_sdk_python/state.py b/src/aws_durable_execution_sdk_python/state.py index 5b909d6..084f431 100644 --- a/src/aws_durable_execution_sdk_python/state.py +++ b/src/aws_durable_execution_sdk_python/state.py @@ -219,7 +219,7 @@ def get_checkpoint_result(self, checkpoint_id: str) -> CheckpointedResult: Note this does not invoke the Durable Functions API. It only checks against the checkpoints currently saved in ExecutionState. The current saved checkpoints are from InitialExecutionState as retrieved - at the start of the current execution/replay (see execution.durable_handler), + at the start of the current execution/replay (see execution.durable_execution), and from each create_checkpoint response. Args: diff --git a/tests/e2e/execution_int_test.py b/tests/e2e/execution_int_test.py index 7549580..0581328 100644 --- a/tests/e2e/execution_int_test.py +++ b/tests/e2e/execution_int_test.py @@ -12,7 +12,7 @@ ) from aws_durable_execution_sdk_python.execution import ( InvocationStatus, - durable_handler, + durable_execution, ) # LambdaContext no longer needed - using duck typing @@ -41,7 +41,7 @@ def step_no_args(step_context: StepContext) -> str: def step_with_args(step_context: StepContext, a: int, b: str) -> str: return f"from step {a} {b}" - @durable_handler + @durable_execution def my_handler(event, context: DurableContext) -> list[str]: results: list[str] = [] result: str = context.step(step_with_args(a=123, b="str")) @@ -138,7 +138,7 @@ def mystep(step_context: StepContext, a: int, b: str) -> str: step_context.logger.info("from step %s %s", a, b) return "result" - @durable_handler + @durable_execution def my_handler(event, context: DurableContext): context.set_logger(my_logger) result: str = context.step(mystep(a=123, b="str")) @@ -232,7 +232,7 @@ def func(child_context: DurableContext, a: int, b: int): mock_inside_child(a, b) child_context.wait(1) - @durable_handler + @durable_execution def my_handler(event, context): context.run_in_child_context(func(10, 20)) @@ -325,7 +325,7 @@ class CustomError(Exception): def test_wait_not_caught_by_exception(): """Do not catch Suspend exceptions.""" - @durable_handler + @durable_execution def my_handler(event: Any, context: DurableContext): try: context.wait(1) diff --git a/tests/execution_test.py b/tests/execution_test.py index 4e21b85..305be28 100644 --- a/tests/execution_test.py +++ b/tests/execution_test.py @@ -14,7 +14,7 @@ DurableExecutionInvocationInputWithClient, InitialExecutionState, InvocationStatus, - durable_handler, + durable_execution, ) # LambdaContext no longer needed - using duck typing @@ -266,11 +266,11 @@ def test_operation_to_dict_minimal(): # endregion Models -# region durable_handler +# region durable_execution -def test_durable_handler_client_selection_env_normal_result(): - """Test durable_handler selects correct client from environment.""" +def test_durable_execution_client_selection_env_normal_result(): + """Test durable_execution selects correct client from environment.""" with patch( "aws_durable_execution_sdk_python.execution.LambdaClient" ) as mock_lambda_client: @@ -284,7 +284,7 @@ def test_durable_handler_client_selection_env_normal_result(): ) mock_client.checkpoint.return_value = mock_output - @durable_handler + @durable_execution def test_handler(event: Any, context: DurableContext) -> dict: return {"result": "success"} @@ -322,8 +322,8 @@ def test_handler(event: Any, context: DurableContext) -> dict: mock_client.checkpoint.assert_not_called() -def test_durable_handler_client_selection_env_large_result(): - """Test durable_handler selects correct client from environment.""" +def test_durable_execution_client_selection_env_large_result(): + """Test durable_execution selects correct client from environment.""" with patch( "aws_durable_execution_sdk_python.execution.LambdaClient" ) as mock_lambda_client: @@ -337,7 +337,7 @@ def test_durable_handler_client_selection_env_large_result(): ) mock_client.checkpoint.return_value = mock_output - @durable_handler + @durable_execution def test_handler(event: Any, context: DurableContext) -> dict: return {"result": LARGE_RESULT} @@ -375,8 +375,8 @@ def test_handler(event: Any, context: DurableContext) -> dict: mock_client.checkpoint.assert_called_once() -def test_durable_handler_with_injected_client_success_normal_result(): - """Test durable_handler uses injected DurableServiceClient for successful execution.""" +def test_durable_execution_with_injected_client_success_normal_result(): + """Test durable_execution uses injected DurableServiceClient for successful execution.""" mock_client = Mock(spec=DurableServiceClient) # Mock successful checkpoint @@ -386,7 +386,7 @@ def test_durable_handler_with_injected_client_success_normal_result(): ) mock_client.checkpoint.return_value = mock_output - @durable_handler + @durable_execution def test_handler(event: Any, context: DurableContext) -> dict: return {"result": "success"} @@ -423,8 +423,8 @@ def test_handler(event: Any, context: DurableContext) -> dict: mock_client.checkpoint.assert_not_called() -def test_durable_handler_with_injected_client_success_large_result(): - """Test durable_handler uses injected DurableServiceClient for successful execution.""" +def test_durable_execution_with_injected_client_success_large_result(): + """Test durable_execution uses injected DurableServiceClient for successful execution.""" mock_client = Mock(spec=DurableServiceClient) # Mock successful checkpoint @@ -434,7 +434,7 @@ def test_durable_handler_with_injected_client_success_large_result(): ) mock_client.checkpoint.return_value = mock_output - @durable_handler + @durable_execution def test_handler(event: Any, context: DurableContext) -> dict: return {"result": LARGE_RESULT} @@ -479,8 +479,8 @@ def test_handler(event: Any, context: DurableContext) -> dict: assert json.loads(updates[0].payload) == {"result": LARGE_RESULT} -def test_durable_handler_with_injected_client_failure(): - """Test durable_handler uses injected DurableServiceClient for failed execution.""" +def test_durable_execution_with_injected_client_failure(): + """Test durable_execution uses injected DurableServiceClient for failed execution.""" mock_client = Mock(spec=DurableServiceClient) # Mock successful checkpoint for failure @@ -490,7 +490,7 @@ def test_durable_handler_with_injected_client_failure(): ) mock_client.checkpoint.return_value = mock_output - @durable_handler + @durable_execution def test_handler(event: Any, context: DurableContext) -> dict: msg = "Test error" raise ValueError(msg) @@ -535,14 +535,14 @@ def test_handler(event: Any, context: DurableContext) -> dict: assert updates[0].error.type == "ValueError" -def test_durable_handler_checkpoint_error_propagation(): - """Test durable_handler propagates CheckpointError from DurableServiceClient.""" +def test_durable_execution_checkpoint_error_propagation(): + """Test durable_execution propagates CheckpointError from DurableServiceClient.""" mock_client = Mock(spec=DurableServiceClient) # Mock checkpoint to raise CheckpointError mock_client.checkpoint.side_effect = CheckpointError("Checkpoint failed") - @durable_handler + @durable_execution def test_handler(event: Any, context: DurableContext) -> dict: return {"result": LARGE_RESULT} @@ -575,11 +575,11 @@ def test_handler(event: Any, context: DurableContext) -> dict: test_handler(invocation_input, lambda_context) -def test_durable_handler_fatal_error_handling(): - """Test durable_handler handles FatalError correctly.""" +def test_durable_execution_fatal_error_handling(): + """Test durable_execution handles FatalError correctly.""" mock_client = Mock(spec=DurableServiceClient) - @durable_handler + @durable_execution def test_handler(event: Any, context: DurableContext) -> dict: msg = "Fatal error occurred" raise FatalError(msg) @@ -615,8 +615,8 @@ def test_handler(event: Any, context: DurableContext) -> dict: assert "Fatal error occurred" in result["Error"]["ErrorMessage"] -def test_durable_handler_client_selection_local_runner(): - """Test durable_handler selects correct client for local runner.""" +def test_durable_execution_client_selection_local_runner(): + """Test durable_execution selects correct client for local runner.""" with patch( "aws_durable_execution_sdk_python.execution.LambdaClient" ) as mock_lambda_client: @@ -630,7 +630,7 @@ def test_durable_handler_client_selection_local_runner(): ) mock_client.checkpoint.return_value = mock_output - @durable_handler + @durable_execution def test_handler(event: Any, context: DurableContext) -> dict: return {"result": "success"} @@ -666,4 +666,4 @@ def test_handler(event: Any, context: DurableContext) -> dict: mock_lambda_client.initialize_local_runner_client.assert_called_once() -# endregion durable_handler +# endregion durable_execution