summaryrefslogtreecommitdiff
path: root/mesonbuild/cargo/interpreter.py
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2024-10-28 13:40:02 -0700
committerEli Schwartz <eschwartz93@gmail.com>2024-11-05 17:41:38 -0500
commit909b04d5b1072f0d6421dbd2d420fa879ab80b36 (patch)
tree16811741262514c5ef5bebba2f7f32ce774b75a6 /mesonbuild/cargo/interpreter.py
parent1751c300b8c4b26c1b60b03787ee33e14eb04d45 (diff)
downloadmeson-909b04d5b1072f0d6421dbd2d420fa879ab80b36.tar.gz
cargo/interpreter: use alternate initializers for all manifest types
This allows us to move a bit of the validation and fixing into these classes
Diffstat (limited to 'mesonbuild/cargo/interpreter.py')
-rw-r--r--mesonbuild/cargo/interpreter.py45
1 files changed, 29 insertions, 16 deletions
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py
index 99dd3f066..6c0921224 100644
--- a/mesonbuild/cargo/interpreter.py
+++ b/mesonbuild/cargo/interpreter.py
@@ -28,6 +28,8 @@ from ..wrap.wrap import PackageDefinition
if T.TYPE_CHECKING:
from types import ModuleType
+ from typing_extensions import Self
+
from . import manifest
from .. import mparser
from ..environment import Environment
@@ -154,6 +156,12 @@ class Package:
def __post_init__(self) -> None:
self.api = _version_to_api(self.version)
+ @classmethod
+ def from_raw(cls, raw: manifest.Package) -> Self:
+ pkg = T.cast('manifest.FixedPackage',
+ {fixup_meson_varname(k): v for k, v in raw.items()})
+ return cls(**pkg)
+
@dataclasses.dataclass
class SystemDependency:
@@ -263,6 +271,10 @@ class BuildTarget:
required_features: T.List[str] = dataclasses.field(default_factory=list)
plugin: bool = False
+ @classmethod
+ def from_raw(cls, raw: manifest.BuildTarget) -> Self:
+ build = _fixup_raw_mappings(raw)
+ return cls(**build)
@dataclasses.dataclass
class Library(BuildTarget):
@@ -276,6 +288,17 @@ class Library(BuildTarget):
crate_type: T.List[manifest.CRATE_TYPE] = dataclasses.field(default_factory=lambda: ['lib'])
doc_scrape_examples: bool = True
+ @classmethod
+ def from_raw(cls, raw: manifest.LibTarget, fallback_name: str) -> Self:
+ 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
+
+ return cls(**fixed)
+
@dataclasses.dataclass
class Binary(BuildTarget):
@@ -343,26 +366,16 @@ class Manifest:
def _convert_manifest(raw_manifest: manifest.Manifest, subdir: str, path: str = '') -> Manifest:
- # This cast is a bit of a hack to deal with proc-macro
- lib = _fixup_raw_mappings(raw_manifest.get('lib', {}))
-
- # We need to set the name field if it's not set manually,
- # including if other fields are set in the lib section
- lib.setdefault('name', raw_manifest['package']['name'])
-
- pkg = T.cast('manifest.FixedPackage',
- {fixup_meson_varname(k): v for k, v in raw_manifest['package'].items()})
-
return Manifest(
- Package(**pkg),
+ Package.from_raw(raw_manifest['package']),
{k: Dependency.from_raw(k, v) for k, v in raw_manifest.get('dependencies', {}).items()},
{k: Dependency.from_raw(k, v) for k, v in raw_manifest.get('dev-dependencies', {}).items()},
{k: Dependency.from_raw(k, v) for k, v in raw_manifest.get('build-dependencies', {}).items()},
- Library(**lib),
- [Binary(**_fixup_raw_mappings(b)) for b in raw_manifest.get('bin', {})],
- [Test(**_fixup_raw_mappings(b)) for b in raw_manifest.get('test', {})],
- [Benchmark(**_fixup_raw_mappings(b)) for b in raw_manifest.get('bench', {})],
- [Example(**_fixup_raw_mappings(b)) for b in raw_manifest.get('example', {})],
+ Library.from_raw(raw_manifest.get('lib', {}), raw_manifest['package']['name']),
+ [Binary.from_raw(b) for b in raw_manifest.get('bin', {})],
+ [Test.from_raw(b) for b in raw_manifest.get('test', {})],
+ [Benchmark.from_raw(b) for b in raw_manifest.get('bench', {})],
+ [Example.from_raw(b) for b in raw_manifest.get('example', {})],
raw_manifest.get('features', {}),
{k: {k2: Dependency.from_raw(k2, v2) for k2, v2 in v.get('dependencies', {}).items()}
for k, v in raw_manifest.get('target', {}).items()},