Coverage for src/somesy/harvest.py: 92%

25 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-04 11:35 +0000

1"""Harvest metadata from supported project files.""" 

2 

3from __future__ import annotations 

4 

5import logging 

6from pathlib import Path 

7from typing import Any 

8 

9from somesy.fortran.writer import Fortran 

10from somesy.julia.writer import Julia 

11from somesy.mkdocs.writer import MkDocs 

12from somesy.package_json.writer import PackageJSON 

13from somesy.pom_xml.writer import POM 

14from somesy.pyproject.writer import Pyproject 

15from somesy.rust.writer import Rust 

16 

17logger = logging.getLogger("somesy") 

18 

19_SOURCES = ( 

20 ("pyproject.toml", Pyproject), 

21 ("package.json", PackageJSON), 

22 ("Project.toml", Julia), 

23 ("fpm.toml", Fortran), 

24 ("Cargo.toml", Rust), 

25 ("pom.xml", POM), 

26 ("mkdocs.yml", MkDocs), 

27) 

28 

29 

30def harvest_sources(root: Path) -> list[tuple[Path, dict[str, Any]]]: 

31 """Read all supported non-generated metadata files under ``root``.""" 

32 sources = [] 

33 for filename, writer_cls in _SOURCES: 

34 path = root / filename 

35 if not path.is_file(): 

36 continue 

37 try: 

38 writer = writer_cls(path, pass_validation=True) 

39 sources.append((path, writer.harvest_metadata())) 

40 except (FileNotFoundError, KeyError, TypeError, ValueError) as error: 

41 logger.warning("Cannot harvest metadata from %s: %s", path, error) 

42 return sources