durabletask 1.2.0.dev8__tar.gz → 1.2.0.dev10__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 (31) hide show
  1. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/PKG-INFO +1 -1
  2. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/internal/helpers.py +9 -2
  3. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/task.py +9 -7
  4. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/worker.py +6 -6
  5. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask.egg-info/PKG-INFO +1 -1
  6. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/pyproject.toml +1 -1
  7. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/LICENSE +0 -0
  8. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/README.md +0 -0
  9. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/__init__.py +0 -0
  10. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/client.py +0 -0
  11. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/entities/__init__.py +0 -0
  12. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/entities/durable_entity.py +0 -0
  13. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/entities/entity_context.py +0 -0
  14. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/entities/entity_instance_id.py +0 -0
  15. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/entities/entity_lock.py +0 -0
  16. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/entities/entity_metadata.py +0 -0
  17. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/internal/entity_state_shim.py +0 -0
  18. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/internal/exceptions.py +0 -0
  19. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/internal/grpc_interceptor.py +0 -0
  20. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/internal/orchestration_entity_context.py +0 -0
  21. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/internal/orchestrator_service_pb2.py +0 -0
  22. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/internal/orchestrator_service_pb2.pyi +0 -0
  23. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/internal/orchestrator_service_pb2_grpc.py +0 -0
  24. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/internal/proto_task_hub_sidecar_service_stub.py +0 -0
  25. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/internal/shared.py +0 -0
  26. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask/py.typed +0 -0
  27. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask.egg-info/SOURCES.txt +0 -0
  28. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask.egg-info/dependency_links.txt +0 -0
  29. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask.egg-info/requires.txt +0 -0
  30. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/durabletask.egg-info/top_level.txt +0 -0
  31. {durabletask-1.2.0.dev8 → durabletask-1.2.0.dev10}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: durabletask
3
- Version: 1.2.0.dev8
3
+ Version: 1.2.0.dev10
4
4
  Summary: A Durable Task Client SDK for Python
5
5
  License: MIT License
6
6
 
@@ -116,11 +116,18 @@ def new_sub_orchestration_failed_event(event_id: int, ex: Exception) -> pb.Histo
116
116
  )
117
117
 
118
118
 
119
- def new_failure_details(ex: Exception) -> pb.TaskFailureDetails:
119
+ def new_failure_details(ex: Exception, _visited: Optional[set[int]] = None) -> pb.TaskFailureDetails:
120
+ if _visited is None:
121
+ _visited = set()
122
+ _visited.add(id(ex))
123
+ inner: Optional[BaseException] = ex.__cause__ or ex.__context__
124
+ if len(_visited) > 10 or (inner and id(inner) in _visited) or not isinstance(inner, Exception):
125
+ inner = None
120
126
  return pb.TaskFailureDetails(
121
127
  errorType=type(ex).__name__,
122
128
  errorMessage=str(ex),
123
- stackTrace=wrappers_pb2.StringValue(value=''.join(traceback.format_tb(ex.__traceback__)))
129
+ stackTrace=wrappers_pb2.StringValue(value=''.join(traceback.format_tb(ex.__traceback__))),
130
+ innerFailure=new_failure_details(inner, _visited) if inner else None
124
131
  )
125
132
 
126
133
 
@@ -117,7 +117,7 @@ class OrchestrationContext(ABC):
117
117
  def call_activity(self, activity: Union[Activity[TInput, TOutput], str], *,
118
118
  input: Optional[TInput] = None,
119
119
  retry_policy: Optional[RetryPolicy] = None,
120
- tags: Optional[dict[str, str]] = None) -> Task[TOutput]:
120
+ tags: Optional[dict[str, str]] = None) -> CompletableTask[TOutput]:
121
121
  """Schedule an activity for execution.
122
122
 
123
123
  Parameters
@@ -142,7 +142,7 @@ class OrchestrationContext(ABC):
142
142
  def call_entity(self,
143
143
  entity: EntityInstanceId,
144
144
  operation: str,
145
- input: Optional[TInput] = None) -> Task:
145
+ input: Optional[TInput] = None) -> CompletableTask:
146
146
  """Schedule entity function for execution.
147
147
 
148
148
  Parameters
@@ -182,7 +182,7 @@ class OrchestrationContext(ABC):
182
182
  pass
183
183
 
184
184
  @abstractmethod
185
- def lock_entities(self, entities: list[EntityInstanceId]) -> Task[EntityLock]:
185
+ def lock_entities(self, entities: list[EntityInstanceId]) -> CompletableTask[EntityLock]:
186
186
  """Creates a Task object that locks the specified entity instances.
187
187
 
188
188
  The locks will be acquired the next time the orchestrator yields.
@@ -206,7 +206,7 @@ class OrchestrationContext(ABC):
206
206
  input: Optional[TInput] = None,
207
207
  instance_id: Optional[str] = None,
208
208
  retry_policy: Optional[RetryPolicy] = None,
209
- version: Optional[str] = None) -> Task[TOutput]:
209
+ version: Optional[str] = None) -> CompletableTask[TOutput]:
210
210
  """Schedule sub-orchestrator function for execution.
211
211
 
212
212
  Parameters
@@ -231,7 +231,7 @@ class OrchestrationContext(ABC):
231
231
  # TOOD: Add a timeout parameter, which allows the task to be canceled if the event is
