From c04b9c3384074cb502a2cfad31376d62bf97c66b Mon Sep 17 00:00:00 2001 From: Kevin Kim Date: Thu, 13 Oct 2022 19:17:31 -0700 Subject: [PATCH 1/3] Fix SDK build tests --- labelbox/client.py | 6 +++++- labelbox/schema/task.py | 9 ++++----- tests/integration/test_data_rows.py | 6 ++++-- tests/integration/test_global_keys.py | 5 +++-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/labelbox/client.py b/labelbox/client.py index 3316523bb..1551593b8 100644 --- a/labelbox/client.py +++ b/labelbox/client.py @@ -1178,9 +1178,13 @@ def _format_failed_rows(rows: List[str], errors.extend( _format_failed_rows(data['deletedDataRowGlobalKeys'], "Data Row deleted")) + + # Invalid results may contain empty string, so we must filter + # them prior to checking for PARTIAL_SUCCESS + filtered_results = list(filter(lambda r: r != '', results)) if not errors: status = CollectionJobStatus.SUCCESS.value - elif errors and results: + elif errors and len(filtered_results) > 0: status = CollectionJobStatus.PARTIAL_SUCCESS.value else: status = CollectionJobStatus.FAILURE.value diff --git a/labelbox/schema/task.py b/labelbox/schema/task.py index bb06a6e82..bd35261b9 100644 --- a/labelbox/schema/task.py +++ b/labelbox/schema/task.py @@ -63,9 +63,7 @@ def wait_till_done(self, timeout_seconds=300) -> None: check_frequency = 2 # frequency of checking, in seconds while True: if self.status != "IN_PROGRESS": - if self.status == "FAILED" or (self.status == "COMPLETE" and - self.failed_data_rows - is not None): + if self.errors is not None: logger.warning( "There are errors present. Please look at `task.errors` for more details" ) @@ -87,7 +85,7 @@ def errors(self) -> Optional[Dict[str, Any]]: result = self._fetch_remote_json() return result["error"] elif self.status == "COMPLETE": - return self.failed_data_rows() + return self.failed_data_rows return None @property @@ -105,11 +103,12 @@ def result(self) -> List[Dict[str, Any]]: 'global_key': data_row.get('globalKey'), } for data_row in result['createdDataRows']] + @property def failed_data_rows(self) -> Optional[Dict[str, Any]]: """ Fetch data rows which failed to be created for an import task. """ result = self._fetch_remote_json() - if result.get("errors") is not None: + if len(result.get("errors", [])) > 0: return result["errors"] else: return None diff --git a/tests/integration/test_data_rows.py b/tests/integration/test_data_rows.py index b449af8fb..563358058 100644 --- a/tests/integration/test_data_rows.py +++ b/tests/integration/test_data_rows.py @@ -352,7 +352,8 @@ def test_create_data_rows_with_invalid_metadata(dataset, image_url): DataRow.metadata_fields: fields }]) task.wait_till_done() - assert task.status == "FAILED" + assert task.status == "COMPLETE" + assert len(task.failed_data_rows) > 0 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): }]) task.wait_till_done() - assert task.status == "FAILED" + assert task.status == "COMPLETE" + assert len(task.failed_data_rows) > 0 assert len(list(dataset.data_rows())) == 0 task = dataset.create_data_rows([{ diff --git a/tests/integration/test_global_keys.py b/tests/integration/test_global_keys.py index 72d41a6cc..078356a9c 100644 --- a/tests/integration/test_global_keys.py +++ b/tests/integration/test_global_keys.py @@ -251,9 +251,10 @@ def test_get_data_row_ids_for_invalid_global_keys(client, dataset, image_url): assert res['status'] == "PARTIAL SUCCESS" assert len(res['errors']) == 1 - assert len(res['results']) == 1 + assert len(res['results']) == 2 assert res['errors'][0]['error'] == "Data Row not found" assert res['errors'][0]['global_key'] == gk_1 - assert res['results'][0] == dr_2.uid + assert res['results'][0] == '' + assert res['results'][1] == dr_2.uid From fb1e3b93457c5634d1f32c23d214b75bb777c2a5 Mon Sep 17 00:00:00 2001 From: Kevin Kim Date: Fri, 14 Oct 2022 11:06:52 -0700 Subject: [PATCH 2/3] Address test failrues in test_task.py --- tests/integration/test_task.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/integration/test_task.py b/tests/integration/test_task.py index 2653116ff..6943c1c27 100644 --- a/tests/integration/test_task.py +++ b/tests/integration/test_task.py @@ -23,12 +23,11 @@ def test_task_errors(dataset, image_url): ]) assert task in client.get_user().created_tasks() task.wait_till_done() - assert task.status == "FAILED" + assert task.status == "COMPLETE" + assert len(task.failed_data_rows) > 0 assert task.errors is not None - assert 'message' in task.errors - with pytest.raises(Exception) as exc_info: - task.result - assert str(exc_info.value).startswith("Job failed. Errors : {") + assert 'message' in task.errors[0] + assert len(task.result) == 0 def test_task_success_json(dataset, image_url): From 2c2cce69b2152daf9914b3ae0cd1d1fa1467ffea Mon Sep 17 00:00:00 2001 From: Kevin Kim Date: Fri, 14 Oct 2022 14:07:21 -0700 Subject: [PATCH 3/3] Add sleep for failing tests due to exporter lag --- tests/integration/test_data_row_media_attributes.py | 5 +++++ tests/integration/test_data_row_metadata.py | 3 +++ 2 files changed, 8 insertions(+) diff --git a/tests/integration/test_data_row_media_attributes.py b/tests/integration/test_data_row_media_attributes.py index 58813db75..d2e1c10b0 100644 --- a/tests/integration/test_data_row_media_attributes.py +++ b/tests/integration/test_data_row_media_attributes.py @@ -1,5 +1,10 @@ +from time import sleep + + def test_export_empty_media_attributes(configured_project_with_label): project, _, _, _ = configured_project_with_label + # Wait for exporter to retrieve latest labels + sleep(10) labels = project.label_generator() label = next(labels) assert label.data.media_attributes == {} \ No newline at end of file diff --git a/tests/integration/test_data_row_metadata.py b/tests/integration/test_data_row_metadata.py index 28f449eab..696f0a3f9 100644 --- a/tests/integration/test_data_row_metadata.py +++ b/tests/integration/test_data_row_metadata.py @@ -1,4 +1,5 @@ from datetime import datetime +from time import sleep import pytest import uuid @@ -70,6 +71,8 @@ def make_metadata(dr_id) -> DataRowMetadata: def test_export_empty_metadata(configured_project_with_label): project, _, _, _ = configured_project_with_label + # Wait for exporter to retrieve latest labels + sleep(10) labels = project.label_generator() label = next(labels) assert label.data.metadata == []