File: __init__.py

package info (click to toggle)
python-azure 20181112%2Bgit-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 407,300 kB
  • sloc: python: 717,190; makefile: 201; sh: 76
file content (126 lines) | stat: -rw-r--r-- 4,560 bytes parent folder | download
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from contextlib import suppress
import logging
import os
from pathlib import Path
from typing import Dict, Any, Optional, List

from jinja2 import Template, PackageLoader, Environment
from .conf import read_conf, build_default_conf, CONF_NAME

_LOGGER = logging.getLogger(__name__)

_CWD = Path(__file__).resolve().parent
_TEMPLATE_PATH = _CWD / "template"

def build_config(config : Dict[str, Any]) -> Dict[str, str]:
    """Will build the actual config for Jinja2, based on SDK config.
    """
    result = config.copy()
    # Manage the classifier stable/beta
    is_stable = result.pop("is_stable", False)
    if is_stable:
        result["classifier"] = "Development Status :: 5 - Production/Stable"
    else:
        result["classifier"] = "Development Status :: 4 - Beta"
    # Manage the nspkg
    package_name = result["package_name"]
    result["package_nspkg"] = result.pop(
        "package_nspkg",
        package_name[:package_name.rindex('-')]+"-nspkg"
    )
    # ARM?
    result['is_arm'] = result.pop("is_arm", True)

    # Do I need msrestazure for this package?
    result['need_msrestazure'] = result.pop("need_msrestazure", True)

    # Pre-compute some Jinja variable that are complicated to do inside the templates
    package_parts = result["package_nspkg"][:-len('-nspkg')].split('-')
    result['nspkg_names'] = [
        ".".join(package_parts[:i+1])
        for i in range(len(package_parts))
    ]
    result['init_names'] = [
        "/".join(package_parts[:i+1])+"/__init__.py"
        for i in range(len(package_parts))
    ]

    # Return result
    return result


def build_packaging(output_folder: str, gh_token: Optional[str]=None, jenkins: bool = False, packages: List[str]=None, build_conf: bool = False) -> None:
    package_names = set(packages) or set()
    if jenkins:
        sdk_id = os.environ["ghprbGhRepository"]
        pr_number = int(os.environ["ghprbPullId"])

        from github import Github
        con = Github(gh_token)
        repo = con.get_repo(sdk_id)
        sdk_pr = repo.get_pull(pr_number)
        # "get_files" of Github only download the first 300 files. Might not be enough.
        package_names |= {f.filename.split('/')[0] for f in sdk_pr.get_files() if f.filename.startswith("azure")}

    if not package_names:
        raise ValueError("Was unable to find out the package names.")

    for package_name in package_names:
        build_packaging_by_package_name(package_name, output_folder, build_conf)


def build_packaging_by_package_name(package_name: str, output_folder: str, build_conf: bool = False) -> None:
    _LOGGER.info("Building template %s", package_name)
    package_folder = Path(output_folder) / Path(package_name)

    if build_conf:
        build_default_conf(package_folder, package_name)

    conf = read_conf(package_folder)
    if not conf:
        raise ValueError("Create a {} file before calling this script".format(package_folder / CONF_NAME))

    if not conf.get("auto_update", True):
        _LOGGER.info(f"Package {package_name} has no auto-packaging update enabled")
        return

    env = Environment(
        loader=PackageLoader('packaging_tools', 'templates'),
        keep_trailing_newline=True
    )
    conf = build_config(conf)

    for template_name in env.list_templates():
        future_filepath = Path(output_folder) / package_name / template_name

        # Might decide to make it more generic one day
        if template_name == "HISTORY.rst" and future_filepath.exists():
            _LOGGER.info("Skipping HISTORY.txt template, since a previous one was found")
            # Never overwirte the ChangeLog
            continue

        template = env.get_template(template_name)
        result = template.render(**conf)

        # __init__.py is a weird one
        if template_name == "__init__.py":
            split_package_name = package_name.split("-")[:-1]
            for i in range(len(split_package_name)):
                init_path = Path(output_folder).joinpath(
                    package_name,
                    *split_package_name[:i+1],
                    template_name
                )
                with open(init_path, "w") as fd:
                    fd.write(result)

            continue

        with open(future_filepath, "w") as fd:
            fd.write(result)
    # azure_bdist_wheel had been removed, but need to delete it manually
    with suppress(FileNotFoundError):
        (Path(output_folder) / package_name / "azure_bdist_wheel.py").unlink()


    _LOGGER.info("Template done %s", package_name)