From 5cf4ee1de842f37d582ddd83729dae4eb67d6ec0 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Thu, 4 Jun 2020 11:37:56 +0800 Subject: [PATCH] add additional properties support to powershell client generator (#6528) --- .../codegen/languages/PowerShellClientCodegen.java | 4 ++++ .../resources/powershell/model_simple.mustache | 14 ++++++++++++++ .../test/resources/3_0/powershell/petstore.yaml | 1 + .../powershell/src/PSPetstore/Model/Tag.ps1 | 5 ++++- .../powershell/src/PSPetstore/PSPetstore.psd1 | 5 +++-- 5 files changed, 26 insertions(+), 3 deletions(-) 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 bcdf58f57fc..9c46377c097 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 @@ -922,6 +922,10 @@ public class PowerShellClientCodegen extends DefaultCodegen implements CodegenCo model.anyOf.remove("ModelNull"); } + // add vendor extension for additonalProperties: true + if ("null".equals(model.parent)) { + model.vendorExtensions.put("x-additional-properties", true); + } } return objs; diff --git a/modules/openapi-generator/src/main/resources/powershell/model_simple.mustache b/modules/openapi-generator/src/main/resources/powershell/model_simple.mustache index 6e7eadef78d..ab7098fe9f9 100644 --- a/modules/openapi-generator/src/main/resources/powershell/model_simple.mustache +++ b/modules/openapi-generator/src/main/resources/powershell/model_simple.mustache @@ -129,13 +129,24 @@ function ConvertFrom-{{{apiNamePrefix}}}JsonTo{{{classname}}} { $PSBoundParameters | Out-DebugParameter | Write-Debug $JsonParameters = ConvertFrom-Json -InputObject $Json + {{#vendorExtensions.x-additional-properties}} + ${{{apiNamePrefix}}}{{{classname}}}AdditionalProperties = @{} + {{/vendorExtensions.x-additional-properties}} # check if Json contains properties not defined in {{{apiNamePrefix}}}{{{classname}}} $AllProperties = ({{#allVars}}"{{{baseName}}}"{{^-last}}, {{/-last}}{{/allVars}}) foreach ($name in $JsonParameters.PsObject.Properties.Name) { + {{^vendorExtensions.x-additional-properties}} if (!($AllProperties.Contains($name))) { throw "Error! JSON key '$name' not found in the properties: $($AllProperties)" } + {{/vendorExtensions.x-additional-properties}} + {{#vendorExtensions.x-additional-properties}} + # store undefined properties in additionalProperties + if (!($AllProperties.Contains($name))) { + ${{{apiNamePrefix}}}{{{classname}}}AdditionalProperties[$name] = $JsonParameters.PSobject.Properties[$name].value + } + {{/vendorExtensions.x-additional-properties}} } {{#requiredVars}} @@ -166,6 +177,9 @@ function ConvertFrom-{{{apiNamePrefix}}}JsonTo{{{classname}}} { "<>" = ${<>} <> <<={{ }}=>> + {{#vendorExtensions.x-additional-properties}} + "AdditionalProperties" = ${{{apiNamePrefix}}}{{{classname}}}AdditionalProperties + {{/vendorExtensions.x-additional-properties}} } return $PSO diff --git a/modules/openapi-generator/src/test/resources/3_0/powershell/petstore.yaml b/modules/openapi-generator/src/test/resources/3_0/powershell/petstore.yaml index 11ed2854ba5..b3a0dfd3c11 100644 --- a/modules/openapi-generator/src/test/resources/3_0/powershell/petstore.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/powershell/petstore.yaml @@ -699,6 +699,7 @@ components: xml: name: User Tag: + additionalProperties: true title: Pet Tag description: A tag for a pet type: object diff --git a/samples/client/petstore/powershell/src/PSPetstore/Model/Tag.ps1 b/samples/client/petstore/powershell/src/PSPetstore/Model/Tag.ps1 index 0f0044ef35c..8a7caf8d562 100644 --- a/samples/client/petstore/powershell/src/PSPetstore/Model/Tag.ps1 +++ b/samples/client/petstore/powershell/src/PSPetstore/Model/Tag.ps1 @@ -77,12 +77,14 @@ function ConvertFrom-PSJsonToTag { $PSBoundParameters | Out-DebugParameter | Write-Debug $JsonParameters = ConvertFrom-Json -InputObject $Json + $PSTagAdditionalProperties = @{} # check if Json contains properties not defined in PSTag $AllProperties = ("id", "name") foreach ($name in $JsonParameters.PsObject.Properties.Name) { + # store undefined properties in additionalProperties if (!($AllProperties.Contains($name))) { - throw "Error! JSON key '$name' not found in the properties: $($AllProperties)" + $PSTagAdditionalProperties[$name] = $JsonParameters.PSobject.Properties[$name].value } } @@ -101,6 +103,7 @@ function ConvertFrom-PSJsonToTag { $PSO = [PSCustomObject]@{ "id" = ${Id} "name" = ${Name} + "AdditionalProperties" = $PSTagAdditionalProperties } return $PSO diff --git a/samples/client/petstore/powershell/src/PSPetstore/PSPetstore.psd1 b/samples/client/petstore/powershell/src/PSPetstore/PSPetstore.psd1 index 9b7ca03faf5..7b9c725fae2 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: 5/19/20 +# Generated on: 6/3/20 # @{ @@ -87,7 +87,8 @@ FunctionsToExport = 'Add-PSPet', 'Remove-Pet', 'Find-PSPetsByStatus', 'Find-PSPe 'Set-PSConfiguration', 'Set-PSConfigurationApiKey', 'Set-PSConfigurationApiKeyPrefix', 'Set-PSConfigurationDefaultHeader', 'Get-PSHostSetting', - 'Get-PSUrlFromHostSetting' + 'Get-PSUrlFromHostSetting', 'Set-PSConfigurationHttpSigning', + 'Get-PSConfigurationHttpSigning' # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. CmdletsToExport = @()