From cfd1f4cf9148040c3bf460bc30086bbaaa10ea16 Mon Sep 17 00:00:00 2001 From: osjupiter Date: Tue, 28 Aug 2018 01:59:59 +0900 Subject: [PATCH 1/2] add "x-enum-varnames" extension to control the naming of the enum parameter name #893 --- .../openapitools/codegen/DefaultCodegen.java | 15 +++++ .../codegen/DefaultCodegenTest.java | 62 +++++++++++++++++++ 2 files changed, 77 insertions(+) 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 0574a7bcc084..1f302cc78180 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 @@ -287,6 +287,8 @@ public Map postProcessModelsEnum(Map objs) { enumVar.put("isString", isDataTypeString(cm.dataType)); enumVars.add(enumVar); } + // if "x-enum-varnames" defined, update varnames + updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions()); cm.allowableValues.put("enumVars", enumVars); } @@ -4003,6 +4005,8 @@ public void updateCodegenPropertyEnum(CodegenProperty var) { enumVar.put("isString", isDataTypeString(dataType)); enumVars.add(enumVar); } + // if "x-enum-varnames" defined, update varnames + updateEnumVarsWithExtensions(enumVars, var.getVendorExtensions()); allowableValues.put("enumVars", enumVars); // handle default value for enum, e.g. available => StatusEnum.AVAILABLE @@ -4020,6 +4024,17 @@ public void updateCodegenPropertyEnum(CodegenProperty var) { } } + private void updateEnumVarsWithExtensions(List> enumVars, Map vendorExtensions) { + if (vendorExtensions != null && vendorExtensions.containsKey("x-enum-varnames")) { + List alias = (List) vendorExtensions.get("x-enum-varnames"); + if (alias.size() == enumVars.size()) { + for (int i = 0; i < alias.size(); i++) { + enumVars.get(i).put("name", alias.get(i)); + } + } + } + } + /** * If the pattern misses the delimiter, add "/" to the beginning and end * Otherwise, return the original pattern 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 cf78dbc1a995..c502b02f4a5c 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 @@ -306,6 +306,41 @@ public void updateCodegenPropertyEnum() { Assert.assertEquals(testedEnumVar.getOrDefault("isString", ""), false); } + @Test + public void updateCodegenPropertyEnumWithExtention() { + final DefaultCodegen codegen = new DefaultCodegen(); + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(); + + codegen.updateCodegenPropertyEnum(enumProperty); + + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOGVAR"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CATVAR"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"cat\""); + } + + @Test + public void postProcessModelsEnumWithExtention() { + final DefaultCodegen codegen = new DefaultCodegen(); + Map objs = codegenModelWithXEnumVarName(); + CodegenModel cm = (CodegenModel) ((Map) ((List) objs.get("models")).get(0)).get("model"); + + codegen.postProcessModelsEnum(objs); + + List> enumVars = (List>) cm.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOGVAR"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CATVAR"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"cat\""); + } + @Test public void testExample1() { final OpenAPI openAPI = new OpenAPIParser().readLocation("src/test/resources/3_0/examples.yaml", null, new ParseOptions()).getOpenAPI(); @@ -478,4 +513,31 @@ private CodegenProperty codegenPropertyWithArrayOfIntegerValues() { array.dataType = "Array"; return array; } + + private CodegenProperty codegenPropertyWithXEnumVarName() { + final CodegenProperty var = new CodegenProperty(); + final HashMap allowableValues = new HashMap<>(); + allowableValues.put("values", Arrays.asList("dog", "cat")); + var.setAllowableValues(allowableValues); + var.dataType = "String"; + final List aliases = Arrays.asList("DOGVAR", "CATVAR"); + Map extentions = Collections.singletonMap("x-enum-varnames", aliases); + var.setVendorExtensions(extentions); + return var; + } + + private Map codegenModelWithXEnumVarName() { + final CodegenModel cm = new CodegenModel(); + cm.isEnum = true; + final HashMap allowableValues = new HashMap<>(); + allowableValues.put("values", Arrays.asList("dog", "cat")); + cm.setAllowableValues(allowableValues); + cm.dataType = "String"; + final List aliases = Arrays.asList("DOGVAR", "CATVAR"); + Map extentions = Collections.singletonMap("x-enum-varnames", aliases); + cm.setVendorExtensions(extentions); + cm.setVars(Collections.emptyList()); + Map objs = Collections.singletonMap("models", Collections.singletonList(Collections.singletonMap("model", cm))); + return objs; + } } From 029a8e2187f1c5d6791ff0f7545c949fa9d85aff Mon Sep 17 00:00:00 2001 From: osjupiter Date: Thu, 30 Aug 2018 00:41:46 +0900 Subject: [PATCH 2/2] allow to set different size from target enum --- .../openapitools/codegen/DefaultCodegen.java | 7 +-- .../codegen/DefaultCodegenTest.java | 56 +++++++++++++------ 2 files changed, 43 insertions(+), 20 deletions(-) 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 1f302cc78180..0181846492d8 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 @@ -4027,10 +4027,9 @@ public void updateCodegenPropertyEnum(CodegenProperty var) { private void updateEnumVarsWithExtensions(List> enumVars, Map vendorExtensions) { if (vendorExtensions != null && vendorExtensions.containsKey("x-enum-varnames")) { List alias = (List) vendorExtensions.get("x-enum-varnames"); - if (alias.size() == enumVars.size()) { - for (int i = 0; i < alias.size(); i++) { - enumVars.get(i).put("name", alias.get(i)); - } + int size = Math.min(enumVars.size(), alias.size()); + for (int i = 0; i < size; i++) { + enumVars.get(i).put("name", alias.get(i)); } } } 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 c502b02f4a5c..425eb7a23ab0 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 @@ -308,19 +308,44 @@ public void updateCodegenPropertyEnum() { @Test public void updateCodegenPropertyEnumWithExtention() { - final DefaultCodegen codegen = new DefaultCodegen(); - CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(); - - codegen.updateCodegenPropertyEnum(enumProperty); - - List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); - Assert.assertNotNull(enumVars); - Assert.assertNotNull(enumVars.get(0)); - Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOGVAR"); - Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"dog\""); - Assert.assertNotNull(enumVars.get(1)); - Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CATVAR"); - Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"cat\""); + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("dog", "cat"), Arrays.asList("DOGVAR", "CATVAR")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOGVAR"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CATVAR"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"cat\""); + } + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("1", "2"), Arrays.asList("ONE", "TWO")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "ONE"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"1\""); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "TWO"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"2\""); + } + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("a", "b", "c", "d"), Arrays.asList("FOO", "BAR")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "FOO"); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "BAR"); + Assert.assertEquals(enumVars.get(2).getOrDefault("name", ""), "C"); + Assert.assertEquals(enumVars.get(3).getOrDefault("name", ""), "D"); + } + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("a", "b"), Arrays.asList("FOO", "BAR", "BAZ")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "FOO"); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "BAR"); + Assert.assertEquals(enumVars.size(), 2); + } } @Test @@ -514,13 +539,12 @@ private CodegenProperty codegenPropertyWithArrayOfIntegerValues() { return array; } - private CodegenProperty codegenPropertyWithXEnumVarName() { + private CodegenProperty codegenPropertyWithXEnumVarName(List values, List aliases) { final CodegenProperty var = new CodegenProperty(); final HashMap allowableValues = new HashMap<>(); - allowableValues.put("values", Arrays.asList("dog", "cat")); + allowableValues.put("values", values); var.setAllowableValues(allowableValues); var.dataType = "String"; - final List aliases = Arrays.asList("DOGVAR", "CATVAR"); Map extentions = Collections.singletonMap("x-enum-varnames", aliases); var.setVendorExtensions(extentions); return var;