Skip to content

gh-137481: consider actual day name length #137482

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Aug 20, 2025
2 changes: 1 addition & 1 deletion Lib/calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ def formatweekday(self, day, width):
"""
Returns a formatted week day name.
"""
if width >= 9:
if width >= max(map(len, day_name)):
names = day_name
else:
names = day_abbr
Expand Down
46 changes: 46 additions & 0 deletions Lib/test/test_calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -696,6 +696,52 @@ def test_locale_calendar_formatweekday(self):
except locale.Error:
raise unittest.SkipTest('cannot set the en_US locale')

# These locales have weekday names all shorter than English's longest
# 'Wednesday'. They should not be abbreviated unnecessarily
@support.run_with_locales("LC_ALL",
'Chinese', 'zh_CN.UTF-8',
'French', 'fr_FR.UTF-8',
'Norwegian', 'nb_NO.UTF-8',
'Malay', 'ms_MY.UTF8'
)
def test_locale_calendar_short_weekday_names(self):
names = (datetime.date(2001, 1, i+1).strftime('%A') for i in range(7))
max_length = max(map(len, names))
if max_length >= 9:
self.skipTest('weekday names are too long')

def get_weekday_names(width):
return calendar.TextCalendar().formatweekheader(width).split()

# Weekday names should not be abbreviated if the width is sufficient
self.assertEqual(
get_weekday_names(max_length),
get_weekday_names(max_length + 10)
)

# Any width shorter than necessary should produce abbreviations
self.assertNotEqual(
get_weekday_names(max_length),
get_weekday_names(max_length - 1)
)

# These locales have a weekday name longer than 'Wednesday'
# They should be properly abbreviated rather than truncated
@support.run_with_locales("LC_ALL",
'Portuguese', 'pt_PT.UTF-8',
'German', 'de_DE.UTF-8',
'Russian', 'ru_RU.UTF-8',
)
def test_locale_calendar_long_weekday_names(self):
names = (datetime.date(2001, 1, i+1).strftime('%A') for i in range(7))
max_length = max(map(len, names))
if max_length <= 9:
self.skipTest('weekday names are too short')

def get_weekday_names(width):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function is duplicated

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean the local get_weekday_names function? Or did you mean the test_locale_calendar_short_weekday_names vs test_locale_calendar_long_weekday_names ? The latter two do different things. The first tests that locales with short names are NOT abbreviated needlessly; the second tests that locales with long names ARE abbreviated rather than truncated.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean the helper, get_weekday_names

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Is that important in a test? Do you prefer that function be moved up to the global scope to avoid the duplication, or some other suggestion?

return calendar.TextCalendar().formatweekheader(width).split()
self.assertEqual(get_weekday_names(4), get_weekday_names(9))

def test_locale_calendar_formatmonthname(self):
try:
# formatmonthname uses the same month names regardless of the width argument.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Calendar uses the lengths of the locale's weekdays to decide if the width
requires abbreviation.
Loading