11
11
AddResourceMemberRequestBody , RunManually , Run , LogEvent
12
12
13
13
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
+
14
46
class TasksApi (object ):
15
47
"""Implementation for '/api/v2/tasks' endpoint."""
16
48
@@ -25,7 +57,7 @@ def find_task_by_id(self, task_id) -> Task:
25
57
return task
26
58
27
59
def find_tasks (self , ** kwargs ):
28
- """List all tasks.
60
+ """List all tasks up to set limit (max 500) .
29
61
30
62
:key str name: only returns tasks with the specified name
31
63
:key str after: returns tasks after specified ID
@@ -37,6 +69,23 @@ def find_tasks(self, **kwargs):
37
69
"""
38
70
return self ._service .get_tasks (** kwargs ).tasks
39
71
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
+
40
89
def create_task (self , task : Task = None , task_create_request : TaskCreateRequest = None ) -> Task :
41
90
"""Create a new task."""
42
91
if task_create_request is not None :
@@ -210,3 +259,16 @@ def get_logs(self, task_id: str) -> List['LogEvent']:
210
259
def find_tasks_by_user (self , task_user_id ):
211
260
"""List all tasks by user."""
212
261
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