/ scripts / get_version.py
get_version.py
 1  # Get current project version from Git tags or changelog.
 2  
 3  import re
 4  from contextlib import suppress
 5  from pathlib import Path
 6  
 7  from pdm.backend.hooks.version import (  # ty: ignore[unresolved-import]
 8      SCMVersion,
 9      Version,
10      default_version_formatter,
11      get_version_from_scm,
12  )
13  
14  _root = Path(__file__).parent.parent
15  _changelog = _root / "CHANGELOG.md"
16  _changelog_version_re = re.compile(r"^## \[(\d+\.\d+\.\d+)\].*$")
17  _default_scm_version = SCMVersion(Version("0.0.0"), None, False, None, None)  # noqa: FBT003
18  
19  
20  def get_version() -> str:
21      scm_version = get_version_from_scm(_root) or _default_scm_version
22      if scm_version.version <= Version("0.1"):  # Missing Git tags?
23          with suppress(OSError, StopIteration):  # noqa: SIM117
24              with _changelog.open("r", encoding="utf8") as file:
25                  match = next(filter(None, map(_changelog_version_re.match, file)))
26                  scm_version = scm_version._replace(version=Version(match.group(1)))
27      return default_version_formatter(scm_version)
28  
29  
30  if __name__ == "__main__":
31      print(get_version())