11from collections import defaultdict
2- from typing import Dict , List
2+ from typing import Dict , List , Optional
33
44from .backend import KartonBackend , KartonBind
55from .task import Task , TaskState
@@ -9,9 +9,9 @@ class KartonQueue:
99 """
1010 View object representing a Karton queue
1111
12- :param bind: :py:meth :`KartonBind` object representing the queue bind
12+ :param bind: :class :`KartonBind` object representing the queue bind
1313 :param tasks: List of tasks currently in queue
14- :param state: :py:meth:`KartonBackend ` object to be used
14+ :param state: :class:`KartonState ` object to be used
1515 """
1616
1717 def __init__ (
@@ -48,7 +48,7 @@ class KartonAnalysis:
4848
4949 :param root_uid: Analysis root task uid
5050 :param tasks: List of tasks
51- :param state: :py:meth:`KartonBackend ` object to be used
51+ :param state: :class:`KartonState ` object to be used
5252 """
5353
5454 def __init__ (self , root_uid : str , tasks : List [Task ], state : "KartonState" ) -> None :
@@ -89,7 +89,7 @@ def get_queues_for_tasks(
8989 Group task objects by their queue name
9090
9191 :param tasks: Task objects to group
92- :param state: :py:meth:`KartonBackend` to bind to created queues
92+ :param state: :class:`KartonState` object to be used
9393 :return: A dictionary containing the queue names and lists of tasks
9494 """
9595 tasks_per_queue = defaultdict (list )
@@ -119,30 +119,68 @@ class KartonState:
119119 :param backend: :py:meth:`KartonBackend` object to use for data fetching
120120 """
121121
122- def __init__ (self , backend : KartonBackend ) -> None :
122+ def __init__ (self , backend : KartonBackend , parse_resources : bool = False ) -> None :
123123 self .backend = backend
124124 self .binds = {bind .identity : bind for bind in backend .get_binds ()}
125125 self .replicas = backend .get_online_consumers ()
126- self .tasks = backend .get_all_tasks ()
127- self .pending_tasks = [
128- task for task in self .tasks if task .status != TaskState .FINISHED
129- ]
130-
131- # Tasks grouped by root_uid
132- tasks_per_analysis = defaultdict (list )
133-
134- for task in self .pending_tasks :
135- tasks_per_analysis [task .root_uid ].append (task )
136-
137- self .analyses = {
138- root_uid : KartonAnalysis (root_uid = root_uid , tasks = tasks , state = self )
139- for root_uid , tasks in tasks_per_analysis .items ()
140- }
141- queues = get_queues_for_tasks (self .pending_tasks , self )
142- # Present registered queues without tasks
143- for bind_name , bind in self .binds .items ():
144- if bind_name not in queues :
145- queues [bind_name ] = KartonQueue (
146- bind = self .binds [bind_name ], tasks = [], state = self
126+ self .parse_resources = parse_resources
127+
128+ self ._tasks : Optional [List [Task ]] = None
129+ self ._pending_tasks : Optional [List [Task ]] = None
130+ self ._analyses : Optional [Dict [str , KartonAnalysis ]] = None
131+ self ._queues : Optional [Dict [str , KartonQueue ]] = None
132+
133+ @property
134+ def tasks (self ) -> List [Task ]:
135+ if self ._tasks is None :
136+ self ._tasks = self .backend .get_all_tasks (
137+ parse_resources = self .parse_resources
138+ )
139+ return self ._tasks
140+
141+ @property
142+ def pending_tasks (self ) -> List [Task ]:
143+ if self ._pending_tasks is None :
144+ self ._pending_tasks = [
145+ task for task in self .tasks if task .status != TaskState .FINISHED
146+ ]
147+ return self ._pending_tasks
148+
149+ @property
150+ def analyses (self ) -> Dict [str , KartonAnalysis ]:
151+ if self ._analyses is None :
152+ # Tasks grouped by root_uid
153+ tasks_per_analysis = defaultdict (list )
154+
155+ for task in self .pending_tasks :
156+ tasks_per_analysis [task .root_uid ].append (task )
157+
158+ self ._analyses = {
159+ root_uid : KartonAnalysis (root_uid = root_uid , tasks = tasks , state = self )
160+ for root_uid , tasks in tasks_per_analysis .items ()
161+ }
162+ return self ._analyses
163+
164+ @property
165+ def queues (self ) -> Dict [str , KartonQueue ]:
166+ if self ._queues is None :
167+ queues = get_queues_for_tasks (self .pending_tasks , self )
168+ # Present registered queues without tasks
169+ for bind_name , bind in self .binds .items ():
170+ if bind_name not in queues :
171+ queues [bind_name ] = KartonQueue (
172+ bind = self .binds [bind_name ], tasks = [], state = self
173+ )
174+ self ._queues = queues
175+ return self ._queues
176+
177+ def get_analysis (self , root_uid : str ) -> KartonAnalysis :
178+ return KartonAnalysis (
179+ root_uid = root_uid ,
180+ tasks = list (
181+ self .backend .iter_task_tree (
182+ root_uid , parse_resources = self .parse_resources
147183 )
148- self .queues = queues
184+ ),
185+ state = self ,
186+ )
0 commit comments