]> granicus.if.org Git - python/commitdiff
#10092: Properly reset locale in Locale*Calendar classes. The context manager was...
authorGeorg Brandl <georg@python.org>
Tue, 19 Oct 2010 18:54:25 +0000 (18:54 +0000)
committerGeorg Brandl <georg@python.org>
Tue, 19 Oct 2010 18:54:25 +0000 (18:54 +0000)
Doc/library/calendar.rst
Lib/calendar.py
Lib/test/test_calendar.py
Misc/NEWS

index 2228920fd4459b0e7324c6891c337cb2ac37a277..c8dac49e3cf72127cdc8249c360f4023ec7d6aa8 100644 (file)
@@ -170,9 +170,9 @@ it's the base calendar for all computations.
 .. class:: LocaleTextCalendar(firstweekday=0, locale=None)
 
    This subclass of :class:`TextCalendar` can be passed a locale name in the
-   constructor and will return month and weekday names in the specified
-   locale. If this locale includes an encoding all strings containing month and
-   weekday names will be returned as unicode.
+   constructor and will return month and weekday names in the specified locale.
+   If this locale includes an encoding all strings containing month and weekday
+   names will be returned as unicode.
 
 
 .. class:: LocaleHTMLCalendar(firstweekday=0, locale=None)
@@ -182,6 +182,12 @@ it's the base calendar for all computations.
    locale. If this locale includes an encoding all strings containing month and
    weekday names will be returned as unicode.
 
+.. note::
+
+   The :meth:`formatweekday` and :meth:`formatmonthname` methods of these two
+   classes temporarily change the current locale to the given *locale*.  Because
+   the current locale is a process-wide setting, they are not thread-safe.
+
 
 For simple text calendars this module provides the following functions.
 
index 12bd1a8b17c36bf55f18d93c8dcbab26e7fe5a6c..84aa3a429b45de0dd5175ed436347f35afc3e55f 100644 (file)
@@ -486,8 +486,8 @@ class different_locale:
         self.locale = locale
 
     def __enter__(self):
-        self.oldlocale = _locale.setlocale(_locale.LC_TIME, self.locale)
-        #return _locale.getlocale(_locale.LC_TIME)[1]
+        self.oldlocale = _locale.getlocale(_locale.LC_TIME)
+        _locale.setlocale(_locale.LC_TIME, self.locale)
 
     def __exit__(self, *args):
         _locale.setlocale(_locale.LC_TIME, self.oldlocale)
index b936acb3e9499bcdf7a2dd24a82ac2f0f9f24d0b..f906bc39bd60e927a6f5ab1351e56c935957dddc 100644 (file)
@@ -3,6 +3,7 @@ import unittest
 
 from test import support
 import time
+import locale
 
 result_2004_text = """
                                   2004
@@ -250,6 +251,22 @@ class CalendarTestCase(unittest.TestCase):
             # verify it "acts like a sequence" in two forms of iteration
             self.assertEqual(value[::-1], list(reversed(value)))
 
+    def test_localecalendars(self):
+        # ensure that Locale{Text,HTML}Calendar resets the locale properly
+        # (it is still not thread-safe though)
+        try:
+            def_locale = locale.getdefaultlocale()
+        except locale.Error:
+            # cannot determine a default locale -- skip test
+            return
+        old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
+        calendar.LocaleTextCalendar(
+            locale=def_locale).formatmonthname(2010, 10, 10)
+        calendar.LocaleHTMLCalendar(
+            locale=def_locale).formatmonthname(2010, 10)
+        new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
+        self.assertEquals(old_october, new_october)
+
 
 class MonthCalendarTestCase(unittest.TestCase):
     def setUp(self):
index 4b92ef61507eb929d585c8fb09bd9e2eb95596e5..066c667095282768d5b1f1682924b6f4dbac8a78 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -34,6 +34,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #10092: Properly reset locale in calendar.Locale*Calendar classes.
+
 - logging: Added _logRecordClass, getLogRecordClass, setLogRecordClass to
   increase flexibility of LogRecord creation.