From 71325547aa26094ca456a679bdfed919220e96df Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Thu, 24 Feb 2022 14:10:39 -0800 Subject: cargo/manifest: Add a file with type definitions of the cargo manifest format Co-Authored-By: Thibault Saunier --- mesonbuild/cargo/manifest.py | 227 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 mesonbuild/cargo/manifest.py (limited to 'mesonbuild') diff --git a/mesonbuild/cargo/manifest.py b/mesonbuild/cargo/manifest.py new file mode 100644 index 0000000..e6192d0 --- /dev/null +++ b/mesonbuild/cargo/manifest.py @@ -0,0 +1,227 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright © 2022-2023 Intel Corporation + +"""Type definitions for cargo manifest files.""" + +from __future__ import annotations +import typing as T + +from typing_extensions import Literal, TypedDict, Required + +EDITION = Literal['2015', '2018', '2021'] +CRATE_TYPE = Literal['bin', 'lib', 'dylib', 'staticlib', 'cdylib', 'rlib', 'proc-macro'] + +Package = TypedDict( + 'Package', + { + '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, + 'autobins': bool, + 'autoexamples': bool, + 'autotests': bool, + 'autobenches': bool, + }, + total=False, +) +"""A description of the Package Dictionary.""" + +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 + autobins: bool + autoexamples: bool + autotests: bool + autobenches: bool + + +class Badge(TypedDict): + + """An entry in the badge section.""" + + status: Literal['actively-developed', 'passively-developed', 'as-is', 'experimental', 'deprecated', 'none'] + + +Dependency = TypedDict( + 'Dependency', + { + 'version': str, + 'registry': str, + 'git': str, + 'branch': str, + 'rev': str, + 'path': str, + 'optional': bool, + 'package': str, + 'default-features': bool, + 'features': T.List[str], + }, + total=False, +) +"""An entry in the *dependencies sections.""" + + +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] + + +DependencyV = T.Union[Dependency, str] +"""A Dependency entry, either a string or a Dependency Dict.""" + + +_BaseBuildTarget = TypedDict( + '_BaseBuildTarget', + { + 'path': str, + 'test': bool, + 'doctest': bool, + 'bench': bool, + 'doc': bool, + 'plugin': bool, + 'proc-macro': bool, + 'harness': bool, + 'edition': EDITION, + 'crate-type': T.List[CRATE_TYPE], + 'required-features': T.List[str], + }, + total=False, +) + + +class BuildTarget(_BaseBuildTarget, total=False): + + name: Required[str] + +class LibTarget(_BaseBuildTarget, total=False): + + name: 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: str + +class FixedLibTarget(_BaseFixedBuildTarget, total=False): + + name: Required[str] + proc_macro: bool + + +class Target(TypedDict): + + """Target entry in the Manifest File.""" + + dependencies: T.Dict[str, DependencyV] + + +class Workspace(TypedDict): + + """The representation of a workspace. + + In a vritual manifest the :attribute:`members` is always present, but in a + project manifest, an empty workspace may be provided, in which case the + workspace is implicitly filled in by values from the path based dependencies. + + the :attribute:`exclude` is always optional + """ + + members: T.List[str] + exclude: T.List[str] + + +Manifest = TypedDict( + 'Manifest', + { + 'package': Package, + 'badges': T.Dict[str, Badge], + 'dependencies': T.Dict[str, DependencyV], + 'dev-dependencies': T.Dict[str, DependencyV], + 'build-dependencies': T.Dict[str, DependencyV], + 'lib': LibTarget, + 'bin': T.List[BuildTarget], + 'test': T.List[BuildTarget], + 'bench': T.List[BuildTarget], + 'example': T.List[BuildTarget], + 'features': T.Dict[str, T.List[str]], + 'target': T.Dict[str, Target], + 'workspace': Workspace, + + # TODO: patch? + # TODO: replace? + }, + total=False, +) +"""The Cargo Manifest format.""" + + +class VirtualManifest(TypedDict): + + """The Representation of a virtual manifest. + + Cargo allows a root manifest that contains only a workspace, this is called + a virtual manifest. This doesn't really map 1:1 with any meson concept, + except perhaps the proposed "meta project". + """ + + workspace: Workspace -- cgit v1.1