forked from loafle/openapi-generator-original
* StackOverflowFix for Issue 8671 * update samples Co-authored-by: William Cheng <wing328hk@gmail.com>
This commit is contained in:
parent
bf859c640e
commit
fae4d7a73d
@ -999,13 +999,13 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
|
||||
List<CodegenOperation> operations = (List<CodegenOperation>) objectMap.get("operation");
|
||||
for (CodegenOperation operation : operations) {
|
||||
for (CodegenParameter cp : operation.allParams) {
|
||||
cp.vendorExtensions.put("x-swift-example", constructExampleCode(cp, modelMaps, new HashSet()));
|
||||
cp.vendorExtensions.put("x-swift-example", constructExampleCode(cp, modelMaps, new HashSet<String>()));
|
||||
}
|
||||
}
|
||||
return objs;
|
||||
}
|
||||
|
||||
public String constructExampleCode(CodegenParameter codegenParameter, HashMap<String, CodegenModel> modelMaps, Set visitedModels) {
|
||||
public String constructExampleCode(CodegenParameter codegenParameter, HashMap<String, CodegenModel> modelMaps, Set<String> visitedModels) {
|
||||
if (codegenParameter.isArray) { // array
|
||||
return "[" + constructExampleCode(codegenParameter.items, modelMaps, visitedModels) + "]";
|
||||
} else if (codegenParameter.isMap) { // TODO: map, file type
|
||||
@ -1037,11 +1037,11 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
|
||||
} else { // model
|
||||
// look up the model
|
||||
if (modelMaps.containsKey(codegenParameter.dataType)) {
|
||||
if (visitedModels.contains(modelMaps.get(codegenParameter.dataType))) {
|
||||
if (visitedModels.contains(codegenParameter.dataType)) {
|
||||
// recursive/self-referencing model, simply return nil to avoid stackoverflow
|
||||
return "nil";
|
||||
} else {
|
||||
visitedModels.add(modelMaps.get(codegenParameter.dataType));
|
||||
visitedModels.add(codegenParameter.dataType);
|
||||
return constructExampleCode(modelMaps.get(codegenParameter.dataType), modelMaps, visitedModels);
|
||||
}
|
||||
} else {
|
||||
@ -1051,7 +1051,7 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
|
||||
}
|
||||
}
|
||||
|
||||
public String constructExampleCode(CodegenProperty codegenProperty, HashMap<String, CodegenModel> modelMaps, Set visitedModels) {
|
||||
public String constructExampleCode(CodegenProperty codegenProperty, HashMap<String, CodegenModel> modelMaps, Set<String> visitedModels) {
|
||||
if (codegenProperty.isArray) { // array
|
||||
return "[" + constructExampleCode(codegenProperty.items, modelMaps, visitedModels) + "]";
|
||||
} else if (codegenProperty.isMap) { // TODO: map, file type
|
||||
@ -1083,10 +1083,11 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
|
||||
} else {
|
||||
// look up the model
|
||||
if (modelMaps.containsKey(codegenProperty.dataType)) {
|
||||
if (visitedModels.contains(modelMaps.get(codegenProperty.dataType))) {
|
||||
if (visitedModels.contains(codegenProperty.dataType)) {
|
||||
// recursive/self-referencing model, simply return nil to avoid stackoverflow
|
||||
return "nil";
|
||||
} else {
|
||||
visitedModels.add(codegenProperty.dataType);
|
||||
return constructExampleCode(modelMaps.get(codegenProperty.dataType), modelMaps, visitedModels);
|
||||
}
|
||||
} else {
|
||||
@ -1096,7 +1097,7 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
|
||||
}
|
||||
}
|
||||
|
||||
public String constructExampleCode(CodegenModel codegenModel, HashMap<String, CodegenModel> modelMaps, Set visitedModels) {
|
||||
public String constructExampleCode(CodegenModel codegenModel, HashMap<String, CodegenModel> modelMaps, Set<String> visitedModels) {
|
||||
String example;
|
||||
example = codegenModel.name + "(";
|
||||
List<String> propertyExamples = new ArrayList<>();
|
||||
|
@ -185,4 +185,37 @@ public class Swift5ClientCodegenTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test(description = "Bug example code generation 2", enabled = true)
|
||||
public void crashSwift5ExampleCodeGenerationStackOverflowBug_2Test() throws IOException {
|
||||
//final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/bugs/Swift5CodeGenerationStackOverflow#2966.yaml");
|
||||
Path target = Files.createTempDirectory("test");
|
||||
File output = target.toFile();
|
||||
try {
|
||||
final CodegenConfigurator configurator = new CodegenConfigurator()
|
||||
.setGeneratorName("swift5")
|
||||
.setValidateSpec(false)
|
||||
// .setInputSpec("http://localhost:8080/api/openapi.yaml")
|
||||
.setInputSpec("src/test/resources/bugs/Swift5CodeGenarationBug2.yaml")
|
||||
//.setInputSpec("http://localhost:8080/api/openapi.yaml")
|
||||
.setEnablePostProcessFile(true)
|
||||
.setOutputDir(target.toAbsolutePath().toString());
|
||||
|
||||
final ClientOptInput clientOptInput = configurator.toClientOptInput();
|
||||
DefaultGenerator generator = new DefaultGenerator(false);
|
||||
|
||||
generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true");
|
||||
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "true");
|
||||
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "true");
|
||||
generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true");
|
||||
generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "true");
|
||||
generator.setGeneratorPropertyDefault(CodegenConstants.API_DOCS, "true");
|
||||
generator.setGeneratorPropertyDefault(CodegenConstants.ENABLE_POST_PROCESS_FILE, "true");
|
||||
|
||||
List<File> files = generator.opts(clientOptInput).generate();
|
||||
Assert.assertTrue(files.size() > 0, "No files generated");
|
||||
} finally {
|
||||
output.delete();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,101 @@
|
||||
openapi: 3.0.1
|
||||
info:
|
||||
title: XXX
|
||||
description: Das ist jetzt der erste OpenAPI 3.0 Endpoint
|
||||
contact:
|
||||
email: XXX.XXX@XXX.de
|
||||
version: "1.0"
|
||||
paths:
|
||||
/api/v1/petresource/pet:
|
||||
post:
|
||||
tags:
|
||||
- v1/petresource
|
||||
summary: Save a Pet.
|
||||
description: Save a Pet.
|
||||
operationId: savePet
|
||||
requestBody:
|
||||
content:
|
||||
'*/*':
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pet'
|
||||
responses:
|
||||
default:
|
||||
description: PetResponse
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Pet'
|
||||
/api/v1/petresource/petstore:
|
||||
post:
|
||||
tags:
|
||||
- v1/petresource
|
||||
summary: Save a Petstore.
|
||||
description: Save a Petstore.
|
||||
operationId: savePetStore
|
||||
requestBody:
|
||||
content:
|
||||
'*/*':
|
||||
schema:
|
||||
$ref: '#/components/schemas/PetStore'
|
||||
responses:
|
||||
default:
|
||||
description: PetStore
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/PetStore'
|
||||
components:
|
||||
schemas:
|
||||
Cat:
|
||||
required:
|
||||
- type
|
||||
type: object
|
||||
description: Cat
|
||||
allOf:
|
||||
- $ref: '#/components/schemas/Pet'
|
||||
- type: object
|
||||
properties:
|
||||
catFood:
|
||||
type: string
|
||||
Dog:
|
||||
required:
|
||||
- type
|
||||
type: object
|
||||
description: Dog
|
||||
allOf:
|
||||
- $ref: '#/components/schemas/Pet'
|
||||
- type: object
|
||||
properties:
|
||||
dogFood:
|
||||
type: string
|
||||
Pet:
|
||||
required:
|
||||
- type
|
||||
type: object
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
description: Name
|
||||
store:
|
||||
$ref: '#/components/schemas/PetStore'
|
||||
mother:
|
||||
$ref: '#/components/schemas/Pet'
|
||||
father:
|
||||
$ref: '#/components/schemas/Pet'
|
||||
type:
|
||||
type: string
|
||||
description: Type Diskriminator
|
||||
description: Base Pet
|
||||
discriminator:
|
||||
propertyName: type
|
||||
mapping:
|
||||
Dog: '#/components/schemas/Dog'
|
||||
Cat: '#/components/schemas/Cat'
|
||||
PetStore:
|
||||
type: object
|
||||
properties:
|
||||
pets:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/Pet'
|
||||
description: PetStore
|
@ -228,7 +228,7 @@ For this test, the body for this request much reference a schema named `File`.
|
||||
// The following code samples are still beta. For any issue, please report via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
import PetstoreClient
|
||||
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [File(sourceURI: "sourceURI_example")]) // FileSchemaTestClass |
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [nil]) // FileSchemaTestClass |
|
||||
|
||||
FakeAPI.testBodyWithFileSchema(body: body) { (response, error) in
|
||||
guard error == nil else {
|
||||
|
@ -228,7 +228,7 @@ For this test, the body for this request much reference a schema named `File`.
|
||||
// The following code samples are still beta. For any issue, please report via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
import PetstoreClient
|
||||
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [File(sourceURI: "sourceURI_example")]) // FileSchemaTestClass |
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [nil]) // FileSchemaTestClass |
|
||||
|
||||
FakeAPI.testBodyWithFileSchema(body: body) { (response, error) in
|
||||
guard error == nil else {
|
||||
|
@ -228,7 +228,7 @@ For this test, the body for this request much reference a schema named `File`.
|
||||
// The following code samples are still beta. For any issue, please report via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
import PetstoreClient
|
||||
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [File(sourceURI: "sourceURI_example")]) // FileSchemaTestClass |
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [nil]) // FileSchemaTestClass |
|
||||
|
||||
FakeAPI.testBodyWithFileSchema(body: body) { (response, error) in
|
||||
guard error == nil else {
|
||||
|
@ -228,7 +228,7 @@ For this test, the body for this request much reference a schema named `File`.
|
||||
// The following code samples are still beta. For any issue, please report via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
import PetstoreClient
|
||||
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [File(sourceURI: "sourceURI_example")]) // FileSchemaTestClass |
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [nil]) // FileSchemaTestClass |
|
||||
|
||||
FakeAPI.testBodyWithFileSchema(body: body) { (response, error) in
|
||||
guard error == nil else {
|
||||
|
@ -228,7 +228,7 @@ For this test, the body for this request much reference a schema named `File`.
|
||||
// The following code samples are still beta. For any issue, please report via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
import PetstoreClient
|
||||
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [File(sourceURI: "sourceURI_example")]) // FileSchemaTestClass |
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [nil]) // FileSchemaTestClass |
|
||||
|
||||
FakeAPI.testBodyWithFileSchema(body: body) { (response, error) in
|
||||
guard error == nil else {
|
||||
|
@ -216,7 +216,7 @@ For this test, the body for this request much reference a schema named `File`.
|
||||
// The following code samples are still beta. For any issue, please report via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
import PetstoreClient
|
||||
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [File(sourceURI: "sourceURI_example")]) // FileSchemaTestClass |
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [nil]) // FileSchemaTestClass |
|
||||
|
||||
FakeAPI.testBodyWithFileSchema(body: body).then {
|
||||
// when the promise is fulfilled
|
||||
|
@ -228,7 +228,7 @@ For this test, the body for this request much reference a schema named `File`.
|
||||
// The following code samples are still beta. For any issue, please report via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
import PetstoreClient
|
||||
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [File(sourceURI: "sourceURI_example")]) // FileSchemaTestClass |
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [nil]) // FileSchemaTestClass |
|
||||
|
||||
FakeAPI.testBodyWithFileSchema(body: body) { (response, error) in
|
||||
guard error == nil else {
|
||||
|
@ -228,7 +228,7 @@ For this test, the body for this request much reference a schema named `File`.
|
||||
// The following code samples are still beta. For any issue, please report via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
import PetstoreClient
|
||||
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [File(sourceURI: "sourceURI_example")]) // FileSchemaTestClass |
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [nil]) // FileSchemaTestClass |
|
||||
|
||||
FakeAPI.testBodyWithFileSchema(body: body) { (response, error) in
|
||||
guard error == nil else {
|
||||
|
@ -192,7 +192,7 @@ For this test, the body for this request much reference a schema named `File`.
|
||||
// The following code samples are still beta. For any issue, please report via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
import PetstoreClient
|
||||
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [File(sourceURI: "sourceURI_example")]) // FileSchemaTestClass |
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [nil]) // FileSchemaTestClass |
|
||||
|
||||
// TODO RxSwift sample code not yet implemented. To contribute, please open a ticket via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
```
|
||||
|
@ -228,7 +228,7 @@ For this test, the body for this request much reference a schema named `File`.
|
||||
// The following code samples are still beta. For any issue, please report via http://github.com/OpenAPITools/openapi-generator/issues/new
|
||||
import PetstoreClient
|
||||
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [File(sourceURI: "sourceURI_example")]) // FileSchemaTestClass |
|
||||
let body = FileSchemaTestClass(file: File(sourceURI: "sourceURI_example"), files: [nil]) // FileSchemaTestClass |
|
||||
|
||||
FakeAPI.testBodyWithFileSchema(body: body) { (response, error) in
|
||||
guard error == nil else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user