Skip to content

Commit

Permalink
Add support for examples diff
Browse files Browse the repository at this point in the history
  • Loading branch information
DrSatyr committed Jun 4, 2024
1 parent 8aa10ef commit 7b9ef6e
Show file tree
Hide file tree
Showing 19 changed files with 1,054 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@

import io.swagger.v3.oas.models.media.Content;
import io.swagger.v3.oas.models.media.MediaType;
import java.util.*;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.openapitools.openapidiff.core.model.Changed;
import org.openapitools.openapidiff.core.model.ChangedContent;
import org.openapitools.openapidiff.core.model.ChangedMediaType;
Expand Down Expand Up @@ -34,22 +36,15 @@ public DeferredChanged<ChangedContent> diff(Content left, Content right, DiffCon
MediaType oldMediaType = left.get(mediaTypeKey);
MediaType newMediaType = right.get(mediaTypeKey);

ChangedMediaType changedMediaType =
new ChangedMediaType(oldMediaType.getSchema(), newMediaType.getSchema(), context);

builder
.with(
openApiDiff
.getSchemaDiff()
.diff(
oldMediaType.getSchema(),
newMediaType.getSchema(),
context.copyWithRequired(true)))
.getMediaTypeDiff()
.diff(oldMediaType, newMediaType, context.copyWithRequired(true)))
.ifPresent(
value -> {
changedMediaType.setSchema(value);
if (!isUnchanged(changedMediaType)) {
changedMediaTypes.put(mediaTypeKey, changedMediaType);
if (!isUnchanged(value)) {
changedMediaTypes.put(mediaTypeKey, value);
}
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import java.util.Objects;
import java.util.Optional;
import org.openapitools.openapidiff.core.model.Changed;
import org.openapitools.openapidiff.core.model.ChangedExample;
import org.openapitools.openapidiff.core.model.ChangedExamples;
import org.openapitools.openapidiff.core.model.ChangedHeader;
import org.openapitools.openapidiff.core.model.DiffContext;
import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder;
Expand Down Expand Up @@ -49,7 +51,9 @@ protected DeferredChanged<ChangedHeader> computeDiff(
!Boolean.TRUE.equals(left.getDeprecated())
&& Boolean.TRUE.equals(right.getDeprecated()))
.setStyle(!Objects.equals(left.getStyle(), right.getStyle()))
.setExplode(getBooleanDiff(left.getExplode(), right.getExplode()));
.setExplode(getBooleanDiff(left.getExplode(), right.getExplode()))
.setExamples(new ChangedExamples(left.getExamples(), right.getExamples()))
.setExample(new ChangedExample(left.getExample(), right.getExample()));
builder
.with(
openApiDiff
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.openapitools.openapidiff.core.compare;

import static org.openapitools.openapidiff.core.utils.ChangedUtils.isChanged;

import io.swagger.v3.oas.models.media.MediaType;
import org.openapitools.openapidiff.core.model.Changed;
import org.openapitools.openapidiff.core.model.ChangedExample;
import org.openapitools.openapidiff.core.model.ChangedExamples;
import org.openapitools.openapidiff.core.model.ChangedMediaType;
import org.openapitools.openapidiff.core.model.DiffContext;
import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder;
import org.openapitools.openapidiff.core.model.deferred.DeferredChanged;

public class MediaTypeDiff {

private final OpenApiDiff openApiDiff;

public MediaTypeDiff(OpenApiDiff openApiDiff) {
this.openApiDiff = openApiDiff;
}

public DeferredChanged<ChangedMediaType> diff(
MediaType left, MediaType right, DiffContext context) {
DeferredBuilder<Changed> builder = new DeferredBuilder<>();

ChangedMediaType changedMediaType =
new ChangedMediaType(left.getSchema(), right.getSchema(), context)
.setExample(new ChangedExample(left.getExample(), right.getExample()))
.setExamples(new ChangedExamples(left.getExamples(), right.getExamples()));

builder
.with(
openApiDiff
.getSchemaDiff()
.diff(left.getSchema(), right.getSchema(), context.copyWithRequired(true)))
.ifPresent(changedMediaType::setSchema);

return builder.build().mapOptional(value -> isChanged(changedMediaType));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public class OpenApiDiff {
private PathDiff pathDiff;
private SchemaDiff schemaDiff;
private ContentDiff contentDiff;
private MediaTypeDiff mediaTypeDiff;
private ParametersDiff parametersDiff;
private ParameterDiff parameterDiff;
private RequestBodyDiff requestBodyDiff;
Expand Down Expand Up @@ -76,6 +77,7 @@ private void initializeFields() {
this.pathDiff = new PathDiff(this);
this.schemaDiff = new SchemaDiff(this);
this.contentDiff = new ContentDiff(this);
this.mediaTypeDiff = new MediaTypeDiff(this);
this.parametersDiff = new ParametersDiff(this);
this.parameterDiff = new ParameterDiff(this);
this.requestBodyDiff = new RequestBodyDiff(this);
Expand Down Expand Up @@ -204,6 +206,10 @@ public ContentDiff getContentDiff() {
return this.contentDiff;
}

public MediaTypeDiff getMediaTypeDiff() {
return this.mediaTypeDiff;
}

public ParametersDiff getParametersDiff() {
return this.parametersDiff;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import java.util.Objects;
import java.util.Optional;
import org.openapitools.openapidiff.core.model.Changed;
import org.openapitools.openapidiff.core.model.ChangedExample;
import org.openapitools.openapidiff.core.model.ChangedExamples;
import org.openapitools.openapidiff.core.model.ChangedParameter;
import org.openapitools.openapidiff.core.model.DiffContext;
import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder;
Expand Down Expand Up @@ -56,7 +58,9 @@ protected DeferredChanged<ChangedParameter> computeDiff(
.setChangeAllowEmptyValue(
getBooleanDiff(left.getAllowEmptyValue(), right.getAllowEmptyValue()))
.setChangeStyle(!Objects.equals(left.getStyle(), right.getStyle()))
.setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode()));
.setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode()))
.setExamples(new ChangedExamples(left.getExamples(), right.getExamples()))
.setExample(new ChangedExample(left.getExample(), right.getExample()));
builder
.with(
openApiDiff
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ protected static Schema<?> resolveComposedSchema(
return schema;
}

protected static Schema<?> addSchema(Schema<?> schema, Schema<?> fromSchema) {
protected static <T, U> Schema<T> addSchema(Schema<T> schema, Schema<U> fromSchema) {
if (fromSchema.getProperties() != null) {
if (schema.getProperties() == null) {
schema.setProperties(new LinkedHashMap<>());
Expand Down Expand Up @@ -206,6 +206,9 @@ protected static Schema<?> addSchema(Schema<?> schema, Schema<?> fromSchema) {
if (fromSchema.getExample() != null) {
schema.setExample(fromSchema.getExample());
}
if (fromSchema.getExamples() != null) {
schema.setExamples((List<T>) fromSchema.getExamples());
}
if (fromSchema.getExternalDocs() != null) {
if (schema.getExternalDocs() == null) {
schema.setExternalDocs(new ExternalDocumentation());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import org.openapitools.openapidiff.core.compare.OpenApiDiff;
import org.openapitools.openapidiff.core.model.Change;
import org.openapitools.openapidiff.core.model.Changed;
import org.openapitools.openapidiff.core.model.ChangedExample;
import org.openapitools.openapidiff.core.model.ChangedExamples;
import org.openapitools.openapidiff.core.model.ChangedSchema;
import org.openapitools.openapidiff.core.model.DiffContext;
import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder;
Expand Down Expand Up @@ -70,7 +72,9 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff(
right.getExclusiveMinimum(),
left.getExclusiveMaximum(),
right.getExclusiveMaximum(),
context));
context))
.setExamples(new ChangedExamples(left.getExamples(), right.getExamples()))
.setExample(new ChangedExample(left.getExample(), right.getExample()));
builder
.with(
openApiDiff
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package org.openapitools.openapidiff.core.model;

import java.util.Objects;

public class ChangedExample implements Changed {

private Object leftExample;
private Object rightExample;

public ChangedExample(Object leftExample, Object rightExample) {
this.leftExample = leftExample;
this.rightExample = rightExample;
}

public Object getLeftExample() {
return leftExample;
}

public void setLeftExample(Object leftExample) {
this.leftExample = leftExample;
}

public Object getRightExample() {
return rightExample;
}

public void setRightExample(Object rightExample) {
this.rightExample = rightExample;
}

@Override
public DiffResult isChanged() {
if (!Objects.equals(leftExample, rightExample)) {
return DiffResult.METADATA;
}
return DiffResult.NO_CHANGES;
}

@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object == null || getClass() != object.getClass()) {
return false;
}
ChangedExample that = (ChangedExample) object;
return Objects.equals(leftExample, that.leftExample)
&& Objects.equals(rightExample, that.rightExample);
}

@Override
public int hashCode() {
return Objects.hash(leftExample, rightExample);
}

@Override
public String toString() {
return "ChangedExample{"
+ "leftExample="
+ leftExample
+ ", rightExample="
+ rightExample
+ '}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package org.openapitools.openapidiff.core.model;

import java.util.Objects;

public class ChangedExamples implements Changed {

private Object leftExamples;
private Object rightExamples;

public ChangedExamples(Object leftExamples, Object rightExamples) {
this.leftExamples = leftExamples;
this.rightExamples = rightExamples;
}

public Object getLeftExamples() {
return leftExamples;
}

public void setLeftExamples(Object leftExamples) {
this.leftExamples = leftExamples;
}

public Object getRightExamples() {
return rightExamples;
}

public void setRightExamples(Object rightExamples) {
this.rightExamples = rightExamples;
}

@Override
public DiffResult isChanged() {
if (!Objects.equals(leftExamples, rightExamples)) {
return DiffResult.METADATA;
}
return DiffResult.NO_CHANGES;
}

@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object == null || getClass() != object.getClass()) {
return false;
}
ChangedExamples that = (ChangedExamples) object;
return Objects.equals(leftExamples, that.leftExamples)
&& Objects.equals(rightExamples, that.rightExamples);
}

@Override
public int hashCode() {
return Objects.hash(leftExamples, rightExamples);
}

@Override
public String toString() {
return "ChangedExamples{"
+ ", leftExamples="
+ leftExamples
+ ", rightExamples="
+ rightExamples
+ '}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ public class ChangedHeader implements ComposedChanged {
private boolean style;
private boolean explode;
private ChangedMetadata description;
private ChangedExamples examples;
private ChangedExample example;
private ChangedSchema schema;
private ChangedContent content;
private ChangedExtensions extensions;
Expand All @@ -30,7 +32,7 @@ public ChangedHeader(Header oldHeader, Header newHeader, DiffContext context) {

@Override
public List<Changed> getChangedElements() {
return Arrays.asList(description, schema, content, extensions);
return Arrays.asList(description, example, examples, schema, content, extensions);
}

@Override
Expand Down Expand Up @@ -96,6 +98,14 @@ public ChangedMetadata getDescription() {
return this.description;
}

public ChangedExamples getExamples() {
return this.examples;
}

public ChangedExample getExample() {
return this.example;
}

public ChangedSchema getSchema() {
return this.schema;
}
Expand Down Expand Up @@ -133,6 +143,16 @@ public ChangedHeader setDescription(final ChangedMetadata description) {
return this;
}

public ChangedHeader setExamples(ChangedExamples examples) {
this.examples = examples;
return this;
}

public ChangedHeader setExample(ChangedExample example) {
this.example = example;
return this;
}

public ChangedHeader setSchema(final ChangedSchema schema) {
this.schema = schema;
return this;
Expand Down Expand Up @@ -161,6 +181,8 @@ public boolean equals(Object o) {
&& Objects.equals(newHeader, that.newHeader)
&& Objects.equals(context, that.context)
&& Objects.equals(description, that.description)
&& Objects.equals(examples, that.examples)
&& Objects.equals(example, that.example)
&& Objects.equals(schema, that.schema)
&& Objects.equals(content, that.content)
&& Objects.equals(extensions, that.extensions);
Expand All @@ -177,6 +199,8 @@ public int hashCode() {
style,
explode,
description,
examples,
example,
schema,
content,
extensions);
Expand All @@ -200,6 +224,10 @@ public java.lang.String toString() {
+ this.isExplode()
+ ", description="
+ this.getDescription()
+ ", examples="
+ this.getExamples()
+ ", example="
+ this.getExample()
+ ", schema="
+ this.getSchema()
+ ", content="
Expand Down
Loading

0 comments on commit 7b9ef6e

Please sign in to comment.