aws-durable-execution-sdk-python 1.6.0__tar.gz → 2.0.0__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 (91) hide show
  1. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/.gitignore +3 -1
  2. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/PKG-INFO +52 -2
  3. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/README.md +50 -0
  4. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/pyproject.toml +1 -1
  5. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/__about__.py +1 -1
  6. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/__init__.py +48 -2
  7. aws_durable_execution_sdk_python-2.0.0/src/aws_durable_execution_sdk_python/concurrency/executor.py +818 -0
  8. aws_durable_execution_sdk_python-2.0.0/src/aws_durable_execution_sdk_python/concurrency/models.py +693 -0
  9. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/config.py +251 -126
  10. aws_durable_execution_sdk_python-2.0.0/src/aws_durable_execution_sdk_python/constants.py +6 -0
  11. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/context.py +396 -202
  12. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/exceptions.py +183 -54
  13. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/execution.py +31 -18
  14. aws_durable_execution_sdk_python-2.0.0/src/aws_durable_execution_sdk_python/filesystem_serdes.py +264 -0
  15. aws_durable_execution_sdk_python-2.0.0/src/aws_durable_execution_sdk_python/identifier.py +86 -0
  16. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/lambda_service.py +92 -26
  17. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/logger.py +31 -9
  18. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/operation/base.py +16 -1
  19. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/operation/callback.py +1 -3
  20. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/operation/child.py +90 -46
  21. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/operation/invoke.py +5 -7
  22. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/operation/map.py +28 -46
  23. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/operation/parallel.py +21 -44
  24. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/operation/step.py +59 -21
  25. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/operation/wait.py +1 -3
  26. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/operation/wait_for_condition.py +77 -59
  27. aws_durable_execution_sdk_python-2.0.0/src/aws_durable_execution_sdk_python/plugin.py +863 -0
  28. aws_durable_execution_sdk_python-2.0.0/src/aws_durable_execution_sdk_python/plugin_discovery.py +209 -0
  29. aws_durable_execution_sdk_python-2.0.0/src/aws_durable_execution_sdk_python/preview.py +196 -0
  30. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/retries.py +4 -4
  31. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/serdes.py +16 -6
  32. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/state.py +407 -151
  33. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/types.py +61 -4
  34. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/waits.py +46 -60
  35. aws_durable_execution_sdk_python-2.0.0/tests/concurrency_test.py +5107 -0
  36. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/config_test.py +78 -77
  37. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/context_test.py +832 -18
  38. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/e2e/checkpoint_response_int_test.py +91 -10
  39. aws_durable_execution_sdk_python-2.0.0/tests/e2e/custom_serdes_roundtrip_int_test.py +445 -0
  40. aws_durable_execution_sdk_python-2.0.0/tests/e2e/error_hierarchy_int_test.py +331 -0
  41. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/e2e/execution_int_test.py +6 -1
  42. aws_durable_execution_sdk_python-2.0.0/tests/e2e/filesystem_serdes_int_test.py +489 -0
  43. aws_durable_execution_sdk_python-2.0.0/tests/e2e/plugin_invocation_operations_int_test.py +261 -0
  44. aws_durable_execution_sdk_python-2.0.0/tests/e2e/plugin_invocation_payload_int_test.py +259 -0
  45. aws_durable_execution_sdk_python-2.0.0/tests/e2e/plugin_user_function_lifecycle_int_test.py +229 -0
  46. aws_durable_execution_sdk_python-2.0.0/tests/e2e/should_complete_suspend_resume_int_test.py +74 -0
  47. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/exceptions_test.py +217 -37
  48. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/execution_test.py +752 -16
  49. aws_durable_execution_sdk_python-2.0.0/tests/filesystem_serdes_test.py +790 -0
  50. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/lambda_service_test.py +173 -26
  51. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/logger_test.py +18 -19
  52. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/operation/base_test.py +33 -2
  53. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/operation/callback_test.py +46 -5
  54. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/operation/child_test.py +461 -34
  55. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/operation/invoke_test.py +75 -175
  56. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/operation/map_test.py +364 -108
  57. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/operation/parallel_test.py +380 -73
  58. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/operation/step_test.py +420 -7
  59. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/operation/wait_for_condition_test.py +793 -16
  60. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/operation/wait_test.py +4 -0
  61. aws_durable_execution_sdk_python-2.0.0/tests/plugin_discovery_test.py +479 -0
  62. aws_durable_execution_sdk_python-2.0.0/tests/plugin_test.py +1874 -0
  63. aws_durable_execution_sdk_python-2.0.0/tests/preview_test.py +212 -0
  64. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/serdes_test.py +51 -7
  65. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/state_test.py +1229 -126
  66. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/suspend_test.py +3 -2
  67. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/types_test.py +0 -25
  68. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/waits_test.py +49 -43
  69. aws_durable_execution_sdk_python-1.6.0/src/aws_durable_execution_sdk_python/concurrency/executor.py +0 -530
  70. aws_durable_execution_sdk_python-1.6.0/src/aws_durable_execution_sdk_python/concurrency/models.py +0 -540
  71. aws_durable_execution_sdk_python-1.6.0/src/aws_durable_execution_sdk_python/identifier.py +0 -24
  72. aws_durable_execution_sdk_python-1.6.0/src/aws_durable_execution_sdk_python/plugin.py +0 -407
  73. aws_durable_execution_sdk_python-1.6.0/tests/concurrency_test.py +0 -3651
  74. aws_durable_execution_sdk_python-1.6.0/tests/plugin_test.py +0 -787
  75. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/LICENSE +0 -0
  76. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/NOTICE +0 -0
  77. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/.gitignore +0 -0
  78. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/concurrency/__init__.py +0 -0
  79. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/operation/__init__.py +0 -0
  80. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/py.typed +0 -0
  81. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/suspend.py +0 -0
  82. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/src/aws_durable_execution_sdk_python/threading.py +0 -0
  83. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/__init__.py +0 -0
  84. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/durable_executions_python_language_sdk_test.py +0 -0
  85. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/e2e/__init__.py +0 -0
  86. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/e2e/map_with_concurrent_waits_int_test.py +0 -0
  87. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/operation/__init__.py +0 -0
  88. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/retries_test.py +0 -0
  89. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/test_helpers.py +0 -0
  90. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/threading_test.py +0 -0
  91. {aws_durable_execution_sdk_python-1.6.0 → aws_durable_execution_sdk_python-2.0.0}/tests/with_retry_test.py +0 -0
