SF bug 533234: tm_isdst > 1 Passed to strftime.

One more time on this turkey, but duller instead of cleverer.

Curious:  The docs say __getslice__ has been deprecated since 2.0, but
list.__getitem__ still doesn't work if you pass it a slice.  This makes
it a lot clearer to emulate a list by *being* a list <wink>.

Bugfix candidate.  Michael, just pile this patch on top of the others
that went by -- no need to try to pick these apart.
This commit is contained in:
Tim Peters 2002-03-23 03:26:53 +00:00
parent ed19b88f0b
commit 0c2c8e77fb
2 changed files with 66 additions and 18 deletions

View File

@ -9,10 +9,12 @@ set the first day of the week (0=Monday, 6=Sunday)."""
# Import functions and variables from time module
from time import localtime, mktime, strftime
from types import SliceType
__all__ = ["error","setfirstweekday","firstweekday","isleap",
"leapdays","weekday","monthrange","monthcalendar",
"prmonth","month","prcal","calendar","timegm"]
"prmonth","month","prcal","calendar","timegm",
"month_name", "month_abbr", "day_name", "day_abbr"]
# Exception raised for bad input (with string parameter for details)
error = ValueError
@ -24,29 +26,52 @@ February = 2
# Number of days per month (except for February in leap years)
mdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
class _localized_name:
def __init__(self, format, len):
# This module used to have hard-coded lists of day and month names, as
# English strings. The classes following emulate a read-only version of
# that, but supply localized names. Note that the values are computed
# fresh on each call, in case the user changes locale between calls.
class _indexer:
def __getitem__(self, i):
if isinstance(i, SliceType):
return self.data[i.start : i.stop]
else:
# May raise an appropriate exception.
return self.data[i]
class _localized_month(_indexer):
def __init__(self, format):
self.format = format
self.len = len
def __getitem__(self, item):
if isinstance(item, int):
if item < 0: item += self.len
if not 0 <= item < self.len:
raise IndexError, "out of range"
t = (2001, 1, item+1, 12, 0, 0, item, item+1, 0)
return strftime(self.format, t).capitalize()
elif isinstance(item, type(slice(0))):
return [self[e] for e in range(self.len)].__getslice__(item.start, item.stop)
def __getitem__(self, i):
self.data = [strftime(self.format, (2001, j, 1, 12, 0, 0, 1, 1, 0))
for j in range(1, 13)]
self.data.insert(0, "")
return _indexer.__getitem__(self, i)
def __len__(self):
return self.len
return 13
class _localized_day(_indexer):
def __init__(self, format):
self.format = format
def __getitem__(self, i):
# January 1, 2001, was a Monday.
self.data = [strftime(self.format, (2001, 1, j+1, 12, 0, 0, j, j+1, 0))
for j in range(7)]
return _indexer.__getitem__(self, i)
def __len__(self_):
return 7
# Full and abbreviated names of weekdays
day_name = _localized_name('%A', 7)
day_abbr = _localized_name('%a', 7)
day_name = _localized_day('%A')
day_abbr = _localized_day('%a')
# Full and abbreviated names of months (1-based arrays!!!)
month_name = _localized_name('%B', 13)
month_abbr = _localized_name('%b', 13)
month_name = _localized_month('%B')
month_abbr = _localized_month('%b')
# Constants for weekdays
(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)

View File

@ -31,6 +31,29 @@ class CalendarTestCase(unittest.TestCase):
self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
self.assertEqual(len([d for d in calendar.day_abbr]), 7)
def test_days(self):
for attr in "day_name", "day_abbr":
value = getattr(calendar, attr)
self.assertEqual(len(value), 7)
self.assertEqual(len(value[:]), 7)
# ensure they're all unique
d = {}
for v in value:
d[v] = 1
self.assertEqual(len(d), 7)
def test_months(self):
for attr in "month_name", "month_abbr":
value = getattr(calendar, attr)
self.assertEqual(len(value), 13)
self.assertEqual(len(value[:]), 13)
self.assertEqual(value[0], "")
# ensure they're all unique
d = {}
for v in value:
d[v] = 1
self.assertEqual(len(d), 13)
def test_main():
run_unittest(CalendarTestCase)