@@ -35,6 +35,7 @@ class PythonVersionStatus(enum.Enum):
3535class VersionInfo (NamedTuple ):
3636 """Hold release and support date information for a Python version."""
3737
38+ version : str
3839 python_beta : Optional [datetime .date ]
3940 python_start : datetime .date
4041 python_eol : datetime .date
@@ -44,55 +45,67 @@ class VersionInfo(NamedTuple):
4445 dep_unpatchable_cve : Optional [datetime .date ] = None # unused
4546
4647
47- PYTHON_VERSION_INFO : Dict [ Tuple [ int , int ], VersionInfo ] = {
48+ PYTHON_VERSIONS : list [ VersionInfo ] = [
4849 # Refer to https://devguide.python.org/versions/ and the PEPs linked therefrom.
49- (3 , 7 ): VersionInfo (
50+ VersionInfo (
51+ version = "3.7" ,
5052 python_beta = None ,
5153 python_start = datetime .date (2018 , 6 , 27 ),
5254 python_eol = datetime .date (2023 , 6 , 27 ),
5355 ),
54- (3 , 8 ): VersionInfo (
56+ VersionInfo (
57+ version = "3.8" ,
5558 python_beta = None ,
5659 python_start = datetime .date (2019 , 10 , 14 ),
5760 python_eol = datetime .date (2024 , 10 , 7 ),
5861 ),
59- (3 , 9 ): VersionInfo (
62+ VersionInfo (
63+ version = "3.9" ,
6064 python_beta = datetime .date (2020 , 5 , 18 ),
6165 python_start = datetime .date (2020 , 10 , 5 ),
62- python_eol = datetime .date (2025 , 10 , 5 ), # TODO: specify day when announced
63- gapic_end = datetime .date (2025 , 10 , 5 )
64- + datetime .timedelta (days = 90 ), # TODO: specify day when announced
66+ python_eol = datetime .date (2025 , 10 , 5 ),
67+ gapic_end = datetime .date (2025 , 10 , 5 ) + datetime .timedelta (days = 90 ),
6568 ),
66- (3 , 10 ): VersionInfo (
69+ VersionInfo (
70+ version = "3.10" ,
6771 python_beta = datetime .date (2021 , 5 , 3 ),
6872 python_start = datetime .date (2021 , 10 , 4 ),
6973 python_eol = datetime .date (2026 , 10 , 4 ), # TODO: specify day when announced
7074 ),
71- (3 , 11 ): VersionInfo (
75+ VersionInfo (
76+ version = "3.11" ,
7277 python_beta = datetime .date (2022 , 5 , 8 ),
7378 python_start = datetime .date (2022 , 10 , 24 ),
7479 python_eol = datetime .date (2027 , 10 , 24 ), # TODO: specify day when announced
7580 ),
76- (3 , 12 ): VersionInfo (
81+ VersionInfo (
82+ version = "3.12" ,
7783 python_beta = datetime .date (2023 , 5 , 22 ),
7884 python_start = datetime .date (2023 , 10 , 2 ),
7985 python_eol = datetime .date (2028 , 10 , 2 ), # TODO: specify day when announced
8086 ),
81- (3 , 13 ): VersionInfo (
87+ VersionInfo (
88+ version = "3.13" ,
8289 python_beta = datetime .date (2024 , 5 , 8 ),
8390 python_start = datetime .date (2024 , 10 , 7 ),
8491 python_eol = datetime .date (2029 , 10 , 7 ), # TODO: specify day when announced
8592 ),
86- (3 , 14 ): VersionInfo (
93+ VersionInfo (
94+ version = "3.14" ,
8795 python_beta = datetime .date (2025 , 5 , 7 ),
8896 python_start = datetime .date (2025 , 10 , 7 ),
8997 python_eol = datetime .date (2030 , 10 , 7 ), # TODO: specify day when announced
9098 ),
99+ ]
100+
101+ PYTHON_VERSION_INFO : Dict [Tuple [int , int ], VersionInfo ] = {
102+ tuple (map (int , info .version .split ("." ))): info for info in PYTHON_VERSIONS
91103}
92104
105+
93106LOWEST_TRACKED_VERSION = min (PYTHON_VERSION_INFO .keys ())
94- FAKE_PAST_DATE = datetime .date ( 1970 , 1 , 1 )
95- FAKE_FUTURE_DATE = datetime .date ( 9000 , 1 , 1 )
107+ FAKE_PAST_DATE = datetime .date . min + datetime . timedelta ( days = 900 )
108+ FAKE_FUTURE_DATE = datetime .date . max - datetime . timedelta ( days = 900 )
96109DEPRECATION_WARNING_PERIOD = datetime .timedelta (days = 365 )
97110EOL_GRACE_PERIOD = datetime .timedelta (weeks = 1 )
98111
@@ -164,12 +177,14 @@ def check_python_version(
164177 if not version_info :
165178 if version_tuple < LOWEST_TRACKED_VERSION :
166179 version_info = VersionInfo (
180+ version = "0.0" ,
167181 python_beta = FAKE_PAST_DATE ,
168182 python_start = FAKE_PAST_DATE ,
169183 python_eol = FAKE_PAST_DATE ,
170184 )
171185 else :
172186 version_info = VersionInfo (
187+ version = "999.0" ,
173188 python_beta = FAKE_FUTURE_DATE ,
174189 python_start = FAKE_FUTURE_DATE ,
175190 python_eol = FAKE_FUTURE_DATE ,
0 commit comments