Durations with trailing garbage are parsed successfully

Issue #9 resolved
Matti Niemenmaa created an issue

Any nonsense can be put after a duration, and the parser will succeed:

>>> aniso8601.parse_duration('P1Dasdfasdf')
datetime.timedelta(1)

This also affects intervals that contain durations:

>>> aniso8601.parse_interval('2001/P1Dasdf')
(datetime.date(2001, 1, 1), datetime.date(2001, 1, 2))

>>> aniso8601.parse_interval('P1Dasdf/2001')
(datetime.date(2001, 1, 1), datetime.date(2000, 12, 31))

I would expect exceptions to be raised instead.

This is with aniso8601 1.1.0.

Comments (1)

  1. Brandon Nielsen repo owner

    Fixed in 1.2.0.

    >>> aniso8601.parse_duration('P1Dasdfasdf')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/nielsenb/Jetfuse/aniso8601_test/lib/python2.7/site-packages/aniso8601/duration.py", line 29, in parse_duration
        return _parse_duration_prescribed(isodurationstr, relative)
      File "/home/nielsenb/Jetfuse/aniso8601_test/lib/python2.7/site-packages/aniso8601/duration.py", line 39, in _parse_duration_prescribed
        raise ValueError('ISO 8601 duration must end with a valid character.')
    ValueError: ISO 8601 duration must end with a valid character.
    
    >>> aniso8601.parse_interval('2001/P1Dasdf')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/nielsenb/Jetfuse/aniso8601_test/lib/python2.7/site-packages/aniso8601/interval.py", line 70, in parse_interval
        duration = parse_duration(secondpart, relative=relative)
      File "/home/nielsenb/Jetfuse/aniso8601_test/lib/python2.7/site-packages/aniso8601/duration.py", line 29, in parse_duration
        return _parse_duration_prescribed(isodurationstr, relative)
      File "/home/nielsenb/Jetfuse/aniso8601_test/lib/python2.7/site-packages/aniso8601/duration.py", line 39, in _parse_duration_prescribed
        raise ValueError('ISO 8601 duration must end with a valid character.')
    ValueError: ISO 8601 duration must end with a valid character.
    
    >>> aniso8601.parse_interval('P1Dasdf/2001')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/nielsenb/Jetfuse/aniso8601_test/lib/python2.7/site-packages/aniso8601/interval.py", line 51, in parse_interval
        duration = parse_duration(firstpart, relative=relative)
      File "/home/nielsenb/Jetfuse/aniso8601_test/lib/python2.7/site-packages/aniso8601/duration.py", line 29, in parse_duration
        return _parse_duration_prescribed(isodurationstr, relative)
      File "/home/nielsenb/Jetfuse/aniso8601_test/lib/python2.7/site-packages/aniso8601/duration.py", line 39, in _parse_duration_prescribed
        raise ValueError('ISO 8601 duration must end with a valid character.')
    ValueError: ISO 8601 duration must end with a valid character.
    
  2. Log in to comment