Final Implementation of Validation Options

This commit is contained in:
2025-04-09 21:20:46 -03:00
parent 9e1763c35a
commit 63dc0de4b2
7 changed files with 50 additions and 23 deletions

View File

@@ -2,6 +2,10 @@ from jambo.parser._type_parser import GenericTypeParser
from typing import TypeVar from typing import TypeVar
from jambo.utils.properties_builder.mappings_properties_builder import (
mappings_properties_builder,
)
V = TypeVar("V") V = TypeVar("V")
@@ -16,4 +20,10 @@ class ArrayTypeParser(GenericTypeParser):
properties["items"]["type"] properties["items"]["type"]
).from_properties(name, properties["items"]) ).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)

View File

@@ -8,4 +8,4 @@ class BooleanTypeParser(GenericTypeParser):
@staticmethod @staticmethod
def from_properties(name, properties): def from_properties(name, properties):
return bool, {} return bool, {} # The second argument is not used in this case

View File

@@ -10,5 +10,7 @@ class ObjectTypeParser(GenericTypeParser):
def from_properties(name, properties): def from_properties(name, properties):
from jambo.schema_converter import SchemaConverter from jambo.schema_converter import SchemaConverter
_type = SchemaConverter.build_object(name, properties) return (
return _type, {} SchemaConverter.build_object(name, properties),
{}, # The second argument is not used in this case
)

View File

@@ -1,4 +1,7 @@
from jambo.parser._type_parser import GenericTypeParser from jambo.parser._type_parser import GenericTypeParser
from jambo.utils.properties_builder.mappings_properties_builder import (
mappings_properties_builder,
)
class StringTypeParser(GenericTypeParser): class StringTypeParser(GenericTypeParser):
@@ -14,8 +17,4 @@ class StringTypeParser(GenericTypeParser):
"pattern": "pattern", "pattern": "pattern",
} }
return str, { return str, mappings_properties_builder(properties, _mappings)
_mappings[key]: value
for key, value in properties.items()
if key in _mappings
}

View File

@@ -0,0 +1,4 @@
def mappings_properties_builder(properties, mappings):
return {
mappings[key]: value for key, value in properties.items() if key in mappings
}

View File

@@ -1,3 +1,8 @@
from jambo.utils.properties_builder.mappings_properties_builder import (
mappings_properties_builder,
)
def numeric_properties_builder(properties): def numeric_properties_builder(properties):
_mappings = { _mappings = {
"minimum": "ge", "minimum": "ge",
@@ -7,8 +12,4 @@ def numeric_properties_builder(properties):
"multipleOf": "multiple_of", "multipleOf": "multiple_of",
} }
return { return mappings_properties_builder(properties, _mappings)
_mappings[key]: value
for key, value in properties.items()
if key in _mappings
}

View File

@@ -23,14 +23,15 @@ class TestTypeParser(unittest.TestCase):
parser = IntTypeParser() parser = IntTypeParser()
type_parsing, type_validator = parser.from_properties( type_parsing, type_validator = parser.from_properties(
"placeholder", { "placeholder",
{
"type": "integer", "type": "integer",
"minimum": 0, "minimum": 0,
"exclusiveMinimum": 1, "exclusiveMinimum": 1,
"maximum": 10, "maximum": 10,
"exclusiveMaximum": 11, "exclusiveMaximum": 11,
"multipleOf": 2, "multipleOf": 2,
} },
) )
self.assertEqual(type_parsing, int) self.assertEqual(type_parsing, int)
@@ -44,14 +45,15 @@ class TestTypeParser(unittest.TestCase):
parser = FloatTypeParser() parser = FloatTypeParser()
type_parsing, type_validator = parser.from_properties( type_parsing, type_validator = parser.from_properties(
"placeholder", { "placeholder",
{
"type": "number", "type": "number",
"minimum": 0, "minimum": 0,
"exclusiveMinimum": 1, "exclusiveMinimum": 1,
"maximum": 10, "maximum": 10,
"exclusiveMaximum": 11, "exclusiveMaximum": 11,
"multipleOf": 2, "multipleOf": 2,
} },
) )
self.assertEqual(type_parsing, float) self.assertEqual(type_parsing, float)
@@ -65,12 +67,13 @@ class TestTypeParser(unittest.TestCase):
parser = StringTypeParser() parser = StringTypeParser()
type_parsing, type_validator = parser.from_properties( type_parsing, type_validator = parser.from_properties(
"placeholder", { "placeholder",
{
"type": "string", "type": "string",
"maxLength": 10, "maxLength": 10,
"minLength": 1, "minLength": 1,
"pattern": "[a-zA-Z0-9]", "pattern": "[a-zA-Z0-9]",
} },
) )
self.assertEqual(type_parsing, str) self.assertEqual(type_parsing, str)
@@ -110,19 +113,27 @@ class TestTypeParser(unittest.TestCase):
parser = ArrayTypeParser() parser = ArrayTypeParser()
properties = { properties = {
"type": "array",
"items": { "items": {
"type": "object", "type": "object",
"properties": { "properties": {
"name": {"type": "string"}, "name": {"type": "string"},
"age": {"type": "integer"}, "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) obj = Model(name="name", age=10)
self.assertEqual(obj.name, "name") self.assertEqual(obj.name, "name")
self.assertEqual(obj.age, 10) 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)