Skip to content

Commit 6c845bc

Browse files
author
Matt Sokoloff
committed
Merge branch 'develop' of https://github.com/Labelbox/labelbox-python into ms/coco-invalid-polygons
2 parents a032f9c + 226944a commit 6c845bc

File tree

12 files changed

+46
-19
lines changed

12 files changed

+46
-19
lines changed

CHANGELOG.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
# Changelog
22

3-
# Version 0.0.0 (YYYY-MM-DD) - In Progress
3+
# Version 3.28.0 (2022-10-14)
4+
5+
### Added
6+
* Added warning for upcoming change in default project queue_mode setting
7+
* Added notebook example for importing Conversational Text annotations using Model-Assisted Labeling
48

59
### Changed
6-
* Update QueueMode enum to support new value for QueueMode.Batch = `BATCH`.
10+
* Updated QueueMode enum to support new value for QueueMode.Batch = `BATCH`.
11+
* Task.failed_data_rows is now a property
12+
13+
### Fixed
14+
* Fixed Task.wait_till_done() showing warning message for every completed task, instead of only warning when task has errors
15+
* Fixed error on dataset creation step in examples/annotation_import/video.ipynb notebook
716

817
# Version 3.27.2 (2022-10-04)
918

docs/source/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
copyright = '2021, Labelbox'
2222
author = 'Labelbox'
2323

24-
release = '3.27.2'
24+
release = '3.28.0'
2525

2626
# -- General configuration ---------------------------------------------------
2727

labelbox/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name = "labelbox"
2-
__version__ = "3.27.2"
2+
__version__ = "3.28.0"
33

44
from labelbox.client import Client
55
from labelbox.schema.project import Project

labelbox/client.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1185,9 +1185,13 @@ def _format_failed_rows(rows: List[str],
11851185
errors.extend(
11861186
_format_failed_rows(data['deletedDataRowGlobalKeys'],
11871187
"Data Row deleted"))
1188+
1189+
# Invalid results may contain empty string, so we must filter
1190+
# them prior to checking for PARTIAL_SUCCESS
1191+
filtered_results = list(filter(lambda r: r != '', results))
11881192
if not errors:
11891193
status = CollectionJobStatus.SUCCESS.value
1190-
elif errors and results:
1194+
elif errors and len(filtered_results) > 0:
11911195
status = CollectionJobStatus.PARTIAL_SUCCESS.value
11921196
else:
11931197
status = CollectionJobStatus.FAILURE.value

labelbox/schema/task.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,7 @@ def wait_till_done(self, timeout_seconds=300) -> None:
6363
check_frequency = 2 # frequency of checking, in seconds
6464
while True:
6565
if self.status != "IN_PROGRESS":
66-
if self.status == "FAILED" or (self.status == "COMPLETE" and
67-
self.failed_data_rows
68-
is not None):
66+
if self.errors is not None:
6967
logger.warning(
7068
"There are errors present. Please look at `task.errors` for more details"
7169
)
@@ -87,7 +85,7 @@ def errors(self) -> Optional[Dict[str, Any]]:
8785
result = self._fetch_remote_json()
8886
return result["error"]
8987
elif self.status == "COMPLETE":
90-
return self.failed_data_rows()
88+
return self.failed_data_rows
9189
return None
9290

9391
@property
@@ -105,11 +103,12 @@ def result(self) -> List[Dict[str, Any]]:
105103
'global_key': data_row.get('globalKey'),
106104
} for data_row in result['createdDataRows']]
107105

106+
@property
108107
def failed_data_rows(self) -> Optional[Dict[str, Any]]:
109108
""" Fetch data rows which failed to be created for an import task.
110109
"""
111110
result = self._fetch_remote_json()
112-
if result.get("errors") is not None:
111+
if len(result.get("errors", [])) > 0:
113112
return result["errors"]
114113
else:
115114
return None
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
from time import sleep
2+
3+
14
def test_export_empty_media_attributes(configured_project_with_label):
25
project, _, _, _ = configured_project_with_label
6+
# Wait for exporter to retrieve latest labels
7+
sleep(10)
38
labels = project.label_generator()
49
label = next(labels)
510
assert label.data.media_attributes == {}

tests/integration/test_data_row_metadata.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from time import sleep
23

34
import pytest
45
import uuid
@@ -70,6 +71,8 @@ def make_metadata(dr_id) -> DataRowMetadata:
7071

7172
def test_export_empty_metadata(configured_project_with_label):
7273
project, _, _, _ = configured_project_with_label
74+
# Wait for exporter to retrieve latest labels
75+
sleep(10)
7376
labels = project.label_generator()
7477
label = next(labels)
7578
assert label.data.metadata == []

tests/integration/test_data_rows.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,8 @@ def test_create_data_rows_with_invalid_metadata(dataset, image_url):
352352
DataRow.metadata_fields: fields
353353
}])
354354
task.wait_till_done()
355-
assert task.status == "FAILED"
355+
assert task.status == "COMPLETE"
356+
assert len(task.failed_data_rows) > 0
356357

357358

358359
def test_create_data_rows_with_metadata_missing_value(dataset, image_url):
@@ -632,7 +633,8 @@ def test_data_row_bulk_creation_with_same_global_keys(dataset, sample_image):
632633
}])
633634

634635
task.wait_till_done()
635-
assert task.status == "FAILED"
636+
assert task.status == "COMPLETE"
637+
assert len(task.failed_data_rows) > 0
636638
assert len(list(dataset.data_rows())) == 0
637639

638640
task = dataset.create_data_rows([{

tests/integration/test_export.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from time import sleep
12
import uuid
23

34
from labelbox.data.annotation_types.annotation import ObjectAnnotation
@@ -46,6 +47,8 @@ def test_export_annotations_nested_checklist(
4647
task = LabelImport.create_from_objects(client, project.uid,
4748
f'label-import-{uuid.uuid4()}', data)
4849
task.wait_until_done()
50+
# Wait for exporter to retrieve latest labels
51+
sleep(10)
4952
labels = project.label_generator().as_list()
5053
object_annotation = [
5154
annot for annot in next(labels).annotations

tests/integration/test_global_keys.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,10 @@ def test_get_data_row_ids_for_invalid_global_keys(client, dataset, image_url):
251251
assert res['status'] == "PARTIAL SUCCESS"
252252

253253
assert len(res['errors']) == 1
254-
assert len(res['results']) == 1
254+
assert len(res['results']) == 2
255255

256256
assert res['errors'][0]['error'] == "Data Row not found"
257257
assert res['errors'][0]['global_key'] == gk_1
258258

259-
assert res['results'][0] == dr_2.uid
259+
assert res['results'][0] == ''
260+
assert res['results'][1] == dr_2.uid

0 commit comments

Comments
 (0)