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
« prev ^ index » next coverage.py v7.16.0, created at 2026-11-03 13:31 +0000
1"""Harvest metadata from supported project files."""
3from __future__ import annotations
5import logging
6from pathlib import Path
7from typing import Any
8from xml.etree.ElementTree import ParseError as XMLParseError
10from ruamel.yaml import YAMLError
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
20logger = logging.getLogger("somesy")
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)
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