gh-103636: issue warning for deprecated calendar constants (#103833)

Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
Co-authored-by: Éric <merwok@netwok.org>
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
This commit is contained in:
Prince Roshan 2023-04-29 12:46:46 +05:30 committed by GitHub
parent ed29f524cf
commit 84e7d0f0c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 84 additions and 0 deletions

View File

@ -28,6 +28,58 @@ interpreted as prescribed by the ISO 8601 standard. Year 0 is 1 BC, year -1 is
2 BC, and so on. 2 BC, and so on.
.. class:: Day
Enumeration defining the days of the week as integer constants, from 0 to 6.
.. attribute:: MONDAY
.. attribute:: TUESDAY
.. attribute:: WEDNESDAY
.. attribute:: THURSDAY
.. attribute:: FRIDAY
.. attribute:: SATURDAY
.. attribute:: SUNDAY
.. versionadded:: 3.12
.. class:: Month
Enumeration defining months of the year as integer constants, from 1 to 12.
.. attribute:: JANUARY
.. attribute:: FEBRUARY
.. attribute:: MARCH
.. attribute:: APRIL
.. attribute:: MAY
.. attribute:: JUNE
.. attribute:: JULY
.. attribute:: AUGUST
.. attribute:: SEPTEMBER
.. attribute:: OCTOBER
.. attribute:: NOVEMBER
.. attribute:: DECEMBER
.. versionadded:: 3.12
.. class:: Calendar(firstweekday=0) .. class:: Calendar(firstweekday=0)
Creates a :class:`Calendar` object. *firstweekday* is an integer specifying the Creates a :class:`Calendar` object. *firstweekday* is an integer specifying the

View File

@ -300,6 +300,12 @@ asyncio
yielding tasks. yielding tasks.
(Contributed by Kumar Aditya in :gh:`78530`.) (Contributed by Kumar Aditya in :gh:`78530`.)
calendar
--------
* Add enums :data:`~calendar.Month` and :data:`~calendar.Day`.
(Contributed by Prince Roshan in :gh:`103636`.)
csv csv
--- ---
@ -692,6 +698,9 @@ Deprecated
Python 3.14, when ``'data'`` filter will become the default. Python 3.14, when ``'data'`` filter will become the default.
See :ref:`tarfile-extraction-filter` for details. See :ref:`tarfile-extraction-filter` for details.
* ``calendar.January`` and ``calendar.February`` constants are deprecated and
replaced by :data:`calendar.Month.JANUARY` and :data:`calendar.Month.FEBRUARY`.
(Contributed by Prince Roshan in :gh:`103636`.)
Pending Removal in Python 3.13 Pending Removal in Python 3.13
------------------------------ ------------------------------

View File

@ -10,6 +10,7 @@ import datetime
from enum import IntEnum, global_enum from enum import IntEnum, global_enum
import locale as _locale import locale as _locale
from itertools import repeat from itertools import repeat
import warnings
__all__ = ["IllegalMonthError", "IllegalWeekdayError", "setfirstweekday", __all__ = ["IllegalMonthError", "IllegalWeekdayError", "setfirstweekday",
"firstweekday", "isleap", "leapdays", "weekday", "monthrange", "firstweekday", "isleap", "leapdays", "weekday", "monthrange",
@ -41,6 +42,18 @@ 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
def __getattr__(name):
if name in ('January', 'February'):
warnings.warn(f"The '{name}' attribute is deprecated, use '{name.upper()}' instead",
DeprecationWarning, stacklevel=2)
if name == 'January':
return 1
else:
return 2
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
# Constants for months # Constants for months
@global_enum @global_enum
class Month(IntEnum): class Month(IntEnum):

View File

@ -8,6 +8,7 @@ import locale
import sys import sys
import datetime import datetime
import os import os
import warnings
# From https://en.wikipedia.org/wiki/Leap_year_starting_on_Saturday # From https://en.wikipedia.org/wiki/Leap_year_starting_on_Saturday
result_0_02_text = """\ result_0_02_text = """\
@ -490,6 +491,14 @@ class OutputTestCase(unittest.TestCase):
self.assertEqual(out.getvalue().strip(), "1 2 3") self.assertEqual(out.getvalue().strip(), "1 2 3")
class CalendarTestCase(unittest.TestCase): class CalendarTestCase(unittest.TestCase):
def test_deprecation_warning(self):
with warnings.catch_warnings(record=True) as w:
calendar.January
self.assertEqual(len(w), 1)
self.assertEqual(w[0].category, DeprecationWarning)
self.assertIn("The 'January' attribute is deprecated, use 'JANUARY' instead", str(w[0].message))
def test_isleap(self): def test_isleap(self):
# Make sure that the return is right for a few years, and # Make sure that the return is right for a few years, and
# ensure that the return values are 1 or 0, not just true or # ensure that the return values are 1 or 0, not just true or

View File

@ -0,0 +1 @@
Module-level attributes ``January`` and ``February`` are deprecated from :mod:`calendar`.