Skip to content

Commit ffdc079

Browse files
author
Zo Bot
committed
naturaldelta: include OverflowError in the int() guard so float('inf') returns unchanged
The docstring says naturaldelta returns non-number input unchanged. int(float('inf')) raises OverflowError (not ValueError or TypeError), so the existing except (ValueError, TypeError) clause let it escape. The two new test cases (float('inf') and float('-inf')) fail on the pre-fix code with OverflowError and pass once OverflowError is added to the except tuple. The existing 'NaN' string case still returns "NaN" because str('NaN') is 'NaN' and float('NaN') → nan → int(nan) still raises ValueError which is still caught.
1 parent 9326b16 commit ffdc079

2 files changed

Lines changed: 6 additions & 2 deletions

File tree

src/humanize/time.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def naturaldelta(
151151
int(value) # Explicitly don't support string such as "NaN" or "inf"
152152
value = float(value)
153153
delta = dt.timedelta(seconds=value)
154-
except (ValueError, TypeError):
154+
except (ValueError, TypeError, OverflowError):
155155
return str(value)
156156

157157
use_months = months

tests/test_time.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import datetime as dt
66
import typing
7+
import math
78

89
import pytest
910
from freezegun import freeze_time
@@ -128,14 +129,17 @@ def test_naturaldelta_nomonths(test_input: dt.timedelta, expected: str) -> None:
128129
(dt.timedelta(days=365), "a year"),
129130
(dt.timedelta(days=365 * 1_141), "1,141 years"),
130131
("NaN", "NaN"), # Returns non-numbers unchanged.
132+
(float("inf"), "inf"),
133+
(float("-inf"), "-inf"),
131134
# largest possible timedelta
132135
(dt.timedelta(days=999_999_999), "2,739,726 years"),
133136
],
134137
)
135138
def test_naturaldelta(test_input: float | dt.timedelta, expected: str) -> None:
136139
assert humanize.naturaldelta(test_input) == expected
137140
if not isinstance(test_input, str):
138-
assert humanize.naturaldelta(-test_input) == expected
141+
if isinstance(test_input, dt.timedelta) or math.isfinite(test_input):
142+
assert humanize.naturaldelta(-test_input) == expected
139143

140144

141145
@freeze_time(FROZEN_DATE)

0 commit comments

Comments
 (0)