Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.13] gh-126476: Raise IllegalMonthError for calendar.formatmonth() when the input month is not correct (GH-126484) #126879

Merged
merged 1 commit into from
Nov 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions Lib/calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@
error = ValueError

# Exceptions raised for bad input
class IllegalMonthError(ValueError):
# This is trick for backward compatibility. Since 3.13, we will raise IllegalMonthError instead of
# IndexError for bad month number(out of 1-12). But we can't remove IndexError for backward compatibility.
class IllegalMonthError(ValueError, IndexError):
def __init__(self, month):
self.month = month
def __str__(self):
Expand Down Expand Up @@ -158,11 +160,14 @@ def weekday(year, month, day):
return Day(datetime.date(year, month, day).weekday())


def _validate_month(month):
if not 1 <= month <= 12:
raise IllegalMonthError(month)

def monthrange(year, month):
"""Return weekday of first day of month (0-6 ~ Mon-Sun)
and number of days (28-31) for year, month."""
if not 1 <= month <= 12:
raise IllegalMonthError(month)
_validate_month(month)
day1 = weekday(year, month, 1)
ndays = mdays[month] + (month == FEBRUARY and isleap(year))
return day1, ndays
Expand Down Expand Up @@ -370,6 +375,8 @@ def formatmonthname(self, theyear, themonth, width, withyear=True):
"""
Return a formatted month name.
"""
_validate_month(themonth)

s = month_name[themonth]
if withyear:
s = "%s %r" % (s, theyear)
Expand Down Expand Up @@ -500,6 +507,7 @@ def formatmonthname(self, theyear, themonth, withyear=True):
"""
Return a month name as a table row.
"""
_validate_month(themonth)
if withyear:
s = '%s %s' % (month_name[themonth], theyear)
else:
Expand Down Expand Up @@ -786,6 +794,8 @@ def main(args=None):
if options.month is None:
optdict["c"] = options.spacing
optdict["m"] = options.months
if options.month is not None:
_validate_month(options.month)
if options.year is None:
result = cal.formatyear(datetime.date.today().year, **optdict)
elif options.month is None:
Expand Down
14 changes: 13 additions & 1 deletion Lib/test/test_calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,11 @@ def test_formatmonth(self):
calendar.TextCalendar().formatmonth(0, 2),
result_0_02_text
)
def test_formatmonth_with_invalid_month(self):
with self.assertRaises(calendar.IllegalMonthError):
calendar.TextCalendar().formatmonth(2017, 13)
with self.assertRaises(calendar.IllegalMonthError):
calendar.TextCalendar().formatmonth(2017, -1)

def test_formatmonthname_with_year(self):
self.assertEqual(
Expand Down Expand Up @@ -1121,7 +1126,7 @@ def test__all__(self):
not_exported = {
'mdays', 'January', 'February', 'EPOCH',
'different_locale', 'c', 'prweek', 'week', 'format',
'formatstring', 'main', 'monthlen', 'prevmonth', 'nextmonth'}
'formatstring', 'main', 'monthlen', 'prevmonth', 'nextmonth', ""}
support.check__all__(self, calendar, not_exported=not_exported)


Expand Down Expand Up @@ -1149,6 +1154,13 @@ def test_formatmonth(self):
self.assertIn('class="text-center month"',
self.cal.formatmonth(2017, 5))

def test_formatmonth_with_invalid_month(self):
with self.assertRaises(calendar.IllegalMonthError):
self.cal.formatmonth(2017, 13)
with self.assertRaises(calendar.IllegalMonthError):
self.cal.formatmonth(2017, -1)


def test_formatweek(self):
weeks = self.cal.monthdays2calendar(2017, 5)
self.assertIn('class="wed text-nowrap"', self.cal.formatweek(weeks[0]))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Raise :class:`calendar.IllegalMonthError` (now a subclass of :class:`IndexError`) for :func:`calendar.month`
when the input month is not correct.
Loading