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

27 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-11-03 13:31 +0000

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

2 

3from __future__ import annotations 

4 

5import logging 

6from pathlib import Path 

7from typing import Any 

8from xml.etree.ElementTree import ParseError as XMLParseError 

9 

10from ruamel.yaml import YAMLError 

11 

12from somesy.fortran.writer import Fortran 

13from somesy.julia.writer import Julia 

14from somesy.mkdocs.writer import MkDocs 

15from somesy.package_json.writer import PackageJSON 

16from somesy.pom_xml.writer import POM 

17from somesy.pyproject.writer import Pyproject 

18from somesy.rust.writer import Rust 

19 

20logger = logging.getLogger("somesy") 

21 

22_SOURCES = ( 

23 ("pyproject.toml", Pyproject), 

24 ("package.json", PackageJSON), 

25 ("Project.toml", Julia), 

26 ("fpm.toml", Fortran), 

27 ("Cargo.toml", Rust), 

28 ("pom.xml", POM), 

29 ("mkdocs.yml", MkDocs), 

30) 

31 

32 

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

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

35 sources = [] 

36 for filename, writer_cls in _SOURCES: 

37 path = root / filename 

38 if not path.is_file(): 

39 continue 

40 try: 

41 writer = writer_cls(path, pass_validation=True) 

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

43 except ( 

44 FileNotFoundError, 

45 KeyError, 

46 TypeError, 

47 ValueError, 

48 XMLParseError, 

49 YAMLError, 

50 ) as error: 

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

52 return sources