Skip to content

Commit 1a02924

Browse files
authored
Merge pull request #1358 from jorgerod/gh-505
gh-505: Fix relative paths in parameters, examples and links
2 parents 74735b9 + 5405dee commit 1a02924

File tree

5 files changed

+197
-24
lines changed

5 files changed

+197
-24
lines changed

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
package io.swagger.v3.parser.processors;
22

33

4+
import java.net.URI;
5+
import java.util.Collection;
6+
import java.util.LinkedHashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Objects;
10+
411
import io.swagger.v3.oas.models.Components;
512
import io.swagger.v3.oas.models.OpenAPI;
613
import io.swagger.v3.oas.models.Operation;
@@ -13,28 +20,17 @@
1320
import io.swagger.v3.oas.models.media.ComposedSchema;
1421
import io.swagger.v3.oas.models.media.Discriminator;
1522
import io.swagger.v3.oas.models.media.MediaType;
16-
import io.swagger.v3.oas.models.media.ObjectSchema;
1723
import io.swagger.v3.oas.models.media.Schema;
1824
import io.swagger.v3.oas.models.parameters.Parameter;
1925
import io.swagger.v3.oas.models.parameters.RequestBody;
2026
import io.swagger.v3.oas.models.responses.ApiResponse;
21-
import io.swagger.v3.oas.models.responses.ApiResponses;
2227
import io.swagger.v3.oas.models.security.SecurityScheme;
2328
import io.swagger.v3.parser.ResolverCache;
2429
import io.swagger.v3.parser.models.RefFormat;
2530
import io.swagger.v3.parser.models.RefType;
26-
import io.swagger.v3.parser.util.RefUtils;
27-
2831
import org.apache.commons.lang3.StringUtils;
2932
import org.slf4j.LoggerFactory;
3033

31-
import java.net.URI;
32-
import java.nio.file.Path;
33-
import java.util.Collection;
34-
import java.util.LinkedHashMap;
35-
import java.util.Map;
36-
import java.util.Objects;
37-
3834
import static io.swagger.v3.parser.util.RefUtils.computeDefinitionName;
3935
import static io.swagger.v3.parser.util.RefUtils.computeRefFormat;
4036
import static io.swagger.v3.parser.util.RefUtils.getExternalPath;
@@ -280,17 +276,24 @@ public PathItem processRefToExternalPathItem(String $ref, RefFormat refFormat) {
280276
if (schema != null) {
281277
processRefSchemaObject(mediaType.getSchema(), $ref);
282278
}
279+
if (mediaType.getExamples() != null) {
280+
processRefExamples(mediaType.getExamples(), $ref);
281+
}
282+
283283
}
284284
}
285285
}
286+
if (response.getLinks() != null) {
287+
processRefLinks(response.getLinks(), $ref);
288+
}
286289
}
287290
}
288291
}
289292
}
290293
if (operation.getRequestBody() != null) {
291294
RequestBody body = operation.getRequestBody();
292-
Schema schema = null;
293295
if (body.getContent() != null) {
296+
Schema schema;
294297
Map<String, MediaType> content = body.getContent();
295298
for (String mediaName : content.keySet()) {
296299
MediaType mediaType = content.get(mediaName);
@@ -303,6 +306,13 @@ public PathItem processRefToExternalPathItem(String $ref, RefFormat refFormat) {
303306
}
304307
}
305308
}
309+
310+
final List<Parameter> parameters = operation.getParameters();
311+
if (parameters != null) {
312+
parameters.stream()
313+
.filter(parameter -> parameter.getSchema() != null)
314+
.forEach(parameter -> this.processRefSchemaObject(parameter.getSchema(), $ref));
315+
}
306316
}
307317
}
308318
}

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
package io.swagger.v3.parser.test;
22

33

4+
import java.io.File;
5+
import java.io.IOException;
6+
import java.math.BigDecimal;
7+
import java.net.HttpURLConnection;
8+
import java.nio.charset.StandardCharsets;
9+
import java.util.ArrayList;
10+
import java.util.HashSet;
11+
import java.util.LinkedHashMap;
12+
import java.util.List;
13+
import java.util.Map;
14+
import java.util.Random;
15+
import java.util.Set;
16+
417
import com.fasterxml.jackson.databind.JsonNode;
518
import com.fasterxml.jackson.databind.node.ObjectNode;
619
import com.github.tomakehurst.wiremock.WireMockServer;
@@ -11,17 +24,19 @@
1124
import io.swagger.v3.oas.models.Components;
1225
import io.swagger.v3.oas.models.OpenAPI;
1326
import io.swagger.v3.oas.models.Operation;
14-
import io.swagger.v3.oas.models.Paths;
1527
import io.swagger.v3.oas.models.PathItem;
28+
import io.swagger.v3.oas.models.Paths;
29+
import io.swagger.v3.oas.models.examples.Example;
1630
import io.swagger.v3.oas.models.headers.Header;
1731
import io.swagger.v3.oas.models.links.Link;
18-
import io.swagger.v3.oas.models.media.*;
19-
import io.swagger.v3.oas.models.examples.Example;
2032
import io.swagger.v3.oas.models.media.ArraySchema;
2133
import io.swagger.v3.oas.models.media.ByteArraySchema;
2234
import io.swagger.v3.oas.models.media.ComposedSchema;
2335
import io.swagger.v3.oas.models.media.Content;
2436
import io.swagger.v3.oas.models.media.IntegerSchema;
37+
import io.swagger.v3.oas.models.media.MapSchema;
38+
import io.swagger.v3.oas.models.media.MediaType;
39+
import io.swagger.v3.oas.models.media.ObjectSchema;
2540
import io.swagger.v3.oas.models.media.Schema;
2641
import io.swagger.v3.oas.models.media.StringSchema;
2742
import io.swagger.v3.oas.models.parameters.HeaderParameter;
@@ -45,21 +60,22 @@
4560
import org.testng.annotations.Test;
4661
import org.testng.reporters.Files;
4762

