2424"""
2525from __future__ import annotations
2626
27+ import datetime
2728import re
2829import warnings
29- from datetime import date
3030from importlib .metadata import PackageNotFoundError , version
3131
32+ from ._typed_dict import TypedDict
33+
3234__all__ = ("__version__" , "VersionInfo" , "version_info" )
3335
3436from typing import Literal , NamedTuple
5658 )
5759
5860
61+ class AdvancedVersionInfo (TypedDict ):
62+ serial : int
63+ build : int | None
64+ commit : str | None
65+ date : datetime .date | None
66+
67+
5968class VersionInfo (NamedTuple ):
6069 major : int
6170 minor : int
6271 micro : int
63- release_level : Literal ["alpha" , "beta" , "candidate" , "final" ]
64- serial : int
65- build : int | None = None
66- commit : str | None = None
67- date : date | None = None
72+ releaselevel : Literal ["alpha" , "beta" , "candidate" , "final" ]
73+
74+ # We can't set instance attributes on a NamedTuple, so we have to use a
75+ # global variable to store the advanced version info.
76+ @property
77+ def advanced (self ) -> AdvancedVersionInfo :
78+ return _advanced
79+
80+ @advanced .setter
81+ def advanced (self , value : object ) -> None :
82+ global _advanced
83+ _advanced = value
84+
85+ @property
86+ @deprecated ("releaselevel" , "2.4" )
87+ def release_level (self ) -> Literal ["alpha" , "beta" , "candidate" , "final" ]:
88+ return self .releaselevel
6889
6990 @property
70- @deprecated ("release_level" , "2.3" )
71- def releaselevel (self ) -> Literal ["alpha" , "beta" , "candidate" , "final" ]:
72- return self .release_level
91+ @deprecated ('.advanced["serial"]' , "2.4" )
92+ def serial (self ) -> int :
93+ return self .advanced ["serial" ]
94+
95+ @property
96+ @deprecated ('.advanced["build"]' , "2.4" )
97+ def build (self ) -> int | None :
98+ return self .advanced ["build" ]
99+
100+ @property
101+ @deprecated ('.advanced["commit"]' , "2.4" )
102+ def commit (self ) -> str | None :
103+ return self .advanced ["commit" ]
104+
105+ @property
106+ @deprecated ('.advanced["date"]' , "2.4" )
107+ def date (self ) -> datetime .date | None :
108+ return self .advanced ["date" ]
73109
74110
75111version_regex = re .compile (
@@ -97,7 +133,7 @@ def releaselevel(self) -> Literal["alpha", "beta", "candidate", "final"]:
97133 raise RuntimeError ("Invalid release level" )
98134
99135if (raw_date := raw_info ["date" ] or raw_info ["date1" ]) is not None :
100- date_info = date (
136+ date_info = datetime . date (
101137 int (raw_date [:4 ]),
102138 int (raw_date [4 :6 ]),
103139 int (raw_date [6 :]),
@@ -109,7 +145,10 @@ def releaselevel(self) -> Literal["alpha", "beta", "candidate", "final"]:
109145 major = int (raw_info ["major" ] or 0 ) or None ,
110146 minor = int (raw_info ["minor" ] or 0 ) or None ,
111147 micro = int (raw_info ["patch" ] or 0 ) or None ,
112- release_level = level_info ,
148+ releaselevel = level_info ,
149+ )
150+
151+ _advanced = AdvancedVersionInfo (
113152 serial = raw_info ["serial" ],
114153 build = int (raw_info ["build" ] or 0 ) or None ,
115154 commit = raw_info ["commit" ],
0 commit comments