Skip to content

Commit 5651483

Browse files
committed
Remove dynamic behavior getter for now
1 parent b9bc00e commit 5651483

File tree

5 files changed

+14
-118
lines changed

5 files changed

+14
-118
lines changed

temporalio/worker/_workflow.py

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -136,23 +136,14 @@ def __init__(
136136
if defn.name in self._workflows:
137137
raise ValueError(f"More than one workflow named {defn.name}")
138138
if should_enforce_versioning_behavior:
139-
not_in_annotation = defn.versioning_behavior in [
139+
if defn.versioning_behavior in [
140140
None,
141141
temporalio.common.VersioningBehavior.UNSPECIFIED,
142-
]
143-
if defn.name:
144-
if not_in_annotation:
145-
raise ValueError(
146-
f"Workflow {defn.name} must specify a versioning behavior using "
147-
"the `versioning_behavior` argument to `@workflow.defn`."
148-
)
149-
else:
150-
if not_in_annotation and defn.dynamic_versioning_behavior is None:
151-
raise ValueError(
152-
f"Dynamic Workflow {defn.cls.__qualname__} must specify a versioning "
153-
"behavior using `@workflow.dynamic_versioning_behavior` or the "
154-
"`versioning_behavior` argument to `@workflow.defn`."
155-
)
142+
]:
143+
raise ValueError(
144+
f"Workflow {defn.name} must specify a versioning behavior using "
145+
"the `versioning_behavior` argument to `@workflow.defn`."
146+
)
156147

157148
# Prepare the workflow with the runner (this will error in the
158149
# sandbox if an import fails somehow)

temporalio/worker/_workflow_instance.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -414,20 +414,6 @@ def activate(
414414
)
415415
activation_err = None
416416

417-
# If this workflow is dynamic, try calling the dynamic versioning behavior
418-
if self._defn.name is None:
419-
dvb = self.workflow_get_dynamic_versioning_behavior()
420-
if dvb:
421-
with self._as_read_only():
422-
vb = dvb()
423-
if (
424-
vb
425-
!= temporalio.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_UNSPECIFIED
426-
):
427-
self._current_completion.successful.versioning_behavior = (
428-
vb.value
429-
)
430-
431417
# If we're deleting, there better be no more tasks. It is important for
432418
# the integrity of the system that we check this. If there are tasks
433419
# remaining, they and any associated coroutines will get garbage
@@ -1040,14 +1026,6 @@ def workflow_get_update_validator(self, name: Optional[str]) -> Optional[Callabl
10401026
# Bind if a method
10411027
return defn.bind_validator(self._object) if defn.is_method else defn.validator
10421028

1043-
def workflow_get_dynamic_versioning_behavior(
1044-
self,
1045-
) -> Optional[Callable[[], temporalio.common.VersioningBehavior]]:
1046-
defn = self._defn.dynamic_versioning_behavior
1047-
if not defn:
1048-
return None
1049-
return temporalio.workflow._bind_method(self._object, defn)
1050-
10511029
def workflow_info(self) -> temporalio.workflow.Info:
10521030
return self._outbound.info()
10531031

temporalio/workflow.py

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -223,25 +223,6 @@ class UnfinishedSignalHandlersWarning(RuntimeWarning):
223223
"""The workflow exited before all signal handlers had finished executing."""
224224

225225

226-
def dynamic_versioning_behavior(
227-
fn: MethodSyncNoParam[SelfType, temporalio.common.VersioningBehavior],
228-
) -> MethodSyncNoParam[SelfType, temporalio.common.VersioningBehavior]:
229-
"""Decorator for specifying versioning behavior in dynamic workflows.
230-
231-
This function must be read-only and not mutate workflow state. Any mutation could lead to
232-
nondeterministic behavior. If the workflow function specifies a `versioning_behavior` on
233-
both ``@workflow.run`` and with a getter, the getter's value will be used whenever it is not
234-
``VersioningBehavior.UNSPECIFIED``.
235-
236-
WARNING: This setting is experimental.
237-
238-
Args:
239-
fn: The method to decorate
240-
"""
241-
setattr(fn, "__temporal_dynamic_versioning_behavior", True)
242-
return fn
243-
244-
245226
@overload
246227
def signal(
247228
fn: CallableSyncOrAsyncReturnNoneType,
@@ -1447,7 +1428,6 @@ class _Definition:
14471428
arg_types: Optional[List[Type]] = None
14481429
ret_type: Optional[Type] = None
14491430
versioning_behavior: Optional[temporalio.common.VersioningBehavior] = None
1450-
dynamic_versioning_behavior: Optional[CallableSyncNoParam] = None
14511431

14521432
@staticmethod
14531433
def from_class(cls: Type) -> Optional[_Definition]:
@@ -1516,7 +1496,6 @@ def _apply_to_class(
15161496
signals: Dict[Optional[str], _SignalDefinition] = {}
15171497
queries: Dict[Optional[str], _QueryDefinition] = {}
15181498
updates: Dict[Optional[str], _UpdateDefinition] = {}
1519-
dynamic_versioning_behavior: Optional[CallableSyncNoParam] = None
15201499
for name, member in inspect.getmembers(cls):
15211500
if hasattr(member, "__temporal_workflow_run"):
15221501
seen_run_attr = True
@@ -1560,15 +1539,6 @@ def _apply_to_class(
15601539
queries[query_defn.name] = query_defn
15611540
elif name == "__init__" and hasattr(member, "__temporal_workflow_init"):
15621541
init_fn = member
1563-
elif hasattr(member, "__temporal_dynamic_versioning_behavior"):
1564-
if workflow_name:
1565-
issues.append(
1566-
"Non-dynamic workflows should not specify "
1567-
"@workflow.dynamic_versioning_behavior, which was found on "
1568-
f"{cls.__qualname__}.{name}. Use the versioning_behavior "
1569-
"argument to @workflow.run instead."
1570-
)
1571-
dynamic_versioning_behavior = member
15721542
elif isinstance(member, UpdateMethodMultiParam):
15731543
update_defn = member._defn
15741544
if update_defn.name in updates:
@@ -1652,7 +1622,6 @@ def _apply_to_class(
16521622
sandboxed=sandboxed,
16531623
failure_exception_types=failure_exception_types,
16541624
versioning_behavior=versioning_behavior,
1655-
dynamic_versioning_behavior=dynamic_versioning_behavior,
16561625
)
16571626
setattr(cls, "__temporal_workflow_definition", defn)
16581627
setattr(run_fn, "__temporal_workflow_definition", defn)

tests/test_workflow.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -225,16 +225,12 @@ def update2(self, arg1: str):
225225
def base_update(self):
226226
pass
227227

228-
@workflow.dynamic_versioning_behavior
229-
def i_shouldnt_exist(self) -> VersioningBehavior:
230-
return VersioningBehavior.PINNED
231-
232228

233229
def test_workflow_defn_bad():
234230
with pytest.raises(ValueError) as err:
235231
workflow.defn(BadDefn)
236232

237-
assert "Invalid workflow class for 10 reasons" in str(err.value)
233+
assert "Invalid workflow class for 9 reasons" in str(err.value)
238234
assert "Missing @workflow.run method" in str(err.value)
239235
assert (
240236
"Multiple signal methods found for signal1 (at least on signal2 and signal1)"
@@ -268,10 +264,6 @@ def test_workflow_defn_bad():
268264
"@workflow.update defined on BadDefnBase.base_update but not on the override"
269265
in str(err.value)
270266
)
271-
assert (
272-
"Non-dynamic workflows should not specify @workflow.dynamic_versioning_behavior, which "
273-
"was found on BadDefn.i_shouldnt_exist" in str(err.value)
274-
)
275267

276268

277269
def test_workflow_defn_local_class():

tests/worker/test_worker.py

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -775,26 +775,18 @@ async def run(self, args: Sequence[RawValue]) -> str:
775775
return "dynamic"
776776

777777

778-
@workflow.defn(dynamic=True)
779-
class DynamicWorkflowVersioningWithGetter:
780-
@workflow.run
781-
async def run(self, args: Sequence[RawValue]) -> str:
782-
return "dynamic"
783-
784-
@workflow.dynamic_versioning_behavior
785-
def huh(self) -> VersioningBehavior:
786-
return VersioningBehavior.PINNED
787-
788-
789-
async def _test_dynamic_workflow_versioning(
790-
client: Client, workflow_class, expected_versioning_behavior
778+
async def test_worker_deployment_dynamic_workflow_on_run(
779+
client: Client, env: WorkflowEnvironment
791780
):
781+
if env.supports_time_skipping:
782+
pytest.skip("Test Server doesn't support worker deployments")
783+
792784
deployment_name = f"deployment-dynamic-{uuid.uuid4()}"
793785
worker_v1 = WorkerDeploymentVersion(deployment_name=deployment_name, build_id="1.0")
794786

795787
async with new_worker(
796788
client,
797-
workflow_class,
789+
DynamicWorkflowVersioningOnDefn,
798790
deployment_config=WorkerDeploymentConfig(
799791
version=worker_v1,
800792
use_worker_versioning=True,
@@ -820,37 +812,11 @@ async def _test_dynamic_workflow_versioning(
820812
assert any(
821813
event.HasField("workflow_task_completed_event_attributes")
822814
and event.workflow_task_completed_event_attributes.versioning_behavior
823-
== expected_versioning_behavior
815+
== temporalio.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED
824816
for event in history.events
825817
)
826818

827819

828-
async def test_worker_deployment_dynamic_workflow_on_run(
829-
client: Client, env: WorkflowEnvironment
830-
):
831-
if env.supports_time_skipping:
832-
pytest.skip("Test Server doesn't support worker deployments")
833-
834-
await _test_dynamic_workflow_versioning(
835-
client,
836-
DynamicWorkflowVersioningOnDefn,
837-
temporalio.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED,
838-
)
839-
840-
841-
async def test_worker_deployment_dynamic_workflow_getter(
842-
client: Client, env: WorkflowEnvironment
843-
):
844-
if env.supports_time_skipping:
845-
pytest.skip("Test Server doesn't support worker deployments")
846-
847-
await _test_dynamic_workflow_versioning(
848-
client,
849-
DynamicWorkflowVersioningWithGetter,
850-
temporalio.api.enums.v1.VersioningBehavior.VERSIONING_BEHAVIOR_PINNED,
851-
)
852-
853-
854820
@workflow.defn
855821
class NoVersioningAnnotationWorkflow:
856822
@workflow.run

0 commit comments

Comments
 (0)