diff --git a/tools/build.py b/tools/build.py index fa7550b..3180302 100644 --- a/tools/build.py +++ b/tools/build.py @@ -1,79 +1,83 @@ import os import glob -import json import yaml import shutil -import copy -import re from build_config import Config -from hooks import OpenapiHookBase, RequestHookBase, SchemasHookBase,OtherHookBase +from hooks import OpenapiHookBase, RequestHookBase, SchemasHookBase, OtherHookBase from tqdm import tqdm +def replace_ref(x): + if isinstance(x, dict): + return { + key: "#" + value.split("#")[-1] if key == "$ref" else replace_ref(value) + for key, value in x.items() + } + elif isinstance(x, list): + return [replace_ref(value) for value in x] + return x + + print("=== Build Start ===") config = Config() -try: - shutil.rmtree("dist") -except: - pass +shutil.rmtree("dist", ignore_errors=True) + for lang, profile in tqdm(config.main().items(), leave=False): - dist_replace = lambda x: x.replace( - config.INPUT_DIR, config.OUTPUT_DIR.format(lang), 1 - ) - - for dir in glob.glob(os.path.join(config.INPUT_DIR, "**/")): - os.makedirs(dist_replace(dir), exist_ok=True) - paths = {} + schemas = {} files = glob.glob(os.path.join(config.INPUT_DIR, "**/*.yaml")) for file in tqdm(files, leave=False): file = file.replace(os.path.sep, "/") with open(file, mode="r", encoding="utf-8") as f: load = yaml.safe_load(f) + + # RequestHookBase hook for path in list(load["paths"]): for method in list(load["paths"][path]): + key, value = path, load["paths"][path][method] for tag in list(load["paths"][path][method].get("tags", ["default"])): - key, value = path, load["paths"][path][method] for hook in profile["request"][tag]: hook: RequestHookBase key, value = hook.hook(key, value) - load["paths"][path][method] = value - load["paths"][key] = load["paths"].pop(path) + paths.update({key: {}}) + paths[key].update({method: value}) - escape = key.replace("/", "~1") - relative = file.replace(config.INPUT_DIR, "", 1) - paths.update({key: {"$ref": f".{relative}#/paths/{escape}"}}) + # SchemasHookBase hook for name in list(load.get("components", {}).get("schemas", {})): value = load["components"]["schemas"][name] for hook in profile["schemas"]: hook: SchemasHookBase value = hook.hook(value) - load["components"]["schemas"][name] = value + schemas.update({name: value}) + + # OtherHookBase hook if file == "src/openapi/paths/other.yaml": for hook in profile["other"]: hook: OtherHookBase key, value = hook.hook() - load["components"]["schemas"][key] = value - load["components"]["schemas"]["OtherResponse"]["properties"][key] = { - "$ref": f"#/components/schemas/{key}" - } - with open(dist_replace(file), mode="w+", encoding="utf-8") as f: - f.write(yaml.dump(load)) + schemas["OtherResponse"]["properties"].append({key: value}) file = "src/openapi/openapi-3.0.yaml" + with open(file, mode="r", encoding="utf-8") as f: openapi = yaml.safe_load(f) - for path in paths: - openapi["paths"] = paths + + # OpenapiHookBase hook for hook in profile["openapi"]: hook: OpenapiHookBase openapi = hook.hook(openapi) - with open(dist_replace(file), mode="w+", encoding="utf-8") as f: + + openapi["paths"] = replace_ref(paths) + openapi["components"]["schemas"] = replace_ref(schemas) + output = config.OUTPUT_DIR.format(lang) + os.makedirs(output, exist_ok=True) + + with open(output + "/openapi-3.0.yaml", mode="w+", encoding="utf-8") as f: f.write(yaml.dump(openapi)) print("=== Build End ===")