From 48d02d88d82d633ece6fcae6aef1e605adbacb59 Mon Sep 17 00:00:00 2001 From: rstar327 Date: Thu, 26 Feb 2026 15:08:13 +0200 Subject: [PATCH 1/2] fix(types): accept Arrow objects in interval and span_range type hints --- arrow/arrow.py | 8 ++++---- tests/test_arrow.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/arrow/arrow.py b/arrow/arrow.py index f0a57f04..c0a4e25e 100644 --- a/arrow/arrow.py +++ b/arrow/arrow.py @@ -643,8 +643,8 @@ def ceil(self, frame: _T_FRAMES, **kwargs: Any) -> "Arrow": def span_range( cls, frame: _T_FRAMES, - start: dt_datetime, - end: dt_datetime, + start: Union["Arrow", dt_datetime], + end: Union["Arrow", dt_datetime], tz: Optional[TZ_EXPR] = None, limit: Optional[int] = None, bounds: _BOUNDS = "[)", @@ -725,8 +725,8 @@ def span_range( def interval( cls, frame: _T_FRAMES, - start: dt_datetime, - end: dt_datetime, + start: Union["Arrow", dt_datetime], + end: Union["Arrow", dt_datetime], interval: int = 1, tz: Optional[TZ_EXPR] = None, bounds: _BOUNDS = "[)", diff --git a/tests/test_arrow.py b/tests/test_arrow.py index b595e4e2..c1dcfbb9 100644 --- a/tests/test_arrow.py +++ b/tests/test_arrow.py @@ -1628,6 +1628,26 @@ def test_exact(self): assert result == expected + def test_arrow_objects_as_start_end(self): + start = arrow.Arrow(2013, 5, 5, 12, 30) + end = arrow.Arrow(2013, 5, 5, 17, 15) + result = list(arrow.Arrow.interval("hour", start, end, 2)) + + assert result == [ + ( + arrow.Arrow(2013, 5, 5, 12), + arrow.Arrow(2013, 5, 5, 13, 59, 59, 999999), + ), + ( + arrow.Arrow(2013, 5, 5, 14), + arrow.Arrow(2013, 5, 5, 15, 59, 59, 999999), + ), + ( + arrow.Arrow(2013, 5, 5, 16), + arrow.Arrow(2013, 5, 5, 17, 59, 59, 999999), + ), + ] + @pytest.mark.usefixtures("time_2013_02_15") class TestArrowSpan: From 84d04f61261ddb00edbbc69863d7428a64bab98d Mon Sep 17 00:00:00 2001 From: rstar327 Date: Thu, 26 Feb 2026 15:16:21 +0200 Subject: [PATCH 2/2] fix(types): use _get_datetime for mypy compatibility --- arrow/arrow.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/arrow/arrow.py b/arrow/arrow.py index c0a4e25e..6ca7b067 100644 --- a/arrow/arrow.py +++ b/arrow/arrow.py @@ -702,8 +702,10 @@ def span_range( """ tzinfo = cls._get_tzinfo(start.tzinfo if tz is None else tz) - start = cls.fromdatetime(start, tzinfo).span(frame, exact=exact)[0] - end = cls.fromdatetime(end, tzinfo) + start = cls.fromdatetime(cls._get_datetime(start), tzinfo).span( + frame, exact=exact + )[0] + end = cls.fromdatetime(cls._get_datetime(end), tzinfo) _range = cls.range(frame, start, end, tz, limit) if not exact: for r in _range: