Skip to content

Commit f8ef26e

Browse files
author
Matt Sokoloff
committed
improve result fetching experience
1 parent 5c498a6 commit f8ef26e

File tree

3 files changed

+58
-11
lines changed

3 files changed

+58
-11
lines changed

labelbox/schema/task.py

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import logging
22
import requests
33
import time
4-
from typing import TYPE_CHECKING, Optional
4+
from typing import TYPE_CHECKING, Optional, Dict, Any
5+
from functools import lru_cache
56

67
from labelbox.exceptions import ResourceNotFoundError
78
from labelbox.orm.db_object import DbObject
@@ -32,13 +33,14 @@ class Task(DbObject):
3233
name = Field.String("name")
3334
status = Field.String("status")
3435
completion_percentage = Field.Float("completion_percentage")
35-
result = Field.String("result")
36+
result_url = Field.String("result_url", "result")
3637
_user: Optional["User"] = None
3738

3839
# Relationships
3940
created_by = Relationship.ToOne("User", False, "created_by")
4041
organization = Relationship.ToOne("Organization")
4142

43+
4244
def refresh(self) -> None:
4345
""" Refreshes Task data from the server. """
4446
assert self._user is not None
@@ -68,12 +70,36 @@ def wait_till_done(self, timeout_seconds=300) -> None:
6870
time.sleep(sleep_time_seconds)
6971
self.refresh()
7072

71-
def errors(self):
73+
@property
74+
def errors(self) -> Optional[Dict[str, Any]]:
7275
""" Downloads the result file from Task
7376
"""
74-
if self.status == "FAILED" and self.result:
75-
response = requests.get(self.result)
76-
response.raise_for_status()
77-
data = response.json()
78-
return data.get('error')
77+
self.wait_till_done(timeout_seconds = 600)
78+
if self.status == "FAILED":
79+
data = self._fetch_remote(self.result_url)
80+
if data:
81+
return data.get('error', None)
82+
elif self.status == "IN_PROGRESS":
83+
raise Exception("Job state IN_PROGRESS. Result not available.")
7984
return None
85+
86+
@property
87+
def result(self) -> Dict[str, Any]:
88+
""" Fetch the result for a task
89+
"""
90+
self.wait_till_done(timeout_seconds = 600)
91+
if self.status == "COMPLETE":
92+
return self._fetch_remote(self.result_url)
93+
elif self.status == "FAILED":
94+
raise Exception(f"Job failed. Errors : {self.errors()}")
95+
else:
96+
raise Exception("Job state IN_PROGRESS. Result not available.")
97+
98+
@lru_cache()
99+
def _fetch_remote(self, result_url) -> Dict[str, Any]:
100+
""" Function for fetching and caching the result data.
101+
"""
102+
response = requests.get(result_url)
103+
response.raise_for_status()
104+
return response.json()
105+

tests/integration/test_data_rows.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,3 +543,22 @@ def test_delete_data_row_attachment(datarow, image_url):
543543
attachment.delete()
544544

545545
assert len(list(datarow.attachments())) == 0
546+
547+
548+
def test_create_data_rows_result(client, dataset, image_url):
549+
task = dataset.create_data_rows([
550+
{
551+
DataRow.row_data: image_url,
552+
DataRow.external_id: "row1",
553+
},
554+
{
555+
DataRow.row_data: image_url,
556+
DataRow.external_id: "row1",
557+
},
558+
])
559+
assert task.errors is None
560+
assert 'createdDataRows' in task.result
561+
results = task.result['createdDataRows']
562+
for result in results:
563+
client.get_data_row(result['id'])
564+

tests/integration/test_task.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ def test_task_errors(dataset, image_url):
2222
assert task in client.get_user().created_tasks()
2323
task.wait_till_done()
2424
assert task.status == "FAILED"
25-
assert task.errors() is not None
26-
assert 'message' in task.errors()
25+
assert task.errors is not None
26+
assert 'message' in task.errors
2727

2828

2929
def test_task_success(dataset, image_url):
@@ -36,4 +36,6 @@ def test_task_success(dataset, image_url):
3636
assert task in client.get_user().created_tasks()
3737
task.wait_till_done()
3838
assert task.status == "COMPLETE"
39-
assert task.errors() is None
39+
assert task.errors is None
40+
assert task.result is not None
41+

0 commit comments

Comments
 (0)