- Notifications
You must be signed in to change notification settings - Fork 31.7k
/
Copy pathpatchlevel.py
81 lines (66 loc) · 2.47 KB
/
patchlevel.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
"""Extract version information from Include/patchlevel.h."""
importre
importsys
frompathlibimportPath
fromtypingimportLiteral, NamedTuple
CPYTHON_ROOT=Path(
__file__, # cpython/Doc/tools/extensions/patchlevel.py
"..", # cpython/Doc/tools/extensions
"..", # cpython/Doc/tools
"..", # cpython/Doc
"..", # cpython
).resolve()
PATCHLEVEL_H=CPYTHON_ROOT/"Include"/"patchlevel.h"
RELEASE_LEVELS= {
"PY_RELEASE_LEVEL_ALPHA": "alpha",
"PY_RELEASE_LEVEL_BETA": "beta",
"PY_RELEASE_LEVEL_GAMMA": "candidate",
"PY_RELEASE_LEVEL_FINAL": "final",
}
classversion_info(NamedTuple): # noqa: N801
major: int#: Major release number
minor: int#: Minor release number
micro: int#: Patch release number
releaselevel: Literal["alpha", "beta", "candidate", "final"]
serial: int#: Serial release number
defget_header_version_info() ->version_info:
# Capture PY_ prefixed #defines.
pat=re.compile(r"\s*#define\s+(PY_\w*)\s+(\w+)", re.ASCII)
defines= {}
patchlevel_h=PATCHLEVEL_H.read_text(encoding="utf-8")
forlineinpatchlevel_h.splitlines():
if (m:=pat.match(line)) isnotNone:
name, value=m.groups()
defines[name] =value
returnversion_info(
major=int(defines["PY_MAJOR_VERSION"]),
minor=int(defines["PY_MINOR_VERSION"]),
micro=int(defines["PY_MICRO_VERSION"]),
releaselevel=RELEASE_LEVELS[defines["PY_RELEASE_LEVEL"]],
serial=int(defines["PY_RELEASE_SERIAL"]),
)
defformat_version_info(info: version_info) ->tuple[str, str]:
version=f"{info.major}.{info.minor}"
release=f"{info.major}.{info.minor}.{info.micro}"
ifinfo.releaselevel!="final":
suffix= {"alpha": "a", "beta": "b", "candidate": "rc"}
release+=f"{suffix[info.releaselevel]}{info.serial}"
returnversion, release
defget_version_info():
try:
info=get_header_version_info()
returnformat_version_info(info)
exceptOSError:
version, release=format_version_info(sys.version_info)
print(
f"Failed to get version info from Include/patchlevel.h, "
f"using version of this interpreter ({release}).",
file=sys.stderr,
)
returnversion, release
if__name__=="__main__":
short_ver, full_ver=format_version_info(get_header_version_info())
ifsys.argv[1:2] == ["--short"]:
print(short_ver)
else:
print(full_ver)