import os import glob import json import yaml import shutil import copy import re class placeholder_manager: data: dict config: str = "src/config/placeholder.json" def __init__(self): with open(self.config, mode="r", encoding="utf-8") as f: self.data = json.load(f) def __replace(self, file, old: str, new) -> str: if type(new) is dict: dump = f"'{json.dumps(new)}'" return file.replace(f'"{old}"', dump) else: return file.replace(f"{old}", new) def replace(self, file: str) -> str: for prefix in self.data.keys(): for key in self.data[prefix]: value = self.data[prefix][key] file = self.__replace(file, f"{{{{{prefix}{key}}}}}", value) return file def replace_file(self, file: str, prefix: str) -> str: if self.data.get(prefix, None) is None: return file for key in self.data[prefix].keys(): value = self.data[prefix][key] file = self.__replace(file, f"{{{{{key}}}}}", value) return file OUTPUT_DIR = "dist/{0}" INPUT_DIR = "src/openapi" METHODS = ["get", "put", "post", "delete", "options", "head", "patch", "trace"] try: shutil.rmtree("dist") except: pass with open("src/config/variable.json", mode="r", encoding="utf-8") as f: variable = json.load(f) for lang in variable.keys(): def read(file: str): with open(file, mode="r", encoding="utf-8") as f: return remove(f.read()) def write(file: str, data: str) -> None: with open( file.replace(INPUT_DIR, OUTPUT_DIR.format(lang), 1), mode="w+", encoding="utf-8", ) as f: f.write(data) def get_yaml(data, key): return yaml.safe_load(placeholder.replace_file(str(data), key)) def remove(data): for match in re.findall(r"(\{% (.*?) %\})", data): equation = match[1].split(" ") if equation[0] == "if" and equation[2] == "==": if equation[3] != variable[lang][equation[1]]: data = re.sub( re.escape(match[0]) + "[\s\S]*?" + re.escape("{% endif %}"), "", data, ) return data for dir in glob.glob(os.path.join(INPUT_DIR, "**/")): os.makedirs(dir.replace(INPUT_DIR, OUTPUT_DIR.format(lang), 1), exist_ok=True) placeholder = placeholder_manager() parameters = read("src/config/parameters.yaml") header = read("src/config/header.yaml") paths = {} for file in glob.glob(os.path.join(INPUT_DIR, "**/*.yaml")): file = file.replace(os.path.sep, "/") relative = file.replace(INPUT_DIR, "", 1) load = yaml.safe_load(placeholder.replace(read(file))) for key in load["paths"].keys(): append = get_yaml(parameters, key.split("/")[-1]) param = append["paths"]["/parameters"] for method in METHODS: if load["paths"][key].get(method, None) is not None: req = load["paths"][key][method] req["parameters"] = param["get"]["parameters"] append = get_yaml(header, key.split("/")[-1]) req = load["paths"][key][method] req["responses"]["200"]["headers"] = append["components"]["headers"] escape = key.replace("/", "~1") paths.update({key: {"$ref": f".{relative}#/paths/{escape}"}}) write(file, yaml.dump(load)) file = "src/openapi/openapi-3.0.yaml" data = read(file) for path in paths: load = yaml.safe_load(placeholder.replace(data)) load["paths"] = paths write(file, yaml.dump(load))