Skip to content

Commit 8220428

Browse files
Merge pull request #924 from Labelbox/kkim/improve-metadata-validate-error-msg
[AL-0] Improve error msg for metadata validation
2 parents 257bcdc + 4407875 commit 8220428

File tree

1 file changed

+35
-23
lines changed

1 file changed

+35
-23
lines changed

labelbox/schema/data_row_metadata.py

Lines changed: 35 additions & 23 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,8 +689,12 @@ 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.value = self.get_by_name(
693-
metadatum.name)[metadatum.value].uid
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+
)
697+
metadatum.value = metadatum_by_name[metadatum.value].uid
694698

695699
def _load_schema_id_by_name(self, metadatum: DataRowMetadataField):
696700
"""
@@ -706,7 +710,9 @@ def _load_schema_id_by_name(self, metadatum: DataRowMetadataField):
706710
self._load_option_by_name(metadatum)
707711

708712
def _parse_upsert(
709-
self, metadatum: DataRowMetadataField
713+
self,
714+
metadatum: DataRowMetadataField,
715+
data_row_id: Optional[str] = None
710716
) -> List[_UpsertDataRowMetadataInput]:
711717
"""Format for metadata upserts to GQL"""
712718

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

722728
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}")
729+
try:
730+
if schema.kind == DataRowMetadataKind.datetime:
731+
parsed = _validate_parse_datetime(metadatum)
732+
elif schema.kind == DataRowMetadataKind.string:
733+
parsed = _validate_parse_text(metadatum)
734+
elif schema.kind == DataRowMetadataKind.number:
735+
parsed = _validate_parse_number(metadatum)
736+
elif schema.kind == DataRowMetadataKind.embedding:
737+
parsed = _validate_parse_embedding(metadatum)
738+
elif schema.kind == DataRowMetadataKind.enum:
739+
parsed = _validate_enum_parse(schema, metadatum)
740+
elif schema.kind == DataRowMetadataKind.option:
741+
raise ValueError(
742+
"An Option id should not be set as the Schema id")
743+
else:
744+
raise ValueError(f"Unknown type: {schema}")
745+
except ValueError as e:
746+
error_str = f"Could not validate metadata [{metadatum}]"
747+
if data_row_id:
748+
error_str += f", data_row_id='{data_row_id}'"
749+
raise ValueError(f"{error_str}. Reason: {e}")
738750

739751
return [_UpsertDataRowMetadataInput(**p) for p in parsed]
740752

@@ -824,7 +836,7 @@ def _validate_parse_datetime(
824836
field.value = datetime.fromisoformat(field.value)
825837
elif not isinstance(field.value, datetime):
826838
raise TypeError(
827-
f"value for datetime fields must be either a string or datetime object. Found {type(field.value)}"
839+
f"Value for datetime fields must be either a string or datetime object. Found {type(field.value)}"
828840
)
829841

830842
return [{
@@ -842,7 +854,7 @@ def _validate_parse_text(
842854

843855
if len(field.value) > String.max_length:
844856
raise ValueError(
845-
f"string fields cannot exceed {String.max_length} characters.")
857+
f"String fields cannot exceed {String.max_length} characters.")
846858

847859
return [field.dict(by_alias=True)]
848860

0 commit comments

Comments
 (0)