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:
parent
ed19b88f0b
commit
0c2c8e77fb
|
@ -9,10 +9,12 @@ set the first day of the week (0=Monday, 6=Sunday)."""
|
||||||
|
|
||||||
# Import functions and variables from time module
|
# Import functions and variables from time module
|
||||||
from time import localtime, mktime, strftime
|
from time import localtime, mktime, strftime
|
||||||
|
from types import SliceType
|
||||||
|
|
||||||
__all__ = ["error","setfirstweekday","firstweekday","isleap",
|
__all__ = ["error","setfirstweekday","firstweekday","isleap",
|
||||||
"leapdays","weekday","monthrange","monthcalendar",
|
"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)
|
# Exception raised for bad input (with string parameter for details)
|
||||||
error = ValueError
|
error = ValueError
|
||||||
|
@ -24,29 +26,52 @@ February = 2
|
||||||
# Number of days per month (except for February in leap years)
|
# 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]
|
mdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
||||||
|
|
||||||
class _localized_name:
|
# This module used to have hard-coded lists of day and month names, as
|
||||||
def __init__(self, format, len):
|
# 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.format = format
|
||||||
self.len = len
|
|
||||||
def __getitem__(self, item):
|
def __getitem__(self, i):
|
||||||
if isinstance(item, int):
|
self.data = [strftime(self.format, (2001, j, 1, 12, 0, 0, 1, 1, 0))
|
||||||
if item < 0: item += self.len
|
for j in range(1, 13)]
|
||||||
if not 0 <= item < self.len:
|
self.data.insert(0, "")
|
||||||
raise IndexError, "out of range"
|
return _indexer.__getitem__(self, i)
|
||||||
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 __len__(self):
|
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
|
# Full and abbreviated names of weekdays
|
||||||
day_name = _localized_name('%A', 7)
|
day_name = _localized_day('%A')
|
||||||
day_abbr = _localized_name('%a', 7)
|
day_abbr = _localized_day('%a')
|
||||||
|
|
||||||
# Full and abbreviated names of months (1-based arrays!!!)
|
# Full and abbreviated names of months (1-based arrays!!!)
|
||||||
month_name = _localized_name('%B', 13)
|
month_name = _localized_month('%B')
|
||||||
month_abbr = _localized_name('%b', 13)
|
month_abbr = _localized_month('%b')
|
||||||
|
|
||||||
# Constants for weekdays
|
# Constants for weekdays
|
||||||
(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
|
(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
|
||||||
|
|
|
@ -31,6 +31,29 @@ class CalendarTestCase(unittest.TestCase):
|
||||||
self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
|
self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
|
||||||
self.assertEqual(len([d for d in calendar.day_abbr]), 7)
|
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():
|
def test_main():
|
||||||
run_unittest(CalendarTestCase)
|
run_unittest(CalendarTestCase)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue