From: Georg Brandl Date: Fri, 26 Nov 2010 07:57:57 +0000 (+0000) Subject: Merged revisions 85728 via svnmerge from X-Git-Tag: v2.7.1~20 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=79f096a7aab611b6299c0944d6ab2e9552e6caca;p=python Merged revisions 85728 via svnmerge from 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. ........ --- diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst index 30f2a9420b..2245e513a5 100644 --- a/Doc/library/calendar.rst +++ b/Doc/library/calendar.rst @@ -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. diff --git a/Lib/calendar.py b/Lib/calendar.py index a8735b9307..3106ef273e 100644 --- a/Lib/calendar.py +++ b/Lib/calendar.py @@ -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) diff --git a/Lib/test/test_calendar.py b/Lib/test/test_calendar.py index fad517c3f5..8396bdf6f5 100644 --- a/Lib/test/test_calendar.py +++ b/Lib/test/test_calendar.py @@ -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): diff --git a/Misc/NEWS b/Misc/NEWS index 226bd46a79..72e93d9b34 100644 --- 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.