From 62d7c03db1b0e22bf16aaf848628894262dd96f8 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Fri, 21 Jun 2024 14:14:56 -0400 Subject: [PATCH] Use unfinished_policy=HandlerUnfinishedPolicy.XXX --- temporalio/worker/_workflow_instance.py | 10 ++++----- temporalio/workflow.py | 30 ++++++++++++------------- tests/worker/test_workflow.py | 16 ++++++------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index a02892ce..2cbe7ae4 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -1622,8 +1622,8 @@ def warnable(handler_executions: Iterable[HandlerExecution]): return [ ex for ex in handler_executions - if ex.unfinished_handlers_policy - == temporalio.workflow.UnfinishedHandlersPolicy.WARN_AND_ABANDON + if ex.unfinished_policy + == temporalio.workflow.HandlerUnfinishedPolicy.WARN_AND_ABANDON ] warnable_updates = warnable(self._in_progress_updates.values()) @@ -2742,7 +2742,7 @@ class HandlerExecution: """Information about an execution of a signal or update handler.""" name: str - unfinished_handlers_policy: temporalio.workflow.UnfinishedHandlersPolicy + unfinished_policy: temporalio.workflow.HandlerUnfinishedPolicy id: Optional[str] = None @@ -2764,7 +2764,7 @@ def __str__(self) -> str: Alternatively, if both you and the clients sending updates and signals are okay with interrupting running handlers when the workflow finishes, and causing clients to receive errors, then you can disable this warning via the update handler decorator: -`@workflow.update(unfinished_handlers_policy=workflow.UnfinishedHandlersPolicy.ABANDON)`. +`@workflow.update(unfinished_policy=workflow.HandlerUnfinishedPolicy.ABANDON)`. """.replace( "\n", " " ).strip() @@ -2793,7 +2793,7 @@ def __str__(self) -> str: you and the clients sending updates and signals are okay with interrupting running handlers when the workflow finishes, and causing clients to receive errors, then you can disable this warning via the signal handler decorator: -`@workflow.signal(unfinished_handlers_policy=workflow.UnfinishedHandlersPolicy.ABANDON)`. +`@workflow.signal(unfinished_policy=workflow.HandlerUnfinishedPolicy.ABANDON)`. """.replace( "\n", " " ).strip() diff --git a/temporalio/workflow.py b/temporalio/workflow.py index e88838d0..bcaba1a4 100644 --- a/temporalio/workflow.py +++ b/temporalio/workflow.py @@ -173,7 +173,7 @@ def run(fn: CallableAsyncType) -> CallableAsyncType: return fn # type: ignore[return-value] -class UnfinishedHandlersPolicy(Enum): +class HandlerUnfinishedPolicy(Enum): """Actions taken if a workflow terminates with running handlers. Policy defining actions taken when a workflow exits while update or signal handlers are running. @@ -195,7 +195,7 @@ def signal(fn: CallableSyncOrAsyncReturnNoneType) -> CallableSyncOrAsyncReturnNo @overload def signal( *, - unfinished_policy: UnfinishedHandlersPolicy = UnfinishedHandlersPolicy.WARN_AND_ABANDON, + unfinished_policy: HandlerUnfinishedPolicy = HandlerUnfinishedPolicy.WARN_AND_ABANDON, ) -> Callable[[CallableSyncOrAsyncReturnNoneType], CallableSyncOrAsyncReturnNoneType]: ... @@ -204,7 +204,7 @@ def signal( def signal( *, name: str, - unfinished_policy: UnfinishedHandlersPolicy = UnfinishedHandlersPolicy.WARN_AND_ABANDON, + unfinished_policy: HandlerUnfinishedPolicy = HandlerUnfinishedPolicy.WARN_AND_ABANDON, ) -> Callable[[CallableSyncOrAsyncReturnNoneType], CallableSyncOrAsyncReturnNoneType]: ... @@ -213,7 +213,7 @@ def signal( def signal( *, dynamic: Literal[True], - unfinished_policy: UnfinishedHandlersPolicy = UnfinishedHandlersPolicy.WARN_AND_ABANDON, + unfinished_policy: HandlerUnfinishedPolicy = HandlerUnfinishedPolicy.WARN_AND_ABANDON, ) -> Callable[[CallableSyncOrAsyncReturnNoneType], CallableSyncOrAsyncReturnNoneType]: ... @@ -223,7 +223,7 @@ def signal( *, name: Optional[str] = None, dynamic: Optional[bool] = False, - unfinished_policy: UnfinishedHandlersPolicy = UnfinishedHandlersPolicy.WARN_AND_ABANDON, + unfinished_policy: HandlerUnfinishedPolicy = HandlerUnfinishedPolicy.WARN_AND_ABANDON, ): """Decorator for a workflow signal method. @@ -250,7 +250,7 @@ def signal( def decorator( name: Optional[str], - unfinished_policy: UnfinishedHandlersPolicy, + unfinished_policy: HandlerUnfinishedPolicy, fn: CallableSyncOrAsyncReturnNoneType, ) -> CallableSyncOrAsyncReturnNoneType: if not name and not dynamic: @@ -965,7 +965,7 @@ def update( @overload def update( *, - unfinished_policy: UnfinishedHandlersPolicy = UnfinishedHandlersPolicy.WARN_AND_ABANDON, + unfinished_policy: HandlerUnfinishedPolicy = HandlerUnfinishedPolicy.WARN_AND_ABANDON, ) -> Callable[ [Callable[MultiParamSpec, ReturnType]], UpdateMethodMultiParam[MultiParamSpec, ReturnType], @@ -977,7 +977,7 @@ def update( def update( *, name: str, - unfinished_policy: UnfinishedHandlersPolicy = UnfinishedHandlersPolicy.WARN_AND_ABANDON, + unfinished_policy: HandlerUnfinishedPolicy = HandlerUnfinishedPolicy.WARN_AND_ABANDON, ) -> Callable[ [Callable[MultiParamSpec, ReturnType]], UpdateMethodMultiParam[MultiParamSpec, ReturnType], @@ -989,7 +989,7 @@ def update( def update( *, dynamic: Literal[True], - unfinished_policy: UnfinishedHandlersPolicy = UnfinishedHandlersPolicy.WARN_AND_ABANDON, + unfinished_policy: HandlerUnfinishedPolicy = HandlerUnfinishedPolicy.WARN_AND_ABANDON, ) -> Callable[ [Callable[MultiParamSpec, ReturnType]], UpdateMethodMultiParam[MultiParamSpec, ReturnType], @@ -1002,7 +1002,7 @@ def update( *, name: Optional[str] = None, dynamic: Optional[bool] = False, - unfinished_policy: UnfinishedHandlersPolicy = UnfinishedHandlersPolicy.WARN_AND_ABANDON, + unfinished_policy: HandlerUnfinishedPolicy = HandlerUnfinishedPolicy.WARN_AND_ABANDON, ): """Decorator for a workflow update handler method. @@ -1036,7 +1036,7 @@ def update( def decorator( name: Optional[str], - unfinished_policy: UnfinishedHandlersPolicy, + unfinished_policy: HandlerUnfinishedPolicy, fn: CallableSyncOrAsyncType, ) -> CallableSyncOrAsyncType: if not name and not dynamic: @@ -1517,8 +1517,8 @@ class _SignalDefinition: name: Optional[str] fn: Callable[..., Union[None, Awaitable[None]]] is_method: bool - unfinished_policy: UnfinishedHandlersPolicy = ( - UnfinishedHandlersPolicy.WARN_AND_ABANDON + unfinished_policy: HandlerUnfinishedPolicy = ( + HandlerUnfinishedPolicy.WARN_AND_ABANDON ) # Types loaded on post init if None arg_types: Optional[List[Type]] = None @@ -1601,8 +1601,8 @@ class _UpdateDefinition: name: Optional[str] fn: Callable[..., Union[Any, Awaitable[Any]]] is_method: bool - unfinished_policy: UnfinishedHandlersPolicy = ( - UnfinishedHandlersPolicy.WARN_AND_ABANDON + unfinished_policy: HandlerUnfinishedPolicy = ( + HandlerUnfinishedPolicy.WARN_AND_ABANDON ) # Types loaded on post init if None arg_types: Optional[List[Type]] = None diff --git a/tests/worker/test_workflow.py b/tests/worker/test_workflow.py index fced4000..b230ff73 100644 --- a/tests/worker/test_workflow.py +++ b/tests/worker/test_workflow.py @@ -5117,12 +5117,12 @@ async def _do_update_or_signal(self) -> None: async def my_update(self) -> None: await self._do_update_or_signal() - @workflow.update(unfinished_policy=workflow.UnfinishedHandlersPolicy.ABANDON) + @workflow.update(unfinished_policy=workflow.HandlerUnfinishedPolicy.ABANDON) async def my_update_ABANDON(self) -> None: await self._do_update_or_signal() @workflow.update( - unfinished_policy=workflow.UnfinishedHandlersPolicy.WARN_AND_ABANDON + unfinished_policy=workflow.HandlerUnfinishedPolicy.WARN_AND_ABANDON ) async def my_update_WARN_AND_ABANDON(self) -> None: await self._do_update_or_signal() @@ -5131,12 +5131,12 @@ async def my_update_WARN_AND_ABANDON(self) -> None: async def my_signal(self): await self._do_update_or_signal() - @workflow.signal(unfinished_policy=workflow.UnfinishedHandlersPolicy.ABANDON) + @workflow.signal(unfinished_policy=workflow.HandlerUnfinishedPolicy.ABANDON) async def my_signal_ABANDON(self): await self._do_update_or_signal() @workflow.signal( - unfinished_policy=workflow.UnfinishedHandlersPolicy.WARN_AND_ABANDON + unfinished_policy=workflow.HandlerUnfinishedPolicy.WARN_AND_ABANDON ) async def my_signal_WARN_AND_ABANDON(self): await self._do_update_or_signal() @@ -5164,10 +5164,10 @@ async def run_test(self): wait_for_handlers=False, ) assert not handler_finished and warning - # and when the workflow sets the unfinished_handlers_policy to WARN_AND_ABANDON, + # and when the workflow sets the unfinished_policy to WARN_AND_ABANDON, handler_finished, warning = await self.get_workflow_result_and_warning( wait_for_handlers=False, - unfinished_policy=workflow.UnfinishedHandlersPolicy.WARN_AND_ABANDON, + unfinished_policy=workflow.HandlerUnfinishedPolicy.WARN_AND_ABANDON, ) assert not handler_finished and warning # but not when the workflow waits for handlers to complete, @@ -5178,14 +5178,14 @@ async def run_test(self): # nor when the silence-warnings policy is set on the handler. handler_finished, warning = await self.get_workflow_result_and_warning( wait_for_handlers=False, - unfinished_policy=workflow.UnfinishedHandlersPolicy.ABANDON, + unfinished_policy=workflow.HandlerUnfinishedPolicy.ABANDON, ) assert not handler_finished and not warning async def get_workflow_result_and_warning( self, wait_for_handlers: bool, - unfinished_policy: Optional[workflow.UnfinishedHandlersPolicy] = None, + unfinished_policy: Optional[workflow.HandlerUnfinishedPolicy] = None, ) -> Tuple[bool, bool]: handle = await self.client.start_workflow( UnfinishedHandlersWorkflow.run,