dav_events: improved Iso8601Serializer and its tests
Run tests / Execute tox to run the test suite (push) Successful in 2m51s
Run tests / Execute tox to run the test suite (push) Successful in 2m51s
This commit is contained in:
+48
-36
@@ -2,7 +2,6 @@ import datetime
|
||||
import logging
|
||||
import re
|
||||
import pytz
|
||||
from six import string_types
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -24,15 +23,17 @@ class Iso8601Serializer:
|
||||
r')?'
|
||||
r'(?P<offset>(?P<offdir>[\-+])(?P<offhours>([01][0-9])|(2[0123]))(:(?P<offmins>[0-5][0-9]))?)?$')
|
||||
|
||||
def __init__(self, instance=None, text=None):
|
||||
if instance is not None:
|
||||
self.instance = instance
|
||||
elif text is not None:
|
||||
self.instance = Iso8601Serializer.deserialize(text)
|
||||
def __init__(self, value):
|
||||
if isinstance(value, datetime.datetime) \
|
||||
or isinstance(value, datetime.date) \
|
||||
or isinstance(value, datetime.time):
|
||||
dt_obj = value
|
||||
else:
|
||||
dt_obj = Iso8601Serializer.deserialize(value)
|
||||
self._serialized = Iso8601Serializer.serialize(dt_obj)
|
||||
|
||||
@property
|
||||
def str(self):
|
||||
return Iso8601Serializer.serialize(self.instance)
|
||||
def __str__(self):
|
||||
return self._serialized
|
||||
|
||||
@classmethod
|
||||
def serialize(cls, value, ignore_unsupported_input=False):
|
||||
@@ -55,32 +56,43 @@ class Iso8601Serializer:
|
||||
@classmethod
|
||||
def deserialize(cls, value, ignore_unsupported_input=False):
|
||||
prefix = '{marker}{sep}'.format(marker=cls.marker, sep=cls.separator)
|
||||
if isinstance(value, string_types) and value.startswith(prefix):
|
||||
haystack = value[len(prefix):]
|
||||
m = cls._re.match(haystack)
|
||||
if m is not None:
|
||||
gd = m.groupdict()
|
||||
if gd['hour'] is None:
|
||||
value = datetime.date(int(gd['year']), int(gd['mon']), int(gd['day']))
|
||||
elif gd['year'] is None:
|
||||
value = datetime.time(hour=int(gd['hour']), minute=int(gd['min']), second=int(gd['sec']))
|
||||
|
||||
if not isinstance(value, str):
|
||||
if ignore_unsupported_input:
|
||||
return value
|
||||
raise TypeError('Expected string type, not {}'.format(value.__class__.__name__))
|
||||
|
||||
if not value.startswith(prefix):
|
||||
if ignore_unsupported_input:
|
||||
return value
|
||||
raise ValueError('String must begin with \'{prefix}\''.format(prefix=prefix))
|
||||
|
||||
haystack = value[len(prefix):]
|
||||
match = cls._re.match(haystack)
|
||||
|
||||
if match is None:
|
||||
if ignore_unsupported_input:
|
||||
return value
|
||||
raise ValueError('Format not recognized \'{str}\''.format(str=haystack))
|
||||
|
||||
gd = match.groupdict()
|
||||
if gd['hour'] is None:
|
||||
value = datetime.date(int(gd['year']), int(gd['mon']), int(gd['day']))
|
||||
elif gd['year'] is None:
|
||||
value = datetime.time(hour=int(gd['hour']), minute=int(gd['min']), second=int(gd['sec']))
|
||||
else:
|
||||
value = datetime.datetime(int(gd['year']), int(gd['mon']), int(gd['day']),
|
||||
hour=int(gd['hour']), minute=int(gd['min']), second=int(gd['sec']))
|
||||
if gd['offset'] is not None:
|
||||
offset = datetime.timedelta(hours=int(gd['offhours']))
|
||||
if gd['offmins'] is not None:
|
||||
offset += datetime.timedelta(minutes=int(gd['offmins']))
|
||||
if gd['offdir'] == '+':
|
||||
value -= offset
|
||||
elif gd['offdir'] == '-':
|
||||
value += offset
|
||||
else:
|
||||
value = datetime.datetime(int(gd['year']), int(gd['mon']), int(gd['day']),
|
||||
hour=int(gd['hour']), minute=int(gd['min']), second=int(gd['sec']))
|
||||
if gd['offset'] is not None:
|
||||
offset = datetime.timedelta(hours=int(gd['offhours']))
|
||||
if gd['offmins'] is not None:
|
||||
offset += datetime.timedelta(minutes=int(gd['offmins']))
|
||||
if gd['offdir'] == '+':
|
||||
value -= offset
|
||||
elif gd['offdir'] == '-':
|
||||
value += offset
|
||||
else:
|
||||
raise ValueError('Offset format not recognized \'{str}\''.format(str=gd['offset']))
|
||||
value = value.replace(tzinfo=pytz.UTC)
|
||||
elif not ignore_unsupported_input:
|
||||
raise ValueError('Format not recognized \'{str}\''.format(str=haystack))
|
||||
elif not ignore_unsupported_input:
|
||||
raise ValueError('Expected string type,'
|
||||
' not {}'.format(value.__class__.__name__))
|
||||
raise ValueError('Offset format not recognized \'{str}\''.format(str=gd['offset']))
|
||||
value = value.replace(tzinfo=pytz.UTC)
|
||||
|
||||
return value
|
||||
|
||||
Reference in New Issue
Block a user