]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-137481: Fix abbreviation of day names in TextCalendar (GH-137482)
authorScott Noyes <snoyes@gmail.com>
Wed, 20 Aug 2025 16:55:50 +0000 (12:55 -0400)
committerGitHub <noreply@github.com>
Wed, 20 Aug 2025 16:55:50 +0000 (19:55 +0300)
Use the length of the longest day name in the current locale, rather
than a constant 9, to decide if the names should be abbreviated.

Lib/calendar.py
Lib/test/test_calendar.py
Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst [new file with mode: 0644]

index fd6c561a9d39b8593cd9e9ff6255a260d67598c6..678c7be5aac094e84610212e9ec657c6ecceab33 100644 (file)
@@ -378,7 +378,7 @@ class TextCalendar(Calendar):
         """
         Returns a formatted week day name.
         """
-        if width >= 9:
+        if width >= max(map(len, day_name)):
             names = day_name
         else:
             names = day_abbr
index 589a21baf7bd6175652ce9b2db2f7e9836c6e005..410063e01582f90916e5f971a8bd3782825e7297 100644 (file)
@@ -696,6 +696,52 @@ class CalendarTestCase(unittest.TestCase):
         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):
+            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.
diff --git a/Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst b/Misc/NEWS.d/next/Library/2025-08-06-16-54-22.gh-issue-137481.eSTkK0.rst
new file mode 100644 (file)
index 0000000..57d8d05
--- /dev/null
@@ -0,0 +1,2 @@
+Calendar uses the lengths of the locale's weekdays to decide if the width
+requires abbreviation.