Skip to content

Commit 0088455

Browse files
author
Kevin Kim
committed
Improve error msg for metadata validation
1 parent db2db12 commit 0088455

File tree

1 file changed

+34
-21
lines changed

1 file changed

+34
-21
lines changed

labelbox/schema/data_row_metadata.py

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def _lookup_in_index_by_name(reserved_index, custom_index, name):
158158
elif name in custom_index:
159159
return custom_index[name]
160160
else:
161-
raise KeyError(f"There is no metadata with name {name}")
161+
raise KeyError(f"There is no metadata with name '{name}'")
162162

163163
def get_by_name(
164164
self, name: str
@@ -528,8 +528,8 @@ def _batch_upsert(
528528
data_row_id=m.data_row_id,
529529
fields=list(
530530
chain.from_iterable(
531-
self._parse_upsert(m) for m in m.fields))).dict(
532-
by_alias=True))
531+
self._parse_upsert(f, m.data_row_id)
532+
for f in m.fields))).dict(by_alias=True))
533533
res = _batch_operations(_batch_upsert, items, self._batch_size)
534534
return res
535535

@@ -689,6 +689,11 @@ def _upsert_schema(
689689
def _load_option_by_name(self, metadatum: DataRowMetadataField):
690690
is_value_a_valid_schema_id = metadatum.value in self.fields_by_id
691691
if not is_value_a_valid_schema_id:
692+
metadatum_by_name = self.get_by_name(metadatum.name)
693+
if metadatum.value not in metadatum_by_name:
694+
raise KeyError(
695+
f"There is no enum option by name '{metadatum.value}' for enum name '{metadatum.name}'"
696+
)
692697
metadatum.value = self.get_by_name(
693698
metadatum.name)[metadatum.value].uid
694699

@@ -706,7 +711,9 @@ def _load_schema_id_by_name(self, metadatum: DataRowMetadataField):
706711
self._load_option_by_name(metadatum)
707712

708713
def _parse_upsert(
709-
self, metadatum: DataRowMetadataField
714+
self,
715+
metadatum: DataRowMetadataField,
716+
data_row_id: Optional[str] = None
710717
) -> List[_UpsertDataRowMetadataInput]:
711718
"""Format for metadata upserts to GQL"""
712719

@@ -720,21 +727,27 @@ def _parse_upsert(
720727
f"Schema Id `{metadatum.schema_id}` not found in ontology")
721728

722729
schema = self.fields_by_id[metadatum.schema_id]
723-
724-
if schema.kind == DataRowMetadataKind.datetime:
725-
parsed = _validate_parse_datetime(metadatum)
726-
elif schema.kind == DataRowMetadataKind.string:
727-
parsed = _validate_parse_text(metadatum)
728-
elif schema.kind == DataRowMetadataKind.number:
729-
parsed = _validate_parse_number(metadatum)
730-
elif schema.kind == DataRowMetadataKind.embedding:
731-
parsed = _validate_parse_embedding(metadatum)
732-
elif schema.kind == DataRowMetadataKind.enum:
733-
parsed = _validate_enum_parse(schema, metadatum)
734-
elif schema.kind == DataRowMetadataKind.option:
735-
raise ValueError("An Option id should not be set as the Schema id")
736-
else:
737-
raise ValueError(f"Unknown type: {schema}")
730+
try:
731+
if schema.kind == DataRowMetadataKind.datetime:
732+
parsed = _validate_parse_datetime(metadatum)
733+
elif schema.kind == DataRowMetadataKind.string:
734+
parsed = _validate_parse_text(metadatum)
735+
elif schema.kind == DataRowMetadataKind.number:
736+
parsed = _validate_parse_number(metadatum)
737+
elif schema.kind == DataRowMetadataKind.embedding:
738+
parsed = _validate_parse_embedding(metadatum)
739+
elif schema.kind == DataRowMetadataKind.enum:
740+
parsed = _validate_enum_parse(schema, metadatum)
741+
elif schema.kind == DataRowMetadataKind.option:
742+
raise ValueError(
743+
"An Option id should not be set as the Schema id")
744+
else:
745+
raise ValueError(f"Unknown type: {schema}")
746+
except ValueError as e:
747+
error_str = f"Could not validate metadata [{metadatum}]"
748+
if data_row_id:
749+
error_str += f", data_row_id='{data_row_id}'"
750+
raise ValueError(f"{error_str}. Reason: {e}")
738751

739752
return [_UpsertDataRowMetadataInput(**p) for p in parsed]
740753

@@ -824,7 +837,7 @@ def _validate_parse_datetime(
824837
field.value = datetime.fromisoformat(field.value)
825838
elif not isinstance(field.value, datetime):
826839
raise TypeError(
827-
f"value for datetime fields must be either a string or datetime object. Found {type(field.value)}"
840+
f"Value for datetime fields must be either a string or datetime object. Found {type(field.value)}"
828841
)
829842

830843
return [{
@@ -842,7 +855,7 @@ def _validate_parse_text(
842855

843856
if len(field.value) > String.max_length:
844857
raise ValueError(
845-
f"string fields cannot exceed {String.max_length} characters.")
858+
f"String fields cannot exceed {String.max_length} characters.")
846859

847860
return [field.dict(by_alias=True)]
848861

0 commit comments

Comments
 (0)