1
0

version.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import re
  2. from typing import NamedTuple
  3. __all__ = ["version", "version_info", "version_js", "version_info_js"]
  4. version = "3.2.3"
  5. version_js = "16.6.0"
  6. _re_version = re.compile(r"(\d+)\.(\d+)\.(\d+)(\D*)(\d*)")
  7. class VersionInfo(NamedTuple):
  8. major: int
  9. minor: int
  10. micro: int
  11. releaselevel: str
  12. serial: int
  13. @classmethod
  14. def from_str(cls, v: str) -> "VersionInfo":
  15. groups = _re_version.match(v).groups() # type: ignore
  16. major, minor, micro = map(int, groups[:3])
  17. level = (groups[3] or "")[:1]
  18. if level == "a":
  19. level = "alpha"
  20. elif level == "b":
  21. level = "beta"
  22. elif level in ("c", "r"):
  23. level = "candidate"
  24. else:
  25. level = "final"
  26. serial = groups[4]
  27. serial = int(serial) if serial else 0
  28. return cls(major, minor, micro, level, serial)
  29. def __str__(self) -> str:
  30. v = f"{self.major}.{self.minor}.{self.micro}"
  31. level = self.releaselevel
  32. if level and level != "final":
  33. level = level[:1]
  34. if level == "c":
  35. level = "rc"
  36. v = f"{v}{level}{self.serial}"
  37. return v
  38. version_info = VersionInfo.from_str(version)
  39. version_info_js = VersionInfo.from_str(version_js)