#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:
parent
f87cc04481
commit
7004bd1a3d
|
@ -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.
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue