Co-Authored-By: Thibault Saunier <tsaunier@igalia.com>pull/11733/head
parent
d28d4ac4ed
commit
71325547aa
1 changed files with 227 additions and 0 deletions
@ -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 |
Loading…
Reference in new issue