summaryrefslogtreecommitdiffstats
path: root/src/debputy/manifest_parser/mapper_code.py
blob: d7a08c39612ad91b25d512d1f1f428506e9264a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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