From 612ce4fc96f8592ebd9447a373bda646eabe9104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Srokosz?= Date: Thu, 25 May 2023 12:50:13 +0200 Subject: [PATCH] Feature: Task.to_dict --- karton/core/__version__.py | 2 +- karton/core/task.py | 53 +++++++++++++++++++++++--------------- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/karton/core/__version__.py b/karton/core/__version__.py index 0d72820f..6c235c59 100644 --- a/karton/core/__version__.py +++ b/karton/core/__version__.py @@ -1 +1 @@ -__version__ = "5.1.0" +__version__ = "5.2.0" diff --git a/karton/core/task.py b/karton/core/task.py index 5d465ca0..7bb7b38e 100644 --- a/karton/core/task.py +++ b/karton/core/task.py @@ -227,6 +227,37 @@ def merge_persistent_payload(self, other_task: "Task") -> None: # Delete conflicting non-persistent payload del self.payload[name] + def to_dict(self) -> Dict[str, Any]: + """ + Transform task data into dictionary + :return: Task data dictionary + + :meta private: + """ + def serialize_resources(obj): + if type(obj) is dict: + return {k: serialize_resources(v) for k, v in obj.items()} + elif type(obj) is list or type(obj) is tuple: + return [serialize_resources(v) for v in obj] + elif isinstance(obj, ResourceBase): + return {"__karton_resource__": obj.to_dict()} + else: + return obj + + return { + "uid": self.uid, + "root_uid": self.root_uid, + "parent_uid": self.parent_uid, + "orig_uid": self.orig_uid, + "status": self.status.value, + "priority": self.priority.value, + "last_update": self.last_update, + "payload": serialize_resources(self.payload), + "payload_persistent": serialize_resources(self.payload_persistent), + "headers": self.headers, + "error": self.error, + } + def serialize(self, indent: Optional[int] = None) -> str: """ Serialize task data into JSON string @@ -235,28 +266,8 @@ def serialize(self, indent: Optional[int] = None) -> str: :meta private: """ - - class KartonResourceEncoder(json.JSONEncoder): - def default(kself, obj: Any): - if isinstance(obj, ResourceBase): - return {"__karton_resource__": obj.to_dict()} - return json.JSONEncoder.default(kself, obj) - return json.dumps( - { - "uid": self.uid, - "root_uid": self.root_uid, - "parent_uid": self.parent_uid, - "orig_uid": self.orig_uid, - "status": self.status.value, - "priority": self.priority.value, - "last_update": self.last_update, - "payload": self.payload, - "payload_persistent": self.payload_persistent, - "headers": self.headers, - "error": self.error, - }, - cls=KartonResourceEncoder, + self.to_dict(), indent=indent, sort_keys=True, )