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

1from __future__ import annotations 

2 

3import importlib.metadata 

4 

5 

6__all__ = ["tag", "version", "commit"] 

7 

8 

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# ========= =========== =================== 

16 

17 

18# When tagging a release, set `released = True`. 

19# After tagging a release, set `released = False` and increment `tag`. 

20 

21released = False 

22 

23tag = version = commit = "12.0" 

24 

25 

26if not released: # pragma: no cover 

27 import pathlib 

28 import re 

29 import subprocess 

30 

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] 

36 

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}" 

62 

63 # Read version from package metadata if it is installed. 

64 try: 

65 return importlib.metadata.version("websockets") 

66 except ImportError: 

67 pass 

68 

69 # Avoid crashing if the development version cannot be determined. 

70 return f"{tag}.dev0+gunknown" 

71 

72 version = get_version(tag) 

73 

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 

81 

82 commit = get_commit(tag, version)