Skip to content

Commit 296b12b

Browse files
committed
Merge branch 'oneof-full-support' into actility_tmp
2 parents 672acab + c034cfc commit 296b12b

File tree

8 files changed

+110
-27
lines changed

8 files changed

+110
-27
lines changed

src/main/java/com/qdesrame/openapi/diff/compare/SchemaDiff.java

+1-17
Original file line numberDiff line numberDiff line change
@@ -89,23 +89,7 @@ protected Optional<ChangedSchema> computeDiff(HashSet<String> refSet, Schema lef
8989

9090
//If schema type is same then get specific SchemaDiffResult and compare the properties
9191
SchemaDiffResult result = SchemaDiff.getSchemaDiffResult(right.getClass(), openApiDiff);
92-
Optional<ChangedSchema> schema = result.diff(refSet, leftComponents, rightComponents, left, right, context);
93-
if (schema.isPresent()) {
94-
if (context.isResponse()) {
95-
if (Boolean.TRUE.equals(schema.get().getNewSchema().getWriteOnly())) {
96-
if (!schema.get().isChangeWriteOnly()) {
97-
schema = Optional.empty();
98-
}
99-
}
100-
} else if (context.isRequest()) {
101-
if (Boolean.TRUE.equals(schema.get().getNewSchema().getReadOnly())) {
102-
if (!schema.get().isChangeReadOnly()) {
103-
schema = Optional.empty();
104-
}
105-
}
106-
}
107-
}
108-
return schema;
92+
return result.diff(refSet, leftComponents, rightComponents, left, right, context);
10993
}
11094

11195
protected static Schema resolveComposedSchema(Components components, Schema schema) {

src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/ComposedSchemaDiffResult.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public ComposedSchemaDiffResult(OpenApiDiff openApiDiff) {
3131

3232
@Override
3333
public Optional<ChangedSchema> diff(HashSet<String> refSet, Components leftComponents, Components rightComponents, Schema left, Schema right, DiffContext context) {
34-
if(left instanceof ComposedSchema) {
34+
if (left instanceof ComposedSchema) {
3535
ComposedSchema leftComposedSchema = (ComposedSchema) left;
3636
ComposedSchema rightComposedSchema = (ComposedSchema) right;
3737
if (CollectionUtils.isNotEmpty(leftComposedSchema.getOneOf())
@@ -53,7 +53,8 @@ public Optional<ChangedSchema> diff(HashSet<String> refSet, Components leftCompo
5353
Map<String, String> rightMapping = getMapping(rightComposedSchema);
5454

5555
ChangedOneOfSchema changedOneOfSchema = new ChangedOneOfSchema(leftMapping, rightMapping, context);
56-
MapKeyDiff<String, String> mappingDiff = MapKeyDiff.diff(leftMapping, rightMapping);
56+
MapKeyDiff<String, Schema> mappingDiff = MapKeyDiff.diff(getSchema(leftComponents, leftMapping),
57+
getSchema(rightComponents, rightMapping));
5758
changedOneOfSchema.setIncreasedMapping(mappingDiff.getIncreased());
5859
changedOneOfSchema.setMissingMapping(mappingDiff.getMissing());
5960

@@ -76,6 +77,12 @@ public Optional<ChangedSchema> diff(HashSet<String> refSet, Components leftCompo
7677
}
7778
}
7879

80+
private Map<String, Schema> getSchema(Components components, Map<String, String> mapping) {
81+
Map<String, Schema> result = new HashMap<>();
82+
mapping.forEach((key, value) -> result.put(key, refPointer.resolveRef(components, new Schema(), value)));
83+
return result;
84+
}
85+
7986
private Map<String, String> getMapping(ComposedSchema composedSchema) {
8087
Map<String, String> reverseMapping = new HashMap<>();
8188
for (Schema schema : composedSchema.getOneOf()) {

src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/SchemaDiffResult.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import com.qdesrame.openapi.diff.model.ChangedSchema;
66
import com.qdesrame.openapi.diff.model.DiffContext;
77
import com.qdesrame.openapi.diff.model.ListDiff;
8+
import com.qdesrame.openapi.diff.model.schema.ChangedReadOnly;
9+
import com.qdesrame.openapi.diff.model.schema.ChangedWriteOnly;
810
import io.swagger.v3.oas.models.Components;
911
import io.swagger.v3.oas.models.media.Schema;
1012
import lombok.Getter;
@@ -42,8 +44,8 @@ public Optional<ChangedSchema> diff(HashSet<String> refSet, Components leftCompo
4244
changedSchema.setChangeDefault(!Objects.equals(left.getDefault(), right.getDefault()));
4345
changedSchema.setChangeEnum(ListDiff.diff(left.getEnum(), right.getEnum()));
4446
changedSchema.setChangeFormat(!Objects.equals(left.getFormat(), right.getFormat()));
45-
changedSchema.setChangeReadOnly(!Boolean.TRUE.equals(left.getReadOnly()) && Boolean.TRUE.equals(right.getReadOnly()));
46-
changedSchema.setChangeWriteOnly(!Boolean.TRUE.equals(left.getWriteOnly()) && Boolean.TRUE.equals(right.getWriteOnly()));
47+
changedSchema.setChangedReadOnly(new ChangedReadOnly(context, left.getReadOnly(), right.getReadOnly()));
48+
changedSchema.setChangedWriteOnly(new ChangedWriteOnly(context, left.getWriteOnly(), right.getWriteOnly()));
4749
changedSchema.setChangedMaxLength(!Objects.equals(left.getMaxLength(), right.getMaxLength()));
4850

4951
Map<String, Schema> leftProperties = null == left ? null : left.getProperties();

src/main/java/com/qdesrame/openapi/diff/model/ChangedOneOfSchema.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.qdesrame.openapi.diff.model;
22

3+
import io.swagger.v3.oas.models.media.Schema;
34
import lombok.Getter;
45
import lombok.Setter;
56

@@ -15,8 +16,8 @@ public class ChangedOneOfSchema implements Changed {
1516
private final Map<String, String> newMapping;
1617
private final DiffContext context;
1718

18-
private Map<String, String> increasedMapping;
19-
private Map<String, String> missingMapping;
19+
private Map<String, Schema> increasedMapping;
20+
private Map<String, Schema> missingMapping;
2021
private Map<String, ChangedSchema> changedMapping;
2122

2223
public ChangedOneOfSchema(Map<String, String> oldMapping, Map<String, String> newMapping, DiffContext context) {

src/main/java/com/qdesrame/openapi/diff/model/ChangedSchema.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.qdesrame.openapi.diff.model;
22

3+
import com.qdesrame.openapi.diff.model.schema.ChangedReadOnly;
4+
import com.qdesrame.openapi.diff.model.schema.ChangedWriteOnly;
35
import com.qdesrame.openapi.diff.utils.ChangedUtils;
46
import io.swagger.v3.oas.models.media.Schema;
57
import lombok.Getter;
@@ -29,8 +31,8 @@ public class ChangedSchema implements Changed {
2931
protected boolean changeDefault;
3032
protected ListDiff changeEnum;
3133
protected boolean changeFormat;
32-
protected boolean changeReadOnly;
33-
protected boolean changeWriteOnly;
34+
protected ChangedReadOnly changedReadOnly;
35+
protected ChangedWriteOnly changedWriteOnly;
3436
protected boolean changedType;
3537
protected boolean changedMaxLength;
3638
protected boolean discriminatorPropertyChanged;
@@ -46,8 +48,8 @@ public ChangedSchema() {
4648
@Override
4749
public DiffResult isChanged() {
4850
if (!changedType && (oldSchema == null && newSchema == null || oldSchema != null && newSchema != null)
49-
&& !changeWriteOnly && !changedMaxLength && !changeReadOnly
50-
&& (changeEnum == null || changeEnum.isUnchanged())
51+
&& ChangedUtils.isUnchanged(changedWriteOnly) && ChangedUtils.isUnchanged(changedReadOnly)
52+
&& !changedMaxLength && (changeEnum == null || changeEnum.isUnchanged())
5153
&& !changeFormat && increasedProperties.size() == 0 && missingProperties.size() == 0
5254
&& changedProperties.values().size() == 0 && !changeDeprecated
5355
&& (changeRequired == null || changeRequired.isUnchanged()) && !discriminatorPropertyChanged
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.qdesrame.openapi.diff.model.schema;
2+
3+
import com.qdesrame.openapi.diff.model.Changed;
4+
import com.qdesrame.openapi.diff.model.DiffContext;
5+
import com.qdesrame.openapi.diff.model.DiffResult;
6+
7+
import java.util.Objects;
8+
import java.util.Optional;
9+
10+
public class ChangedReadOnly implements Changed {
11+
private final DiffContext context;
12+
private final boolean oldValue;
13+
private final boolean newValue;
14+
// private final boolean required;
15+
16+
public ChangedReadOnly(DiffContext context, Boolean oldValue, Boolean newValue) {
17+
this.context = context;
18+
this.oldValue = Optional.ofNullable(oldValue).orElse(false);
19+
this.newValue = Optional.ofNullable(newValue).orElse(false);
20+
// this.required = required;
21+
}
22+
23+
@Override
24+
public DiffResult isChanged() {
25+
if (Objects.equals(oldValue, newValue)) {
26+
return DiffResult.NO_CHANGES;
27+
}
28+
if (context.isResponse()) {
29+
return DiffResult.COMPATIBLE;
30+
}
31+
if (context.isRequest()) {
32+
if (Boolean.TRUE.equals(newValue)) {
33+
return DiffResult.COMPATIBLE;
34+
} else {
35+
return DiffResult.INCOMPATIBLE;
36+
}
37+
}
38+
return DiffResult.UNKNOWN;
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.qdesrame.openapi.diff.model.schema;
2+
3+
import com.qdesrame.openapi.diff.model.Changed;
4+
import com.qdesrame.openapi.diff.model.DiffContext;
5+
import com.qdesrame.openapi.diff.model.DiffResult;
6+
7+
import java.util.Objects;
8+
import java.util.Optional;
9+
10+
public class ChangedWriteOnly implements Changed {
11+
private final DiffContext context;
12+
private final boolean oldValue;
13+
private final boolean newValue;
14+
// private final boolean required;
15+
16+
public ChangedWriteOnly(DiffContext context, Boolean oldValue, Boolean newValue) {
17+
this.context = context;
18+
this.oldValue = Optional.ofNullable(oldValue).orElse(false);
19+
this.newValue = Optional.ofNullable(newValue).orElse(false);
20+
// this.required = required;
21+
}
22+
23+
@Override
24+
public DiffResult isChanged() {
25+
if (Objects.equals(oldValue, newValue)) {
26+
return DiffResult.NO_CHANGES;
27+
}
28+
if (context.isRequest()) {
29+
return DiffResult.COMPATIBLE;
30+
}
31+
if (context.isResponse()) {
32+
if (Boolean.TRUE.equals(newValue)) {
33+
return DiffResult.INCOMPATIBLE;
34+
} else {
35+
return DiffResult.COMPATIBLE;
36+
}
37+
}
38+
return DiffResult.UNKNOWN;
39+
}
40+
}

src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java

+7
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,13 @@ private String schema(int deepness, ComposedSchema schema) {
244244
.map(this::resolve)
245245
.forEach(composedChild -> sb.append(schema(deepness, composedChild)));
246246
}
247+
if (schema.getOneOf() != null && schema.getOneOf() != null) {
248+
LOGGER.debug("One of schema");
249+
sb.append(format("%sOne of:\n\n", indent(deepness)));
250+
schema.getOneOf().stream()
251+
.map(this::resolve)
252+
.forEach(composedChild -> sb.append(schema(deepness + 1, composedChild)));
253+
}
247254
return sb.toString();
248255
}
249256

0 commit comments

Comments
 (0)