File: split_by_locale.py

package info (click to toggle)
firefox 147.0.2-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,683,484 kB
  • sloc: cpp: 7,607,246; javascript: 6,533,185; ansic: 3,775,227; python: 1,415,393; xml: 634,561; asm: 438,951; java: 186,241; sh: 62,752; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (79 lines) | stat: -rw-r--r-- 3,270 bytes parent folder | download | duplicates (2)
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
78
79
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
"""
This transform splits the jobs it receives into per-locale tasks. Locales are
provided by the `locales-file`.
"""

from pprint import pprint

from taskgraph.transforms.base import TransformSequence
from taskgraph.util.copy import deepcopy
from taskgraph.util.schema import Schema
from voluptuous import Extra, Optional, Required

from gecko_taskgraph.transforms.l10n import parse_locales_file

transforms = TransformSequence()

split_by_locale_schema = Schema(
    {
        # The file to pull locale information from. This should be a json file
        # such as browser/locales/l10n-changesets.json.
        Required("locales-file"): str,
        # The platform name in the form used by the locales files. Defaults to
        # attributes.build_platform if not provided.
        Optional("locale-file-platform"): str,
        # A list of properties elsewhere in the job that need to have the locale
        # name substituted into them. The referenced properties may be strings
        # or lists. In the case of the latter, all list values will have
        # substitutions performed.
        Optional("properties-with-locale"): [str],
        Extra: object,
    }
)


transforms.add_validate(split_by_locale_schema)


@transforms.add
def add_command(config, jobs):
    for job in jobs:
        locales_file = job.pop("locales-file")
        properties_with_locale = job.pop("properties-with-locale")
        build_platform = job.pop(
            "locale-file-platform", job["attributes"]["build_platform"]
        )

        for locale in parse_locales_file(locales_file, build_platform):
            locale_job = deepcopy(job)
            locale_job["attributes"]["locale"] = locale
            for prop in properties_with_locale:
                container, subfield = locale_job, prop
                while "." in subfield:
                    f, subfield = subfield.split(".", 1)
                    if f not in container:
                        raise Exception(
                            f"Unable to find property {prop} to perform locale substitution on. Job is:\n{pprint(job)}"
                        )
                    container = container[f]
                    if not isinstance(container, dict):
                        raise Exception(
                            f"{container} is not a dict, cannot perform locale substitution. Job is:\n{pprint(job)}"
                        )

                if isinstance(container[subfield], str):
                    container[subfield] = container[subfield].format(locale=locale)
                elif isinstance(container[subfield], list):
                    for i in range(len(container[subfield])):
                        container[subfield][i] = container[subfield][i].format(
                            locale=locale
                        )
                else:
                    raise Exception(
                        f"Don't know how to subtitute locale for value of type: {type(container[subfield])}; value is: {container[subfield]}"
                    )

            yield locale_job