Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,10 @@ public Paths getPaths(ObjectNode obj, String location, ParseResult result) {
for (String pathName : pathKeys) {
JsonNode pathValue = obj.get(pathName);
if(pathName.startsWith("x-")) {
result.unsupported(location, pathName, pathValue);
Map <String,Object> extensions = getExtensions(obj);
if(extensions != null && extensions.size() > 0) {
paths.setExtensions(extensions);
}
} else {
if (!pathValue.getNodeType().equals(JsonNodeType.OBJECT)) {
result.invalidType(location, pathName, "object", pathValue);
Expand Down Expand Up @@ -2234,11 +2237,18 @@ public ApiResponses getResponses(ObjectNode node, String location, ParseResult r
Set<String> keys = getKeys(node);

for (String key : keys) {
ObjectNode obj = getObject(key, node, false, String.format("%s.%s", location, "responses"), result);
if(obj != null) {
ApiResponse response = getResponse(obj, String.format("%s.%s", location, key), result);
if(response != null) {
apiResponses.put(key, response);
if (key.startsWith("x-")) {
Map <String,Object> extensions = getExtensions(node);
if(extensions != null && extensions.size() > 0) {
apiResponses.setExtensions(extensions);
}
} else {
ObjectNode obj = getObject(key, node, false, String.format("%s.%s", location, "responses"), result);
if (obj != null) {
ApiResponse response = getResponse(obj, String.format("%s.%s", location, key), result);
if (response != null) {
apiResponses.put(key, response);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,17 @@ public class OpenAPIV3ParserTest {
protected int serverPort = getDynamicPort();
protected WireMockServer wireMockServer;

@Test
public void testIssue719() {
final OpenAPI openAPI = new OpenAPIV3Parser().readLocation("extensions-responses.yaml", null, new ParseOptions()).getOpenAPI();

Assert.assertNotNull(openAPI);

Assert.assertNotNull(openAPI.getPaths().getExtensions());
Assert.assertNotNull(openAPI.getPaths().get("/something").getGet().getResponses().getExtensions());

}

@Test
public void issue682() throws Exception {
OpenAPIV3Parser parser = new OpenAPIV3Parser();
Expand Down Expand Up @@ -798,8 +809,7 @@ public void testIssue() {

assertEquals(((Map) openAPI.getExtensions().get("x-some-vendor")).get("sometesting"), "bye!");
assertEquals(openAPI.getPaths().get("/foo").getExtensions().get("x-something"), "yes, it is supported");
assertTrue(result.getMessages().size() == 1);
assertEquals(result.getMessages().get(0), "attribute paths.x-nothing is unsupported");

}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ public void testEmptyDefinitions() throws Exception {
assertNotNull(openAPI.getComponents().getSchemas().get("mydefinition"));



}


Expand Down
155 changes: 155 additions & 0 deletions modules/swagger-parser-v3/src/test/resources/extensions-responses.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
openapi: 3.0.0
servers: []
info:
version: '1.0'
title: Extensions everywhere!
x-apis-json:
image: >-
https://s3.amazonaws.com/kinlane-productions/api-evangelist/t-shirts/KL_InApiWeTrust-1000.png
humanURL: 'http://developer.apievangelist.com'
baseURL: 'http://api.apievangelist.com/definitions/Analysis'
tags:
- blog
- industry
- analysis
- new
- API
- Application Programming Interface
properties:
- type: X-signup
url: 'https://apievangelist.3scale.net/'
- type: X-blog
url: 'http://developer.apievangelist.com/blog/'
- type: X-apicommonsmanifest
url: >-
https://raw.githubusercontent.com/kinlane/analysis-api/master/api-commons-manifest.json
contact:
name: Developer
x-contact-extension: Support not available on weekends
license:
name: Apache 2.0
x-notes: hello
externalDocs:
description: Learn more about this API
url: 'http://example.com/api-docs'
x-docs-extension: something something
tags:
- name: pets
x-tag-extension: fooooo
externalDocs:
description: Learn more about pet operations
url: 'http://example.com/api-docs'
x-tag-docs-extension: Yeah
x-definitions:
DayOfWeek:
type: integer
format: int32
minimum: 0
maximum: 6
paths:
/post:
post:
responses:
'200':
description: OK
requestBody:
content:
application/json:
schema:
type: object
properties:
status:
type: string
required:
- status
application/xml:
schema:
type: object
properties:
status:
type: string
required:
- status
required: true
x-paths-extension: value
/something:
x-path-item-extension: true
get:
x-version: 1.1
parameters:
- in: query
name: ids
schema:
type: array
items:
type: integer
x-example: 2
externalDocs:
description: Learn more about this operation
url: 'http://example.com/api-docs'
x-operation-docs-extension: foo bar
responses:
'200':
description: OK
x-response-extension: OK?!
headers:
X-Rate-Limit:
x-example: 200
schema:
type: integer
x-responses-extension: hello
security:
- BasicAuth: []
- APIKeyHeader: []
APIKeyQueryParam: []
- OAuth2Implicit:
- 'read:pets'
- 'write:pets'
components:
securitySchemes:
BasicAuth:
type: http
description: Basic authentication using login and password
scheme: basic
APIKeyHeader:
type: apiKey
in: header
name: X-API-Key
APIKeyQueryParam:
type: apiKey
in: query
name: api_key
OAuth2Implicit:
type: oauth2
x-auth-extension: hello
flows:
implicit:
authorizationUrl: 'http://swagger.io/api/oauth/dialog'
scopes:
'write:pets': modify pets in your account
'read:pets': read your pets
x-scope-extension: hello
schemas:
String:
type: string
nullable: true
ArrayOfInt:
type: array
items:
type: integer
nullable: true
nullable: true
User:
type: object
xml:
name: USER
x-xml-extension: something
Dictionary:
type: object
additionalProperties:
type: integer
x-extension: Foo bar
externalDocs:
description: Learn more about dictionaries
url: 'http://api.example.com/docs'
x-extension: Yeah