From 63dc0de4b28ae1a5771603b96240d86c4a6d4f20 Mon Sep 17 00:00:00 2001 From: Vitor Hideyoshi Date: Wed, 9 Apr 2025 21:20:46 -0300 Subject: [PATCH] Final Implementation of Validation Options --- jambo/parser/array_type_parser.py | 12 +++++++- jambo/parser/boolean_type_parser.py | 2 +- jambo/parser/object_type_parser.py | 6 ++-- jambo/parser/string_type_parser.py | 9 +++--- .../mappings_properties_builder.py | 4 +++ .../numeric_properties_builder.py | 11 +++---- tests/test_type_parser.py | 29 +++++++++++++------ 7 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 jambo/utils/properties_builder/mappings_properties_builder.py diff --git a/jambo/parser/array_type_parser.py b/jambo/parser/array_type_parser.py index 52fec64..f0329ac 100644 --- a/jambo/parser/array_type_parser.py +++ b/jambo/parser/array_type_parser.py @@ -2,6 +2,10 @@ from jambo.parser._type_parser import GenericTypeParser from typing import TypeVar +from jambo.utils.properties_builder.mappings_properties_builder import ( + mappings_properties_builder, +) + V = TypeVar("V") @@ -16,4 +20,10 @@ class ArrayTypeParser(GenericTypeParser): properties["items"]["type"] ).from_properties(name, properties["items"]) - return list[_item_type], {} + _mappings = { + "maxItems": "max_items", + "minItems": "min_items", + "uniqueItems": "unique_items", + } + + return list[_item_type], mappings_properties_builder(properties, _mappings) diff --git a/jambo/parser/boolean_type_parser.py b/jambo/parser/boolean_type_parser.py index 198154f..c549062 100644 --- a/jambo/parser/boolean_type_parser.py +++ b/jambo/parser/boolean_type_parser.py @@ -8,4 +8,4 @@ class BooleanTypeParser(GenericTypeParser): @staticmethod def from_properties(name, properties): - return bool, {} + return bool, {} # The second argument is not used in this case diff --git a/jambo/parser/object_type_parser.py b/jambo/parser/object_type_parser.py index 6fd0c16..b5e7f5d 100644 --- a/jambo/parser/object_type_parser.py +++ b/jambo/parser/object_type_parser.py @@ -10,5 +10,7 @@ class ObjectTypeParser(GenericTypeParser): def from_properties(name, properties): from jambo.schema_converter import SchemaConverter - _type = SchemaConverter.build_object(name, properties) - return _type, {} + return ( + SchemaConverter.build_object(name, properties), + {}, # The second argument is not used in this case + ) diff --git a/jambo/parser/string_type_parser.py b/jambo/parser/string_type_parser.py index ee088de..c6ac1e4 100644 --- a/jambo/parser/string_type_parser.py +++ b/jambo/parser/string_type_parser.py @@ -1,4 +1,7 @@ from jambo.parser._type_parser import GenericTypeParser +from jambo.utils.properties_builder.mappings_properties_builder import ( + mappings_properties_builder, +) class StringTypeParser(GenericTypeParser): @@ -14,8 +17,4 @@ class StringTypeParser(GenericTypeParser): "pattern": "pattern", } - return str, { - _mappings[key]: value - for key, value in properties.items() - if key in _mappings - } + return str, mappings_properties_builder(properties, _mappings) diff --git a/jambo/utils/properties_builder/mappings_properties_builder.py b/jambo/utils/properties_builder/mappings_properties_builder.py new file mode 100644 index 0000000..64a7a72 --- /dev/null +++ b/jambo/utils/properties_builder/mappings_properties_builder.py @@ -0,0 +1,4 @@ +def mappings_properties_builder(properties, mappings): + return { + mappings[key]: value for key, value in properties.items() if key in mappings + } diff --git a/jambo/utils/properties_builder/numeric_properties_builder.py b/jambo/utils/properties_builder/numeric_properties_builder.py index fd5b0cf..ff512db 100644 --- a/jambo/utils/properties_builder/numeric_properties_builder.py +++ b/jambo/utils/properties_builder/numeric_properties_builder.py @@ -1,3 +1,8 @@ +from jambo.utils.properties_builder.mappings_properties_builder import ( + mappings_properties_builder, +) + + def numeric_properties_builder(properties): _mappings = { "minimum": "ge", @@ -7,8 +12,4 @@ def numeric_properties_builder(properties): "multipleOf": "multiple_of", } - return { - _mappings[key]: value - for key, value in properties.items() - if key in _mappings - } \ No newline at end of file + return mappings_properties_builder(properties, _mappings) diff --git a/tests/test_type_parser.py b/tests/test_type_parser.py index 1ac8d3e..54e0ea5 100644 --- a/tests/test_type_parser.py +++ b/tests/test_type_parser.py @@ -23,14 +23,15 @@ class TestTypeParser(unittest.TestCase): parser = IntTypeParser() type_parsing, type_validator = parser.from_properties( - "placeholder", { + "placeholder", + { "type": "integer", "minimum": 0, "exclusiveMinimum": 1, "maximum": 10, "exclusiveMaximum": 11, "multipleOf": 2, - } + }, ) self.assertEqual(type_parsing, int) @@ -44,14 +45,15 @@ class TestTypeParser(unittest.TestCase): parser = FloatTypeParser() type_parsing, type_validator = parser.from_properties( - "placeholder", { + "placeholder", + { "type": "number", "minimum": 0, "exclusiveMinimum": 1, "maximum": 10, "exclusiveMaximum": 11, "multipleOf": 2, - } + }, ) self.assertEqual(type_parsing, float) @@ -65,12 +67,13 @@ class TestTypeParser(unittest.TestCase): parser = StringTypeParser() type_parsing, type_validator = parser.from_properties( - "placeholder", { + "placeholder", + { "type": "string", "maxLength": 10, "minLength": 1, "pattern": "[a-zA-Z0-9]", - } + }, ) self.assertEqual(type_parsing, str) @@ -110,19 +113,27 @@ class TestTypeParser(unittest.TestCase): parser = ArrayTypeParser() properties = { + "type": "array", "items": { "type": "object", "properties": { "name": {"type": "string"}, "age": {"type": "integer"}, }, - } + }, + "maxItems": 10, + "minItems": 1, + "uniqueItems": True, } - _type, _args = parser.from_properties("placeholder", properties) + type_parsing, type_validator = parser.from_properties("placeholder", properties) - Model = get_args(_type)[0] + Model = get_args(type_parsing)[0] obj = Model(name="name", age=10) self.assertEqual(obj.name, "name") self.assertEqual(obj.age, 10) + + self.assertEqual(type_validator["max_items"], 10) + self.assertEqual(type_validator["min_items"], 1) + self.assertEqual(type_validator["unique_items"], True)