com.qdesrame.openapi.diff.output.ConsoleRender Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of openapi-diff Show documentation
Show all versions of openapi-diff Show documentation
Utility for comparing two OpenAPI specifications.
The newest version!
package com.qdesrame.openapi.diff.output;
import com.qdesrame.openapi.diff.model.*;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.responses.ApiResponse;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
public class ConsoleRender implements Render {
private static final int LINE_LENGTH = 74;
private StringBuilder output;
@Override
public String render(ChangedOpenApi diff) {
output = new StringBuilder();
if (!diff.isDiff()) {
output.append("No differences. Specifications are equivalents");
} else {
output.append(bigTitle("Api Change Log"))
.append(StringUtils.center(diff.getNewSpecOpenApi().getInfo().getTitle(), LINE_LENGTH))
.append(System.lineSeparator());
List newEndpoints = diff.getNewEndpoints();
String ol_newEndpoint = listEndpoints(newEndpoints, "What's New");
List missingEndpoints = diff.getMissingEndpoints();
String ol_missingEndpoint = listEndpoints(missingEndpoints, "What's Deleted");
List deprecatedEndpoints = diff.getDeprecatedEndpoints();
String ol_deprecatedEndpoint = listEndpoints(deprecatedEndpoints, "What's Deprecated");
List changedOperations = diff.getChangedOperations();
String ol_changed = ol_changed(changedOperations);
output
.append(renderBody(ol_newEndpoint, ol_missingEndpoint, ol_deprecatedEndpoint, ol_changed))
.append(title("Result"))
.append(StringUtils.center(diff.isDiffBackwardCompatible() ?
"API changes are backward compatible" : "API changes broke backward compatibility", LINE_LENGTH))
.append(System.lineSeparator())
.append(separator('-'));
}
return output.toString();
}
private String ol_changed(List operations) {
if (null == operations || operations.size() == 0) return "";
StringBuilder sb = new StringBuilder();
sb.append(title("What's Changed"));
for (ChangedOperation operation : operations) {
String pathUrl = operation.getPathUrl();
String method = operation.getHttpMethod().toString();
String desc = operation.getSummary();
StringBuilder ul_detail = new StringBuilder();
if (operation.isDiffParam()) {
ul_detail.append(StringUtils.repeat(' ', 2)).append("Parameter:")
.append(System.lineSeparator())
.append(ul_param(operation.getChangedParameters()));
}
if (operation.isDiffRequest()) {
ul_detail.append(StringUtils.repeat(' ', 2)).append("Request:")
.append(System.lineSeparator())
.append(ul_content(operation.getChangedRequestBody().getChangedContent(), true));
}
if (operation.isDiffResponse()) {
ul_detail.append(StringUtils.repeat(' ', 2)).append("Return Type:")
.append(System.lineSeparator())
.append(ul_response(operation.getChangedApiResponse()));
}
sb.append(itemEndpoint(method, pathUrl, desc)).append(ul_detail);
}
return sb.toString();
}
private String ul_response(ChangedApiResponse changedApiResponse) {
Map addResponses = changedApiResponse.getAddResponses();
Map delResponses = changedApiResponse.getMissingResponses();
Map changedResponses = changedApiResponse.getChangedResponses();
StringBuilder sb = new StringBuilder();
for (String propName : addResponses.keySet()) {
sb.append(itemResponse("Add ", propName));
}
for (String propName : delResponses.keySet()) {
sb.append(itemResponse("Deleted ", propName));
}
for (String propName : changedResponses.keySet()) {
sb.append(itemChangedResponse("Changed ", propName, changedResponses.get(propName)));
}
return sb.toString();
}
private String itemResponse(String title, String code) {
StringBuilder sb = new StringBuilder();
String status = "";
if (!code.equals("default")) {
status = HttpStatus.getStatusText(Integer.parseInt(code));
}
sb.append(StringUtils.repeat(' ', 4)).append("- ").append(title).append(code)
.append(' ').append(status).append(System.lineSeparator());
return sb.toString();
}
private String itemChangedResponse(String title, String contentType, ChangedResponse response) {
StringBuilder sb = new StringBuilder();
sb.append(itemResponse(title, contentType));
sb.append(StringUtils.repeat(' ', 6)).append("Media types:").append(System.lineSeparator());
sb.append(ul_content(response.getChangedContent(), false));
return sb.toString();
}
private String ul_content(ChangedContent changedContent, boolean isRequest) {
StringBuilder sb = new StringBuilder();
if (changedContent == null) {
return sb.toString();
}
for (String propName : changedContent.getIncreased().keySet()) {
sb.append(itemContent("Added ", propName));
}
for (String propName : changedContent.getMissing().keySet()) {
sb.append(itemContent("Deleted ", propName));
}
for (String propName : changedContent.getChanged().keySet()) {
sb.append(itemContent("Changed ", propName, changedContent.getChanged().get(propName), isRequest));
}
return sb.toString();
}
private String itemContent(String title, String contentType) {
StringBuilder sb = new StringBuilder();
sb.append(StringUtils.repeat(' ', 8)).append("- ").append(title).append(contentType)
.append(System.lineSeparator());
return sb.toString();
}
private String itemContent(String title, String contentType, ChangedMediaType changedMediaType, boolean isRequest) {
StringBuilder sb = new StringBuilder();
sb.append(itemContent(title, contentType))
.append(StringUtils.repeat(' ', 10))
.append("Schema: ")
.append(changedMediaType.isDiffBackwardCompatible(isRequest) ?
"Backward compatible" : "Broken compatibility")
.append(System.lineSeparator());
return sb.toString();
}
private String ul_param(ChangedParameters changedParameters) {
List addParameters = changedParameters.getIncreased();
List delParameters = changedParameters.getMissing();
List changed = changedParameters.getChanged();
StringBuilder sb = new StringBuilder();
for (Parameter param : addParameters) {
sb.append(itemParam("Add ", param));
}
for (ChangedParameter param : changed) {
sb.append(li_changedParam(param));
}
for (Parameter param : delParameters) {
sb.append(itemParam("Delete ", param));
}
return sb.toString();
}
private String itemParam(String title, Parameter param) {
StringBuilder sb = new StringBuilder("");
sb.append(StringUtils.repeat(' ', 4)).append("- ").append(title).append(param.getName())
.append(" in ").append(param.getIn()).append(System.lineSeparator());
// .append(null == param.getDescription() ? ""
// : (" //" + param.getDescription()));
return sb.toString();
}
private String li_changedParam(ChangedParameter changeParam) {
if (changeParam.isDeprecated()) {
return itemParam("Deprecated ", changeParam.getNewParameter());
} else {
return itemParam("Changed ", changeParam.getNewParameter());
}
}
private String listEndpoints(List endpoints, String title) {
if (null == endpoints || endpoints.size() == 0) return "";
StringBuilder sb = new StringBuilder();
sb.append(title(title));
for (Endpoint endpoint : endpoints) {
sb.append(itemEndpoint(endpoint.getMethod().toString(),
endpoint.getPathUrl(), endpoint.getSummary()));
}
return sb.append(System.lineSeparator()).toString();
}
private String itemEndpoint(String method, String path, String desc) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("- %s %s%n", StringUtils.rightPad(method, 6), path));
return sb.toString();
}
public String renderBody(String ol_new, String ol_miss, String ol_deprec, String ol_changed) {
StringBuilder sb = new StringBuilder();
sb.append(ol_new)
.append(ol_miss)
.append(ol_deprec)
.append(ol_changed);
return sb.toString();
}
public String bigTitle(String title) {
char ch = '=';
return this.title(title.toUpperCase(), ch);
}
public String title(String title) {
return this.title(title, '-');
}
public String title(String title, char ch) {
String little = StringUtils.repeat(ch, 2);
return String.format("%s%s%s%s%n%s", separator(ch), little, StringUtils.center(title, LINE_LENGTH - 4), little, separator(ch));
}
public StringBuilder separator(char ch) {
StringBuilder sb = new StringBuilder();
return sb.append(StringUtils.repeat(ch, LINE_LENGTH)).append(System.lineSeparator());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy