Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/websockets/version.py: 100%
5 statements
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:20 +0000
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:20 +0000
1from __future__ import annotations
3import importlib.metadata
6__all__ = ["tag", "version", "commit"]
9# ========= =========== ===================
10# release development
11# ========= =========== ===================
12# tag X.Y X.Y (upcoming)
13# version X.Y X.Y.dev1+g5678cde
14# commit X.Y 5678cde
15# ========= =========== ===================
18# When tagging a release, set `released = True`.
19# After tagging a release, set `released = False` and increment `tag`.
21released = False
23tag = version = commit = "12.0"
26if not released: # pragma: no cover
27 import pathlib
28 import re
29 import subprocess
31 def get_version(tag: str) -> str:
32 # Since setup.py executes the contents of src/websockets/version.py,
33 # __file__ can point to either of these two files.
34 file_path = pathlib.Path(__file__)
35 root_dir = file_path.parents[0 if file_path.name == "setup.py" else 2]
37 # Read version from git if available. This prevents reading stale
38 # information from src/websockets.egg-info after building a sdist.
39 try:
40 description = subprocess.run(
41 ["git", "describe", "--dirty", "--tags", "--long"],
42 capture_output=True,
43 cwd=root_dir,
44 timeout=1,
45 check=True,
46 text=True,
47 ).stdout.strip()
48 # subprocess.run raises FileNotFoundError if git isn't on $PATH.
49 except (
50 FileNotFoundError,
51 subprocess.CalledProcessError,
52 subprocess.TimeoutExpired,
53 ):
54 pass
55 else:
56 description_re = r"[0-9.]+-([0-9]+)-(g[0-9a-f]{7,}(?:-dirty)?)"
57 match = re.fullmatch(description_re, description)
58 assert match is not None
59 distance, remainder = match.groups()
60 remainder = remainder.replace("-", ".") # required by PEP 440
61 return f"{tag}.dev{distance}+{remainder}"
63 # Read version from package metadata if it is installed.
64 try:
65 return importlib.metadata.version("websockets")
66 except ImportError:
67 pass
69 # Avoid crashing if the development version cannot be determined.
70 return f"{tag}.dev0+gunknown"
72 version = get_version(tag)
74 def get_commit(tag: str, version: str) -> str:
75 # Extract commit from version, falling back to tag if not available.
76 version_re = r"[0-9.]+\.dev[0-9]+\+g([0-9a-f]{7,}|unknown)(?:\.dirty)?"
77 match = re.fullmatch(version_re, version)
78 assert match is not None
79 (commit,) = match.groups()
80 return tag if commit == "unknown" else commit
82 commit = get_commit(tag, version)