AWS API GatewayのModelをテストデータから自動生成する①


概要

とっても便利なAWS API GatewayのModel機能ですが、JSON Schemaを自分で用意する必要があります。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-create-model.html

JSON Schemaを生成するツールも沢山あるようです。

https://developer.ntt.com/ja/blog/e8d1542a-72ef-47c7-b7bb-aed22a747570

今回自分は単体で動いていたlambda(+ API Gateway)をプロキシ統合する際にJSON Schemaが必要となり、テストデータから自動生成してみました。
テストデータのみから生成するので、requiredとかは一旦考えていません。

実装

create_gateway_model.py
import sys
import json
import re
import pyperclip

def snake2CamelCase(s):
    return re.sub("_(.)", lambda m:m.group(1).upper(), s.lower())

def t(x):
    if type(x) == bool:
        return { "type": "boolean" }
    elif type(x) == str:
        return { "type": "string" }
    elif type(x) == float:
        return { "type": "number" }
    elif type(x) == int:
        return { "type": "integer" }
    elif type(x) == dict:
        p = {}
        for k in x.keys():
            p[k] = t(x[k])
        return { "type": "object", "properties": p }
    elif type(x) == list: # use the type of the first element
        return { "type": "array", "items": t(x[0]) } 

args = sys.argv
file_name = args[1]

with open(file_name, 'r') as f:
    s = f.read()
    d = {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": snake2CamelCase(name) + "Document",
        "type": "object"
    }
    d.update(t(json.loads(s)))
    o = json.dumps(d, indent=4)
    print(o)
    pyperclip.copy(o)

おまけにクリップボードにコピーまでしました

ToDo

いずれrequiredとかも生成したいですね