diff --git a/openapi_core/schema/schemas/models.py b/openapi_core/schema/schemas/models.py index 11438a4..0351e1a 100644 --- a/openapi_core/schema/schemas/models.py +++ b/openapi_core/schema/schemas/models.py @@ -20,6 +20,7 @@ from openapi_core.schema.schemas.exceptions import ( ) from openapi_core.schema.schemas.util import ( forcebool, format_date, format_datetime, + format_uuid, ) from openapi_core.schema.schemas.validators import ( TypeValidator, AttributeValidator, @@ -46,7 +47,7 @@ class Schema(object): format_date, TypeValidator(date, exclude=datetime)), SchemaFormat.DATETIME: Format(format_datetime, TypeValidator(datetime)), SchemaFormat.BINARY: Format(binary_type, TypeValidator(binary_type)), - SchemaFormat.UUID: Format(UUID, TypeValidator(UUID)), + SchemaFormat.UUID: Format(format_uuid, TypeValidator(UUID)), SchemaFormat.BYTE: Format(b64decode, TypeValidator(binary_type)), } diff --git a/openapi_core/schema/schemas/util.py b/openapi_core/schema/schemas/util.py index 19c8b5c..7c274ec 100644 --- a/openapi_core/schema/schemas/util.py +++ b/openapi_core/schema/schemas/util.py @@ -4,6 +4,7 @@ from distutils.util import strtobool from json import dumps from six import string_types import strict_rfc3339 +from uuid import UUID def forcebool(val): @@ -24,3 +25,9 @@ def format_date(value): def format_datetime(value): timestamp = strict_rfc3339.rfc3339_to_timestamp(value) return datetime.datetime.utcfromtimestamp(timestamp) + + +def format_uuid(value): + if isinstance(value, UUID): + return value + return UUID(value) diff --git a/tests/unit/schema/test_schemas.py b/tests/unit/schema/test_schemas.py index d6799fc..f41af34 100644 --- a/tests/unit/schema/test_schemas.py +++ b/tests/unit/schema/test_schemas.py @@ -5,6 +5,7 @@ import mock import pytest from openapi_core.extensions.models.models import Model +from openapi_core.schema.schemas.enums import SchemaFormat, SchemaType from openapi_core.schema.schemas.exceptions import ( InvalidSchemaValue, MultipleOneOfSchema, NoOneOfSchema, OpenAPISchemaError, UndefinedSchemaProperty @@ -49,6 +50,22 @@ class TestSchemaUnmarshal(object): assert result == value + def test_string_format_uuid_valid(self): + schema = Schema(SchemaType.STRING, schema_format=SchemaFormat.UUID) + value = str(uuid.uuid4()) + + result = schema.unmarshal(value) + + assert result == uuid.UUID(value) + + def test_string_format_uuid_uuid_quirks_valid(self): + schema = Schema(SchemaType.STRING, schema_format=SchemaFormat.UUID) + value = uuid.uuid4() + + result = schema.unmarshal(value, strict=False) + + assert result == value + def test_string_float_invalid(self): schema = Schema('string') value = 1.23