From 56b8055f6e3e8b41bf95cc5dae843045aea94ff8 Mon Sep 17 00:00:00 2001 From: Valentin Gilberg Date: Fri, 1 Nov 2019 10:16:14 +0100 Subject: [PATCH 1/4] This commit addresses issue #4346 and adds the proposed optionalEmitDefaultValues flag. --- docs/generators/csharp-netcore.md | 1 + .../languages/CSharpNetCoreClientCodegen.java | 22 +++++++++++++++++++ .../csharp-netcore/modelGeneric.mustache | 5 ++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/docs/generators/csharp-netcore.md b/docs/generators/csharp-netcore.md index 62b36ff6769c..346932bc6e3f 100644 --- a/docs/generators/csharp-netcore.md +++ b/docs/generators/csharp-netcore.md @@ -19,6 +19,7 @@ sidebar_label: csharp-netcore |returnICollection|Return ICollection<T> instead of the concrete type.| |false| |optionalMethodArgument|C# Optional method argument, e.g. void square(int x=10) (.net 4.0+ only).| |true| |optionalAssemblyInfo|Generate AssemblyInfo.cs.| |true| +|optionalEmitDefaultValues|Set DataMember's EmitDefaultValue.| |false| |optionalProjectFile|Generate {PackageName}.csproj.| |true| |nonPublicApi|Generates code with reduced access modifiers; allows embedding elsewhere without exposing non-public API calls to consumers.| |false| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java index 2856fd673809..34dd208b583f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java @@ -185,6 +185,10 @@ public CSharpNetCoreClientCodegen() { CodegenConstants.OPTIONAL_ASSEMBLY_INFO_DESC, this.optionalAssemblyInfoFlag); + addSwitch(CodegenConstants.OPTIONAL_EMIT_DEFAULT_VALUES, + CodegenConstants.OPTIONAL_EMIT_DEFAULT_VALUES_DESC, + this.optionalEmitDefaultValuesFlag); + addSwitch(CodegenConstants.OPTIONAL_PROJECT_FILE, CodegenConstants.OPTIONAL_PROJECT_FILE_DESC, this.optionalProjectFileFlag); @@ -370,6 +374,8 @@ public String modelTestFileFolder() { @Override public void postProcessModelProperty(CodegenModel model, CodegenProperty property) { postProcessPattern(property.pattern, property.vendorExtensions); + postProcessEmitDefaultValue(property.vendorExtensions); + super.postProcessModelProperty(model, property); } @@ -403,6 +409,7 @@ public Map postProcessOperationsWithModels(Map o @Override public void postProcessParameter(CodegenParameter parameter) { postProcessPattern(parameter.pattern, parameter.vendorExtensions); + postProcessEmitDefaultValue(parameter.vendorExtensions); super.postProcessParameter(parameter); if (!parameter.required && nullableType.contains(parameter.dataType)) { //optional @@ -446,6 +453,10 @@ public void postProcessPattern(String pattern, Map vendorExtensi } } + public void postProcessEmitDefaultValue(Map vendorExtensions) { + vendorExtensions.put("x-emit-default-value", optionalEmitDefaultValuesFlag); + } + @Override public Mustache.Compiler processCompiler(Mustache.Compiler compiler) { // To avoid unexpected behaviors when options are passed programmatically such as { "supportsAsync": "" } @@ -465,6 +476,13 @@ public void processOpts() { * if (additionalProperties.containsKey(prop)) convertPropertyToBooleanAndWriteBack(prop); */ + if (additionalProperties.containsKey(CodegenConstants.OPTIONAL_EMIT_DEFAULT_VALUES)) { + setOptionalEmitDefaultValuesFlag(convertPropertyToBooleanAndWriteBack(CodegenConstants.OPTIONAL_EMIT_DEFAULT_VALUES)); + } else { + additionalProperties.put(CodegenConstants.OPTIONAL_EMIT_DEFAULT_VALUES, optionalEmitDefaultValuesFlag); + } + + if (additionalProperties.containsKey(CodegenConstants.MODEL_PROPERTY_NAMING)) { setModelPropertyNaming((String) additionalProperties.get(CodegenConstants.MODEL_PROPERTY_NAMING)); } @@ -610,6 +628,10 @@ public void setOptionalAssemblyInfoFlag(boolean flag) { this.optionalAssemblyInfoFlag = flag; } + public void setOptionalEmitDefaultValuesFlag(boolean flag){ + this.optionalEmitDefaultValuesFlag = flag; + } + public void setOptionalProjectFileFlag(boolean flag) { this.optionalProjectFileFlag = flag; } diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/modelGeneric.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/modelGeneric.mustache index 45d075c16e8e..ce7248b45ae4 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/modelGeneric.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/modelGeneric.mustache @@ -33,8 +33,7 @@ {{#description}} /// {{description}} {{/description}} - [DataMember(Name="{{baseName}}", EmitDefaultValue={{#isNullable}}true{{/isNullable}}{{^isNullable}}false{{/isNullable}})] - public {{#complexType}}{{{complexType}}}{{/complexType}}{{^complexType}}{{{datatypeWithEnum}}}{{/complexType}}{{^isContainer}}{{^required}}?{{/required}}{{/isContainer}} {{name}} { get; set; } + [DataMember(Name="{{baseName}}", EmitDefaultValue={{#vendorExtensions.x-emit-default-value}}true{{/vendorExtensions.x-emit-default-value}}{{^vendorExtensions.x-emit-default-value}}{{#isNullable}}true{{/isNullable}}{{^isNullable}}false{{/isNullable}}{{/vendorExtensions.x-emit-default-value}})] public {{#complexType}}{{{complexType}}}{{/complexType}}{{^complexType}}{{{datatypeWithEnum}}}{{/complexType}}{{^isContainer}}{{^required}}?{{/required}}{{/isContainer}} {{name}} { get; set; } {{/isEnum}} {{/vars}} {{#hasRequired}} @@ -116,7 +115,7 @@ /// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{description}}{{/description}} /// {{#description}} /// {{description}}{{/description}} - [DataMember(Name="{{baseName}}", EmitDefaultValue={{#isNullable}}true{{/isNullable}}{{^isNullable}}false{{/isNullable}})]{{#isDate}} + [DataMember(Name="{{baseName}}", EmitDefaultValue={{#vendorExtensions.x-emit-default-value}}true{{/vendorExtensions.x-emit-default-value}}{{^vendorExtensions.x-emit-default-value}}{{#isNullable}}true{{/isNullable}}{{^isNullable}}false{{/isNullable}}{{/vendorExtensions.x-emit-default-value}})]{{#isDate}} [JsonConverter(typeof(OpenAPIDateConverter))]{{/isDate}} public {{{dataType}}} {{name}} { get; {{#isReadOnly}}private {{/isReadOnly}}set; } From 1b252c8e898eac406912f19ad9f7c5fd7553f8c3 Mon Sep 17 00:00:00 2001 From: Valentin Gilberg Date: Fri, 1 Nov 2019 10:37:51 +0100 Subject: [PATCH 2/4] ran /bin/cshapr-netcore-petstore.sh to create sample clients --- .../src/Org.OpenAPITools/Model/EnumArrays.cs | 6 ++---- .../src/Org.OpenAPITools/Model/EnumTest.cs | 15 +++++---------- .../src/Org.OpenAPITools/Model/MapTest.cs | 3 +-- .../src/Org.OpenAPITools/Model/Order.cs | 3 +-- .../src/Org.OpenAPITools/Model/Pet.cs | 3 +-- 5 files changed, 10 insertions(+), 20 deletions(-) diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumArrays.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumArrays.cs index bba92d524f13..80acda785b4c 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumArrays.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumArrays.cs @@ -55,8 +55,7 @@ public enum JustSymbolEnum /// /// Gets or Sets JustSymbol /// - [DataMember(Name="just_symbol", EmitDefaultValue=false)] - public JustSymbolEnum? JustSymbol { get; set; } + [DataMember(Name="just_symbol", EmitDefaultValue=false)] public JustSymbolEnum? JustSymbol { get; set; } /// /// Defines ArrayEnum /// @@ -81,8 +80,7 @@ public enum ArrayEnumEnum /// /// Gets or Sets ArrayEnum /// - [DataMember(Name="array_enum", EmitDefaultValue=false)] - public List ArrayEnum { get; set; } + [DataMember(Name="array_enum", EmitDefaultValue=false)] public List ArrayEnum { get; set; } /// /// Initializes a new instance of the class. /// diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs index 595a92331504..c69826a6f78f 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs @@ -61,8 +61,7 @@ public enum EnumStringEnum /// /// Gets or Sets EnumString /// - [DataMember(Name="enum_string", EmitDefaultValue=false)] - public EnumStringEnum? EnumString { get; set; } + [DataMember(Name="enum_string", EmitDefaultValue=false)] public EnumStringEnum? EnumString { get; set; } /// /// Defines EnumStringRequired /// @@ -92,8 +91,7 @@ public enum EnumStringRequiredEnum /// /// Gets or Sets EnumStringRequired /// - [DataMember(Name="enum_string_required", EmitDefaultValue=false)] - public EnumStringRequiredEnum EnumStringRequired { get; set; } + [DataMember(Name="enum_string_required", EmitDefaultValue=false)] public EnumStringRequiredEnum EnumStringRequired { get; set; } /// /// Defines EnumInteger /// @@ -114,8 +112,7 @@ public enum EnumIntegerEnum /// /// Gets or Sets EnumInteger /// - [DataMember(Name="enum_integer", EmitDefaultValue=false)] - public EnumIntegerEnum? EnumInteger { get; set; } + [DataMember(Name="enum_integer", EmitDefaultValue=false)] public EnumIntegerEnum? EnumInteger { get; set; } /// /// Defines EnumNumber /// @@ -139,13 +136,11 @@ public enum EnumNumberEnum /// /// Gets or Sets EnumNumber /// - [DataMember(Name="enum_number", EmitDefaultValue=false)] - public EnumNumberEnum? EnumNumber { get; set; } + [DataMember(Name="enum_number", EmitDefaultValue=false)] public EnumNumberEnum? EnumNumber { get; set; } /// /// Gets or Sets OuterEnum /// - [DataMember(Name="outerEnum", EmitDefaultValue=false)] - public OuterEnum? OuterEnum { get; set; } + [DataMember(Name="outerEnum", EmitDefaultValue=false)] public OuterEnum? OuterEnum { get; set; } /// /// Initializes a new instance of the class. /// diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/MapTest.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/MapTest.cs index 14c90960be77..3a767a76e8cd 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/MapTest.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/MapTest.cs @@ -56,8 +56,7 @@ public enum InnerEnum /// /// Gets or Sets MapOfEnumString /// - [DataMember(Name="map_of_enum_string", EmitDefaultValue=false)] - public Dictionary MapOfEnumString { get; set; } + [DataMember(Name="map_of_enum_string", EmitDefaultValue=false)] public Dictionary MapOfEnumString { get; set; } /// /// Initializes a new instance of the class. /// diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Order.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Order.cs index 0c4a6a5b60f9..5c18083655e3 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Order.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Order.cs @@ -63,8 +63,7 @@ public enum StatusEnum /// Order Status /// /// Order Status - [DataMember(Name="status", EmitDefaultValue=false)] - public StatusEnum? Status { get; set; } + [DataMember(Name="status", EmitDefaultValue=false)] public StatusEnum? Status { get; set; } /// /// Initializes a new instance of the class. /// diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Pet.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Pet.cs index b7be3ee84f91..b29709bd263f 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Pet.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Pet.cs @@ -63,8 +63,7 @@ public enum StatusEnum /// pet status in the store /// /// pet status in the store - [DataMember(Name="status", EmitDefaultValue=false)] - public StatusEnum? Status { get; set; } + [DataMember(Name="status", EmitDefaultValue=false)] public StatusEnum? Status { get; set; } /// /// Initializes a new instance of the class. /// From dcbbe31ad9c7a59fe298c9c5acc278e1174bf861 Mon Sep 17 00:00:00 2001 From: Valentin Gilberg Date: Mon, 4 Nov 2019 17:25:27 +0100 Subject: [PATCH 3/4] Fixed lost newline --- .../src/main/resources/csharp-netcore/modelGeneric.mustache | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/modelGeneric.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/modelGeneric.mustache index ce7248b45ae4..78738eeb1f31 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/modelGeneric.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/modelGeneric.mustache @@ -33,7 +33,8 @@ {{#description}} /// {{description}} {{/description}} - [DataMember(Name="{{baseName}}", EmitDefaultValue={{#vendorExtensions.x-emit-default-value}}true{{/vendorExtensions.x-emit-default-value}}{{^vendorExtensions.x-emit-default-value}}{{#isNullable}}true{{/isNullable}}{{^isNullable}}false{{/isNullable}}{{/vendorExtensions.x-emit-default-value}})] public {{#complexType}}{{{complexType}}}{{/complexType}}{{^complexType}}{{{datatypeWithEnum}}}{{/complexType}}{{^isContainer}}{{^required}}?{{/required}}{{/isContainer}} {{name}} { get; set; } + [DataMember(Name="{{baseName}}", EmitDefaultValue={{#vendorExtensions.x-emit-default-value}}true{{/vendorExtensions.x-emit-default-value}}{{^vendorExtensions.x-emit-default-value}}{{#isNullable}}true{{/isNullable}}{{^isNullable}}false{{/isNullable}}{{/vendorExtensions.x-emit-default-value}})] + public {{#complexType}}{{{complexType}}}{{/complexType}}{{^complexType}}{{{datatypeWithEnum}}}{{/complexType}}{{^isContainer}}{{^required}}?{{/required}}{{/isContainer}} {{name}} { get; set; } {{/isEnum}} {{/vars}} {{#hasRequired}} From e57286ba931d7c236809b7798bdfc42cabf927dd Mon Sep 17 00:00:00 2001 From: Valentin Gilberg Date: Mon, 4 Nov 2019 18:32:47 +0100 Subject: [PATCH 4/4] Ran script again to update samples --- .../src/Org.OpenAPITools/Model/EnumArrays.cs | 6 ++++-- .../src/Org.OpenAPITools/Model/EnumTest.cs | 15 ++++++++++----- .../src/Org.OpenAPITools/Model/MapTest.cs | 3 ++- .../src/Org.OpenAPITools/Model/Order.cs | 3 ++- .../src/Org.OpenAPITools/Model/Pet.cs | 3 ++- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumArrays.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumArrays.cs index 80acda785b4c..bba92d524f13 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumArrays.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumArrays.cs @@ -55,7 +55,8 @@ public enum JustSymbolEnum /// /// Gets or Sets JustSymbol /// - [DataMember(Name="just_symbol", EmitDefaultValue=false)] public JustSymbolEnum? JustSymbol { get; set; } + [DataMember(Name="just_symbol", EmitDefaultValue=false)] + public JustSymbolEnum? JustSymbol { get; set; } /// /// Defines ArrayEnum /// @@ -80,7 +81,8 @@ public enum ArrayEnumEnum /// /// Gets or Sets ArrayEnum /// - [DataMember(Name="array_enum", EmitDefaultValue=false)] public List ArrayEnum { get; set; } + [DataMember(Name="array_enum", EmitDefaultValue=false)] + public List ArrayEnum { get; set; } /// /// Initializes a new instance of the class. /// diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs index c69826a6f78f..595a92331504 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/EnumTest.cs @@ -61,7 +61,8 @@ public enum EnumStringEnum /// /// Gets or Sets EnumString /// - [DataMember(Name="enum_string", EmitDefaultValue=false)] public EnumStringEnum? EnumString { get; set; } + [DataMember(Name="enum_string", EmitDefaultValue=false)] + public EnumStringEnum? EnumString { get; set; } /// /// Defines EnumStringRequired /// @@ -91,7 +92,8 @@ public enum EnumStringRequiredEnum /// /// Gets or Sets EnumStringRequired /// - [DataMember(Name="enum_string_required", EmitDefaultValue=false)] public EnumStringRequiredEnum EnumStringRequired { get; set; } + [DataMember(Name="enum_string_required", EmitDefaultValue=false)] + public EnumStringRequiredEnum EnumStringRequired { get; set; } /// /// Defines EnumInteger /// @@ -112,7 +114,8 @@ public enum EnumIntegerEnum /// /// Gets or Sets EnumInteger /// - [DataMember(Name="enum_integer", EmitDefaultValue=false)] public EnumIntegerEnum? EnumInteger { get; set; } + [DataMember(Name="enum_integer", EmitDefaultValue=false)] + public EnumIntegerEnum? EnumInteger { get; set; } /// /// Defines EnumNumber /// @@ -136,11 +139,13 @@ public enum EnumNumberEnum /// /// Gets or Sets EnumNumber /// - [DataMember(Name="enum_number", EmitDefaultValue=false)] public EnumNumberEnum? EnumNumber { get; set; } + [DataMember(Name="enum_number", EmitDefaultValue=false)] + public EnumNumberEnum? EnumNumber { get; set; } /// /// Gets or Sets OuterEnum /// - [DataMember(Name="outerEnum", EmitDefaultValue=false)] public OuterEnum? OuterEnum { get; set; } + [DataMember(Name="outerEnum", EmitDefaultValue=false)] + public OuterEnum? OuterEnum { get; set; } /// /// Initializes a new instance of the class. /// diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/MapTest.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/MapTest.cs index 3a767a76e8cd..14c90960be77 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/MapTest.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/MapTest.cs @@ -56,7 +56,8 @@ public enum InnerEnum /// /// Gets or Sets MapOfEnumString /// - [DataMember(Name="map_of_enum_string", EmitDefaultValue=false)] public Dictionary MapOfEnumString { get; set; } + [DataMember(Name="map_of_enum_string", EmitDefaultValue=false)] + public Dictionary MapOfEnumString { get; set; } /// /// Initializes a new instance of the class. /// diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Order.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Order.cs index 5c18083655e3..0c4a6a5b60f9 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Order.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Order.cs @@ -63,7 +63,8 @@ public enum StatusEnum /// Order Status /// /// Order Status - [DataMember(Name="status", EmitDefaultValue=false)] public StatusEnum? Status { get; set; } + [DataMember(Name="status", EmitDefaultValue=false)] + public StatusEnum? Status { get; set; } /// /// Initializes a new instance of the class. /// diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Pet.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Pet.cs index b29709bd263f..b7be3ee84f91 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Pet.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/Pet.cs @@ -63,7 +63,8 @@ public enum StatusEnum /// pet status in the store /// /// pet status in the store - [DataMember(Name="status", EmitDefaultValue=false)] public StatusEnum? Status { get; set; } + [DataMember(Name="status", EmitDefaultValue=false)] + public StatusEnum? Status { get; set; } /// /// Initializes a new instance of the class. ///