File: generate_sdk.py

package info (click to toggle)
python-azure 20230112%2Bgit-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 749,544 kB
  • sloc: python: 6,815,827; javascript: 287; makefile: 195; xml: 109; sh: 105
file content (179 lines) | stat: -rw-r--r-- 5,805 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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import argparse
import logging
from pathlib import Path
import tempfile

from .swaggertosdk.SwaggerToSdkNewCLI import (
    build_project,
)
from .swaggertosdk.SwaggerToSdkCore import (
    CONFIG_FILE,
    read_config,
    solve_relative_path,
    extract_conf_from_readmes,
    get_input_paths,
    get_repo_tag_meta,
)

_LOGGER = logging.getLogger(__name__)


def generate(
    config_path,
    sdk_folder,
    project_pattern,
    readme,
    restapi_git_folder,
    autorest_bin=None,
    force_generation=False,
    python_tag=None,
):

    sdk_folder = Path(sdk_folder).expanduser()
    config = read_config(sdk_folder, config_path)

    global_conf = config["meta"]
    repotag = get_repo_tag_meta(global_conf)
    global_conf["autorest_options"] = solve_relative_path(global_conf.get("autorest_options", {}), sdk_folder)
    global_conf["envs"] = solve_relative_path(global_conf.get("envs", {}), sdk_folder)
    global_conf["advanced_options"] = solve_relative_path(global_conf.get("advanced_options", {}), sdk_folder)
    if python_tag:
        global_conf["autorest_options"]["tag"] = python_tag
    if restapi_git_folder:
        restapi_git_folder = Path(restapi_git_folder).expanduser()

    # Look for configuration in Readme
    if readme:
        swagger_files_in_pr = [readme]
    else:
        if not restapi_git_folder:
            raise ValueError("RestAPI folder must be set if you don't provide a readme.")
        swagger_files_in_pr = list(restapi_git_folder.glob("specification/**/readme.md"))
    _LOGGER.info(f"Readme files: {swagger_files_in_pr}")
    extract_conf_from_readmes(
        swagger_files_in_pr,
        restapi_git_folder,
        repotag,
        config,
        force_generation=force_generation,
    )

    with tempfile.TemporaryDirectory() as temp_dir:
        for project, local_conf in config.get("projects", {}).items():
            if readme:
                if str(readme) not in project:
                    _LOGGER.info("Skip project %s (readme was %s)", project, readme)
                    continue
            else:
                if project_pattern and not any(p in project for p in project_pattern):
                    _LOGGER.info("Skip project %s", project)
                    continue
            local_conf["autorest_options"] = solve_relative_path(local_conf.get("autorest_options", {}), sdk_folder)

            if readme and readme.startswith("http"):
                # Simplify here, do not support anything else than Readme.md
                absolute_markdown_path = readme
                _LOGGER.info(f"HTTP Markdown input: {absolute_markdown_path}")
            else:
                markdown_relative_path, optional_relative_paths = get_input_paths(global_conf, local_conf)

                _LOGGER.info(f"Markdown input: {markdown_relative_path}")
                _LOGGER.info(f"Optional inputs: {optional_relative_paths}")

                absolute_markdown_path = None
                if markdown_relative_path:
                    absolute_markdown_path = Path(restapi_git_folder or "", markdown_relative_path).resolve()
                if optional_relative_paths:
                    local_conf.setdefault("autorest_options", {})["input-file"] = [
                        Path(restapi_git_folder or "", input_path).resolve() for input_path in optional_relative_paths
                    ]

            build_project(
                temp_dir,
                project,
                absolute_markdown_path,
                sdk_folder,
                global_conf,
                local_conf,
                autorest_bin,
            )
    return config


def generate_main():
    """Main method"""

    parser = argparse.ArgumentParser(
        description="Build SDK using Autorest, offline version.",
        formatter_class=argparse.RawTextHelpFormatter,
    )
    parser.add_argument(
        "--rest-folder",
        "-r",
        dest="restapi_git_folder",
        default=None,
        help="Rest API git folder. [default: %(default)s]",
    )
    parser.add_argument(
        "--project",
        "-p",
        dest="project",
        action="append",
        help="Select a specific project. Do all by default. You can use a substring for several projects.",
    )
    parser.add_argument("--readme", "-m", dest="readme", help="Select a specific readme. Must be a path")
    parser.add_argument(
        "--config",
        "-c",
        dest="config_path",
        default=CONFIG_FILE,
        help="The JSON configuration format path [default: %(default)s]",
    )
    parser.add_argument(
        "--autorest",
        dest="autorest_bin",
        help="Force the Autorest to be executed. Must be a executable command.",
    )
    parser.add_argument(
        "-f",
        "--force",
        dest="force",
        action="store_true",
        help="Should I force generation if SwaggerToSdk tag is not found",
    )
    parser.add_argument(
        "-v",
        "--verbose",
        dest="verbose",
        action="store_true",
        help="Verbosity in INFO mode",
    )
    parser.add_argument("--debug", dest="debug", action="store_true", help="Verbosity in DEBUG mode")

    parser.add_argument(
        "--sdk-folder",
        "-s",
        dest="sdk_folder",
        default=".",
        help="A Python SDK folder. [default: %(default)s]",
    )

    args = parser.parse_args()
    main_logger = logging.getLogger()
    if args.verbose or args.debug:
        logging.basicConfig()
        main_logger.setLevel(logging.DEBUG if args.debug else logging.INFO)

    generate(
        args.config_path,
        args.sdk_folder,
        args.project,
        args.readme,
        args.restapi_git_folder,
        args.autorest_bin,
        args.force,
    )


if __name__ == "__main__":
    generate_main()