@@ -33,5 +33,7 @@ dist/
33
33
 
34
34
  **/build/
35
35
  **/*.zip
36
+ .aws-sam/
37
+ **/template.generated.json
36
38
 
37
- .env
39
+ .env
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: aws-durable-execution-sdk-python
3
- Version: 1.6.0
3
+ Version: 2.0.0
4
4
  Summary: AWS Durable Execution SDK for Python
5
5
  Project-URL: Documentation, https://github.com/aws/aws-durable-execution-sdk-python#readme
6
6
  Project-URL: Issues, https://github.com/aws/aws-durable-execution-sdk-python/issues
@@ -48,6 +48,56 @@ Build reliable, long-running AWS Lambda workflows with checkpointed steps, waits
48
48
  | `aws-durable-execution-sdk-python` | Execution SDK for Lambda durable functions | [![PyPI - Version](https://img.shields.io/pypi/v/aws-durable-execution-sdk-python.svg)](https://pypi.org/project/aws-durable-execution-sdk-python) |
49
49
  | `aws-durable-execution-sdk-python-testing` | Local/cloud test runner and pytest helpers | [![PyPI - Version](https://img.shields.io/pypi/v/aws-durable-execution-sdk-python-testing.svg)](https://pypi.org/project/aws-durable-execution-sdk-python-testing) |
50
50
 
51
+ ## Dynamic instrumentation plugins
52
+
53
+ Instrumentation plugins can be selected at Lambda cold start without importing
54
+ them in the function artifact. Install a provider package in the function or a
55
+ Lambda layer, then set an ordered allow-list:
56
+
57
+ ```text
58
+ DURABLE_EXECUTION_PLUGINS=otel-invocation,example_audit
59
+ ```
60
+
61
+ The SDK resolves those names from the `aws_durable_execution.plugins` Python
62
+ entry-point group when the decorated handler is initialized. An unset or blank
63
+ variable preserves the existing behavior. The decorator's `plugins` argument
64
+ remains supported; explicit plugins run first and take precedence when a
65
+ dynamic provider creates the same concrete plugin type.
66
+
67
+ Provider packages expose a versioned factory:
68
+
69
+ ```python
70
+ from aws_durable_execution_sdk_python.plugin import (
71
+ DurableInstrumentationPlugin,
72
+ DurableInstrumentationPluginProvider,
73
+ )
74
+
75
+
76
+ class AuditPlugin(DurableInstrumentationPlugin):
77
+ pass
78
+
79
+
80
+ AUDIT_PLUGIN_PROVIDER = DurableInstrumentationPluginProvider(
81
+ plugin_type=AuditPlugin,
82
+ factory=AuditPlugin,
83
+ plugin_api_version=1,
84
+ )
85
+ ```
86
+
87
+ Register the provider in the package's `pyproject.toml`:
88
+
89
+ ```toml
90
+ [project.entry-points."aws_durable_execution.plugins"]
91
+ example_audit = "example_audit:AUDIT_PLUGIN_PROVIDER"
92
+ ```
93
+
94
+ Set `plugin_api_version` to the literal API version the provider implements.
95
+ Update it only after verifying the provider against that API version.
96
+
97
+ Provider names must be unique across installed distributions. Missing,
98
+ ambiguous, incompatible, or invalid providers raise `PluginLoadError` during
99
+ handler initialization with the provider and distribution details.
100
+
51
101
  ## 🚀 Quick Start
52
102
 
53
103
  Install the execution SDK:
@@ -27,6 +27,56 @@ Build reliable, long-running AWS Lambda workflows with checkpointed steps, waits
27
27
  | `aws-durable-execution-sdk-python` | Execution SDK for Lambda durable functions | [![PyPI - Version](https://img.shields.io/pypi/v/aws-durable-execution-sdk-python.svg)](https://pypi.org/project/aws-durable-execution-sdk-python) |
28
28
  | `aws-durable-execution-sdk-python-testing` | Local/cloud test runner and pytest helpers | [![PyPI - Version](https://img.shields.io/pypi/v/aws-durable-execution-sdk-python-testing.svg)](https://pypi.org/project/aws-durable-execution-sdk-python-testing) |
29
29
 
30
+ ## Dynamic instrumentation plugins
31
+
32
+ Instrumentation plugins can be selected at Lambda cold start without importing
33
+ them in the function artifact. Install a provider package in the function or a
34
+ Lambda layer, then set an ordered allow-list:
35
+
36
+ ```text
37
+ DURABLE_EXECUTION_PLUGINS=otel-invocation,example_audit
38
+ ```
39
+
40
+ The SDK resolves those names from the `aws_durable_execution.plugins` Python
41
+ entry-point group when the decorated handler is initialized. An unset or blank
42
+ variable preserves the existing behavior. The decorator's `plugins` argument
43
+ remains supported; explicit plugins run first and take precedence when a
44
+ dynamic provider creates the same concrete plugin type.
45
+
46
+ Provider packages expose a versioned factory:
47
+
48
+ ```python
49
+ from aws_durable_execution_sdk_python.plugin import (
50
+ DurableInstrumentationPlugin,
51
+ DurableInstrumentationPluginProvider,
52
+ )
53
+
54
+
55
+ class AuditPlugin(DurableInstrumentationPlugin):
56
+ pass
57
+
58
+
59
+ AUDIT_PLUGIN_PROVIDER = DurableInstrumentationPluginProvider(
60
+ plugin_type=AuditPlugin,
61
+ factory=AuditPlugin,
62
+ plugin_api_version=1,
63
+ )
64
+ ```
65
+
66
+ Register the provider in the package's `pyproject.toml`:
67
+
68
+ ```toml
69
+ [project.entry-points."aws_durable_execution.plugins"]
70
+ example_audit = "example_audit:AUDIT_PLUGIN_PROVIDER"
71
+ ```
72
+
73
+ Set `plugin_api_version` to the literal API version the provider implements.
74
+ Update it only after verifying the provider against that API version.
75
+
76
+ Provider names must be unique across installed distributions. Missing,
77
+ ambiguous, incompatible, or invalid providers raise `PluginLoadError` during
78
+ handler initialization with the provider and distribution details.
79
+
30
80
  ## 🚀 Quick Start
31
81
 
32
82
  Install the execution SDK:
@@ -63,7 +63,7 @@ target-version = "py311"
63
63
 
64
64
  [tool.ruff.lint]
65
65
  preview = true
66
- select = ["TID252"] # Enforce absolute imports (ban relative imports)
66
+ select = ["E4", "E7", "E9", "F", "TID252"] # pycodestyle (E4/E7/E9) + Pyflakes + absolute imports
67
67
 
68
68
  [tool.ruff.lint.isort]
69
69
  known-first-party = ["aws_durable_execution_sdk_python"]
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2025-present Amazon.com, Inc. or its affiliates.
2
2
  #
3
3
  # SPDX-License-Identifier: Apache-2.0
4
- __version__ = "1.6.0"
4
+ __version__ = "2.0.0"
@@ -6,8 +6,20 @@ from aws_durable_execution_sdk_python.__about__ import __version__
6
6
  # Main context - used in every durable function
7
7
  # Helper decorators - commonly used for step functions
8
8
  # Concurrency
9
- from aws_durable_execution_sdk_python.concurrency.models import BatchResult
10
- from aws_durable_execution_sdk_python.config import ParallelBranch
9
+ from aws_durable_execution_sdk_python.concurrency.models import (
10
+ BatchCompletionError,
11
+ BatchResult,
12
+ )
13
+ from aws_durable_execution_sdk_python.config import (
14
+ BatchItemStatus,
15
+ CompletionDecision,
16
+ CompletionItemStatus,
17
+ CompletionOutcome,
18
+ CompletionStatus,
19
+ ParallelBranch,
20
+ complete_batch,
21
+ continue_batch,
22
+ )
11
23
  from aws_durable_execution_sdk_python.context import (
12
24
  DurableContext,
13
25
  durable_parallel_branch,
@@ -18,9 +30,22 @@ from aws_durable_execution_sdk_python.context import (
18
30
 
19
31
  # Most common exceptions - users need to handle these exceptions
20
32
  from aws_durable_execution_sdk_python.exceptions import (
33
+ CallbackError,
34
+ CallbackExternalError,
35
+ CallbackSubmitterError,
36
+ CallbackTimeoutError,
37
+ ChildContextError,
21
38
  DurableExecutionsError,
39
+ DurableOperationError,
40
+ ExecutionError,
22
41
  InvocationError,
42
+ InvokeError,
43
+ PluginLoadError,
44
+ RetryableSerDesError,
45
+ SerDesError,
46
+ StepError,
23
47
  ValidationError,
48
+ WaitForConditionError,
24
49
  )
25
50
 
26
51
  # Core decorator - used in every durable function
@@ -32,15 +57,36 @@ from aws_durable_execution_sdk_python.types import StepContext
32
57
 
33
58
 
34
59
  __all__ = [
60
+ "BatchCompletionError",
61
+ "BatchItemStatus",
35
62
  "BatchResult",
63
+ "CallbackError",
64
+ "CallbackExternalError",
65
+ "CallbackSubmitterError",
66
+ "CallbackTimeoutError",
67
+ "ChildContextError",
68
+ "CompletionDecision",
69
+ "CompletionItemStatus",
70
+ "CompletionOutcome",
71
+ "CompletionStatus",
36
72
  "DurableContext",
37
73
  "DurableExecutionsError",
74
+ "DurableOperationError",
75
+ "ExecutionError",
38
76
  "InvocationError",
77
+ "InvokeError",
39
78
  "ParallelBranch",
79
+ "PluginLoadError",
80
+ "RetryableSerDesError",
81
+ "SerDesError",
40
82
  "StepContext",
83
+ "StepError",
41
84
  "ValidationError",
85
+ "WaitForConditionError",
42
86
  "WithRetryConfig",
43
87
  "__version__",
88
+ "complete_batch",
89
+ "continue_batch",
44
90
  "durable_execution",
45
91
  "durable_parallel_branch",
46
92
  "durable_step",