From 3e4b653755ccaf6b245f6c90371372c6cad5d433 Mon Sep 17 00:00:00 2001 From: Samuel Fendell Date: Thu, 15 Feb 2024 14:07:22 -0800 Subject: [PATCH] [PLT-130] Catch row update missing row data. --- labelbox/schema/data_row.py | 16 ++++++++++++---- tests/integration/test_data_rows.py | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/labelbox/schema/data_row.py b/labelbox/schema/data_row.py index ebe279d52..9d8758934 100644 --- a/labelbox/schema/data_row.py +++ b/labelbox/schema/data_row.py @@ -1,7 +1,6 @@ import logging -from typing import TYPE_CHECKING, Collection, Dict, List, Optional, Union +from typing import TYPE_CHECKING, List, Optional, Union import json -from labelbox.exceptions import ResourceNotFoundError from labelbox.orm import query from labelbox.orm.db_object import DbObject, Updateable, BulkDeletable, experimental @@ -11,7 +10,6 @@ from labelbox.schema.export_params import CatalogExportParams, validate_catalog_export_params from labelbox.schema.export_task import ExportTask from labelbox.schema.task import Task -from labelbox.schema.user import User # type: ignore if TYPE_CHECKING: from labelbox import AssetAttachment, Client @@ -74,9 +72,19 @@ def __init__(self, *args, **kwargs): def update(self, **kwargs): # Convert row data to string if it is an object # All other updates pass through + primary_fields = ["external_id", "global_key", "row_data"] + for field in primary_fields: + data = kwargs.get(field) + if data == "" or data == {}: + raise ValueError(f"{field} cannot be empty if it is set") + if not any(kwargs.get(field) for field in primary_fields): + raise ValueError( + f"At least one of these fields needs to be present: {primary_fields}" + ) + row_data = kwargs.get("row_data") if isinstance(row_data, dict): - kwargs['row_data'] = json.dumps(kwargs['row_data']) + kwargs['row_data'] = json.dumps(row_data) super().update(**kwargs) @staticmethod diff --git a/tests/integration/test_data_rows.py b/tests/integration/test_data_rows.py index a0e524d11..e57ad4d9c 100644 --- a/tests/integration/test_data_rows.py +++ b/tests/integration/test_data_rows.py @@ -554,6 +554,23 @@ def test_create_data_rows_with_metadata_wrong_type(dataset, image_url): ]) +def test_data_row_update_missing_or_empty_required_fields( + dataset, rand_gen, image_url): + external_id = rand_gen(str) + data_row = dataset.create_data_row(row_data=image_url, + external_id=external_id) + with pytest.raises(ValueError): + data_row.update(row_data="") + with pytest.raises(ValueError): + data_row.update(row_data={}) + with pytest.raises(ValueError): + data_row.update(external_id="") + with pytest.raises(ValueError): + data_row.update(global_key="") + with pytest.raises(ValueError): + data_row.update() + + def test_data_row_update(client, dataset, rand_gen, image_url, wait_for_data_row_processing): external_id = rand_gen(str)