Coverage for src / project_meta / project_info_pkg.py: 0%

42 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2025-12-11 21:45 +0000

1"""Project information based on the <project>.egg-info/PKG-INFO.""" 

2from __future__ import annotations 

3 

4from importlib import metadata 

5from typing import override 

6 

7from project_meta.project_info import _ProjectInfoBase, _ProjectKey 

8 

9 

10class ProjectInfoPkg(_ProjectInfoBase): 

11 """Project information based on the <project>.egg-info/PKG-INFO. 

12 

13 To access most of the information, the <project>.egg-info/PKG-INFO must be generated 

14 e.g. by installing project package via pip. 

15 """ 

16 

17 def __init__(self) -> None: 

18 """Initialize the project information.""" 

19 super().__init__() 

20 self.project_metadata = None 

21 

22 dists = metadata.packages_distributions().get(__package__) 

23 if dists: 

24 self.project_name = dists[0] 

25 self.version = metadata.version(self.project_name) 

26 self.project_metadata = metadata.metadata(self.project_name) 

27 

28 @override 

29 def _get_item_impl(self, project_key: _ProjectKey) -> str: 

30 if not self.project_metadata: 

31 raise ValueError("PKG-INFO was not found") 

32 

33 match project_key: 

34 case _ProjectKey.NAME: 

35 return self.project_name 

36 case _ProjectKey.VERSION: 

37 return self.version 

38 case _ProjectKey.DESCRIPTION: 

39 return self._get_pkg("Summary") 

40 case _ProjectKey.AUTHOR: 

41 return self._get_pkg("Author") 

42 case _ProjectKey.HOMEPAGE_URL: 

43 try: 

44 # get homepage URL from Project-URL: homepage, https://... 

45 urls = self._get_pkg("Project-URL") 

46 url_dict = {k.strip(): v.strip() for k, v in (item.split(",") for item in urls.splitlines())} 

47 return url_dict["homepage"] 

48 except (ValueError, KeyError): 

49 return self._get_pkg("Home-page") 

50 case _: 

51 raise ValueError(f"Unknown project key: {project_key}") 

52 

53 def _get_pkg(self, name: str) -> str: 

54 if not self.project_metadata: 

55 raise ValueError("PKG-INFO was not found") 

56 

57 value = self.project_metadata.get(name) 

58 if not value: 

59 raise ValueError(f"Project key: {name} was not found in PKG-INFO") 

60 return value