24
24
"""
25
25
from __future__ import annotations
26
26
27
+ import datetime
27
28
import re
28
29
import warnings
29
- from datetime import date
30
30
from importlib .metadata import PackageNotFoundError , version
31
31
32
+ from ._typed_dict import TypedDict
33
+
32
34
__all__ = ("__version__" , "VersionInfo" , "version_info" )
33
35
34
36
from typing import Literal , NamedTuple
56
58
)
57
59
58
60
61
+ class AdvancedVersionInfo (TypedDict ):
62
+ serial : int
63
+ build : int | None
64
+ commit : str | None
65
+ date : datetime .date | None
66
+
67
+
59
68
class VersionInfo (NamedTuple ):
60
69
major : int
61
70
minor : int
62
71
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
68
89
69
90
@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" ]
73
109
74
110
75
111
version_regex = re .compile (
@@ -97,7 +133,7 @@ def releaselevel(self) -> Literal["alpha", "beta", "candidate", "final"]:
97
133
raise RuntimeError ("Invalid release level" )
98
134
99
135
if (raw_date := raw_info ["date" ] or raw_info ["date1" ]) is not None :
100
- date_info = date (
136
+ date_info = datetime . date (
101
137
int (raw_date [:4 ]),
102
138
int (raw_date [4 :6 ]),
103
139
int (raw_date [6 :]),
@@ -109,7 +145,10 @@ def releaselevel(self) -> Literal["alpha", "beta", "candidate", "final"]:
109
145
major = int (raw_info ["major" ] or 0 ) or None ,
110
146
minor = int (raw_info ["minor" ] or 0 ) or None ,
111
147
micro = int (raw_info ["patch" ] or 0 ) or None ,
112
- release_level = level_info ,
148
+ releaselevel = level_info ,
149
+ )
150
+
151
+ _advanced = AdvancedVersionInfo (
113
152
serial = raw_info ["serial" ],
114
153
build = int (raw_info ["build" ] or 0 ) or None ,
115
154
commit = raw_info ["commit" ],
0 commit comments