232
232
  # not received within the specified timeout. This requires support for task cancellation.
233
233
  @abstractmethod
234
- def wait_for_external_event(self, name: str) -> Task:
234
+ def wait_for_external_event(self, name: str) -> CompletableTask:
235
235
  """Wait asynchronously for an event to be raised with the name `name`.
236
236
 
237
237
  Parameters
@@ -302,8 +302,10 @@ class FailureDetails:
302
302
  class TaskFailedError(Exception):
303
303
  """Exception type for all orchestration task failures."""
304
304
 
305
- def __init__(self, message: str, details: pb.TaskFailureDetails):
305
+ def __init__(self, message: str, details: Union[pb.TaskFailureDetails, Exception]):
306
306
  super().__init__(message)
307
+ if isinstance(details, Exception):
308
+ details = pbh.new_failure_details(details)
307
309
  self._details = FailureDetails(
308
310
  details.errorMessage,
309
311
  details.errorType,
@@ -424,7 +426,7 @@ class CompletableTask(Task[T]):
424
426
  if self._parent is not None:
425
427
  self._parent.on_child_completed(self)
426
428
 
427
- def fail(self, message: str, details: pb.TaskFailureDetails):
429
+ def fail(self, message: str, details: Union[Exception, pb.TaskFailureDetails]):
428
430
  if self._is_complete:
429
431
  raise ValueError('The task has already completed.')
430
432
  self._exception = TaskFailedError(message, details)
@@ -1014,7 +1014,7 @@ class _RuntimeOrchestrationContext(task.OrchestrationContext):
1014
1014
  self,
1015
1015
  fire_at: Union[datetime, timedelta],
1016
1016
  retryable_task: Optional[task.RetryableTask] = None,
1017
- ) -> task.Task:
1017
+ ) -> task.TimerTask:
1018
1018
  id = self.next_sequence_number()
1019
1019
  if isinstance(fire_at, timedelta):
1020
1020
  fire_at = self.current_utc_datetime + fire_at
@@ -1034,7 +1034,7 @@ class _RuntimeOrchestrationContext(task.OrchestrationContext):
1034
1034
  input: Optional[TInput] = None,
1035
1035
  retry_policy: Optional[task.RetryPolicy] = None,
1036
1036
  tags: Optional[dict[str, str]] = None,
1037
- ) -> task.Task[TOutput]:
1037
+ ) -> task.CompletableTask[TOutput]:
1038
1038
  id = self.next_sequence_number()
1039
1039
 
1040
1040
  self.call_activity_function_helper(
@@ -1047,7 +1047,7 @@ class _RuntimeOrchestrationContext(task.OrchestrationContext):
1047
1047
  entity: EntityInstanceId,
1048
1048
  operation: str,
1049
1049
  input: Optional[TInput] = None,
1050
- ) -> task.Task:
1050
+ ) -> task.CompletableTask:
1051
1051
  id = self.next_sequence_number()
1052
1052
 
1053
1053
  self.call_entity_function_helper(
@@ -1068,7 +1068,7 @@ class _RuntimeOrchestrationContext(task.OrchestrationContext):
1068
1068
  id, entity_id, operation_name, input
1069
1069
  )
1070
1070
 
1071
- def lock_entities(self, entities: list[EntityInstanceId]) -> task.Task[EntityLock]:
1071
+ def lock_entities(self, entities: list[EntityInstanceId]) -> task.CompletableTask[EntityLock]:
1072
1072
  id = self.next_sequence_number()
1073
1073
 
1074
1074
  self.lock_entities_function_helper(
@@ -1084,7 +1084,7 @@ class _RuntimeOrchestrationContext(task.OrchestrationContext):
1084
1084
  instance_id: Optional[str] = None,
1085
1085
  retry_policy: Optional[task.RetryPolicy] = None,
1086
1086
  version: Optional[str] = None,
1087
- ) -> task.Task[TOutput]:
1087
+ ) -> task.CompletableTask[TOutput]:
1088
1088
  id = self.next_sequence_number()
1089
1089
  if isinstance(orchestrator, str):
1090
1090
  orchestrator_name = orchestrator
@@ -1229,7 +1229,7 @@ class _RuntimeOrchestrationContext(task.OrchestrationContext):
1229
1229
  action = pb.OrchestratorAction(id=task_id, sendEntityMessage=entity_unlock_message)
1230
1230
  self._pending_actions[task_id] = action
1231
1231
 
1232
- def wait_for_external_event(self, name: str) -> task.Task:
1232
+ def wait_for_external_event(self, name: str) -> task.CompletableTask:
1233
1233
  # Check to see if this event has already been received, in which case we
1234
1234
  # can return it immediately. Otherwise, record out intent to receive an
1235
1235
  # event with the given name so that we can resume the generator when it
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: durabletask
3
- Version: 1.2.0.dev8
3
+ Version: 1.2.0.dev10
4
4
  Summary: A Durable Task Client SDK for Python
5
5
  License: MIT License
6
6
 
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
 
10
10
  [project]
11
11
  name = "durabletask"
12
- version = "1.2.0.dev8"
12
+ version = "1.2.0.dev10"
13
13
  description = "A Durable Task Client SDK for Python"
14
14
  keywords = [
15
15
  "durable",