pyyaml icon indicating copy to clipboard operation
pyyaml copied to clipboard

ISO 8601 coverage

Open captn3m0 opened this issue 3 years ago • 2 comments

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

captn3m0 avatar May 18 '22 08:05 captn3m0

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

captn3m0 avatar May 18 '22 08:05 captn3m0

"1972-06-30T23:59:60Z",

At least this one will be hard to support as long as python itself does not support leap seconds.

maxnoe avatar Jun 09 '22 14:06 maxnoe