Skip to content

Commit f9b9a0a

Browse files
Add Dataset.data_row_for_external_id
1 parent 338fcb5 commit f9b9a0a

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

labelbox/schema.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import os
66
import time
77

8-
from labelbox.exceptions import InvalidQueryError
8+
from labelbox.exceptions import InvalidQueryError, ResourceNotFoundError
99
from labelbox.orm import query
1010
from labelbox.orm.db_object import (DbObject, Updateable, Deletable,
1111
BulkDeletable)
@@ -205,9 +205,11 @@ def create_data_rows(self, items):
205205
206206
Args:
207207
items (iterable of (dict or str)): See above for details.
208+
208209
Return:
209210
Task representing the data import on the server side. The Task
210211
can be used for inspecting task progress and waiting until it's done.
212+
211213
Raise:
212214
InvalidQueryError: if the `items` parameter does not conform to
213215
the specification above.
@@ -278,6 +280,32 @@ def convert_item(item):
278280
task._user = user
279281
return task
280282

283+
def data_row_for_external_id(self, external_id):
284+
""" Convenience method for getting a single `DataRow` belonging to this
285+
`Dataset` that has the given `external_id`.
286+
287+
Args:
288+
external_id (str): External ID of the sought `DataRow`.
289+
290+
Returns:
291+
A single `DataRow` with the given ID.
292+
293+
Raises:
294+
labelbox.exceptions.ResourceNotFoundError: if there is no `DataRow`
295+
in this `DataSet` with the given external ID, or if there are
296+
multiple `DataRows` for it.
297+
"""
298+
where = DataRow.external_id==external_id
299+
300+
data_rows = self.data_rows(where=where)
301+
# Get at most two data_rows.
302+
data_rows = [row for row, _ in zip(data_rows, range(2))]
303+
304+
if len(data_rows) != 1:
305+
raise ResourceNotFoundError(DataRow, where)
306+
307+
return data_rows[0]
308+
281309

282310
class DataRow(DbObject, Updateable, BulkDeletable):
283311
external_id = Field.String("external_id")

tests/integration/test_dataset.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
from labelbox.exceptions import ResourceNotFoundError
55

66

7+
IMG_URL = "https://picsum.photos/200/300"
8+
9+
710
def test_dataset(client, rand_gen):
811
before = list(client.get_datasets())
912
for o in before:
@@ -55,3 +58,22 @@ def test_dataset_filtering(client):
5558

5659
d1.delete()
5760
d2.delete()
61+
62+
63+
def test_get_data_row_for_external_id(client, rand_gen):
64+
dataset = client.create_dataset(name=rand_gen(str))
65+
external_id = rand_gen(str)
66+
67+
with pytest.raises(ResourceNotFoundError):
68+
data_row = dataset.data_row_for_external_id(external_id)
69+
70+
data_row = dataset.create_data_row(row_data=IMG_URL, external_id=external_id)
71+
72+
found = dataset.data_row_for_external_id(external_id)
73+
assert found.uid == data_row.uid
74+
assert found.external_id == external_id
75+
76+
second = dataset.create_data_row(row_data=IMG_URL, external_id=external_id)
77+
78+
with pytest.raises(ResourceNotFoundError):
79+
data_row = dataset.data_row_for_external_id(external_id)

0 commit comments

Comments
 (0)