From 6591d4e6fbfd0f7138f2d10ec3decdab10d5e09d Mon Sep 17 00:00:00 2001 From: William Cheng Date: Fri, 8 Apr 2022 13:27:03 +0800 Subject: [PATCH] [PowerShell] better enum model support (#12082) * better enum model/class support in powershell client generator * add new files --- .../languages/PowerShellClientCodegen.java | 29 ++++++- .../main/resources/powershell/model.mustache | 5 ++ .../resources/powershell/model_enum.mustache | 18 ++++ ...odels-for-testing-with-http-signature.yaml | 86 +++++++++---------- .../powershell/.openapi-generator/FILES | 4 + samples/client/petstore/powershell/README.md | 2 + .../petstore/powershell/docs/EnumTest.md | 8 +- .../src/PSPetstore/Model/EnumTest.ps1 | 43 +--------- .../src/PSPetstore/Model/OuterEnum.ps1 | 26 ++++++ .../powershell/src/PSPetstore/PSPetstore.psd1 | 2 +- 10 files changed, 130 insertions(+), 93 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/powershell/model_enum.mustache create mode 100644 samples/client/petstore/powershell/src/PSPetstore/Model/OuterEnum.ps1 diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java index be907ccfe81..89227f989bc 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java @@ -1125,7 +1125,8 @@ public class PowerShellClientCodegen extends DefaultCodegen implements CodegenCo } } - return objs; + // process enum in models + return postProcessModelsEnum(objs); } @Override @@ -1545,4 +1546,30 @@ public class PowerShellClientCodegen extends DefaultCodegen implements CodegenCo @Override public GeneratorLanguage generatorLanguage() { return GeneratorLanguage.POWERSHELL; } + + @Override + public String toEnumVarName(String name, String datatype) { + if (name.length() == 0) { + return "EMPTY"; + } + + // for symbol, e.g. $, # + if (getSymbolName(name) != null) { + return (getSymbolName(name)).toUpperCase(Locale.ROOT); + } + + // number + if ("Int16".equals(datatype) || "Int32".equals(datatype) || "Int64".equals(datatype) || + "UInt16".equals(datatype) || "UInt32".equals(datatype) || "UInt64".equals(datatype) || + "Double".equals(datatype) || "Single".equals(datatype) || "Decimal".equals(datatype)) { + String varName = name; + varName = varName.replaceAll("-", "MINUS_"); + varName = varName.replaceAll("\\+", "PLUS_"); + varName = varName.replaceAll("\\.", "_DOT_"); + return varName; + } + + // remove special character + return sanitizeName(name); + } } diff --git a/modules/openapi-generator/src/main/resources/powershell/model.mustache b/modules/openapi-generator/src/main/resources/powershell/model.mustache index a4b90baee9f..9b81320e23c 100644 --- a/modules/openapi-generator/src/main/resources/powershell/model.mustache +++ b/modules/openapi-generator/src/main/resources/powershell/model.mustache @@ -1,6 +1,11 @@ {{> partial_header}} {{#models}} {{#model}} +{{#isEnum}} +{{>model_enum}} +{{/isEnum}} +{{^isEnum}} {{#oneOf}}{{#-first}}{{>model_oneof}}{{/-first}}{{/oneOf}}{{^oneOf}}{{#anyOf}}{{#-first}}{{>model_anyof}}{{/-first}}{{/anyOf}}{{^anyOf}}{{>model_simple}}{{/anyOf}}{{/oneOf}} +{{/isEnum}} {{/model}} {{/models}} diff --git a/modules/openapi-generator/src/main/resources/powershell/model_enum.mustache b/modules/openapi-generator/src/main/resources/powershell/model_enum.mustache new file mode 100644 index 00000000000..067e039808c --- /dev/null +++ b/modules/openapi-generator/src/main/resources/powershell/model_enum.mustache @@ -0,0 +1,18 @@ +<# +.SYNOPSIS + +{{{summary}}}{{^summary}}Enum {{{classname}}}.{{/summary}} + +.DESCRIPTION + +{{{description}}}{{^description}}No description available.{{/description}} +#> + +enum {{{classname}}} { + {{#allowableValues}} + {{#enumVars}} + # enum value: {{{value}}} + {{{name}}} + {{/enumVars}} + {{/allowableValues}} +} diff --git a/modules/openapi-generator/src/test/resources/3_0/powershell/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml b/modules/openapi-generator/src/test/resources/3_0/powershell/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml index 00094aa46de..22c23b279c6 100644 --- a/modules/openapi-generator/src/test/resources/3_0/powershell/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/powershell/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml @@ -1525,42 +1525,42 @@ components: # - _abc # - '-efg' # - (xyz) - #Enum_Test: - # type: object - # required: - # - enum_string_required - # properties: - # enum_string: - # type: string - # enum: - # - UPPER - # - lower - # - '' - # enum_string_required: - # type: string - # enum: - # - UPPER - # - lower - # - '' - # enum_integer: - # type: integer - # format: int32 - # enum: - # - 1 - # - -1 - # enum_integer_only: - # type: integer - # enum: - # - 2 - # - -2 - # enum_number: - # type: number - # format: double - # enum: - # - 1.1 - # - -1.2 - # outerEnum: - # $ref: '#/components/schemas/OuterEnum' + Enum_Test: + type: object + required: + - enum_string_required + properties: + enum_string: + type: string + enum: + - UPPER + - lower + - '' + enum_string_required: + type: string + enum: + - UPPER + - lower + - '' + enum_integer: + type: integer + format: int32 + enum: + - 1 + - -1 + enum_integer_only: + type: integer + enum: + - 2 + - -2 + enum_number: + type: number + format: double + enum: + - 1.1 + - -1.2 + outerEnum: + $ref: '#/components/schemas/OuterEnum' # outerEnumInteger: # $ref: '#/components/schemas/OuterEnumInteger' # outerEnumDefaultValue: @@ -1733,13 +1733,13 @@ components: enum: - fish - crab - #OuterEnum: - # nullable: true - # type: string - # enum: - # - placed - # - approved - # - delivered + OuterEnum: + nullable: true + type: string + enum: + - placed + - approved + - delivered #OuterEnumInteger: # type: integer # enum: diff --git a/samples/client/petstore/powershell/.openapi-generator/FILES b/samples/client/petstore/powershell/.openapi-generator/FILES index f2de7bc7630..a23fa36f7ee 100644 --- a/samples/client/petstore/powershell/.openapi-generator/FILES +++ b/samples/client/petstore/powershell/.openapi-generator/FILES @@ -26,6 +26,7 @@ docs/Dog.md docs/DogAllOf.md docs/Drawing.md docs/EnumArrays.md +docs/EnumTest.md docs/EquilateralTriangle.md docs/File.md docs/FileSchemaTestClass.md @@ -50,6 +51,7 @@ docs/NumberOnly.md docs/ObjectWithDeprecatedFields.md docs/Order.md docs/OuterComposite.md +docs/OuterEnum.md docs/PSAnotherFakeApi.md docs/PSDefaultApi.md docs/PSFakeApi.md @@ -109,6 +111,7 @@ src/PSPetstore/Model/Dog.ps1 src/PSPetstore/Model/DogAllOf.ps1 src/PSPetstore/Model/Drawing.ps1 src/PSPetstore/Model/EnumArrays.ps1 +src/PSPetstore/Model/EnumTest.ps1 src/PSPetstore/Model/EquilateralTriangle.ps1 src/PSPetstore/Model/File.ps1 src/PSPetstore/Model/FileSchemaTestClass.ps1 @@ -135,6 +138,7 @@ src/PSPetstore/Model/NumberOnly.ps1 src/PSPetstore/Model/ObjectWithDeprecatedFields.ps1 src/PSPetstore/Model/Order.ps1 src/PSPetstore/Model/OuterComposite.ps1 +src/PSPetstore/Model/OuterEnum.ps1 src/PSPetstore/Model/ParentPet.ps1 src/PSPetstore/Model/Pet.ps1 src/PSPetstore/Model/PetWithRequiredTags.ps1 diff --git a/samples/client/petstore/powershell/README.md b/samples/client/petstore/powershell/README.md index bb6c77f0266..f62e510dd22 100644 --- a/samples/client/petstore/powershell/README.md +++ b/samples/client/petstore/powershell/README.md @@ -122,6 +122,7 @@ Class | Method | HTTP request | Description - [PSPetstore/Model.DogAllOf](docs/DogAllOf.md) - [PSPetstore/Model.Drawing](docs/Drawing.md) - [PSPetstore/Model.EnumArrays](docs/EnumArrays.md) + - [PSPetstore/Model.EnumTest](docs/EnumTest.md) - [PSPetstore/Model.EquilateralTriangle](docs/EquilateralTriangle.md) - [PSPetstore/Model.File](docs/File.md) - [PSPetstore/Model.FileSchemaTestClass](docs/FileSchemaTestClass.md) @@ -148,6 +149,7 @@ Class | Method | HTTP request | Description - [PSPetstore/Model.ObjectWithDeprecatedFields](docs/ObjectWithDeprecatedFields.md) - [PSPetstore/Model.Order](docs/Order.md) - [PSPetstore/Model.OuterComposite](docs/OuterComposite.md) + - [PSPetstore/Model.OuterEnum](docs/OuterEnum.md) - [PSPetstore/Model.ParentPet](docs/ParentPet.md) - [PSPetstore/Model.Pet](docs/Pet.md) - [PSPetstore/Model.PetWithRequiredTags](docs/PetWithRequiredTags.md) diff --git a/samples/client/petstore/powershell/docs/EnumTest.md b/samples/client/petstore/powershell/docs/EnumTest.md index c0ec1bb6c28..25d92ed0225 100644 --- a/samples/client/petstore/powershell/docs/EnumTest.md +++ b/samples/client/petstore/powershell/docs/EnumTest.md @@ -9,9 +9,6 @@ Name | Type | Description | Notes **EnumIntegerOnly** | **Int32** | | [optional] **EnumNumber** | **Double** | | [optional] **OuterEnum** | [**OuterEnum**](OuterEnum.md) | | [optional] -**OuterEnumInteger** | [**OuterEnumInteger**](OuterEnumInteger.md) | | [optional] -**OuterEnumDefaultValue** | [**OuterEnumDefaultValue**](OuterEnumDefaultValue.md) | | [optional] -**OuterEnumIntegerDefaultValue** | [**OuterEnumIntegerDefaultValue**](OuterEnumIntegerDefaultValue.md) | | [optional] ## Examples @@ -22,10 +19,7 @@ $EnumTest = Initialize-PSPetstoreEnumTest -EnumString null ` -EnumInteger null ` -EnumIntegerOnly null ` -EnumNumber null ` - -OuterEnum null ` - -OuterEnumInteger null ` - -OuterEnumDefaultValue null ` - -OuterEnumIntegerDefaultValue null + -OuterEnum null ``` - Convert the resource to JSON diff --git a/samples/client/petstore/powershell/src/PSPetstore/Model/EnumTest.ps1 b/samples/client/petstore/powershell/src/PSPetstore/Model/EnumTest.ps1 index fdb1139d4f4..8b9608f1925 100644 --- a/samples/client/petstore/powershell/src/PSPetstore/Model/EnumTest.ps1 +++ b/samples/client/petstore/powershell/src/PSPetstore/Model/EnumTest.ps1 @@ -26,12 +26,6 @@ No description available. No description available. .PARAMETER OuterEnum No description available. -.PARAMETER OuterEnumInteger -No description available. -.PARAMETER OuterEnumDefaultValue -No description available. -.PARAMETER OuterEnumIntegerDefaultValue -No description available. .OUTPUTS EnumTest @@ -62,16 +56,7 @@ function Initialize-PSEnumTest { ${EnumNumber}, [Parameter(Position = 5, ValueFromPipelineByPropertyName = $true)] [PSCustomObject] - ${OuterEnum}, - [Parameter(Position = 6, ValueFromPipelineByPropertyName = $true)] - [PSCustomObject] - ${OuterEnumInteger}, - [Parameter(Position = 7, ValueFromPipelineByPropertyName = $true)] - [PSCustomObject] - ${OuterEnumDefaultValue}, - [Parameter(Position = 8, ValueFromPipelineByPropertyName = $true)] - [PSCustomObject] - ${OuterEnumIntegerDefaultValue} + ${OuterEnum} ) Process { @@ -90,9 +75,6 @@ function Initialize-PSEnumTest { "enum_integer_only" = ${EnumIntegerOnly} "enum_number" = ${EnumNumber} "outerEnum" = ${OuterEnum} - "outerEnumInteger" = ${OuterEnumInteger} - "outerEnumDefaultValue" = ${OuterEnumDefaultValue} - "outerEnumIntegerDefaultValue" = ${OuterEnumIntegerDefaultValue} } @@ -130,7 +112,7 @@ function ConvertFrom-PSJsonToEnumTest { $JsonParameters = ConvertFrom-Json -InputObject $Json # check if Json contains properties not defined in PSEnumTest - $AllProperties = ("enum_string", "enum_string_required", "enum_integer", "enum_integer_only", "enum_number", "outerEnum", "outerEnumInteger", "outerEnumDefaultValue", "outerEnumIntegerDefaultValue") + $AllProperties = ("enum_string", "enum_string_required", "enum_integer", "enum_integer_only", "enum_number", "outerEnum") foreach ($name in $JsonParameters.PsObject.Properties.Name) { if (!($AllProperties.Contains($name))) { throw "Error! JSON key '$name' not found in the properties: $($AllProperties)" @@ -177,24 +159,6 @@ function ConvertFrom-PSJsonToEnumTest { $OuterEnum = $JsonParameters.PSobject.Properties["outerEnum"].value } - if (!([bool]($JsonParameters.PSobject.Properties.name -match "outerEnumInteger"))) { #optional property not found - $OuterEnumInteger = $null - } else { - $OuterEnumInteger = $JsonParameters.PSobject.Properties["outerEnumInteger"].value - } - - if (!([bool]($JsonParameters.PSobject.Properties.name -match "outerEnumDefaultValue"))) { #optional property not found - $OuterEnumDefaultValue = $null - } else { - $OuterEnumDefaultValue = $JsonParameters.PSobject.Properties["outerEnumDefaultValue"].value - } - - if (!([bool]($JsonParameters.PSobject.Properties.name -match "outerEnumIntegerDefaultValue"))) { #optional property not found - $OuterEnumIntegerDefaultValue = $null - } else { - $OuterEnumIntegerDefaultValue = $JsonParameters.PSobject.Properties["outerEnumIntegerDefaultValue"].value - } - $PSO = [PSCustomObject]@{ "enum_string" = ${EnumString} "enum_string_required" = ${EnumStringRequired} @@ -202,9 +166,6 @@ function ConvertFrom-PSJsonToEnumTest { "enum_integer_only" = ${EnumIntegerOnly} "enum_number" = ${EnumNumber} "outerEnum" = ${OuterEnum} - "outerEnumInteger" = ${OuterEnumInteger} - "outerEnumDefaultValue" = ${OuterEnumDefaultValue} - "outerEnumIntegerDefaultValue" = ${OuterEnumIntegerDefaultValue} } return $PSO diff --git a/samples/client/petstore/powershell/src/PSPetstore/Model/OuterEnum.ps1 b/samples/client/petstore/powershell/src/PSPetstore/Model/OuterEnum.ps1 new file mode 100644 index 00000000000..0f7cd366d1a --- /dev/null +++ b/samples/client/petstore/powershell/src/PSPetstore/Model/OuterEnum.ps1 @@ -0,0 +1,26 @@ +# +# OpenAPI Petstore +# This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: "" \ +# Version: 1.0.0 +# Generated by OpenAPI Generator: https://openapi-generator.tech +# + +<# +.SYNOPSIS + +Enum OuterEnum. + +.DESCRIPTION + +No description available. +#> + +enum OuterEnum { + # enum value: "placed" + placed + # enum value: "approved" + approved + # enum value: "delivered" + delivered +} + diff --git a/samples/client/petstore/powershell/src/PSPetstore/PSPetstore.psd1 b/samples/client/petstore/powershell/src/PSPetstore/PSPetstore.psd1 index ffe8692ce3b..1127e0c738d 100644 --- a/samples/client/petstore/powershell/src/PSPetstore/PSPetstore.psd1 +++ b/samples/client/petstore/powershell/src/PSPetstore/PSPetstore.psd1 @@ -3,7 +3,7 @@ # # Generated by: OpenAPI Generator Team # -# Generated on: 04/06/2022 +# Generated on: 04/08/2022 # @{