From e560b3f619e6258120aeee7a1a48111b65883e8f Mon Sep 17 00:00:00 2001 From: Jacob Bundgaard Date: Mon, 9 Aug 2021 14:55:57 +0200 Subject: [PATCH] Add JsonRender and --json command line option --- README.md | 85 ++++++++++++++++++- .../openapitools/openapidiff/cli/Main.java | 14 +++ .../openapidiff/core/output/JsonRender.java | 18 ++++ .../openapidiff/core/JsonRenderTest.java | 17 ++++ .../openapidiff/core/OpenApiDiffTest.java | 15 ++++ 5 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java diff --git a/README.md b/README.md index 3bd0608e2..07afff0e4 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Compare two OpenAPI specifications (3.x) and render the difference to HTML plain * Depth comparison of parameters, responses, endpoint, http method (GET,POST,PUT,DELETE...) * Supports swagger api Authorization * Render difference of property with Expression Language -* HTML & Markdown render +* HTML, Markdown & JSON render # Maven @@ -52,6 +52,7 @@ usage: openapi-diff --header use given header for authorisation --html export diff as html in given file --info Print additional information + --json export diff as json in given file -l,--log use given level for log (TRACE, DEBUG, INFO, WARN, ERROR, OFF). Default: ERROR --markdown export diff as markdown in given file @@ -104,6 +105,7 @@ usage: openapi-diff --header use given header for authorisation --html export diff as html in given file --info Print additional information + --json export diff as json in given file -l,--log use given level for log (TRACE, DEBUG, INFO, WARN, ERROR, OFF). Default: ERROR --markdown export diff as markdown in given file @@ -168,6 +170,22 @@ try { } ``` + +#### JSON + +```java +String render = new JsonRender().render(diff); +try { + FileWriter fw = new FileWriter( + "testDiff.json"); + fw.write(render); + fw.close(); + +} catch (IOException e) { + e.printStackTrace(); +} +``` + ### Extensions This project uses Java Service Provider Inteface (SPI) so additional extensions can be added. @@ -350,6 +368,71 @@ Then, including your library with the `openapi-diff` module will cause it to be Changed response : [200] //successful operation ``` +### JSON + +```json +{ + "changedElements": [...], + "changedExtensions": null, + "changedOperations": [...], + "compatible": false, + "deprecatedEndpoints": [...], + "different": true, + "incompatible": true, + "missingEndpoints": [...], + "newEndpoints": [ + { + "method": "GET", + "operation": { + "callbacks": null, + "deprecated": null, + "description": "Returns a single pet", + "extensions": null, + "externalDocs": null, + "operationId": "getPetById", + "parameters": [ + { + "$ref": null, + "allowEmptyValue": null, + "allowReserved": null, + "content": null, + "deprecated": null, + "description": "ID of pet to return", + "example": null, + "examples": null, + "explode": false, + "extensions": null, + "in": "path", + "name": "petId", + "required": true, + "schema": {...}, + "style": "SIMPLE" + } + ], + "requestBody": null, + "responses": {...}, + "security": [ + { + "api_key": [] + } + ], + "servers": null, + "summary": "Find pet by ID", + "tags": [ + "pet" + ] + }, + "path": null, + "pathUrl": "/pet/{petId}", + "summary": "Find pet by ID" + } + ], + "newSpecOpenApi": {...}, + "oldSpecOpenApi": {...}, + "unchanged": false +} +``` + # License openapi-diff is released under the Apache License 2.0. diff --git a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java index 6736a5fd7..12d8b8221 100644 --- a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java +++ b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java @@ -24,6 +24,7 @@ import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.ConsoleRender; import org.openapitools.openapidiff.core.output.HtmlRender; +import org.openapitools.openapidiff.core.output.JsonRender; import org.openapitools.openapidiff.core.output.MarkdownRender; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -106,6 +107,13 @@ public static void main(String... args) { .argName("file") .desc("export diff as text in given file") .build()); + options.addOption( + Option.builder() + .longOpt("json") + .hasArg() + .argName("file") + .desc("export diff as json in given file") + .build()); // create the parser CommandLineParser parser = new DefaultParser(); @@ -188,6 +196,12 @@ public static void main(String... args) { String outputFile = line.getOptionValue("text"); writeOutput(output, outputFile); } + if (line.hasOption("json")) { + JsonRender jsonRender = new JsonRender(); + String output = jsonRender.render(result); + String outputFile = line.getOptionValue("json"); + writeOutput(output, outputFile); + } if (line.hasOption("state")) { System.out.println(result.isChanged().getValue()); System.exit(0); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java new file mode 100644 index 000000000..47d2f40d1 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java @@ -0,0 +1,18 @@ +package org.openapitools.openapidiff.core.output; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; + +public class JsonRender implements Render { + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public String render(ChangedOpenApi diff) { + try { + return objectMapper.writeValueAsString(diff); + } catch (JsonProcessingException e) { + throw new RuntimeException("Could not serialize diff as JSON", e); + } + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java new file mode 100644 index 000000000..a4fad6996 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java @@ -0,0 +1,17 @@ +package org.openapitools.openapidiff.core; + +import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.output.JsonRender; + +import static org.assertj.core.api.Assertions.assertThat; + +public class JsonRenderTest { + @Test + public void renderDoesNotFailWhenPropertyHasBeenRemoved() { + JsonRender render = new JsonRender(); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); + assertThat(render.render(diff)).isNotBlank(); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java index bcf96443a..4a5301042 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java @@ -11,6 +11,7 @@ import org.openapitools.openapidiff.core.model.ChangedOperation; import org.openapitools.openapidiff.core.model.Endpoint; import org.openapitools.openapidiff.core.output.HtmlRender; +import org.openapitools.openapidiff.core.output.JsonRender; import org.openapitools.openapidiff.core.output.MarkdownRender; public class OpenApiDiffTest { @@ -102,4 +103,18 @@ public void testDiffAndMarkdown() { e.printStackTrace(); } } + + @Test + public void testDiffAndJson() { + ChangedOpenApi diff = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + String render = new JsonRender().render(diff); + try { + FileWriter fw = new FileWriter("target/testDiff.json"); + fw.write(render); + fw.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + } }