diff --git a/jambo/parser/enum_type_parser.py b/jambo/parser/enum_type_parser.py index 7a51afd..45480af 100644 --- a/jambo/parser/enum_type_parser.py +++ b/jambo/parser/enum_type_parser.py @@ -9,6 +9,16 @@ from enum import Enum class EnumTypeParser(GenericTypeParser): json_schema_type = "enum" + allowed_types: tuple[type] = ( + str, + int, + float, + bool, + list, + set, + type(None), + ) + def from_properties_impl( self, name, properties, **kwargs: Unpack[TypeParserOptions] ): @@ -20,13 +30,20 @@ class EnumTypeParser(GenericTypeParser): if not isinstance(enum_values, list): raise ValueError(f"Enum type {name} must have 'enum' as a list of values.") + if any( + not isinstance(value, self.allowed_types) for value in enum_values + ): + raise ValueError( + f"Enum type {name} must have 'enum' values of allowed types: {self.allowed_types}." + ) + # Create a new Enum type dynamically enum_type = Enum(name, {str(value).upper(): value for value in enum_values}) parsed_properties = self.mappings_properties_builder(properties, **kwargs) if ( "default" in parsed_properties and parsed_properties["default"] is not None - ): + ): parsed_properties["default"] = enum_type(parsed_properties["default"]) return enum_type, parsed_properties diff --git a/tests/parser/test_enum_type_parser.py b/tests/parser/test_enum_type_parser.py index f0dcd7d..0f830e0 100644 --- a/tests/parser/test_enum_type_parser.py +++ b/tests/parser/test_enum_type_parser.py @@ -78,3 +78,13 @@ class TestEnumTypeParser(TestCase): with self.assertRaises(ValueError): parser.from_properties_impl("TestEnum", schema) + + def test_enum_type_parser_throws_invalid_enum_value(self): + parser = EnumTypeParser() + + schema = { + "enum": ["value1", 42, dict()], + } + + with self.assertRaises(ValueError): + parser.from_properties_impl("TestEnum", schema)