@@ -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