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.
Files changed (90) hide show
  1. {durable_workflow-2.3.5/src/durable_workflow.egg-info → durable_workflow-2.3.6}/PKG-INFO +1 -1
  2. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/pyproject.toml +3 -3
  3. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/external_storage.py +1 -1
  4. {durable_workflow-2.3.5 → durable_workflow-2.3.6/src/durable_workflow.egg-info}/PKG-INFO +1 -1
  5. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_external_storage.py +21 -1
  6. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/LICENSE +0 -0
  7. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/README.md +0 -0
  8. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/setup.cfg +0 -0
  9. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/__init__.py +0 -0
  10. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/_avro.py +0 -0
  11. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/activity.py +0 -0
  12. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/auth_composition.py +0 -0
  13. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/client.py +0 -0
  14. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/errors.py +0 -0
  15. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/external_task_input.py +0 -0
  16. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/external_task_result.py +0 -0
  17. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/history_bundle_verify.py +0 -0
  18. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/interceptors.py +0 -0
  19. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/invocable.py +0 -0
  20. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/metrics.py +0 -0
  21. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/nexus.py +0 -0
  22. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/py.typed +0 -0
  23. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/python_conformance.py +0 -0
  24. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/replay_conformance.py +0 -0
  25. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/replay_verify.py +0 -0
  26. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/retry_policy.py +0 -0
  27. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/serializer.py +0 -0
  28. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/sync.py +0 -0
  29. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/testing.py +0 -0
  30. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/worker.py +0 -0
  31. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/worker_session.py +0 -0
  32. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/workflow.py +0 -0
  33. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow/workflow_updates_conformance.py +0 -0
  34. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/SOURCES.txt +0 -0
  35. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/dependency_links.txt +0 -0
  36. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/entry_points.txt +0 -0
  37. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/requires.txt +0 -0
  38. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/src/durable_workflow.egg-info/top_level.txt +0 -0
  39. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_activity_context.py +0 -0
  40. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_auth_composition.py +0 -0
  41. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_avro_value_benchmark.py +0 -0
  42. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_avro_value_protocol.py +0 -0
  43. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_ci_checkout.py +0 -0
  44. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_ci_integration_endpoint.py +0 -0
  45. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_client.py +0 -0
  46. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_codec_regression_corpus.py +0 -0
  47. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_control_plane_parity_fixtures.py +0 -0
  48. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_docstring_cross_references.py +0 -0
  49. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_durable_selection.py +0 -0
  50. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_errors.py +0 -0
  51. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_external_task_input.py +0 -0
  52. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_external_task_result.py +0 -0
  53. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_golden_history_replay.py +0 -0
  54. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_history_bundle_verify.py +0 -0
  55. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_history_event_contract.py +0 -0
  56. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_invocable.py +0 -0
  57. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_message_streams.py +0 -0
  58. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_metrics.py +0 -0
  59. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_order_processing_example.py +0 -0
  60. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_parallel_completion_order_replay.py +0 -0
  61. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_parallel_saga_authoring.py +0 -0
  62. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_public_boundary_scanner.py +0 -0
  63. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_pypi_project_surface.py +0 -0
  64. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_python_conformance.py +0 -0
  65. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_queries.py +0 -0
  66. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_readme_quickstart.py +0 -0
  67. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_redrive_replay.py +0 -0
  68. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_release_metadata.py +0 -0
  69. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_replay.py +0 -0
  70. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_replay_conformance.py +0 -0
  71. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_replay_regression_corpus.py +0 -0
  72. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_replay_verify.py +0 -0
  73. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_retry_policy.py +0 -0
  74. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_runtime_external_payload_transport.py +0 -0
  75. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_schedules.py +0 -0
  76. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_serializer.py +0 -0
  77. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_signals.py +0 -0
  78. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_sleep.py +0 -0
  79. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_standalone_activity_client.py +0 -0
  80. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_storage_admission.py +0 -0
  81. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_sync.py +0 -0
  82. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_testing_harness.py +0 -0
  83. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_update_signal_condition_replay.py +0 -0
  84. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_updates.py +0 -0
  85. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_wait_condition.py +0 -0
  86. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_worker.py +0 -0
  87. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_worker_session.py +0 -0
  88. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_workflow_result_timeout.py +0 -0
  89. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_workflow_streams.py +0 -0
  90. {durable_workflow-2.3.5 → durable_workflow-2.3.6}/tests/test_workflow_updates_conformance.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: durable-workflow
3
- Version: 2.3.5
3
+ Version: 2.3.6
4
4
  Summary: Python client and worker SDK for Durable Workflow Cloud and self-hosted Server
5
5
  Author: Durable Workflow Contributors
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "durable-workflow"
7
- version = "2.3.5"
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.5"
75
- registry-version = "2.3.5"
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 = 128, max_bytes: int = 16 * 1024 * 1024) -> None:
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
  Metadata-Version: 2.4
2
2
  Name: durable-workflow
3
- Version: 2.3.5
3
+ Version: 2.3.6
4
4
  Summary: Python client and worker SDK for Durable Workflow Cloud and self-hosted Server
5
5
  Author: Durable Workflow Contributors
6
6
  License-Expression: MIT
@@ -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)