From d9a69173f953c68e970dca997c85fcdc9d9f07d3 Mon Sep 17 00:00:00 2001 From: Artur Frysiak Date: Wed, 11 Sep 2024 11:13:59 +0200 Subject: [PATCH 1/2] Fix parsing invalid intervals Parsing string with slash at the start or the end raised IndexError instead of ParseError. --- src/pendulum/parsing/__init__.py | 4 ++-- tests/parsing/test_parsing.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/pendulum/parsing/__init__.py b/src/pendulum/parsing/__init__.py index 761f52c5..193eea1b 100644 --- a/src/pendulum/parsing/__init__.py +++ b/src/pendulum/parsing/__init__.py @@ -214,11 +214,11 @@ def _parse_iso8601_interval(text: str) -> _Interval: first, last = text.split("/") start = end = duration = None - if first[0] == "P": + if first[0:1] == "P": # duration/end duration = parse_iso8601(first) end = parse_iso8601(last) - elif last[0] == "P": + elif last[0:1] == "P": # start/duration start = parse_iso8601(first) duration = parse_iso8601(last) diff --git a/tests/parsing/test_parsing.py b/tests/parsing/test_parsing.py index d57b82f8..ce530c34 100644 --- a/tests/parsing/test_parsing.py +++ b/tests/parsing/test_parsing.py @@ -660,6 +660,16 @@ def test_invalid(): with pytest.raises(ParserError): parse(text) + text = "/2012" + + with pytest.raises(ParserError): + parse(text) + + text = "2012/" + + with pytest.raises(ParserError): + parse(text) + def test_exif_edge_case(): text = "2016:12:26 15:45:28" From ae719c665c6b055bc4902dc8ec2380b442c0d280 Mon Sep 17 00:00:00 2001 From: Artur Frysiak Date: Mon, 23 Sep 2024 14:32:20 +0200 Subject: [PATCH 2/2] Apply suggestion from review --- src/pendulum/parsing/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pendulum/parsing/__init__.py b/src/pendulum/parsing/__init__.py index 193eea1b..60b232bf 100644 --- a/src/pendulum/parsing/__init__.py +++ b/src/pendulum/parsing/__init__.py @@ -214,11 +214,11 @@ def _parse_iso8601_interval(text: str) -> _Interval: first, last = text.split("/") start = end = duration = None - if first[0:1] == "P": + if first[:1] == "P": # duration/end duration = parse_iso8601(first) end = parse_iso8601(last) - elif last[0:1] == "P": + elif last[:1] == "P": # start/duration start = parse_iso8601(first) duration = parse_iso8601(last)