Source code for ivpm_build.config

"""Parser for the [tool.ivpm-build] section of pyproject.toml."""
from __future__ import annotations

import os
from dataclasses import dataclass, field
from typing import List

try:
    import tomllib  # Python >= 3.11
except ImportError:
    try:
        import tomli as tomllib  # type: ignore[no-redef]
    except ImportError as exc:
        raise ImportError(
            "tomli is required on Python < 3.11: pip install tomli"
        ) from exc


[docs] @dataclass class ExtraDataSpec: pkg: str src: str dst: str
[docs] @dataclass class ExtNameMapEntry: module: str name: str
[docs] @dataclass class IvpmBuildConfig: cmake: bool = False ivpm_dep_pkgs: List[str] = field(default_factory=list) extra_data: List[ExtraDataSpec] = field(default_factory=list) ext_name_map: List[ExtNameMapEntry] = field(default_factory=list)
[docs] def load_config(pyproject_path: str = "pyproject.toml") -> IvpmBuildConfig: """Parse [tool.ivpm-build] section from *pyproject_path*. Returns a default :class:`IvpmBuildConfig` if the file does not exist or if the section is absent. Raises :class:`ValueError` on malformed TOML. """ if not os.path.isfile(pyproject_path): return IvpmBuildConfig() try: with open(pyproject_path, "rb") as fh: data = tomllib.load(fh) except Exception as exc: raise ValueError("Failed to parse %s: %s" % (pyproject_path, exc)) from exc section = data.get("tool", {}).get("ivpm-build", {}) if not section: return IvpmBuildConfig() cmake = bool(section.get("cmake", False)) ivpm_dep_pkgs = list(section.get("ivpm-dep-pkgs", [])) extra_data = [ ExtraDataSpec( pkg=entry["pkg"], src=entry["src"], dst=entry["dst"], ) for entry in section.get("extra-data", []) ] ext_name_map = [ ExtNameMapEntry( module=entry["module"], name=entry["name"], ) for entry in section.get("ext-name-map", []) ] return IvpmBuildConfig( cmake=cmake, ivpm_dep_pkgs=ivpm_dep_pkgs, extra_data=extra_data, ext_name_map=ext_name_map, )