durabletask 0.0.0.dev40__tar.gz → 0.0.0.dev41__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 (33) hide show
  1. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/PKG-INFO +1 -1
  2. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/client.py +35 -2
  3. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/entities/entity_metadata.py +2 -0
  4. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask.egg-info/PKG-INFO +1 -1
  5. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/pyproject.toml +1 -1
  6. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/LICENSE +0 -0
  7. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/README.md +0 -0
  8. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/__init__.py +0 -0
  9. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/entities/__init__.py +0 -0
  10. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/entities/durable_entity.py +0 -0
  11. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/entities/entity_context.py +0 -0
  12. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/entities/entity_instance_id.py +0 -0
  13. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/entities/entity_lock.py +0 -0
  14. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/entities/entity_operation_failed_exception.py +0 -0
  15. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/entity_state_shim.py +0 -0
  16. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/exceptions.py +0 -0
  17. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/grpc_interceptor.py +0 -0
  18. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/helpers.py +0 -0
  19. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/json_encode_output_exception.py +0 -0
  20. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/orchestration_entity_context.py +0 -0
  21. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/orchestrator_service_pb2.py +0 -0
  22. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/orchestrator_service_pb2.pyi +0 -0
  23. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/orchestrator_service_pb2_grpc.py +0 -0
  24. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/proto_task_hub_sidecar_service_stub.py +0 -0
  25. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/internal/shared.py +0 -0
  26. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/py.typed +0 -0
  27. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/task.py +0 -0
  28. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask/worker.py +0 -0
  29. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask.egg-info/SOURCES.txt +0 -0
  30. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask.egg-info/dependency_links.txt +0 -0
  31. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask.egg-info/requires.txt +0 -0
  32. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/durabletask.egg-info/top_level.txt +0 -0
  33. {durabletask-0.0.0.dev40 → durabletask-0.0.0.dev41}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: durabletask
3
- Version: 0.0.0.dev40
3
+ Version: 0.0.0.dev41
4
4
  Summary: A Durable Task Client SDK for Python
5
5
  License: MIT License
6
6
 
@@ -4,7 +4,7 @@
4
4
  import logging
5
5
  import uuid
6
6
  from dataclasses import dataclass
7
- from datetime import datetime, timedelta, timezone
7
+ from datetime import datetime, timezone
8
8
  from enum import Enum
9
9
  from typing import Any, List, Optional, Sequence, TypeVar, Union
10
10
 
@@ -63,6 +63,12 @@ class PurgeInstancesResult:
63
63
  self.is_complete = is_complete
64
64
 
65
65
 
66
+ class CleanEntityStorageResult:
67
+ def __init__(self, empty_entities_removed: int, orphaned_locks_released: int):
68
+ self.empty_entities_removed = empty_entities_removed
69
+ self.orphaned_locks_released = orphaned_locks_released
70
+
71
+
66
72
  class OrchestrationFailedError(Exception):
67
73
  def __init__(self, message: str, failure_details: task.FailureDetails):
68
74
  super().__init__(message)
@@ -356,7 +362,7 @@ class TaskHubGrpcClient:
356
362
  page_size: Optional[int] = None,
357
363
  _continuation_token: Optional[pb2.StringValue] = None
358
364
  ) -> List[EntityMetadata]:
359
- self._logger.info(f"Getting entities")
365
+ self._logger.info("Getting entities")
360
366
  query_request = pb.QueryEntitiesRequest(
361
367
  query=pb.EntityQuery(
362
368
  instanceIdStartsWith=helpers.get_string_value(instance_id_starts_with),
@@ -382,3 +388,30 @@ class TaskHubGrpcClient:
382
388
  _continuation_token=resp.continuationToken
383
389
  )
384
390
  return entities
391
+
392
+ def clean_entity_storage(self,
393
+ remove_empty_entities: bool = True,
394
+ release_orphaned_locks: bool = True,
395
+ _continuation_token: Optional[pb2.StringValue] = None
396
+ ) -> CleanEntityStorageResult:
397
+ self._logger.info("Cleaning entity storage")
398
+ req = pb.CleanEntityStorageRequest(
399
+ removeEmptyEntities=remove_empty_entities,
400
+ releaseOrphanedLocks=release_orphaned_locks,
401
+ continuationToken=_continuation_token
402
+ )
403
+ resp: pb.CleanEntityStorageResponse = self._stub.CleanEntityStorage(req)
404
+ empty_entities_removed = resp.emptyEntitiesRemoved
405
+ orphaned_locks_released = resp.orphanedLocksReleased
406
+
407
+ if resp.continuationToken and resp.continuationToken.value != "0":
408
+ self._logger.info(f"Received continuation token with value {resp.continuationToken.value}, cleaning next page...")
409
+ next_result = self.clean_entity_storage(
410
+ remove_empty_entities=remove_empty_entities,
411
+ release_orphaned_locks=release_orphaned_locks,
412
+ _continuation_token=resp.continuationToken
413
+ )
414
+ empty_entities_removed += next_result.empty_entities_removed
415
+ orphaned_locks_released += next_result.orphaned_locks_released
416
+
417
+ return CleanEntityStorageResult(empty_entities_removed, orphaned_locks_released)
@@ -1,5 +1,6 @@
1
1
  from datetime import datetime, timezone
2
2
  from typing import Any, Optional, Type, TypeVar, Union, overload
3
+ from warnings import deprecated
3
4
  from durabletask.entities.entity_instance_id import EntityInstanceId
4
5
 
5
6
  import durabletask.internal.orchestrator_service_pb2 as pb
@@ -42,6 +43,7 @@ class EntityMetadata:
42
43
  self.includes_state = includes_state
43
44
  self._state = state
44
45
 
46
+ @deprecated("This method is deprecated. Use 'from_entity_metadata' instead.")
45
47
  @staticmethod
46
48
  def from_entity_response(entity_response: pb.GetEntityResponse, includes_state: bool):
47
49
  return EntityMetadata.from_entity_metadata(entity_response.entity, includes_state)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: durabletask
3
- Version: 0.0.0.dev40
3
+ Version: 0.0.0.dev41
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 = "0.0.0.dev40"
12
+ version = "0.0.0.dev41"
13
13
  description = "A Durable Task Client SDK for Python"
14
14
  keywords = [
15
15
  "durable",