48-
import java.io.File;
49-
import java.io.IOException;
50-
import java.math.BigDecimal;
51-
import java.net.HttpURLConnection;
52-
import java.nio.charset.StandardCharsets;
53-
import java.util.*;
54-
55-
import static com.github.tomakehurst.wiremock.client.WireMock.*;
5663
import static java.util.Arrays.asList;
5764
import static java.util.Collections.emptyList;
65+
66+
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
67+
import static com.github.tomakehurst.wiremock.client.WireMock.get;
68+
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching;
5869
import static org.hamcrest.CoreMatchers.equalTo;
5970
import static org.hamcrest.CoreMatchers.instanceOf;
6071
import static org.hamcrest.CoreMatchers.notNullValue;
6172
import static org.junit.Assert.assertThat;
62-
import static org.testng.Assert.*;
73+
import static org.testng.Assert.assertEquals;
74+
import static org.testng.Assert.assertFalse;
75+
import static org.testng.Assert.assertNotNull;
76+
import static org.testng.Assert.assertNull;
77+
import static org.testng.Assert.assertTrue;
78+
import static org.testng.Assert.fail;
6379

6480

6581
public class OpenAPIV3ParserTest {
@@ -147,6 +163,21 @@ public void testIssue_1292() {
147163
assertNotNull(openAPI.getComponents().getSchemas().get("Error"));
148164
}
149165

166+
@Test
167+
public void testIssue_505() {
168+
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
169+
ParseOptions options = new ParseOptions();
170+
options.setResolve(true);
171+
SwaggerParseResult parseResult = openApiParser.readLocation("issue-505/petstore.yml", null, options);
172+
OpenAPI openAPI = parseResult.getOpenAPI();
173+
174+
assertNotNull(openAPI.getComponents().getSchemas().get("DateWithExample"));
175+
assertNotNull(openAPI.getComponents().getExamples().get("DateWithExample"));
176+
assertNotNull(openAPI.getComponents().getLinks().get("userRepository"));
177+
178+
assertEquals(3, openAPI.getPaths().get("/pets").getGet().getParameters().size());
179+
}
180+
150181
@Test
151182
public void testFlattenComposedSchema() {
152183
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
components:
2+
schemas:
3+
Pet:
4+
type: object
5+
required:
6+
- id
7+
- name
8+
properties:
9+
id:
10+
type: integer
11+
format: int64
12+
name:
13+
type: string
14+
tag:
15+
type: string
16+
Pets:
17+
type: array
18+
items:
19+
$ref: "#/components/schemas/Pet"
20+
Error:
21+
type: object
22+
required:
23+
- code
24+
- message
25+
properties:
26+
code:
27+
type: integer
28+
format: int32
29+
message:
30+
type: string
31+
32+
links:
33+
userRepository:
34+
operationId: getRepository
35+
requestBody: '$response.body#/slug'
36+
headers:
37+
X-Rate-Limit:
38+
description: The number of allowed requests in the current period
39+
schema:
40+
type: integer
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
get:
2+
summary: List all pets
3+
operationId: listPets
4+
tags:
5+
- pets
6+
parameters:
7+
- name: myParam
8+
in: query
9+
description: Param
10+
required: true
11+
schema:
12+
$ref: 'def.yml#/components/schemas/Pet'
13+
- name: myParam2
14+
in: query
15+
description: Param2
16+
required: true
17+
schema:
18+
$ref: './def.yml#/components/schemas/Pet'
19+
- name: myParam3
20+
in: query
21+
description: Param3
22+
required: true
23+
schema:
24+
$ref: '../pets/def.yml#/components/schemas/Pet'
25+
responses:
26+
"200":
27+
description: A paged array of pets
28+
headers:
29+
x-next:
30+
description: A link to the next page of responses
31+
schema:
32+
type: string
33+
content:
34+
application/json:
35+
schema:
36+
$ref: "./def.yml#/components/schemas/Pets"
37+
default:
38+
description: unexpected error
39+
content:
40+
application/json:
41+
schema:
42+
$ref: "./def.yml#/components/schemas/Error"
43+
post:
44+
summary: Create a pet
45+
operationId: createPets
46+
tags:
47+
- pets
48+
responses:
49+
'201':
50+
description: New guest added to event list
51+
content:
52+
application/json:
53+
schema:
54+
properties:
55+
test:
56+
type: string
57+
examples:
58+
testExamples:
59+
$ref: "../petstore.yml#/components/schemas/DateWithExample"
60+
links:
61+
userRepository:
62+
$ref: 'def.yml#/components/links/userRepository'
63+
default:
64+
description: unexpected error
65+
content:
66+
application/json:
67+
schema:
68+
$ref: "./def.yml#/components/schemas/Error"
69+
example:
70+
$ref: "../petstore.yml#/components/schemas/DateWithExample"
71+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
openapi: "3.0.0"
2+
info:
3+
version: 1.0.0
4+
title: Swagger Petstore
5+
license:
6+
name: MIT
7+
servers:
8+
- url: http://petstore.swagger.io/v1
9+
paths:
10+
/pets:
11+
$ref: "./pets/pets.yml"
12+
13+
components:
14+
schemas:
15+
Date:
16+
type: string
17+
format: date
18+
DateWithExample:
19+
$ref: '#/components/schemas/Date'
20+
description: Date schema extended with a `default` value... Or not?
21+
default: 2000-01-01

0 commit comments

Comments
 (0)