diff --git a/wsme/utils.py b/wsme/utils.py new file mode 100644 index 0000000..b2290e3 --- /dev/null +++ b/wsme/utils.py @@ -0,0 +1,75 @@ +import re +import datetime + +date_re = r'(?P-?\d{4,})-(?P\d{2})-(?P\d{2})' +time_re = r'(?P\d{2}):(?P\d{2}):(?P\d{2})' + \ + r'(\.(?P\d+))?' +tz_re = r'((?P[+-])(?P\d{2}):(?P\d{2}))' + \ + r'|(?PZ)' + +datetime_re = re.compile( + '%sT%s(%s)?' % (date_re, time_re, tz_re)) +date_re = re.compile(date_re) +time_re = re.compile(time_re) + + +def parse_isodate(value): + m = date_re.match(value) + if m is None: + raise validators.Invalid("%s is not a legal date value" % (value), + value, None) + try: + return datetime.date( + int(m.group('year')), + int(m.group('month')), + int(m.group('day'))) + except ValueError, e: + raise validators.Invalid("%s is a out-of-range date" % (value), + value, None) + + +def parse_isotime(value): + m = time_re.match(value) + if m is None: + raise validators.Invalid("%s is not a legal time value" % (value), + value, None) + try: + ms = 0 + if m.group('sec_frac') is not None: + f = decimal.Decimal('0.' + m.group('sec_frac')) + f = str(f.quantize(decimal.Decimal('0.000001'))) + ms = int(f[2:]) + return datetime.time( + int(m.group('hour')), + int(m.group('min')), + int(m.group('sec')), + ms) + except ValueError, e: + raise validators.Invalid("%s is a out-of-range time" % (value), + value, None) + + +# TODO handle timezone +def parse_isodatetime(value): + m = datetime_re.match(value) + if m is None: + raise validators.Invalid("%s is not a legal datetime value" % (value), + value, None) + try: + ms = 0 + if m.group('sec_frac') is not None: + f = decimal.Decimal('0.' + m.group('sec_frac')) + f = f.quantize(decimal.Decimal('0.000001')) + ms = int(str(f)[2:]) + return datetime.datetime( + int(m.group('year')), + int(m.group('month')), + int(m.group('day')), + int(m.group('hour')), + int(m.group('min')), + int(m.group('sec')), + ms) + except ValueError, e: + raise validators.Invalid("%s is a out-of-range datetime" % (value), + value, None) +