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
« 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
4from importlib import metadata
5from typing import override
7from project_meta.project_info import _ProjectInfoBase, _ProjectKey
10class ProjectInfoPkg(_ProjectInfoBase):
11 """Project information based on the <project>.egg-info/PKG-INFO.
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 """
17 def __init__(self) -> None:
18 """Initialize the project information."""
19 super().__init__()
20 self.project_metadata = None
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)
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")
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}")
53 def _get_pkg(self, name: str) -> str:
54 if not self.project_metadata:
55 raise ValueError("PKG-INFO was not found")
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