From d9c874fbb875a83a844f3acd891586495f7ec22e Mon Sep 17 00:00:00 2001 From: bkoziak Date: Thu, 8 Aug 2019 16:58:14 +0200 Subject: [PATCH 1/5] type aliasing issue --- .../openapitools/codegen/DefaultCodegen.java | 29 ++++++++++++------- .../languages/CppRestSdkClientCodegen.java | 3 +- .../codegen/utils/ModelUtils.java | 23 +++++++++++---- .../codegen/DefaultCodegenTest.java | 15 ++++++++++ .../codegen/utils/ModelUtilsTest.java | 15 +++++++++- .../src/test/resources/3_0/type-alias.yaml | 26 +++++++++++++++++ 6 files changed, 91 insertions(+), 20 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/type-alias.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 90ae91674c1d..35ec0acb51da 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -1505,12 +1505,15 @@ public String toOneOfName(List names, ComposedSchema composedSchema) { } private String getSingleSchemaType(Schema schema) { - Schema unaliasSchema = ModelUtils.unaliasSchema(this.openAPI, schema); + Schema unaliasSchema = ModelUtils.unaliasSchema(this.openAPI, schema, importMapping); if (StringUtils.isNotBlank(unaliasSchema.get$ref())) { // reference to another definition/schema // get the schema/model name from $ref String schemaName = ModelUtils.getSimpleRef(unaliasSchema.get$ref()); if (StringUtils.isNotEmpty(schemaName)) { + if(importMapping.containsKey(schemaName)){ + return schemaName; + } return getAlias(schemaName); } else { LOGGER.warn("Error obtaining the datatype from ref:" + unaliasSchema.get$ref() + ". Default to 'object'"); @@ -1721,7 +1724,7 @@ public CodegenModel fromModel(String name, Schema schema) { } // unalias schema - schema = ModelUtils.unaliasSchema(this.openAPI, schema); + schema = ModelUtils.unaliasSchema(this.openAPI, schema, importMapping); if (schema == null) { LOGGER.warn("Schema {} not found", name); return null; @@ -2034,7 +2037,7 @@ public CodegenProperty fromProperty(String name, Schema p) { LOGGER.debug("debugging fromProperty for " + name + " : " + p); // unalias schema - p = ModelUtils.unaliasSchema(this.openAPI, p); + p = ModelUtils.unaliasSchema(this.openAPI, p, importMapping); CodegenProperty property = CodegenModelFactory.newInstance(CodegenModelType.PROPERTY); property.name = toVarName(name); @@ -2177,14 +2180,15 @@ public CodegenProperty fromProperty(String name, Schema p) { property.isFreeFormObject = true; } else if (ModelUtils.isArraySchema(p)) { // default to string if inner item is undefined - Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ((ArraySchema) p).getItems()); + Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ((ArraySchema) p).getItems(), importMapping); if (innerSchema == null) { LOGGER.error("Undefined array inner type for `{}`. Default to String.", p.getName()); innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type"); ((ArraySchema) p).setItems(innerSchema); } } else if (ModelUtils.isMapSchema(p)) { - Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p)); + Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p), + importMapping); if (innerSchema == null) { LOGGER.error("Undefined map inner type for `{}`. Default to String.", p.getName()); innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type"); @@ -2259,7 +2263,7 @@ public CodegenProperty fromProperty(String name, Schema p) { if (itemName == null) { itemName = property.name; } - Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ((ArraySchema) p).getItems()); + Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ((ArraySchema) p).getItems(), importMapping); if (innerSchema == null) { LOGGER.error("Undefined array inner type for `{}`. Default to String.", p.getName()); innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type"); @@ -2276,7 +2280,8 @@ public CodegenProperty fromProperty(String name, Schema p) { property.maxItems = p.getMaxProperties(); // handle inner property - Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p)); + Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p), + importMapping); if (innerSchema == null) { LOGGER.error("Undefined map inner type for `{}`. Default to String.", p.getName()); innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type"); @@ -2574,7 +2579,8 @@ public CodegenOperation fromOperation(String path, op.responses.get(op.responses.size() - 1).hasMore = false; if (methodResponse != null) { - Schema responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(methodResponse)); + Schema responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(methodResponse), + importMapping); if (responseSchema != null) { CodegenProperty cm = fromProperty("response", responseSchema); @@ -2827,7 +2833,8 @@ public CodegenResponse fromResponse(String responseCode, ApiResponse response) { } Schema responseSchema; if (this.openAPI != null && this.openAPI.getComponents() != null) { - responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(response)); + responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(response), + importMapping); } else { // no model/alias defined responseSchema = ModelUtils.getSchemaFromResponse(response); } @@ -3040,7 +3047,7 @@ public CodegenParameter fromParameter(Parameter parameter, Set imports) } if (s != null) { - Schema parameterSchema = ModelUtils.unaliasSchema(this.openAPI, s); + Schema parameterSchema = ModelUtils.unaliasSchema(this.openAPI, s, importMapping); if (parameterSchema == null) { LOGGER.warn("warning! Schema not found for parameter \"" + parameter.getName() + "\", using String"); parameterSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to missing type definition."); @@ -3626,7 +3633,7 @@ protected void addImport(CodegenModel m, String type) { private Map unaliasPropertySchema(Map properties) { if (properties != null) { for (String key : properties.keySet()) { - properties.put(key, ModelUtils.unaliasSchema(this.openAPI, properties.get(key))); + properties.put(key, ModelUtils.unaliasSchema(this.openAPI, properties.get(key),importMapping())); } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java index aabac7f7a38c..590cc5379186 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java @@ -31,7 +31,6 @@ import java.util.*; import static com.google.common.base.Strings.isNullOrEmpty; -import static org.openapitools.codegen.utils.StringUtils.*; public class CppRestSdkClientCodegen extends AbstractCppCodegen { @@ -238,7 +237,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation if (methodResponse != null) { Schema response = ModelUtils.getSchemaFromResponse(methodResponse); - response = ModelUtils.unaliasSchema(this.openAPI, response); + response = ModelUtils.unaliasSchema(this.openAPI, response, importMapping); if (response != null) { CodegenProperty cm = fromProperty("response", response); op.vendorExtensions.put("x-codegen-response", cm); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java index ad991f679545..f289ac8a04f6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java @@ -786,9 +786,12 @@ private static Schema getSchemaFromContent(Content content) { * * @param openAPI specification being checked * @param schema schema (alias or direct reference) + * @param importMappings mappings of external types to be omitted by unaliasing * @return actual schema */ - public static Schema unaliasSchema(OpenAPI openAPI, Schema schema) { + public static Schema unaliasSchema(OpenAPI openAPI, + Schema schema, + Map importMappings) { Map allSchemas = getSchemas(openAPI); if (allSchemas == null || allSchemas.isEmpty()) { // skip the warning as the spec can have no model defined @@ -797,7 +800,12 @@ public static Schema unaliasSchema(OpenAPI openAPI, Schema schema) { } if (schema != null && StringUtils.isNotEmpty(schema.get$ref())) { - Schema ref = allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())); + String simpleRef = ModelUtils.getSimpleRef(schema.get$ref()); + if(importMappings.containsKey(simpleRef)){ + LOGGER.info("Schema unaliasing of {} omitted because aliased class is to be mapped to {}", simpleRef, importMappings.get(simpleRef)); + return schema; + } + Schema ref = allSchemas.get(simpleRef); if (ref == null) { LOGGER.warn("{} is not defined", schema.get$ref()); return schema; @@ -808,7 +816,8 @@ public static Schema unaliasSchema(OpenAPI openAPI, Schema schema) { if (generateAliasAsModel) { return schema; // generate a model extending array } else { - return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref()))); + return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), + importMappings); } } else if (isComposedSchema(ref)) { return schema; @@ -820,17 +829,19 @@ public static Schema unaliasSchema(OpenAPI openAPI, Schema schema) { return schema; // generate a model extending map } else { // treat it as a typical map - return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref()))); + return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), + importMappings); } } } else if (isObjectSchema(ref)) { // model if (ref.getProperties() != null && !ref.getProperties().isEmpty()) { // has at least one property return schema; } else { // free form object (type: object) - return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref()))); + return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), + importMappings); } } else { - return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref()))); + return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), importMappings); } } return schema; diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 167177017f50..6ef84949a5b3 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -874,6 +874,21 @@ public void modelDoNotContainInheritedVars() { Assert.assertEquals(codegenModel.vars.size(), 1); } + @Test + public void importMapping() { + DefaultCodegen codegen = new DefaultCodegen(); + codegen.importMapping.put("TypeAlias", "foo.bar.TypeAlias"); + + OpenAPI openAPI = new OpenAPIParser() + .readLocation("src/test/resources/3_0/type-alias.yaml", null, new ParseOptions()).getOpenAPI(); + codegen.setOpenAPI(openAPI); + + CodegenModel codegenModel = codegen.fromModel("ParentType", openAPI.getComponents().getSchemas().get("ParentType")); + + Assert.assertEquals(codegenModel.vars.size(), 1); + Assert.assertEquals(codegenModel.vars.get(0).getBaseType(), "TypeAlias"); + } + @Test public void modelWithPrefixDoNotContainInheritedVars() { DefaultCodegen codegen = new DefaultCodegen(); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java index 4f428705a19d..4604104f77d2 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java @@ -196,7 +196,20 @@ public void testComposedSchemasAreNotUnaliased() { OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("SomeComposedSchema", composedSchema); - Assert.assertEquals(refToComposedSchema, ModelUtils.unaliasSchema(openAPI, refToComposedSchema)); + Assert.assertEquals(refToComposedSchema, ModelUtils.unaliasSchema(openAPI, refToComposedSchema, new HashMap<>())); + } + + @Test + public void testAliasedTypeIsNotUnaliasedIfUsedForImportMapping(){ + Schema emailSchema = new Schema().$ref("#/components/schemas/Email").type("string"); + StringSchema stringSchema = new StringSchema(); + HashMap importMappings = new HashMap<>(); + importMappings.put("Email","foo.bar.Email"); + + OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("Email", stringSchema); + + Assert.assertEquals(emailSchema, ModelUtils.unaliasSchema(openAPI, emailSchema, importMappings)); + Assert.assertEquals(stringSchema, ModelUtils.unaliasSchema(openAPI, emailSchema, new HashMap<>())); } /** diff --git a/modules/openapi-generator/src/test/resources/3_0/type-alias.yaml b/modules/openapi-generator/src/test/resources/3_0/type-alias.yaml new file mode 100644 index 000000000000..710395185ba1 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/type-alias.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.0 +info: + title: Sample API + description: API description in Markdown. + version: 1.0.0 +paths: + /type-alias: + get: + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ParentType' + +components: + schemas: + ParentType: + title: ParentType + type: object + properties: + typeAlias: + $ref: '#/components/schemas/TypeAlias' + TypeAlias: + type: string \ No newline at end of file From 626540f08bef83ebbb706ac1fb10a2b779306a6c Mon Sep 17 00:00:00 2001 From: Peter Steiner Date: Fri, 11 Oct 2019 19:45:44 +0200 Subject: [PATCH 2/5] Add example OpenAPI document from issue 3589 https://github.com/OpenAPITools/openapi-generator/issues/3589 --- .../src/test/resources/3_0/issue_3589.yaml | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml new file mode 100644 index 000000000000..6062877c2b99 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.0 +info: + title: Sample API + description: API description in Markdown. + version: 1.0.0 +paths: + /type-alias: + get: + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ParentType' + +components: + schemas: + ParentType: + title: ParentType + type: object + properties: + typeAlias: + $ref: '#/components/schemas/TypeAlias' + TypeAlias: + type: string From d8e27dd09a38a2ac5fb4da079bcf50c2d701ad99 Mon Sep 17 00:00:00 2001 From: Peter Steiner Date: Thu, 17 Oct 2019 10:36:27 +0200 Subject: [PATCH 3/5] Add test to reproduce the issue - type of TypeAlias changed from 'string' to 'object' (not sure if importMapping is supposed also for 'string' types...) - there might be better ways to write the test, it's kind of a brute force test (generate a file and parse it with a regexp) --- .../codegen/plugin/CodeGenMojo.java | 3 +- .../codegen/java/JavaClientCodegenTest.java | 52 ++++++++++++++++++- .../src/test/resources/3_0/issue_3589.yaml | 2 +- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java b/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java index 6a709267e407..057101528020 100644 --- a/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java +++ b/modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java @@ -619,7 +619,7 @@ public void execute() throws MojoExecutionException { configurator); } - // Retained for backwards-compataibility with configOptions -> import-mappings + // Retained for backwards-compatibility with configOptions -> import-mappings if (importMappings == null && configOptions.containsKey("import-mappings")) { applyImportMappingsKvp(configOptions.get("import-mappings").toString(), configurator); @@ -850,6 +850,7 @@ private void addCompileSourceRootIfConfigured() { } } } + /** * This method enables conversion of true/false strings in * config.additionalProperties (configuration/configOptions) to proper booleans. diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index 2f8a8d31c9ba..00efcdfc766e 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -524,11 +524,61 @@ public void testFreeFormObjects() { Assert.assertEquals(cm.getClassname(), "OtherObj"); } + /** + * Test to reproduce broken importMapping, see + * https://github.com/OpenAPITools/openapi-generator/issues/3589 + */ + @Test + public void testImportMapping() throws IOException { + + Map properties = new HashMap<>(); + properties.put(JavaClientCodegen.JAVA8_MODE, true); + properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api"); + + Map importMappings = new HashMap<>(); + importMappings.put("TypeAlias", "foo.bar.TypeAlias"); + + File output = Files.createTempDirectory("test").toFile(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("java") + .setLibrary(JavaClientCodegen.RESTEASY) + .setAdditionalProperties(properties) + .setImportMappings(importMappings) + .setInputSpec("src/test/resources/3_0/issue_3589.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + Assert.assertEquals(clientOptInput.getConfig().importMapping().get("TypeAlias"), "foo.bar.TypeAlias"); + + MockDefaultGenerator generator = new MockDefaultGenerator(); + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); + generator.opts(clientOptInput).generate(); + + Map generatedFiles = generator.getFiles(); + Assert.assertEquals(generatedFiles.size(), 1); + TestUtils.ensureContainsFile(generatedFiles, output, "src/main/java/org/openapitools/client/model/ParentType.java"); + + final String parentTypeContents = generatedFiles.values().iterator().next(); + + final Pattern FIELD_PATTERN = Pattern.compile(".* private (.*?) typeAlias;.*", Pattern.DOTALL); + Matcher fieldMatcher = FIELD_PATTERN.matcher(parentTypeContents); + Assert.assertTrue(fieldMatcher.matches()); + + // this is the type of the field 'typeAlias'. With a working importMapping it should + // be 'foo.bar.TypeAlias' or just 'TypeAlias', but currently it's just 'Object' + Assert.assertEquals(fieldMatcher.group(1), "Object"); + } + @Test public void testBearerAuth() { final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/pingBearerAuth.yaml"); JavaClientCodegen codegen = new JavaClientCodegen(); - + List security = codegen.fromSecurity(openAPI.getComponents().getSecuritySchemes()); Assert.assertEquals(security.size(), 1); Assert.assertEquals(security.get(0).isBasic, Boolean.TRUE); diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml index 6062877c2b99..72c9dc2fffba 100644 --- a/modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml @@ -23,4 +23,4 @@ components: typeAlias: $ref: '#/components/schemas/TypeAlias' TypeAlias: - type: string + type: object From 47da69c8f1f39cc171d1d09ef34561624219a8e0 Mon Sep 17 00:00:00 2001 From: Peter Steiner Date: Fri, 1 Nov 2019 18:22:43 +0100 Subject: [PATCH 4/5] Remove duplicate test file --- .../codegen/java/JavaClientCodegenTest.java | 5 ++-- .../src/test/resources/3_0/issue_3589.yaml | 26 ------------------- .../src/test/resources/3_0/type-alias.yaml | 4 +-- 3 files changed, 4 insertions(+), 31 deletions(-) delete mode 100644 modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index 74495c5e97d6..5dce077cb0b7 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -504,8 +504,7 @@ public void testFreeFormObjects() { } /** - * Test to reproduce broken importMapping, see - * https://github.com/OpenAPITools/openapi-generator/issues/3589 + * See https://github.com/OpenAPITools/openapi-generator/issues/3589 */ @Test public void testImportMapping() throws IOException { @@ -524,7 +523,7 @@ public void testImportMapping() throws IOException { .setLibrary(JavaClientCodegen.RESTEASY) .setAdditionalProperties(properties) .setImportMappings(importMappings) - .setInputSpec("src/test/resources/3_0/issue_3589.yaml") + .setInputSpec("src/test/resources/3_0/type-alias.yaml") .setOutputDir(output.getAbsolutePath().replace("\\", "/")); final ClientOptInput clientOptInput = configurator.toClientOptInput(); diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml deleted file mode 100644 index 72c9dc2fffba..000000000000 --- a/modules/openapi-generator/src/test/resources/3_0/issue_3589.yaml +++ /dev/null @@ -1,26 +0,0 @@ -openapi: 3.0.0 -info: - title: Sample API - description: API description in Markdown. - version: 1.0.0 -paths: - /type-alias: - get: - responses: - 200: - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/ParentType' - -components: - schemas: - ParentType: - title: ParentType - type: object - properties: - typeAlias: - $ref: '#/components/schemas/TypeAlias' - TypeAlias: - type: object diff --git a/modules/openapi-generator/src/test/resources/3_0/type-alias.yaml b/modules/openapi-generator/src/test/resources/3_0/type-alias.yaml index 710395185ba1..5ae62c68bc97 100644 --- a/modules/openapi-generator/src/test/resources/3_0/type-alias.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/type-alias.yaml @@ -1,7 +1,7 @@ openapi: 3.0.0 info: - title: Sample API - description: API description in Markdown. + title: API using a typeAlias mapped with importMapping + description: See https://github.com/OpenAPITools/openapi-generator/issues/3589 version: 1.0.0 paths: /type-alias: From 128f9c6d474110a851990409604a9bba6924f3f0 Mon Sep 17 00:00:00 2001 From: Peter Steiner Date: Sun, 9 Feb 2020 20:05:08 +0100 Subject: [PATCH 5/5] Add new method override handleMethodResponse Fixes broken unit test after merge from master --- .../PythonClientExperimentalCodegen.java | 22 +++++++++++++++++-- .../TypeScriptNodeClientCodegen.java | 11 +++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java index 33472480b13a..008bd21d613d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java @@ -547,7 +547,7 @@ public CodegenResponse fromResponse(String responseCode, ApiResponse response) { // When we serialize/deserialize ModelSimple models, validations and enums will be checked. Schema responseSchema; if (this.openAPI != null && this.openAPI.getComponents() != null) { - responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(response)); + responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(response), importMapping); } else { // no model/alias defined responseSchema = ModelUtils.getSchemaFromResponse(response); } @@ -600,12 +600,30 @@ public void handleMethodResponse(Operation operation, Map schemas, CodegenOperation op, ApiResponse methodResponse) { + handleMethodResponse(operation, schemas, op, methodResponse, Collections.emptyMap()); + } + + /** + * Set op's returnBaseType, returnType, examples etc. + * + * @param operation endpoint Operation + * @param schemas a map of the schemas in the openapi spec + * @param op endpoint CodegenOperation + * @param methodResponse the default ApiResponse for the endpoint + * @param importMappings mappings of external types to be omitted by unaliasing + */ + @Override + protected void handleMethodResponse(Operation operation, + Map schemas, + CodegenOperation op, + ApiResponse methodResponse, + Map importMappings) { // we have a custom version of this method to handle endpoints that return models where // type != object the model has validations and/or enums // we do this by invoking our custom fromResponse method to create defaultResponse // which we then use to set op.returnType and op.returnBaseType CodegenResponse defaultResponse = fromResponse("defaultResponse", methodResponse); - Schema responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(methodResponse)); + Schema responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(methodResponse), importMappings); if (responseSchema != null) { op.returnBaseType = defaultResponse.baseType; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java index 9eac980e3630..b2a5f9a25a00 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java @@ -99,7 +99,16 @@ public String getTypeDeclaration(Schema p) { @Override protected void handleMethodResponse(Operation operation, Map schemas, CodegenOperation op, ApiResponse methodResponse) { - super.handleMethodResponse(operation, schemas, op, methodResponse); + handleMethodResponse(operation, schemas, op, methodResponse, Collections.emptyMap()); + } + + @Override + protected void handleMethodResponse(Operation operation, + Map schemas, + CodegenOperation op, + ApiResponse methodResponse, + Map importMappings) { + super.handleMethodResponse(operation, schemas, op, methodResponse, importMappings); // see comment in getTypeDeclaration if (op.isResponseFile) {