From 267175d28dfc85468d7f769adae96b4193872f86 Mon Sep 17 00:00:00 2001 From: Shreyans Chowdry Date: Fri, 16 Oct 2026 17:43:08 +0530 Subject: [PATCH] Accumulate repeated units in parse_timedelta --- boltons/timeutils.py | 7 ++++++- tests/test_timeutils.py | 13 ++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/boltons/timeutils.py b/boltons/timeutils.py index e0c73bc9..0db9fc03 100644 --- a/boltons/timeutils.py +++ b/boltons/timeutils.py @@ -166,6 +166,11 @@ def parse_timedelta(text): >>> parse_td('2 weeks 1 day') == timedelta(days=15) True + Repeated units are added together: + + >>> parse_td('1h 30m 2h') == timedelta(hours=3, minutes=30) + True + Negative times are supported, too: >>> parse_td('-1.5 weeks 3m 20s') == timedelta(days=-11, seconds=43400) @@ -184,7 +189,7 @@ def parse_timedelta(text): except ValueError: raise ValueError('invalid time value for unit %r: %r' % (unit, value)) - td_kwargs[unit_key] = value + td_kwargs[unit_key] = td_kwargs.get(unit_key, 0) + value return timedelta(**td_kwargs) diff --git a/tests/test_timeutils.py b/tests/test_timeutils.py index 0e383e5c..32b82146 100644 --- a/tests/test_timeutils.py +++ b/tests/test_timeutils.py @@ -2,7 +2,7 @@ import pytest -from boltons.timeutils import daterange, isoparse, Eastern +from boltons.timeutils import daterange, isoparse, Eastern, parse_timedelta def test_daterange_years(): @@ -152,3 +152,14 @@ def test_us_timezone_fromutc_sets_fold(): assert second.replace(tzinfo=None) == datetime(2011, 11, 6, 1, 30) assert second.fold == 1 assert second.tzname() == 'EST' + + +@pytest.mark.parametrize('text, expected', [ + ('1h 30m 2h', timedelta(hours=3, minutes=30)), + ('1 day 2 days', timedelta(days=3)), + ('1.5h -0.5h', timedelta(hours=1)), + ('2s -2s', timedelta(0)), + ('1w 2d 3h 4m 5s', timedelta(weeks=1, days=2, hours=3, minutes=4, seconds=5)), +]) +def test_parse_timedelta_repeated_units(text, expected): + assert parse_timedelta(text) == expected