Source code for pyrs.schema.formats

import datetime
import re

import isodate
import jsonschema
import six


draft4_format_checkers = list(jsonschema.draft4_format_checker.checkers.keys())


[docs]def parse_datetime(datetimestring): ''' Parses ISO 8601 date-times into datetime.datetime objects. This function uses parse_date and parse_time to do the job, so it allows more combinations of date and time representations, than the actual ISO 8601:2004 standard allows. ''' try: datestring, timestring = re.split('T| ', datetimestring) except ValueError: raise isodate.ISO8601Error( "ISO 8601 time designator 'T' or ' ' missing. Unable to parse " "datetime string %r" % datetimestring ) tmpdate = isodate.parse_date(datestring) tmptime = isodate.parse_time(timestring) return datetime.datetime.combine(tmpdate, tmptime)
[docs]def format_checker(name, raises=()): def wrap(func): draft4_format_checkers.append(name) func = jsonschema.FormatChecker.cls_checks(name, raises)(func) return func return wrap
@format_checker('date', (ValueError, isodate.ISO8601Error, ))
[docs]def date_format_checker(instance): if isinstance(instance, datetime.date): return True if isinstance(instance, six.string_types): return isodate.parse_date(instance)
@format_checker('datetime', (ValueError, isodate.ISO8601Error, ))
[docs]def datetime_format_checker(instance): if isinstance(instance, datetime.datetime): return True if isinstance(instance, six.string_types): return parse_datetime(instance)
@format_checker('time', (ValueError, isodate.ISO8601Error, ))
[docs]def time_format_checker(instance): if isinstance(instance, datetime.datetime): return True if isinstance(instance, six.string_types): return isodate.parse_time(instance)
@format_checker('duration', (ValueError, isodate.ISO8601Error, ))
[docs]def duration_format_checker(instance): if isinstance(instance, (datetime.timedelta, int, float)): return True if isinstance(instance, six.string_types): return isodate.parse_duration(instance)