mirror of
https://github.com/correl/openapi-core.git
synced 2024-12-26 19:16:57 +00:00
Date-time format unmarshal tz fix
This commit is contained in:
parent
1270d5a6b9
commit
dc8bd4d335
7 changed files with 29 additions and 11 deletions
|
@ -1,6 +1,8 @@
|
|||
from functools import partial
|
||||
import logging
|
||||
|
||||
from isodate.isodatetime import parse_datetime
|
||||
|
||||
from openapi_schema_validator._types import (
|
||||
is_array, is_bool, is_integer,
|
||||
is_object, is_number, is_string,
|
||||
|
@ -20,7 +22,7 @@ from openapi_core.unmarshalling.schemas.exceptions import (
|
|||
)
|
||||
from openapi_core.unmarshalling.schemas.formatters import Formatter
|
||||
from openapi_core.unmarshalling.schemas.util import (
|
||||
forcebool, format_date, format_datetime, format_byte, format_uuid,
|
||||
forcebool, format_date, format_byte, format_uuid,
|
||||
format_number,
|
||||
)
|
||||
|
||||
|
@ -77,7 +79,7 @@ class StringUnmarshaller(PrimitiveTypeUnmarshaller):
|
|||
partial(oas30_format_checker.check, format='date'), format_date),
|
||||
SchemaFormat.DATETIME: Formatter.from_callables(
|
||||
partial(oas30_format_checker.check, format='date-time'),
|
||||
format_datetime),
|
||||
parse_datetime),
|
||||
SchemaFormat.BINARY: Formatter.from_callables(
|
||||
partial(oas30_format_checker.check, format='binary'), binary_type),
|
||||
SchemaFormat.UUID: Formatter.from_callables(
|
||||
|
|
|
@ -3,7 +3,6 @@ from base64 import b64decode
|
|||
import datetime
|
||||
from distutils.util import strtobool
|
||||
from six import string_types, text_type, integer_types
|
||||
import strict_rfc3339
|
||||
from uuid import UUID
|
||||
|
||||
|
||||
|
@ -18,11 +17,6 @@ def format_date(value):
|
|||
return datetime.datetime.strptime(value, '%Y-%m-%d').date()
|
||||
|
||||
|
||||
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
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
isodate==0.6.0
|
||||
openapi-spec-validator
|
||||
openapi-schema-validator
|
||||
six
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
isodate==0.6.0
|
||||
openapi-spec-validator
|
||||
openapi-schema-validator
|
||||
six
|
||||
|
|
|
@ -23,6 +23,7 @@ python_requires = >= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*, != 3.4.*
|
|||
setup_requires =
|
||||
setuptools
|
||||
install_requires =
|
||||
isodate
|
||||
openapi-spec-validator
|
||||
openapi-schema-validator
|
||||
six
|
||||
|
|
|
@ -3,6 +3,7 @@ import pytest
|
|||
from datetime import datetime
|
||||
from base64 import b64encode
|
||||
from uuid import UUID
|
||||
from isodate.tzinfo import UTC
|
||||
from six import text_type
|
||||
|
||||
from openapi_core.casting.schemas.exceptions import CastError
|
||||
|
@ -1090,7 +1091,7 @@ class TestPetstore(object):
|
|||
|
||||
assert parameters == RequestParameters()
|
||||
assert isinstance(body, BaseModel)
|
||||
assert body.created == datetime(2016, 4, 16, 16, 6, 5)
|
||||
assert body.created == datetime(2016, 4, 16, 16, 6, 5, tzinfo=UTC)
|
||||
assert body.name == pet_name
|
||||
|
||||
code = 400
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import datetime
|
||||
import uuid
|
||||
|
||||
from isodate.tzinfo import UTC, FixedOffset
|
||||
import pytest
|
||||
|
||||
from openapi_core.schema.media_types.models import MediaType
|
||||
|
@ -199,13 +200,30 @@ class TestSchemaUnmarshallerCall(object):
|
|||
|
||||
assert result == datetime.date(2018, 1, 2)
|
||||
|
||||
def test_string_format_datetime(self, unmarshaller_factory):
|
||||
def test_string_format_datetime_invalid(self, unmarshaller_factory):
|
||||
schema = Schema('string', schema_format='date-time')
|
||||
value = '2018-01-02T00:00:00'
|
||||
|
||||
with pytest.raises(InvalidSchemaValue):
|
||||
unmarshaller_factory(schema)(value)
|
||||
|
||||
def test_string_format_datetime_utc(self, unmarshaller_factory):
|
||||
schema = Schema('string', schema_format='date-time')
|
||||
value = '2018-01-02T00:00:00Z'
|
||||
|
||||
result = unmarshaller_factory(schema)(value)
|
||||
|
||||
assert result == datetime.datetime(2018, 1, 2, 0, 0)
|
||||
tzinfo = UTC
|
||||
assert result == datetime.datetime(2018, 1, 2, 0, 0, tzinfo=tzinfo)
|
||||
|
||||
def test_string_format_datetime_tz(self, unmarshaller_factory):
|
||||
schema = Schema('string', schema_format='date-time')
|
||||
value = '2020-04-01T12:00:00+02:00'
|
||||
|
||||
result = unmarshaller_factory(schema)(value)
|
||||
|
||||
tzinfo = FixedOffset(2)
|
||||
assert result == datetime.datetime(2020, 4, 1, 12, 0, 0, tzinfo=tzinfo)
|
||||
|
||||
def test_string_format_custom(self, unmarshaller_factory):
|
||||
formatted = 'x-custom'
|
||||
|
|
Loading…
Reference in a new issue