From ab2b0ba115f373bf2d4627c8a66dde185ff6a1f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Wed, 14 Jun 2023 18:04:59 +0900 Subject: [PATCH] update config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- tools/build_config.py | 257 +++++++++++------------------------------- tools/hooks.py | 35 ++++-- 2 files changed, 95 insertions(+), 197 deletions(-) diff --git a/tools/build_config.py b/tools/build_config.py index aade1e0..5f771ad 100644 --- a/tools/build_config.py +++ b/tools/build_config.py @@ -5,196 +5,73 @@ class Config: OUTPUT_DIR = "dist/{0}" INPUT_DIR = "src/openapi" + def hooks_generator(self, queryParameterJson=True): + # https://stackoverflow.com/questions/34820064/defining-an-api-with-swagger-get-call-that-uses-json-in-parameters/45223964 + if queryParameterJson: + getParamHook = AddParametersOnContent( + split=-1, + contentType="application/json", + ignoreKeys=["queryId"], + ) + postParamHook = AddParametersOnParameters( + split=-1, + schemaType=None, + ) + else: + getParamHook = AddParametersOnParameters( + split=-1, + schemaType="string", + ignoreKeys=["queryId"], + ) + postParamHook = AddParametersOnBody( + split=-1, + schemaType=None, + contentType="application/json", + ) + + return { + "openapi": [AddSecuritySchemesOnSecuritySchemes()], + "schemas": [], + "other": [], + "request": { + key: [ + SetResponsesHeader(suffix=None), + AddPathQueryIdOnParameters(split=-1), + getParamHook, + ] + for key in ["default", "user", "user-list", "tweet"] + } + | { + key: [ + SetResponsesHeader(suffix=None), + AddPathQueryIdOnParameters(split=-1), + postParamHook, + ] + for key in ["post"] + } + | { + key: [ + SetResponsesHeader(suffix="legacy"), + AddParametersOnParameters(split=2, schemaType=None), + ] + for key in ["v1.1-get", "v2.0-get"] + } + | { + key: [ + SetResponsesHeader(suffix="legacy"), + AddParametersOnBody( + split=2, + schemaType=None, + contentType="application/x-www-form-urlencoded", + ), + ] + for key in ["v1.1-post", "v2.0-post"] + } + | {"other": []}, + } + def main(self): return { - "docs": { - "openapi": [AddSecuritySchemesOnSecuritySchemes()], - "schemas": [], - "other": [], - "request": { - key: [ - SetResponsesHeader(suffix=None), - AddPathQueryIdOnParameters(split=-1), - AddParametersOnContent( - split=-1, contentType="application/json" - ), - ] - for key in ["default", "user", "user-list", "tweet"] - } - | { - key: [ - SetResponsesHeader(suffix=None), - AddPathQueryIdOnParameters(split=-1), - AddParametersOnParameters( - split=-1, - schemaType=None, - ), - ] - for key in ["post"] - } - | { - key: [ - SetResponsesHeader(suffix="legacy"), - AddParametersOnParameters( - split=2, - schemaType=None, - ), - ] - for key in ["v1.1-get", "v2.0-get"] - } - | { - key: [ - SetResponsesHeader(suffix="legacy"), - AddParametersOnBody( - split=2, - schemaType=None, - contentType="application/x-www-form-urlencoded", - ), - ] - for key in ["v1.1-post", "v2.0-post"] - } - | {"other": []}, - }, - "dart": { - "openapi": [], - "schemas": [], - "other": [], - "request": { - key: [ - AddSecuritySchemesOnHeader(split=-1), - SetResponsesHeader(suffix=None), - AddPathQueryIdOnParameters(split=-1), - AddParametersOnParameters( - split=-1, - schemaType="string", - ), - ] - for key in ["default", "user", "user-list", "tweet"] - } - | { - key: [ - AddSecuritySchemesOnHeader(split=-1), - SetResponsesHeader(suffix=None), - AddPathQueryIdOnParameters(split=-1), - AddParametersOnBody( - split=-1, - schemaType=None, - contentType="application/json", - ), - ] - for key in ["post"] - } - | { - key: [ - SetResponsesHeader(suffix="legacy"), - AddSecuritySchemesOnHeader(split=-1), - AddParametersOnParameters( - split=2, - schemaType=None, - ), - ] - for key in ["v1.1-get", "v2.0-get"] - } - | { - key: [ - SetResponsesHeader(suffix="legacy"), - AddSecuritySchemesOnHeader(split=-1), - AddParametersOnBody( - split=2, - schemaType=None, - contentType="application/x-www-form-urlencoded", - ), - ] - for key in ["v1.1-post", "v2.0-post"] - } - | {"other": []}, - }, - "typescript": { - "openapi": [AddSecuritySchemesOnSecuritySchemes()], - "schemas": [], - "other": [], - "request": { - key: [ - SetResponsesHeader(suffix=None), - AddPathQueryIdOnParameters(split=-1), - AddParametersOnParameters( - split=-1, - schemaType="string", - ), - ] - for key in ["default", "user", "user-list", "tweet"] - } - | { - key: [ - SetResponsesHeader(suffix=None), - AddPathQueryIdOnParameters(split=-1), - AddParametersOnBody( - split=-1, - schemaType=None, - contentType="application/json", - ), - ] - for key in ["post"] - } - | { - key: [ - SetResponsesHeader(suffix="legacy"), - AddParametersOnParameters( - split=2, - schemaType=None, - ), - ] - for key in ["v1.1-get", "v2.0-get"] - } - | { - key: [ - SetResponsesHeader(suffix="legacy"), - AddParametersOnBody( - split=2, - schemaType=None, - contentType="application/x-www-form-urlencoded", - ), - ] - for key in ["v1.1-post", "v2.0-post"] - } - | {"other": []}, - }, - "test": { - "openapi": [AddSecuritySchemesOnSecuritySchemes()], - "schemas": [], - "other": [], - "request": { - key: [ - SetResponsesHeader(suffix=None), - AddPathQueryIdOnParameters(split=-1), - AddParametersOnParameters( - split=-1, - schemaType="string", - ), - ] - for key in ["default", "user", "user-list", "tweet"] - } - | { - key: [ - SetResponsesHeader(suffix=None), - AddPathQueryIdOnParameters(split=-1), - AddParametersOnParameters( - split=-1, - schemaType="string", - ), - ] - for key in ["post"] - } - | { - key: [ - SetResponsesHeader(suffix="legacy"), - AddParametersOnParameters( - split=2, - schemaType="object", - ), - ] - for key in ["v1.1-get", "v1.1-post", "v2.0-get", "v2.0-post"] - } - | {"other": []}, - }, + "docs": self.hooks_generator(), + "compatible": self.hooks_generator(queryParameterJson=False), } diff --git a/tools/hooks.py b/tools/hooks.py index 4b97b41..00bbdb8 100644 --- a/tools/hooks.py +++ b/tools/hooks.py @@ -169,24 +169,33 @@ class AddPathQueryIdOnParameters(RequestHookBase): class AddParametersOnParameters(RequestHookBase): schemaType: str | None + ignoreKeys: list[str] - def __init__(self, split: str = 1, schemaType: str | None = None): + def __init__( + self, + split: str = 1, + schemaType: str | None = None, + ignoreKeys: list[str] | None = None, + ): super().__init__(split=split) self.schemaType = schemaType + self.ignoreKeys = ignoreKeys or [] def hook(self, path: str, value: dict): path, value = super().hook(path, value) data = self.PLACEHOLDER[self.path_name] + data = {key: data[key] for key in data.keys() if key not in self.ignoreKeys} + for key in data.keys(): if self.schemaType == "string": - example = json.dumps(data[key]) + example = data[key] if type(data[key]) is str else json.dumps(data[key]) schema = { "type": "string", "default": example, "example": example, } elif self.schemaType == "object": - example = json.dumps(data[key]) + example = data[key] if type(data[key]) is str else json.dumps(data[key]) schema = { "type": "object", "default": example, @@ -211,30 +220,34 @@ class AddParametersOnParameters(RequestHookBase): class AddParametersOnBody(RequestHookBase): schemaType: str | None contentType: str | None + ignoreKeys: list[str] def __init__( self, split: str = 1, contentType: str = "application/json", schemaType: str | None = None, + ignoreKeys: list[str] | None = None, ): super().__init__(split) self.schemaType = schemaType self.contentType = contentType + self.ignoreKeys = ignoreKeys or [] def hook(self, path: str, value: dict): path, value = super().hook(path, value) data = self.PLACEHOLDER[self.path_name] + data = {key: data[key] for key in data.keys() if key not in self.ignoreKeys} if self.schemaType == "string": - example = json.dumps(data) + example = data if type(data) is str else json.dumps(data) schema = { "type": "string", "default": example, "example": example, } elif self.schemaType == "object": - example = json.dumps(data) + example = data if type(data) is str else json.dumps(data) schema = { "type": "object", "default": example, @@ -264,14 +277,23 @@ class AddParametersOnBody(RequestHookBase): class AddParametersOnContent(RequestHookBase): contentType: str + ignoreKeys: list[str] - def __init__(self, split: str = 1, contentType: str = "application/json"): + def __init__( + self, + split: str = 1, + contentType: str = "application/json", + ignoreKeys: list[str] | None = None, + ): super().__init__(split=split) self.contentType = contentType + self.ignoreKeys = ignoreKeys or [] def hook(self, path: str, value: dict): path, value = super().hook(path, value) data = self.PLACEHOLDER[self.path_name] + data = {key: data[key] for key in data.keys() if key not in self.ignoreKeys} + for key in data.keys(): value["parameters"].append( { @@ -281,7 +303,6 @@ class AddParametersOnContent(RequestHookBase): "content": { self.contentType: { "schema": self.placeholder_to_yaml(data[key]), - "required": [i for i in data[key]], } }, }