|
31 | 31 |
|
32 | 32 | class _VersionInfo(NamedTuple):
|
33 | 33 | """Version information as a namedtuple"""
|
| 34 | + |
34 | 35 | major: int
|
35 | 36 | minor: int
|
36 | 37 | micro: int
|
37 | 38 | releaselevel: str = "final"
|
38 | 39 | serial: int = 0
|
39 | 40 |
|
| 41 | + @staticmethod |
| 42 | + def from_version(version: str) -> "_VersionInfo": |
| 43 | + pattern = r"(?P<major>\d+)\.(?P<minor>\d+)\.(?P<micro>\d+)((?P<prerelease>a|b|rc)(?P<serial>\d+))?" |
| 44 | + match = re.fullmatch(pattern, version, re.ASCII) |
| 45 | + fields = {k: v for k, v in match.groupdict().items() if v is not None} |
| 46 | + # Remove prerelease and convert it to releaselevel |
| 47 | + prerelease = fields.pop("prerelease", None) |
| 48 | + releaselevel = {"a": "alpha", "b": "beta", "rc": "candidate", None: "final"}[ |
| 49 | + prerelease |
| 50 | + ] |
| 51 | + version_fields = {k: int(v) for k, v in fields.items()} |
40 | 52 |
|
41 |
| -def _version_info(version: str) -> _VersionInfo: |
42 |
| - pattern = r"(?P<major>\d+)\.(?P<minor>\d+)\.(?P<micro>\d+)((?P<prerelease>a|b|rc)(?P<serial>\d+))?" |
43 |
| - match = re.fullmatch(pattern, version, re.ASCII) |
44 |
| - fields = {k: v for k, v in match.groupdict().items() if v is not None} |
45 |
| - # Remove prerelease and convert it to releaselevel |
46 |
| - prerelease = fields.pop("prerelease", None) |
47 |
| - releaselevel = {"a": "alpha", "b": "beta", "rc": "candidate", None: "final"}[prerelease] |
48 |
| - version_fields = {k: int(v) for k, v in fields.items()} |
49 |
| - |
50 |
| - return _VersionInfo(releaselevel=releaselevel, **version_fields) |
| 53 | + return _VersionInfo(releaselevel=releaselevel, **version_fields) |
51 | 54 |
|
52 | 55 |
|
53 |
| -version_info = _version_info(version) |
| 56 | +version_info = _VersionInfo.from_version(version) |
0 commit comments