]> granicus.if.org Git - python/commitdiff
Merged revisions 85728 via svnmerge from
authorGeorg Brandl <georg@python.org>
Fri, 26 Nov 2010 07:57:57 +0000 (07:57 +0000)
committerGeorg Brandl <georg@python.org>
Fri, 26 Nov 2010 07:57:57 +0000 (07:57 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r85728 | georg.brandl | 2010-10-19 20:54:25 +0200 (Di, 19 Okt 2010) | 1 line

  #10092: Properly reset locale in Locale*Calendar classes.  The context manager was buggy because setlocale() returns the *new* locale, not the old.  Also add a test for this.
........

Doc/library/calendar.rst
Lib/calendar.py
Lib/test/test_calendar.py
Misc/NEWS

index 30f2a9420bf42b706410f2bb5b1788b3bca65449..2245e513a5eaf5a6d9de322c61e86b0e0fb636bb 100644 (file)
@@ -182,9 +182,9 @@ it's the base calendar for all computations.
 .. class:: LocaleTextCalendar([firstweekday[, locale]])
 
    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.
 
    .. versionadded:: 2.5
 
@@ -198,6 +198,13 @@ it's the base calendar for all computations.
 
    .. versionadded:: 2.5
 
+.. 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 a8735b9307a5a64ef14a4037a05908a1afa4f358..3106ef273e86e9541d96552615632ffa61e9de70 100644 (file)
@@ -486,8 +486,8 @@ class TimeEncoding:
         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 fad517c3f5efa6e92b3aee29c8d676b967dcdbb6..8396bdf6f56afc341b226de5367013bba0da8718 100644 (file)
@@ -2,6 +2,7 @@ import calendar
 import unittest
 
 from test import test_support
+import locale
 
 
 result_2004_text = """
@@ -248,6 +249,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 226bd46a7931ace2f9c89d4d276ec4dbc5f3c79e..72e93d9b34004d6eca5a6a3c057fb36bfe06bdd4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #10092: Properly reset locale in calendar.Locale*Calendar classes.
+
 - Issue #10459: Update CJK character names to Unicode 5.2.
 
 - Issue #6098: Don't claim DOM level 3 conformance in minidom.