gh-103636: add enums for days and months in calendar module (GH-103642)

Convert day contants to a Day enum, and add a Month enum.
This commit is contained in:
Prince Roshan 2023-04-25 08:21:27 +05:30 committed by GitHub
parent 57f8f9a66d
commit b934f97850
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 21 deletions

View File

@ -7,6 +7,7 @@ set the first day of the week (0=Monday, 6=Sunday)."""
import sys import sys
import datetime import datetime
from enum import IntEnum, global_enum
import locale as _locale import locale as _locale
from itertools import repeat from itertools import repeat
@ -16,6 +17,9 @@ __all__ = ["IllegalMonthError", "IllegalWeekdayError", "setfirstweekday",
"timegm", "month_name", "month_abbr", "day_name", "day_abbr", "timegm", "month_name", "month_abbr", "day_name", "day_abbr",
"Calendar", "TextCalendar", "HTMLCalendar", "LocaleTextCalendar", "Calendar", "TextCalendar", "HTMLCalendar", "LocaleTextCalendar",
"LocaleHTMLCalendar", "weekheader", "LocaleHTMLCalendar", "weekheader",
"Day", "Month", "JANUARY", "FEBRUARY", "MARCH",
"APRIL", "MAY", "JUNE", "JULY",
"AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER",
"MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY",
"SATURDAY", "SUNDAY"] "SATURDAY", "SUNDAY"]
@ -37,9 +41,35 @@ class IllegalWeekdayError(ValueError):
return "bad weekday number %r; must be 0 (Monday) to 6 (Sunday)" % self.weekday return "bad weekday number %r; must be 0 (Monday) to 6 (Sunday)" % self.weekday
# Constants for months referenced later # Constants for months
January = 1 @global_enum
February = 2 class Month(IntEnum):
JANUARY = 1
FEBRUARY = 2
MARCH = 3
APRIL = 4
MAY = 5
JUNE = 6
JULY = 7
AUGUST = 8
SEPTEMBER = 9
OCTOBER = 10
NOVEMBER = 11
DECEMBER = 12
# Constants for days
@global_enum
class Day(IntEnum):
MONDAY = 0
TUESDAY = 1
WEDNESDAY = 2
THURSDAY = 3
FRIDAY = 4
SATURDAY = 5
SUNDAY = 6
# 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]
@ -95,9 +125,6 @@ day_abbr = _localized_day('%a')
month_name = _localized_month('%B') month_name = _localized_month('%B')
month_abbr = _localized_month('%b') month_abbr = _localized_month('%b')
# Constants for weekdays
(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
def isleap(year): def isleap(year):
"""Return True for leap years, False for non-leap years.""" """Return True for leap years, False for non-leap years."""
@ -125,12 +152,12 @@ def monthrange(year, month):
if not 1 <= month <= 12: if not 1 <= month <= 12:
raise IllegalMonthError(month) raise IllegalMonthError(month)
day1 = weekday(year, month, 1) day1 = weekday(year, month, 1)
ndays = mdays[month] + (month == February and isleap(year)) ndays = mdays[month] + (month == FEBRUARY and isleap(year))
return day1, ndays return day1, ndays
def _monthlen(year, month): def _monthlen(year, month):
return mdays[month] + (month == February and isleap(year)) return mdays[month] + (month == FEBRUARY and isleap(year))
def _prevmonth(year, month): def _prevmonth(year, month):
@ -260,10 +287,7 @@ class Calendar(object):
Each month contains between 4 and 6 weeks and each week contains 1-7 Each month contains between 4 and 6 weeks and each week contains 1-7
days. Days are datetime.date objects. days. Days are datetime.date objects.
""" """
months = [ months = [self.monthdatescalendar(year, m) for m in Month]
self.monthdatescalendar(year, i)
for i in range(January, January+12)
]
return [months[i:i+width] for i in range(0, len(months), width) ] return [months[i:i+width] for i in range(0, len(months), width) ]
def yeardays2calendar(self, year, width=3): def yeardays2calendar(self, year, width=3):
@ -273,10 +297,7 @@ class Calendar(object):
(day number, weekday number) tuples. Day numbers outside this month are (day number, weekday number) tuples. Day numbers outside this month are
zero. zero.
""" """
months = [ months = [self.monthdays2calendar(year, m) for m in Month]
self.monthdays2calendar(year, i)
for i in range(January, January+12)
]
return [months[i:i+width] for i in range(0, len(months), width) ] return [months[i:i+width] for i in range(0, len(months), width) ]
def yeardayscalendar(self, year, width=3): def yeardayscalendar(self, year, width=3):
@ -285,10 +306,7 @@ class Calendar(object):
yeardatescalendar()). Entries in the week lists are day numbers. yeardatescalendar()). Entries in the week lists are day numbers.
Day numbers outside this month are zero. Day numbers outside this month are zero.
""" """
months = [ months = [self.monthdayscalendar(year, m) for m in Month]
self.monthdayscalendar(year, i)
for i in range(January, January+12)
]
return [months[i:i+width] for i in range(0, len(months), width) ] return [months[i:i+width] for i in range(0, len(months), width) ]
@ -509,7 +527,7 @@ class HTMLCalendar(Calendar):
a('\n') a('\n')
a('<tr><th colspan="%d" class="%s">%s</th></tr>' % ( a('<tr><th colspan="%d" class="%s">%s</th></tr>' % (
width, self.cssclass_year_head, theyear)) width, self.cssclass_year_head, theyear))
for i in range(January, January+12, width): for i in range(JANUARY, JANUARY+12, width):
# months in this row # months in this row
months = range(i, min(i+width, 13)) months = range(i, min(i+width, 13))
a('<tr>') a('<tr>')

View File

@ -0,0 +1 @@
Added Enum for months and days in the calendar module.