1111 AddResourceMemberRequestBody , RunManually , Run , LogEvent
1212
1313
14+ class _Page :
15+ def __init__ (self , values , has_next , next_after ):
16+ self .has_next = has_next
17+ self .values = values
18+ self .next_after = next_after
19+
20+ @staticmethod
21+ def empty ():
22+ return _Page ([], False , None )
23+
24+ @staticmethod
25+ def initial (after ):
26+ return _Page ([], True , after )
27+
28+
29+ class _PageIterator :
30+ def __init__ (self , page : _Page , get_next_page ):
31+ self .page = page
32+ self .get_next_page = get_next_page
33+
34+ def __iter__ (self ):
35+ return self
36+
37+ def __next__ (self ):
38+ if not self .page .values :
39+ if self .page .has_next :
40+ self .page = self .get_next_page (self .page )
41+ if not self .page .values :
42+ raise StopIteration
43+ return self .page .values .pop (0 )
44+
45+
1446class TasksApi (object ):
1547 """Implementation for '/api/v2/tasks' endpoint."""
1648
@@ -25,7 +57,7 @@ def find_task_by_id(self, task_id) -> Task:
2557 return task
2658
2759 def find_tasks (self , ** kwargs ):
28- """List all tasks.
60+ """List all tasks up to set limit (max 500) .
2961
3062 :key str name: only returns tasks with the specified name
3163 :key str after: returns tasks after specified ID
@@ -37,6 +69,23 @@ def find_tasks(self, **kwargs):
3769 """
3870 return self ._service .get_tasks (** kwargs ).tasks
3971
72+ def find_tasks_iter (self , ** kwargs ):
73+ """Iterate over all tasks with pagination.
74+
75+ :key str name: only returns tasks with the specified name
76+ :key str after: returns tasks after specified ID
77+ :key str user: filter tasks to a specific user ID
78+ :key str org: filter tasks to a specific organization name
79+ :key str org_id: filter tasks to a specific organization ID
80+ :key int limit: the number of tasks in one page
81+ :return: Tasks iterator
82+ """
83+
84+ def get_next_page (page : _Page ):
85+ return self ._find_tasks_next_page (page , ** kwargs )
86+
87+ return iter (_PageIterator (_Page .initial (kwargs .get ('after' )), get_next_page ))
88+
4089 def create_task (self , task : Task = None , task_create_request : TaskCreateRequest = None ) -> Task :
4190 """Create a new task."""
4291 if task_create_request is not None :
@@ -210,3 +259,16 @@ def get_logs(self, task_id: str) -> List['LogEvent']:
210259 def find_tasks_by_user (self , task_user_id ):
211260 """List all tasks by user."""
212261 return self .find_tasks (user = task_user_id )
262+
263+ def _find_tasks_next_page (self , page : _Page , ** kwargs ):
264+ if not page .has_next :
265+ return _Page .empty ()
266+
267+ args = {** kwargs , 'after' : page .next_after } if page .next_after is not None else kwargs
268+ tasks_response = self ._service .get_tasks (** args )
269+
270+ tasks = tasks_response .tasks
271+ has_next = tasks_response .links .next is not None
272+ last_id = tasks [- 1 ].id if tasks else None
273+
274+ return _Page (tasks , has_next , last_id )
0 commit comments