summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-06-03 23:28:08 +0200
committerDylan Baker <dylan@pnwbakers.com>2025-08-01 07:55:49 -0700
commit09e547fcf289463c5163d2b0fe17a2e2ddf92a33 (patch)
tree11c1ab2d7de4d1b41514b0ea75db960033325107
parente88ab40b1cb9b77aa2f0d89fee860f2e7ba402fc (diff)
downloadmeson-09e547fcf289463c5163d2b0fe17a2e2ddf92a33.tar.gz
cargo: remove Fixed* dictionaries
Create the dataclasses directly from the raw dictionaries, without an intermediate step. Extracted from a patch by Xavier Classens. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--mesonbuild/cargo/interpreter.py32
-rw-r--r--mesonbuild/cargo/manifest.py74
2 files changed, 7 insertions, 99 deletions
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py
index 8805980a0..9699d1d2a 100644
--- a/mesonbuild/cargo/interpreter.py
+++ b/mesonbuild/cargo/interpreter.py
@@ -36,10 +36,6 @@ if T.TYPE_CHECKING:
class DataclassInstance(Protocol):
__dataclass_fields__: T.ClassVar[dict[str, dataclasses.Field[T.Any]]]
- _UnknownKeysT = T.TypeVar('_UnknownKeysT', manifest.FixedPackage,
- manifest.FixedDependency, manifest.FixedLibTarget,
- manifest.FixedBuildTarget)
-
_R = T.TypeVar('_R', bound='raw._BaseBuildTarget')
@@ -61,19 +57,7 @@ def fixup_meson_varname(name: str) -> str:
return name.replace('-', '_')
-# Pylance can figure out that these do not, in fact, overlap, but mypy can't
-@T.overload
-def _fixup_raw_mappings(d: raw.BuildTarget) -> manifest.FixedBuildTarget: ... # type: ignore
-
-@T.overload
-def _fixup_raw_mappings(d: raw.LibTarget) -> manifest.FixedLibTarget: ... # type: ignore
-
-@T.overload
-def _fixup_raw_mappings(d: raw.Dependency) -> manifest.FixedDependency: ...
-
-def _fixup_raw_mappings(d: T.Union[raw.BuildTarget, raw.LibTarget, raw.Dependency]
- ) -> T.Union[manifest.FixedBuildTarget, manifest.FixedLibTarget,
- manifest.FixedDependency]:
+def _fixup_raw_mappings(d: T.Mapping[str, T.Any], convert_version: bool = True) -> T.MutableMapping[str, T.Any]:
"""Fixup raw cargo mappings to ones more suitable for python to consume.
This does the following:
@@ -86,14 +70,14 @@ def _fixup_raw_mappings(d: T.Union[raw.BuildTarget, raw.LibTarget, raw.Dependenc
:return: the fixed string
"""
raw = {fixup_meson_varname(k): v for k, v in d.items()}
- if 'version' in raw:
+ if convert_version and 'version' in raw:
assert isinstance(raw['version'], str), 'for mypy'
raw['version'] = version.convert(raw['version'])
- return T.cast('T.Union[manifest.FixedBuildTarget, manifest.FixedLibTarget, manifest.FixedDependency]', raw)
+ return raw
-def _handle_unknown_keys(data: _UnknownKeysT, cls: T.Union[DataclassInstance, T.Type[DataclassInstance]],
- msg: str) -> _UnknownKeysT:
+def _handle_unknown_keys(data: T.MutableMapping[str, T.Any], cls: T.Union[DataclassInstance, T.Type[DataclassInstance]],
+ msg: str) -> T.MutableMapping[str, T.Any]:
"""Remove and warn on keys that are coming from cargo, but are unknown to
our representations.
@@ -111,8 +95,7 @@ def _handle_unknown_keys(data: _UnknownKeysT, cls: T.Union[DataclassInstance, T.
mlog.warning(msg, 'has unexpected keys', '"{}".'.format(', '.join(sorted(unexpected))),
_EXTRA_KEYS_WARNING)
for k in unexpected:
- # Mypy and Pyright can't prove that this is okay
- del data[k] # type: ignore[misc]
+ del data[k]
return data
@@ -156,8 +139,7 @@ class Package:
@classmethod
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 = _fixup_raw_mappings(raw, convert_version=False)
pkg = _handle_unknown_keys(pkg, cls, f'Package entry {pkg["name"]}')
return cls(**pkg)
diff --git a/mesonbuild/cargo/manifest.py b/mesonbuild/cargo/manifest.py
index 753979608..6f9f77c2f 100644
--- a/mesonbuild/cargo/manifest.py
+++ b/mesonbuild/cargo/manifest.py
@@ -4,77 +4,3 @@
"""Type definitions for cargo manifest files."""
from __future__ import annotations
-import typing as T
-
-from typing_extensions import TypedDict, Required
-
-from .raw import EDITION, CRATE_TYPE
-
-class FixedPackage(TypedDict, total=False):
-
- """A description of the Package Dictionary, fixed up."""
-
- name: Required[str]
- version: Required[str]
- authors: T.List[str]
- edition: EDITION
- rust_version: str
- description: str
- readme: str
- license: str
- license_file: str
- keywords: T.List[str]
- categories: T.List[str]
- workspace: str
- build: str
- links: str
- include: T.List[str]
- exclude: T.List[str]
- publish: bool
- metadata: T.Dict[str, T.Dict[str, str]]
- default_run: str
- autolib: bool
- autobins: bool
- autoexamples: bool
- autotests: bool
- autobenches: bool
-
-
-class FixedDependency(TypedDict, total=False):
-
- """An entry in the *dependencies sections, fixed up."""
-
- version: T.List[str]
- registry: str
- git: str
- branch: str
- rev: str
- path: str
- optional: bool
- package: str
- default_features: bool
- features: T.List[str]
-
-
-class _BaseFixedBuildTarget(TypedDict, total=False):
- path: str
- test: bool
- doctest: bool
- bench: bool
- doc: bool
- plugin: bool
- harness: bool
- edition: EDITION
- crate_type: T.List[CRATE_TYPE]
- required_features: T.List[str]
-
-
-class FixedBuildTarget(_BaseFixedBuildTarget, total=False):
-
- name: Required[str]
-
-
-class FixedLibTarget(_BaseFixedBuildTarget, total=False):
-
- name: str
- proc_macro: bool