summaryrefslogtreecommitdiff
path: root/mesonbuild/cargo/interpreter.py
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-06-03 12:00:05 +0200
committerDylan Baker <dylan@pnwbakers.com>2025-08-01 07:55:49 -0700
commit824f6fccf35dc46f17cff9da0639d23614ccba64 (patch)
tree17d6d3a7af6742d166e2e1165a67b7410868c082 /mesonbuild/cargo/interpreter.py
parent939cfa6dd16743a296d772136cc338e2148ee7e5 (diff)
downloadmeson-824f6fccf35dc46f17cff9da0639d23614ccba64.tar.gz
cargo: move TypedDicts for Cargo.toml to "raw" module
Fix a few issues: * Cargo.lock's version is an int * Different BuildTargets have different types for the argument of from_raw Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'mesonbuild/cargo/interpreter.py')
-rw-r--r--mesonbuild/cargo/interpreter.py46
1 files changed, 24 insertions, 22 deletions
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py
index b6d0817cd..e3918ba7f 100644
--- a/mesonbuild/cargo/interpreter.py
+++ b/mesonbuild/cargo/interpreter.py
@@ -26,7 +26,7 @@ from ..wrap.wrap import PackageDefinition
if T.TYPE_CHECKING:
from typing_extensions import Protocol, Self
- from . import manifest
+ from . import manifest, raw
from .. import mparser
from ..environment import Environment
from ..interpreterbase import SubProject
@@ -40,6 +40,8 @@ if T.TYPE_CHECKING:
manifest.FixedDependency, manifest.FixedLibTarget,
manifest.FixedBuildTarget)
+_R = T.TypeVar('_R', bound='raw._BaseBuildTarget')
+
_EXTRA_KEYS_WARNING = (
"This may (unlikely) be an error in the cargo manifest, or may be a missing "
@@ -61,15 +63,15 @@ def fixup_meson_varname(name: str) -> str:
# Pylance can figure out that these do not, in fact, overlap, but mypy can't
@T.overload
-def _fixup_raw_mappings(d: manifest.BuildTarget) -> manifest.FixedBuildTarget: ... # type: ignore
+def _fixup_raw_mappings(d: raw.BuildTarget) -> manifest.FixedBuildTarget: ... # type: ignore
@T.overload
-def _fixup_raw_mappings(d: manifest.LibTarget) -> manifest.FixedLibTarget: ... # type: ignore
+def _fixup_raw_mappings(d: raw.LibTarget) -> manifest.FixedLibTarget: ... # type: ignore
@T.overload
-def _fixup_raw_mappings(d: manifest.Dependency) -> manifest.FixedDependency: ...
+def _fixup_raw_mappings(d: raw.Dependency) -> manifest.FixedDependency: ...
-def _fixup_raw_mappings(d: T.Union[manifest.BuildTarget, manifest.LibTarget, manifest.Dependency]
+def _fixup_raw_mappings(d: T.Union[raw.BuildTarget, raw.LibTarget, raw.Dependency]
) -> T.Union[manifest.FixedBuildTarget, manifest.FixedLibTarget,
manifest.FixedDependency]:
"""Fixup raw cargo mappings to ones more suitable for python to consume.
@@ -153,7 +155,7 @@ class Package:
self.api = _version_to_api(self.version)
@classmethod
- def from_raw(cls, raw: manifest.Package) -> Self:
+ def from_raw(cls, raw: raw.Package) -> Self:
pkg = T.cast('manifest.FixedPackage',
{fixup_meson_varname(k): v for k, v in raw.items()})
pkg = _handle_unknown_keys(pkg, cls, f'Package entry {pkg["name"]}')
@@ -233,7 +235,7 @@ class Dependency:
raise MesonException(f'Cannot determine minimum API version from {self.version}.')
@classmethod
- def from_raw(cls, name: str, raw: manifest.DependencyV) -> Dependency:
+ def from_raw(cls, name: str, raw: raw.DependencyV) -> Dependency:
"""Create a dependency from a raw cargo dictionary"""
if isinstance(raw, str):
return cls(name, version.convert(raw))
@@ -242,7 +244,7 @@ class Dependency:
@dataclasses.dataclass
-class BuildTarget:
+class BuildTarget(T.Generic[_R]):
name: str
crate_type: T.List[manifest.CRATE_TYPE] = dataclasses.field(default_factory=lambda: ['lib'])
@@ -270,13 +272,13 @@ class BuildTarget:
plugin: bool = False
@classmethod
- def from_raw(cls, raw: manifest.BuildTarget) -> Self:
+ def from_raw(cls, raw: raw.BuildTarget) -> Self:
name = raw.get('name', '<anonymous>')
build = _handle_unknown_keys(_fixup_raw_mappings(raw), cls, f'Binary entry {name}')
return cls(**build)
@dataclasses.dataclass
-class Library(BuildTarget):
+class Library(BuildTarget['raw.LibTarget']):
"""Representation of a Cargo Library Entry."""
@@ -288,20 +290,20 @@ class Library(BuildTarget):
doc_scrape_examples: bool = True
@classmethod
- def from_raw(cls, raw: manifest.LibTarget, fallback_name: str) -> Self: # type: ignore[override]
+ def from_raw(cls, raw: raw.LibTarget, fallback_name: str) -> Self: # type: ignore[override]
+ if 'name' not in raw:
+ raw['name'] = fallback_name
fixed = _fixup_raw_mappings(raw)
# We need to set the name field if it's not set manually, including if
# other fields are set in the lib section
- if 'name' not in fixed:
- fixed['name'] = fallback_name
fixed = _handle_unknown_keys(fixed, cls, f'Library entry {fixed["name"]}')
return cls(**fixed)
@dataclasses.dataclass
-class Binary(BuildTarget):
+class Binary(BuildTarget['raw.BuildTarget']):
"""Representation of a Cargo Bin Entry."""
@@ -309,7 +311,7 @@ class Binary(BuildTarget):
@dataclasses.dataclass
-class Test(BuildTarget):
+class Test(BuildTarget['raw.BuildTarget']):
"""Representation of a Cargo Test Entry."""
@@ -317,7 +319,7 @@ class Test(BuildTarget):
@dataclasses.dataclass
-class Benchmark(BuildTarget):
+class Benchmark(BuildTarget['raw.BuildTarget']):
"""Representation of a Cargo Benchmark Entry."""
@@ -325,7 +327,7 @@ class Benchmark(BuildTarget):
@dataclasses.dataclass
-class Example(BuildTarget):
+class Example(BuildTarget['raw.BuildTarget']):
"""Representation of a Cargo Example Entry."""
@@ -365,7 +367,7 @@ class Manifest:
self.system_dependencies = {k: SystemDependency.from_raw(k, v) for k, v in self.package.metadata.get('system-deps', {}).items()}
-def _convert_manifest(raw_manifest: manifest.Manifest, subdir: str, path: str = '') -> Manifest:
+def _convert_manifest(raw_manifest: raw.Manifest, subdir: str, path: str = '') -> Manifest:
return Manifest(
Package.from_raw(raw_manifest['package']),
{k: Dependency.from_raw(k, v) for k, v in raw_manifest.get('dependencies', {}).items()},
@@ -503,9 +505,9 @@ class Interpreter:
manifest_ = self.manifests.get(subdir)
if not manifest_:
filename = os.path.join(self.environment.source_dir, subdir, 'Cargo.toml')
- raw = load_toml(filename)
- if 'package' in raw:
- raw_manifest = T.cast('manifest.Manifest', raw)
+ toml = load_toml(filename)
+ if 'package' in toml:
+ raw_manifest = T.cast('raw.Manifest', toml)
manifest_ = _convert_manifest(raw_manifest, subdir)
self.manifests[subdir] = manifest_
else:
@@ -821,7 +823,7 @@ def load_wraps(source_dir: str, subproject_dir: str) -> T.List[PackageDefinition
filename = os.path.join(source_dir, 'Cargo.lock')
if os.path.exists(filename):
try:
- cargolock = T.cast('manifest.CargoLock', load_toml(filename))
+ cargolock = T.cast('raw.CargoLock', load_toml(filename))
except TomlImplementationMissing as e:
mlog.warning('Failed to load Cargo.lock:', str(e), fatal=False)
return wraps