pyyaml
pyyaml copied to clipboard
ISO 8601 coverage
Ran some tests against a few ISO8601 testcases I could find.
Failed to parse 1972-06-30T23:59:60Z as a valid date (second must be in 0..59)
Failed to parse 2019-03-26t14:00Z as a valid date ()
Failed to parse 2019-03-26T14:00z as a valid date ()
Failed to parse 2019-03-26T14:00:00,999Z as a valid date ()
Failed to parse 2019-03-26T10:00-04 as a valid date ()
Failed to parse 2019-03-26T14:00.9Z as a valid date ()
Failed to parse 20190326T1400Z as a valid date ()
Failed to parse 24:00 as a valid date ()
Failed to parse 2400 as a valid date ()
Failed to parse 24:00:00 as a valid date ()
Failed to parse 240000 as a valid date ()
Failed to parse 24:00:00.000 as a valid date ()
Failed to parse 24:00:00,000 as a valid date ()
Failed to parse 24:00:00.000000 as a valid date ()
Failed to parse 24:00:00,000000 as a valid date ()
Incorrectly parsed 2019-03-26T14:00:00. as a valid date
References:
- https://tc39.es/proposal-uniform-interchange-date-parsing/cases.html
- https://github.com/dateutil/dateutil/blob/7c5c98959bd0e9eea3c55fdf78bef3ae5b8c995e/tests/test_isoparser.py#L471
- https://github.com/dateutil/dateutil/blob/7c5c98959bd0e9eea3c55fdf78bef3ae5b8c995e/tests/test_isoparser.py#L242
- https://github.com/dateutil/dateutil/blob/7c5c98959bd0e9eea3c55fdf78bef3ae5b8c995e/tests/test_isoparser.py#L486
Source code:
import yaml
import datetime
doc = """
date: 20190326T1400Z
"""
# The following should all be valid:
valid = [
# https://tc39.es/proposal-uniform-interchange-date-parsing/cases.html
"1972-06-30T23:59:60Z",
"2019-03-26T14:00:00.9Z",
"2019-03-26T14:00:00.4999Z",
"2019-03-26t14:00Z",
"2019-03-26T14:00z",
"2019-03-26T14:00:00,999Z",
"2019-03-26T10:00-04",
"2019-03-26T14:00.9Z",
"20190326T1400Z",
# https://github.com/dateutil/dateutil/blob/7c5c98959bd0e9eea3c55fdf78bef3ae5b8c995e/tests/test_isoparser.py#L471
'24:00',
'2400',
'24:00:00',
'240000',
'24:00:00.000',
'24:00:00,000',
'24:00:00.000000',
'24:00:00,000000',
]
for v in valid:
doc = """
%s
""" % v
try:
d = yaml.load(doc, Loader=yaml.Loader)
assert isinstance(d, datetime.datetime)
except Exception as e:
print("Failed to parse %s as a valid date (%s)" % (v, e))
invalid = ["2019-02-30","2019-03-25T24:01Z","2019-03-26T14:00+24:00","2018-06-30T23:59:60Z","2019-03-26T23:59:60Z",
"2019-03-26T13:59:60Z","2019-03-26Z","2019-03-26+01:00",
"2019-03-26-04:00","2019-03-26T10:00-0400","+0002019-03-26T14:00Z",
"+2019-03-26T14:00Z","002019-03-26T14:00Z","019-03-26T14:00Z","2019-03-26T10:00Q",
"2019-03-26T10:00T","2019-03-26Q","2019-03-26T","2019-03-26 14:00Z","2019-03-26T14:00:00.",
# https://github.com/dateutil/dateutil/blob/7c5c98959bd0e9eea3c55fdf78bef3ae5b8c995e/tests/test_isoparser.py#L242
'201','2012-0425','201204-25','20120425T0120:00','20120425T01:2000','14:3015','20120425T012500-334','2001-1','2012-04-9','201204','20120411T03:30+','20120411T03:30+1234567','20120411T03:30-25:40','2012-1a','20120411T03:30+00:60','20120411T03:30+00:61','20120411T033030.123456012:00',
'2012-W00','2012-W55','2012-W01-0','2012-W01-8','2013-000','2013-366','2013366','2014-03-12Т12:30:14','2014-04-21T24:00:01','2014_W01-1','2014W01-1','2014-W011',
'243','2014-0423','201404-23','2014日03月14','2013-02-29','2014/12/03','2014-04-19T','201202',
# https://github.com/dateutil/dateutil/blob/7c5c98959bd0e9eea3c55fdf78bef3ae5b8c995e/tests/test_isoparser.py#L486
'3','14時30分15秒','14_30_15','1430:15','25','25:15','14:60','14:59:61','14:30:15.34468305:00','14:30:15+','14:30:15+1234567','14:59:59+25:00','14:59:59+12:62','14:59:30_344583','24:01','24:00:01','24:00:00.001','24:00:00.000001'
]
for v in invalid:
doc = """
%s
""" % v
try:
d = yaml.load(doc, Loader=yaml.Loader)
if isinstance(d, datetime.datetime):
print("Incorrectly parsed %s as a valid date" % v)
except Exception as e:
pass
"1972-06-30T23:59:60Z",
At least this one will be hard to support as long as python itself does not support leap seconds.