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()
|