durable-workflow 2.3.5__tar.gz → 2.3.6__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.5/src/durable_workflow.egg-info → durable_workflow-2.3.6}/PKG-INFO +1 -1
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/pyproject.toml +3 -3
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/external_storage.py +1 -1
- {durable_workflow-2.3.5 → durable_workflow-2.3.6/src/durable_workflow.egg-info}/PKG-INFO +1 -1
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_external_storage.py +21 -1
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/LICENSE +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/README.md +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/setup.cfg +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/__init__.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/_avro.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/activity.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/auth_composition.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/client.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/errors.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/external_task_input.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/external_task_result.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/history_bundle_verify.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/interceptors.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/invocable.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/metrics.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/nexus.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/py.typed +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/python_conformance.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/replay_conformance.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/replay_verify.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/retry_policy.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/serializer.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/sync.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/testing.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/worker.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/worker_session.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/workflow.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/workflow_updates_conformance.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/SOURCES.txt +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/dependency_links.txt +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/entry_points.txt +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/requires.txt +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/top_level.txt +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_activity_context.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_auth_composition.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_avro_value_benchmark.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_avro_value_protocol.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_ci_checkout.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_ci_integration_endpoint.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_client.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_codec_regression_corpus.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_control_plane_parity_fixtures.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_docstring_cross_references.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_durable_selection.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_errors.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_external_task_input.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_external_task_result.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_golden_history_replay.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_history_bundle_verify.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_history_event_contract.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_invocable.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_message_streams.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_metrics.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_order_processing_example.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_parallel_completion_order_replay.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_parallel_saga_authoring.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_public_boundary_scanner.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_pypi_project_surface.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_python_conformance.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_queries.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_readme_quickstart.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_redrive_replay.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_release_metadata.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_replay.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_replay_conformance.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_replay_regression_corpus.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_replay_verify.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_retry_policy.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_runtime_external_payload_transport.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_schedules.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_serializer.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_signals.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_sleep.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_standalone_activity_client.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_storage_admission.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_sync.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_testing_harness.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_update_signal_condition_replay.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_updates.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_wait_condition.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_worker.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_worker_session.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_workflow_result_timeout.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_workflow_streams.py +0 -0
- {durable_workflow-2.3.5 → durable_workflow-2.3.6}/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.6"
|
|
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.6"
|
|
75
|
+
registry-version = "2.3.6"
|
|
76
76
|
supported-server-versions = "2.4.8"
|
|
77
77
|
worker-protocol-version = "1.19"
|
|
78
78
|
control-plane-version = "2"
|
|
@@ -250,7 +250,7 @@ class ExternalPayloadCache:
|
|
|
250
250
|
contract as a fresh driver fetch.
|
|
251
251
|
"""
|
|
252
252
|
|
|
253
|
-
def __init__(self, *, max_entries: int =
|
|
253
|
+
def __init__(self, *, max_entries: int = 1024, max_bytes: int = 16 * 1024 * 1024) -> None:
|
|
254
254
|
if max_entries < 1:
|
|
255
255
|
raise ValueError("external payload cache max_entries must be at least 1")
|
|
256
256
|
if max_bytes < 1:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import hashlib
|
|
2
2
|
from pathlib import Path
|
|
3
|
-
from unittest.mock import AsyncMock
|
|
3
|
+
from unittest.mock import AsyncMock, patch
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
6
|
|
|
@@ -740,6 +740,26 @@ def test_fetch_external_payload_cache_reuses_verified_bytes(tmp_path: Path) -> N
|
|
|
740
740
|
assert len(cache) == 1
|
|
741
741
|
|
|
742
742
|
|
|
743
|
+
def test_default_cache_reuses_large_replay_reference_set(tmp_path: Path) -> None:
|
|
744
|
+
storage = LocalFilesystemExternalStorage(tmp_path)
|
|
745
|
+
cache = ExternalPayloadCache()
|
|
746
|
+
references = [
|
|
747
|
+
store_external_payload(storage, f"signal-{index}".encode(), codec="avro")
|
|
748
|
+
for index in range(1000)
|
|
749
|
+
]
|
|
750
|
+
|
|
751
|
+
with patch.object(storage, "get", wraps=storage.get) as get:
|
|
752
|
+
for _ in range(2):
|
|
753
|
+
for index, reference in enumerate(references):
|
|
754
|
+
assert fetch_external_payload(storage, reference, cache=cache) == (
|
|
755
|
+
f"signal-{index}".encode()
|
|
756
|
+
)
|
|
757
|
+
|
|
758
|
+
assert get.call_count == len(references)
|
|
759
|
+
assert len(cache) == len(references)
|
|
760
|
+
assert cache.current_bytes <= cache.max_bytes == 16 * 1024 * 1024
|
|
761
|
+
|
|
762
|
+
|
|
743
763
|
def test_delete_external_payload_removes_blob_and_cache_entry(tmp_path: Path) -> None:
|
|
744
764
|
storage = LocalFilesystemExternalStorage(tmp_path)
|
|
745
765
|
cache = ExternalPayloadCache(max_entries=2, max_bytes=1024)
|
|
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.5 → durable_workflow-2.3.6}/src/durable_workflow/external_task_input.py
RENAMED
|
File without changes
|
{durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/external_task_result.py
RENAMED
|
File without changes
|
{durable_workflow-2.3.5 → durable_workflow-2.3.6}/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.5 → durable_workflow-2.3.6}/src/durable_workflow/python_conformance.py
RENAMED
|
File without changes
|
{durable_workflow-2.3.5 → durable_workflow-2.3.6}/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
|
|
File without changes
|
{durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/requires.txt
RENAMED
|
File without changes
|
{durable_workflow-2.3.5 → durable_workflow-2.3.6}/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.5 → durable_workflow-2.3.6}/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
|
{durable_workflow-2.3.5 → durable_workflow-2.3.6}/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.5 → durable_workflow-2.3.6}/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.5 → durable_workflow-2.3.6}/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
|
|
File without changes
|
{durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_workflow_updates_conformance.py
RENAMED
|
File without changes
|