Skip to content

Commit 35dc956

Browse files
committed
Support short and narrow formats for format_timedelta(..., add_direction=True)
Fixes #1162
1 parent 9d25e67 commit 35dc956

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

babel/dates.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -943,11 +943,16 @@ def format_timedelta(
943943

944944
def _iter_patterns(a_unit):
945945
if add_direction:
946-
unit_rel_patterns = locale._data['date_fields'][a_unit]
947-
if seconds >= 0:
948-
yield unit_rel_patterns['future']
949-
else:
950-
yield unit_rel_patterns['past']
946+
for key in (f"{a_unit}-{format}", a_unit):
947+
unit_rel_patterns = locale._data['date_fields'].get(key)
948+
if not unit_rel_patterns:
949+
continue
950+
if seconds >= 0:
951+
yield unit_rel_patterns['future']
952+
break # do not try fallback key
953+
else:
954+
yield unit_rel_patterns['past']
955+
break # do not try fallback key
951956
a_unit = f"duration-{a_unit}"
952957
unit_pats = locale._data['unit_patterns'].get(a_unit, {})
953958
yield unit_pats.get(format)

tests/test_dates.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,3 +807,24 @@ def test_issue_892():
807807
def test_issue_1089():
808808
assert dates.format_datetime(datetime.now(), locale="ja_JP@mod")
809809
assert dates.format_datetime(datetime.now(), locale=Locale.parse("ja_JP@mod"))
810+
811+
812+
@pytest.mark.parametrize(('locale', 'format', 'negative', 'expected'), [
813+
('en_US', 'long', False, 'in 3 hours'),
814+
('en_US', 'long', True, '3 hours ago'),
815+
('en_US', 'narrow', False, 'in 3h'),
816+
('en_US', 'narrow', True, '3h ago'),
817+
('en_US', 'short', False, 'in 3 hr.'),
818+
('en_US', 'short', True, '3 hr. ago'),
819+
('fi_FI', 'long', False, '3 tunnin päästä'),
820+
('fi_FI', 'long', True, '3 tuntia sitten'),
821+
('fi_FI', 'short', False, '3 t päästä'),
822+
('fi_FI', 'short', True, '3 t sitten'),
823+
('sv_SE', 'long', False, 'om 3 timmar'),
824+
('sv_SE', 'long', True, 'för 3 timmar sedan'),
825+
('sv_SE', 'short', False, 'om 3 tim'),
826+
('sv_SE', 'short', True, 'för 3 tim sedan'),
827+
])
828+
def test_issue_1162(locale, format, negative, expected):
829+
delta = timedelta(seconds=10800) * (-1 if negative else +1)
830+
assert dates.format_timedelta(delta, add_direction=True, format=format, locale=locale) == expected

0 commit comments

Comments
 (0)