diff options
Diffstat (limited to 'src/debputy/manifest_parser/mapper_code.py')
-rw-r--r-- | src/debputy/manifest_parser/mapper_code.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/debputy/manifest_parser/mapper_code.py b/src/debputy/manifest_parser/mapper_code.py new file mode 100644 index 0000000..d7a08c3 --- /dev/null +++ b/src/debputy/manifest_parser/mapper_code.py @@ -0,0 +1,77 @@ +from typing import ( + TypeVar, + Optional, + Union, + List, + Callable, +) + +from debputy.manifest_parser.exceptions import ManifestTypeException +from debputy.manifest_parser.parser_data import ParserContextData +from debputy.manifest_parser.util import AttributePath +from debputy.packages import BinaryPackage +from debputy.util import assume_not_none + +S = TypeVar("S") +T = TypeVar("T") + + +def type_mapper_str2package( + raw_package_name: str, + ap: AttributePath, + opc: Optional[ParserContextData], +) -> BinaryPackage: + pc = assume_not_none(opc) + if "{{" in raw_package_name: + resolved_package_name = pc.substitution.substitute(raw_package_name, ap.path) + else: + resolved_package_name = raw_package_name + + package_name_in_message = raw_package_name + if resolved_package_name != raw_package_name: + package_name_in_message = f'"{resolved_package_name}" ["{raw_package_name}"]' + + if not pc.is_known_package(resolved_package_name): + package_names = ", ".join(pc.binary_packages) + raise ManifestTypeException( + f'The value {package_name_in_message} (from "{ap.path}") does not reference a package declared in' + f" debian/control. Valid options are: {package_names}" + ) + package_data = pc.binary_package_data(resolved_package_name) + if package_data.is_auto_generated_package: + package_names = ", ".join(pc.binary_packages) + raise ManifestTypeException( + f'The package name {package_name_in_message} (from "{ap.path}") references an auto-generated package.' + " However, auto-generated packages are now permitted here. Valid options are:" + f" {package_names}" + ) + return package_data.binary_package + + +def wrap_into_list( + x: T, + _ap: AttributePath, + _pc: Optional["ParserContextData"], +) -> List[T]: + return [x] + + +def normalize_into_list( + x: Union[T, List[T]], + _ap: AttributePath, + _pc: Optional["ParserContextData"], +) -> List[T]: + return x if isinstance(x, list) else [x] + + +def map_each_element( + mapper: Callable[[S, AttributePath, Optional["ParserContextData"]], T], +) -> Callable[[List[S], AttributePath, Optional["ParserContextData"]], List[T]]: + def _generated_mapper( + xs: List[S], + ap: AttributePath, + pc: Optional["ParserContextData"], + ) -> List[T]: + return [mapper(s, ap[i], pc) for i, s in enumerate(xs)] + + return _generated_mapper |