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.
........
This commit is contained in:
Georg Brandl 2010-11-26 07:57:57 +00:00
parent b8d0e365e2
commit 79f096a7aa
4 changed files with 31 additions and 5 deletions

View File

@ -182,9 +182,9 @@ it's the base calendar for all computations.
.. class:: LocaleTextCalendar([firstweekday[, locale]]) .. class:: LocaleTextCalendar([firstweekday[, locale]])
This subclass of :class:`TextCalendar` can be passed a locale name in the This subclass of :class:`TextCalendar` can be passed a locale name in the
constructor and will return month and weekday names in the specified constructor and will return month and weekday names in the specified locale.
locale. If this locale includes an encoding all strings containing month and If this locale includes an encoding all strings containing month and weekday
weekday names will be returned as unicode. names will be returned as unicode.
.. versionadded:: 2.5 .. versionadded:: 2.5
@ -198,6 +198,13 @@ it's the base calendar for all computations.
.. versionadded:: 2.5 .. 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. For simple text calendars this module provides the following functions.

View File

@ -486,8 +486,8 @@ class TimeEncoding:
self.locale = locale self.locale = locale
def __enter__(self): def __enter__(self):
self.oldlocale = _locale.setlocale(_locale.LC_TIME, self.locale) self.oldlocale = _locale.getlocale(_locale.LC_TIME)
return _locale.getlocale(_locale.LC_TIME)[1] _locale.setlocale(_locale.LC_TIME, self.locale)
def __exit__(self, *args): def __exit__(self, *args):
_locale.setlocale(_locale.LC_TIME, self.oldlocale) _locale.setlocale(_locale.LC_TIME, self.oldlocale)

View File

@ -2,6 +2,7 @@ import calendar
import unittest import unittest
from test import test_support from test import test_support
import locale
result_2004_text = """ result_2004_text = """
@ -248,6 +249,22 @@ class CalendarTestCase(unittest.TestCase):
# verify it "acts like a sequence" in two forms of iteration # verify it "acts like a sequence" in two forms of iteration
self.assertEqual(value[::-1], list(reversed(value))) 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): class MonthCalendarTestCase(unittest.TestCase):
def setUp(self): def setUp(self):

View File

@ -13,6 +13,8 @@ Core and Builtins
Library Library
------- -------
- Issue #10092: Properly reset locale in calendar.Locale*Calendar classes.
- Issue #10459: Update CJK character names to Unicode 5.2. - Issue #10459: Update CJK character names to Unicode 5.2.
- Issue #6098: Don't claim DOM level 3 conformance in minidom. - Issue #6098: Don't claim DOM level 3 conformance in minidom.