From d815bf4a4cfa7ec9f4b5c61f836a5d1106463eab Mon Sep 17 00:00:00 2001 From: Owen Diehl Date: Wed, 3 Mar 2021 21:58:13 -0500 Subject: [PATCH] hack for cleaning circular refs in swagger definition --- Makefile | 15 ++++++---- cmd/clean-swagger/main.go | 62 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 cmd/clean-swagger/main.go diff --git a/Makefile b/Makefile index 549012eec06..ec22002906a 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,18 @@ .DEFAULT_GOAL := openapi -PKG_DIR = pkg -GO_PKG_FILES = $(shell find $(PKG_DIR) -name *.go -print) - +API_DIR = pkg/api +GO_PKG_FILES = $(shell find $(API_DIR) -name *.go -print) spec.json: $(GO_PKG_FILES) - swagger generate spec -m -w $(PKG_DIR) -o $@ + swagger generate spec -m -w $(API_DIR) -o $@ +post.json: spec.json + go run cmd/clean-swagger/main.go -if $(<) -of $@ + +.PHONY: server +server: post.json + swagger generate server --exclude-main -t pkg/gen --with-flatten=full --with-flatten=remove-unused -f $(<) .PHONY: openapi -openapi: spec.json +openapi: post.json docker run --rm -p 80:8080 -v $$(pwd):/tmp -e SWAGGER_FILE=/tmp/$(<) swaggerapi/swagger-editor diff --git a/cmd/clean-swagger/main.go b/cmd/clean-swagger/main.go new file mode 100644 index 00000000000..907be253c7a --- /dev/null +++ b/cmd/clean-swagger/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "encoding/json" + "flag" + "io/ioutil" + "log" + "strings" +) + +const RefKey = "$ref" + +func main() { + var input, output string + flag.StringVar(&input, "if", "", "input file") + flag.StringVar(&output, "of", "", "output file") + + flag.Parse() + + if input == "" || output == "" { + log.Fatal("no file specified, input", input, ", output", output) + } + + b, err := ioutil.ReadFile(input) + if err != nil { + log.Fatal(err) + } + + data := make(map[string]interface{}) + if err := json.Unmarshal(b, &data); err != nil { + log.Fatal(err) + } + + definitions, ok := data["definitions"] + if !ok { + log.Fatal("no definitions") + } + + defs := definitions.(map[string]interface{}) + for k, v := range defs { + vMap := v.(map[string]interface{}) + refKey, ok := vMap[RefKey] + if !ok { + continue + } + + if strings.TrimPrefix(refKey.(string), "#/definitions/") == k { + log.Println("removing circular ref key", refKey) + delete(vMap, RefKey) + } + } + + out, err := json.MarshalIndent(data, "", " ") + if err != nil { + log.Fatal(err) + } + + err = ioutil.WriteFile(output, out, 0644) + if err != nil { + log.Fatal(err) + } +}