@@ -58,16 +58,23 @@ def validate_metadata(
58
58
}
59
59
else :
60
60
taxonomy = get_entity_specific_taxonomy (taxonomy , entity_key )
61
- return validate_metadata_against_taxonomy (taxonomy , metadata )
61
+
62
+ return validate_metadata_against_taxonomy (
63
+ taxonomy , metadata , bool (entity_key is None )
64
+ )
62
65
63
66
64
67
def validate_metadata_against_taxonomy (
65
- taxonomy : Union [TaxonomyData , TaxonomyDataEntry ], metadata : TaxonomyDataEntry
68
+ taxonomy : Union [TaxonomyData , TaxonomyDataEntry ],
69
+ metadata : TaxonomyDataEntry ,
70
+ is_family_metadata : bool = False ,
66
71
) -> Optional [MetadataValidationErrors ]:
67
72
"""Build the Corpus taxonomy for the entity & validate against it.
68
73
69
74
:param TaxonomyDataEntry taxonomy: The Corpus taxonomy to validate against.
70
75
:param TaxonomyDataEntry metadata: The metadata to validate.
76
+ :param bool is_family_metadata: Whether to validate all metadata
77
+ values as string arrays.
71
78
:raises TypeError: If the Taxonomy is invalid.
72
79
:return Optional[MetadataValidationResult]: A list of errors or None
73
80
if the metadata is valid.
@@ -79,18 +86,22 @@ def validate_metadata_against_taxonomy(
79
86
# Wrap any TypeError in a more general error
80
87
raise TypeError ("Bad Taxonomy data in database" ) from e
81
88
82
- errors = _validate_metadata (taxonomy_entries , metadata )
89
+ errors = _validate_metadata (taxonomy_entries , metadata , is_family_metadata )
83
90
return errors if len (errors ) > 0 else None
84
91
85
92
86
93
def _validate_metadata (
87
- taxonomy_entries : Mapping [str , TaxonomyEntry ], metadata : Mapping
94
+ taxonomy_entries : Mapping [str , TaxonomyEntry ],
95
+ metadata : Mapping ,
96
+ is_family_metadata : bool = False ,
88
97
) -> MetadataValidationErrors :
89
98
"""Validates the metadata against the taxonomy.
90
99
91
100
:param _type_ taxonomy_entries: The built entries from the
92
101
CorpusType.valid_metadata.
93
- :param _type_ metadata: The metadata to validate.
102
+ :param Mapping metadata: The metadata to validate.
103
+ :param bool is_family_metadata: Whether to validate all metadata
104
+ values as string arrays.
94
105
:return MetadataValidationErrors: a list of errors if the metadata
95
106
is invalid.
96
107
"""
@@ -108,13 +119,22 @@ def _validate_metadata(
108
119
for key , value_list in metadata .items ():
109
120
if key not in taxonomy_entries :
110
121
continue # We've already checked for missing keys
111
- taxonomy_entry = taxonomy_entries [ key ]
122
+
112
123
if not isinstance (value_list , list ):
113
124
errors .append (
114
125
f"Invalid value '{ value_list } ' for metadata key '{ key } ' expected list."
115
126
)
116
127
continue
117
128
129
+ # Ensure all items in value_list are strings
130
+ if is_family_metadata and not all (isinstance (item , str ) for item in value_list ):
131
+ errors .append (
132
+ f"Invalid value(s) in '{ value_list } ' for metadata key '{ key } ', "
133
+ "expected all items to be strings."
134
+ )
135
+ continue
136
+
137
+ taxonomy_entry = taxonomy_entries [key ]
118
138
if not taxonomy_entry .allow_any :
119
139
if not all (item in taxonomy_entry .allowed_values for item in value_list ):
120
140
errors .append (f"Invalid value '{ value_list } ' for metadata key '{ key } '" )
0 commit comments