From 696cb117c92467f122ffa593eb9f1aa336405b80 Mon Sep 17 00:00:00 2001 From: fengguodong <152643312+CodingFeng101@users.noreply.github.com> Date: Sat, 20 Jun 2026 09:22:25 +0800 Subject: [PATCH 1/3] Reject non-positive date_range steps --- dateparser/date.py | 3 +++ tests/test_date_range.py | 11 +++++++++++ 2 files changed, 14 insertions(+) create mode 100644 tests/test_date_range.py diff --git a/dateparser/date.py b/dateparser/date.py index 094591707..6149f037d 100644 --- a/dateparser/date.py +++ b/dateparser/date.py @@ -77,6 +77,9 @@ def date_range(begin, end, **kwargs): step = relativedelta(**kwargs) if kwargs else relativedelta(days=1) date = begin + if date + step <= date: + raise ValueError("date_range step must be positive") + while date < end: yield date date += step diff --git a/tests/test_date_range.py b/tests/test_date_range.py new file mode 100644 index 000000000..6f8d8339b --- /dev/null +++ b/tests/test_date_range.py @@ -0,0 +1,11 @@ +from datetime import datetime + +import pytest + +from dateparser import date + + +@pytest.mark.parametrize("step", [{"months": 0}, {"days": -1}]) +def test_date_range_rejects_steps_that_do_not_advance(step): + with pytest.raises(ValueError, match="date_range step must be positive"): + next(date.date_range(datetime(2014, 6, 15), datetime(2014, 6, 25), **step)) From 4cbea3af2ff044e94e1961aeafbf335697dd3afc Mon Sep 17 00:00:00 2001 From: codingFeng101 <3524962421@qq.com> Date: Thu, 25 Jun 2026 20:29:02 +0800 Subject: [PATCH 2/3] Move date_range step test into existing class --- tests/test_date.py | 14 ++++++++++++++ tests/test_date_range.py | 11 ----------- 2 files changed, 14 insertions(+), 11 deletions(-) delete mode 100644 tests/test_date_range.py diff --git a/tests/test_date.py b/tests/test_date.py index 7c8759b89..7367b14f1 100644 --- a/tests/test_date.py +++ b/tests/test_date.py @@ -86,6 +86,20 @@ def test_should_reject_easily_mistaken_dateutil_arguments(self, invalid_period): ) self.then_period_was_rejected(invalid_period) + @parameterized.expand( + [ + param(step={"months": 0}), + param(step={"days": -1}), + ] + ) + def test_should_reject_steps_that_do_not_advance(self, step): + with pytest.raises(ValueError, match="date_range step must be positive"): + next( + date.date_range( + datetime(2014, 6, 15), datetime(2014, 6, 25), **step + ) + ) + def when_date_range_generated(self, begin, end, **size): try: self.result = list(date.date_range(begin, end, **size)) diff --git a/tests/test_date_range.py b/tests/test_date_range.py deleted file mode 100644 index 6f8d8339b..000000000 --- a/tests/test_date_range.py +++ /dev/null @@ -1,11 +0,0 @@ -from datetime import datetime - -import pytest - -from dateparser import date - - -@pytest.mark.parametrize("step", [{"months": 0}, {"days": -1}]) -def test_date_range_rejects_steps_that_do_not_advance(step): - with pytest.raises(ValueError, match="date_range step must be positive"): - next(date.date_range(datetime(2014, 6, 15), datetime(2014, 6, 25), **step)) From 1150f2f78779d98ebaab85d2071cebc39f947a68 Mon Sep 17 00:00:00 2001 From: codingFeng101 <3524962421@qq.com> Date: Fri, 26 Jun 2026 10:47:35 +0800 Subject: [PATCH 3/3] Apply pre-commit formatting to date_range test --- tests/test_date.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/test_date.py b/tests/test_date.py index 7367b14f1..510ec4955 100644 --- a/tests/test_date.py +++ b/tests/test_date.py @@ -94,11 +94,7 @@ def test_should_reject_easily_mistaken_dateutil_arguments(self, invalid_period): ) def test_should_reject_steps_that_do_not_advance(self, step): with pytest.raises(ValueError, match="date_range step must be positive"): - next( - date.date_range( - datetime(2014, 6, 15), datetime(2014, 6, 25), **step - ) - ) + next(date.date_range(datetime(2014, 6, 15), datetime(2014, 6, 25), **step)) def when_date_range_generated(self, begin, end, **size): try: