Skip to content

Commit 7360fd6

Browse files
Merge pull request #48 from apiaddicts/fix/42/propertie_example_defined
Fix/42/propertie example defined
2 parents 6dc6a9f + b139b42 commit 7360fd6

File tree

3 files changed

+42
-22
lines changed

3 files changed

+42
-22
lines changed

src/main/java/apiaddicts/sonar/openapi/checks/examples/OAR031ExamplesCheck.java

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
package apiaddicts.sonar.openapi.checks.examples;
22

3+
import apiaddicts.sonar.openapi.checks.BaseCheck;
4+
import static apiaddicts.sonar.openapi.utils.JsonNodeUtils.getType;
5+
import static apiaddicts.sonar.openapi.utils.JsonNodeUtils.isArrayType;
6+
import static apiaddicts.sonar.openapi.utils.JsonNodeUtils.isExternalRef;
7+
import static apiaddicts.sonar.openapi.utils.JsonNodeUtils.isObjectType;
8+
import static apiaddicts.sonar.openapi.utils.JsonNodeUtils.isOperation;
9+
import static apiaddicts.sonar.openapi.utils.JsonNodeUtils.resolve;
310
import com.google.common.collect.ImmutableSet;
411
import com.sonar.sslr.api.AstNodeType;
5-
import org.sonar.check.Rule;
6-
import org.apiaddicts.apitools.dosonarapi.api.v2.OpenApi2Grammar;
7-
import org.apiaddicts.apitools.dosonarapi.api.v3.OpenApi3Grammar;
8-
import org.apiaddicts.apitools.dosonarapi.api.v31.OpenApi31Grammar;
9-
import apiaddicts.sonar.openapi.checks.BaseCheck;
10-
import org.apiaddicts.apitools.dosonarapi.sslr.yaml.grammar.JsonNode;
11-
1212
import java.util.List;
1313
import java.util.Map;
1414
import java.util.Set;
1515
import java.util.stream.Collectors;
16-
17-
import static apiaddicts.sonar.openapi.utils.JsonNodeUtils.*;
16+
import org.apiaddicts.apitools.dosonarapi.api.v2.OpenApi2Grammar;
17+
import org.apiaddicts.apitools.dosonarapi.api.v3.OpenApi3Grammar;
18+
import org.apiaddicts.apitools.dosonarapi.api.v31.OpenApi31Grammar;
19+
import org.apiaddicts.apitools.dosonarapi.sslr.yaml.grammar.JsonNode;
20+
import org.sonar.check.Rule;
1821

1922
@Rule(key = OAR031ExamplesCheck.KEY)
2023
public class OAR031ExamplesCheck extends BaseCheck {
@@ -52,7 +55,9 @@ private void visitV2Node(JsonNode node) {
5255
}
5356
responseNode = resolve(responseNode);
5457
visitResponseV2Node(responseNode);
55-
if (externalRefManagement) externalRefNode = null;
58+
if (externalRefManagement) {
59+
externalRefNode = null;
60+
}
5661
}
5762
}
5863
}
@@ -80,8 +85,10 @@ private void visitV3Node(JsonNode node) {
8085
}
8186
responseNode = resolve(responseNode);
8287
visitRequestBodyOrResponseV3Node(responseNode);
83-
if (externalRefManagement) externalRefNode = null;
84-
}
88+
if (externalRefManagement) {
89+
externalRefNode = null;
90+
}
91+
}
8592
}
8693
} else if (type.equals(OpenApi3Grammar.SCHEMA)) {
8794
visitSchemaNode(node);
@@ -92,7 +99,9 @@ private void visitV3Node(JsonNode node) {
9299

93100
private void visitRequestBodyOrResponseV3Node(JsonNode node) {
94101
JsonNode content = node.at("/content");
95-
if (content.isMissing()) return;
102+
if (content.isMissing()) {
103+
return;
104+
}
96105
for (JsonNode mediaTypeNode : content.propertyMap().values()) {
97106
AstNodeType type = node.getType();
98107
JsonNode schemaNode = mediaTypeNode.get("schema");
@@ -117,8 +126,13 @@ private void visitSchemaNode(JsonNode node) {
117126
if (node.get("example").isMissing() && parentNode.get("example").isMissing() && parentNode.get("examples").isMissing()) {
118127
addIssue(KEY, translate("OAR031.error-parameter"), parentNode);
119128
}
120-
} else if (parentNode.getType().equals(OpenApi3Grammar.SCHEMA_PROPERTIES) ||
121-
parentNode.getType().toString().equals("BLOCK_MAPPING") || parentNode.getType().toString().equals("FLOW_MAPPING")) {
129+
} else if (parentNode.getType().equals(OpenApi3Grammar.SCHEMA_PROPERTIES)
130+
|| parentNode.getType().toString().equals("BLOCK_MAPPING") || parentNode.getType().toString().equals("FLOW_MAPPING")) {
131+
JsonNode schemaParent = (JsonNode) parentNode.getParent().getParent();
132+
if (schemaParent != null && !schemaParent.get("allOf").isMissing()) {
133+
return;
134+
}
135+
122136
JsonNode type = getType(node);
123137
if (!isObjectType(type) && !type.isMissing() && !isArrayType(type)) {
124138
if (node.get("example").isMissing()) {
@@ -129,7 +143,7 @@ private void visitSchemaNode(JsonNode node) {
129143
}
130144

131145
private void visitPathNode(JsonNode node) {
132-
List<JsonNode> allResponses = node.properties().stream().filter(propertyNode -> isOperation(propertyNode))
146+
List<JsonNode> allResponses = node.properties().stream().filter(propertyNode -> isOperation(propertyNode))
133147
.map(JsonNode::value)
134148
.flatMap(n -> n.properties().stream())
135149
.map(JsonNode::value)
@@ -148,15 +162,21 @@ private void visitPathNode(JsonNode node) {
148162
} else if (responseNode.getType().equals(OpenApi3Grammar.RESPONSE)) {
149163
JsonNode content = responseNode.at("/content");
150164
if (content.isMissing()) {
151-
if (externalRefManagement) externalRefNode = null;
165+
if (externalRefManagement) {
166+
externalRefNode = null;
167+
}
152168
continue;
153169
}
154170
content.propertyMap().forEach((mediaType, mediaTypeNode) -> { // estudiar función lambda
155-
if (!mediaType.toLowerCase().contains("json")) return;
156-
visitSchemaNode2(mediaTypeNode);
171+
if (!mediaType.toLowerCase().contains("json")) {
172+
return;
173+
}
174+
visitSchemaNode(mediaTypeNode);
157175
});
158176
}
159-
if (externalRefManagement) externalRefNode = null;
177+
if (externalRefManagement) {
178+
externalRefNode = null;
179+
}
160180
}
161181
}
162182

src/test/resources/checks/v3/examples/OAR031/valid.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ components:
9494
size:
9595
type: integer
9696
example: 1
97-
pets: # Noncompliant {{OAR031: Properties must have an example defined}}
97+
pets:
9898
type: array
9999
items:
100100
$ref: '#/components/schemas/pet'

src/test/resources/checks/v3/examples/OAR031/without-examples.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ components:
5757
properties:
5858
size: # Noncompliant {{OAR031: Properties must have an example defined}}
5959
type: integer
60-
pets: # Noncompliant {{OAR031: Properties must have an example defined}}
60+
pets:
6161
type: array
6262
items:
6363
$ref: '#/components/schemas/pet'

0 commit comments

Comments
 (0)