durable-workflow 2.3.7__tar.gz → 2.3.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {durable_workflow-2.3.7/src/durable_workflow.egg-info → durable_workflow-2.3.8}/PKG-INFO +1 -1
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/pyproject.toml +3 -3
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/worker.py +1 -27
- {durable_workflow-2.3.7 → durable_workflow-2.3.8/src/durable_workflow.egg-info}/PKG-INFO +1 -1
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_worker.py +11 -4
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/LICENSE +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/README.md +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/setup.cfg +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/__init__.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/_avro.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/activity.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/auth_composition.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/client.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/errors.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/external_storage.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/external_task_input.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/external_task_result.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/history_bundle_verify.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/interceptors.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/invocable.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/metrics.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/nexus.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/py.typed +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/python_conformance.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/replay_conformance.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/replay_verify.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/retry_policy.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/serializer.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/sync.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/testing.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/worker_session.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/workflow.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/workflow_updates_conformance.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow.egg-info/SOURCES.txt +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow.egg-info/dependency_links.txt +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow.egg-info/entry_points.txt +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow.egg-info/requires.txt +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow.egg-info/top_level.txt +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_activity_context.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_auth_composition.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_avro_value_benchmark.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_avro_value_protocol.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_ci_checkout.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_ci_integration_endpoint.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_client.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_codec_regression_corpus.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_control_plane_parity_fixtures.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_docstring_cross_references.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_durable_selection.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_errors.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_external_storage.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_external_task_input.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_external_task_result.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_golden_history_replay.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_history_bundle_verify.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_history_event_contract.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_invocable.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_message_streams.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_metrics.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_order_processing_example.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_parallel_completion_order_replay.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_parallel_saga_authoring.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_public_boundary_scanner.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_pypi_project_surface.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_python_conformance.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_queries.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_readme_quickstart.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_redrive_replay.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_release_metadata.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_replay.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_replay_conformance.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_replay_regression_corpus.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_replay_verify.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_retry_policy.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_runtime_external_payload_transport.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_schedules.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_serializer.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_signals.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_sleep.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_standalone_activity_client.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_storage_admission.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_sync.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_testing_harness.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_update_signal_condition_replay.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_updates.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_wait_condition.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_worker_session.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_workflow_result_timeout.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_workflow_streams.py +0 -0
- {durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_workflow_updates_conformance.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "durable-workflow"
|
|
7
|
-
version = "2.3.
|
|
7
|
+
version = "2.3.8"
|
|
8
8
|
description = "Python client and worker SDK for Durable Workflow Cloud and self-hosted Server"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -71,8 +71,8 @@ durable-workflow-replay-conformance = "durable_workflow.replay_conformance:main"
|
|
|
71
71
|
durable-workflow-workflow-updates-conformance = "durable_workflow.workflow_updates_conformance:main"
|
|
72
72
|
|
|
73
73
|
[tool.durable-workflow]
|
|
74
|
-
product-train = "2.3.
|
|
75
|
-
registry-version = "2.3.
|
|
74
|
+
product-train = "2.3.8"
|
|
75
|
+
registry-version = "2.3.8"
|
|
76
76
|
supported-server-versions = "2.4.8"
|
|
77
77
|
worker-protocol-version = "1.19"
|
|
78
78
|
control-plane-version = "2"
|
|
@@ -951,30 +951,6 @@ def _server_supports_update_validation_tasks(info: dict[str, Any]) -> bool:
|
|
|
951
951
|
)
|
|
952
952
|
|
|
953
953
|
|
|
954
|
-
def _server_long_poll_timeout(info: dict[str, Any]) -> float | None:
|
|
955
|
-
worker_protocol = info.get("worker_protocol")
|
|
956
|
-
if not isinstance(worker_protocol, dict):
|
|
957
|
-
return None
|
|
958
|
-
|
|
959
|
-
capabilities = worker_protocol.get("server_capabilities")
|
|
960
|
-
if not isinstance(capabilities, dict):
|
|
961
|
-
return None
|
|
962
|
-
|
|
963
|
-
timeout = capabilities.get("long_poll_timeout")
|
|
964
|
-
if isinstance(timeout, bool):
|
|
965
|
-
return None
|
|
966
|
-
if isinstance(timeout, int | float):
|
|
967
|
-
return float(timeout) if timeout > 0 else None
|
|
968
|
-
if isinstance(timeout, str):
|
|
969
|
-
try:
|
|
970
|
-
parsed = float(timeout)
|
|
971
|
-
except ValueError:
|
|
972
|
-
return None
|
|
973
|
-
return parsed if parsed > 0 else None
|
|
974
|
-
|
|
975
|
-
return None
|
|
976
|
-
|
|
977
|
-
|
|
978
954
|
def _contract_version_matches(value: Any, expected: int) -> bool:
|
|
979
955
|
if isinstance(value, int):
|
|
980
956
|
return value == expected
|
|
@@ -1041,6 +1017,7 @@ class Worker:
|
|
|
1041
1017
|
raise ValueError("heartbeat_interval must be positive")
|
|
1042
1018
|
|
|
1043
1019
|
self._poll_timeout = poll_timeout
|
|
1020
|
+
# Client supplies HTTP grace separately from this requested poll window.
|
|
1044
1021
|
self._poll_http_timeout = poll_timeout
|
|
1045
1022
|
self.max_concurrent_workflow_tasks = max_concurrent_workflow_tasks
|
|
1046
1023
|
self.max_concurrent_activity_tasks = max_concurrent_activity_tasks
|
|
@@ -1191,9 +1168,6 @@ class Worker:
|
|
|
1191
1168
|
"multiplexed workflow/update-validation polling. Refusing registration so validated "
|
|
1192
1169
|
"updates cannot be accepted without validator approval or exceed worker capacity."
|
|
1193
1170
|
)
|
|
1194
|
-
server_long_poll_timeout = _server_long_poll_timeout(info)
|
|
1195
|
-
if server_long_poll_timeout is not None:
|
|
1196
|
-
self._poll_http_timeout = max(self._poll_http_timeout, server_long_poll_timeout + 5.0)
|
|
1197
1171
|
log.debug(
|
|
1198
1172
|
"server compatibility accepted: app_version=%s control_plane=%s worker_protocol=%s",
|
|
1199
1173
|
info.get("version", "unknown"),
|
|
@@ -711,7 +711,14 @@ class TestWorkerRegistration:
|
|
|
711
711
|
)
|
|
712
712
|
|
|
713
713
|
@pytest.mark.asyncio
|
|
714
|
-
|
|
714
|
+
@pytest.mark.parametrize(("poll_loop", "poll_method"), [
|
|
715
|
+
("_poll_workflow_tasks", "poll_workflow_task"),
|
|
716
|
+
("_poll_activity_tasks", "poll_activity_task"),
|
|
717
|
+
("_poll_query_tasks", "poll_query_task"),
|
|
718
|
+
])
|
|
719
|
+
async def test_registration_preserves_configured_poll_window(
|
|
720
|
+
self, mock_client: AsyncMock, poll_loop: str, poll_method: str,
|
|
721
|
+
) -> None:
|
|
715
722
|
mock_client.get_cluster_info = AsyncMock(
|
|
716
723
|
return_value=compatible_cluster_info(
|
|
717
724
|
worker_protocol={
|
|
@@ -736,12 +743,12 @@ class TestWorkerRegistration:
|
|
|
736
743
|
worker._stop.set()
|
|
737
744
|
return None
|
|
738
745
|
|
|
739
|
-
mock_client.
|
|
746
|
+
getattr(mock_client, poll_method).side_effect = poll_once
|
|
740
747
|
|
|
741
748
|
await worker._register()
|
|
742
|
-
await worker
|
|
749
|
+
await getattr(worker, poll_loop)()
|
|
743
750
|
|
|
744
|
-
assert mock_client.
|
|
751
|
+
assert getattr(mock_client, poll_method).call_args.kwargs["timeout"] == 0.01
|
|
745
752
|
|
|
746
753
|
@pytest.mark.asyncio
|
|
747
754
|
async def test_register_keeps_baseline_capabilities_when_server_does_not_support_query_tasks(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/external_task_input.py
RENAMED
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/external_task_result.py
RENAMED
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/history_bundle_verify.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/python_conformance.py
RENAMED
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow/replay_conformance.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow.egg-info/requires.txt
RENAMED
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/src/durable_workflow.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_control_plane_parity_fixtures.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_parallel_completion_order_replay.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_runtime_external_payload_transport.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_update_signal_condition_replay.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{durable_workflow-2.3.7 → durable_workflow-2.3.8}/tests/test_workflow_updates_conformance.py
RENAMED
|
File without changes
|