|
4 | 4 | import uuid |
5 | 5 | from contextlib import closing |
6 | 6 | from datetime import timedelta |
7 | | -from typing import Awaitable, Callable, Optional, Sequence, Type, TypeVar |
| 7 | +from typing import Any, Awaitable, Callable, Optional, Sequence, Type, TypeVar |
8 | 8 |
|
9 | 9 | from temporalio.api.common.v1 import WorkflowExecution |
10 | 10 | from temporalio.api.enums.v1 import IndexedValueType |
|
14 | 14 | ) |
15 | 15 | from temporalio.api.update.v1 import UpdateRef |
16 | 16 | from temporalio.api.workflowservice.v1 import PollWorkflowExecutionUpdateRequest |
17 | | -from temporalio.client import BuildIdOpAddNewDefault, Client |
| 17 | +from temporalio.client import BuildIdOpAddNewDefault, Client, WorkflowHandle |
18 | 18 | from temporalio.common import SearchAttributeKey |
19 | 19 | from temporalio.service import RPCError, RPCStatusCode |
20 | 20 | from temporalio.worker import Worker, WorkflowRunner |
21 | 21 | from temporalio.worker.workflow_sandbox import SandboxedWorkflowRunner |
| 22 | +from temporalio.workflow import UpdateMethodMultiParam |
22 | 23 |
|
23 | 24 |
|
24 | 25 | def new_worker( |
@@ -128,3 +129,24 @@ async def workflow_update_exists( |
128 | 129 | if err.status != RPCStatusCode.NOT_FOUND: |
129 | 130 | raise |
130 | 131 | return False |
| 132 | + |
| 133 | + |
| 134 | +# TODO: type update return value |
| 135 | +async def admitted_update_task( |
| 136 | + client: Client, |
| 137 | + handle: WorkflowHandle, |
| 138 | + update_method: UpdateMethodMultiParam, |
| 139 | + id: str, |
| 140 | + **kwargs, |
| 141 | +) -> asyncio.Task: |
| 142 | + """ |
| 143 | + Return an asyncio.Task for an update after waiting for it to be admitted. |
| 144 | + """ |
| 145 | + update_task = asyncio.create_task( |
| 146 | + handle.execute_update(update_method, id=id, **kwargs) |
| 147 | + ) |
| 148 | + await assert_eq_eventually( |
| 149 | + True, |
| 150 | + lambda: workflow_update_exists(client, handle.id, id), |
| 151 | + ) |
| 152 | + return update_task |
0 commit comments