From 5f9164049c5365ab71b179a008441b9ab77420d1 Mon Sep 17 00:00:00 2001 From: John Hancock Date: Wed, 6 Jan 2016 20:02:43 -0500 Subject: [PATCH 1/3] CSharp: add support for DateTimeOffset and sourceFolder configuration --- .../io/swagger/codegen/CodegenConstants.java | 3 ++ .../languages/CSharpClientCodegen.java | 32 +++++++++++++++++++ .../main/resources/csharp/ApiClient.mustache | 6 ++++ .../csharp/CSharpClientOptionsTest.java | 4 +++ .../options/CSharpClientOptionsProvider.java | 5 ++- .../csharp/SwaggerClientTest/TestApiClient.cs | 2 +- 6 files changed, 50 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java index 80aab1af864..6fa62061300 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java @@ -46,6 +46,9 @@ public class CodegenConstants { public static final String SORT_PARAMS_BY_REQUIRED_FLAG = "sortParamsByRequiredFlag"; public static final String SORT_PARAMS_BY_REQUIRED_FLAG_DESC = "Sort method arguments to place required parameters before optional parameters."; + public static final String USE_DATETIME_OFFSET = "useDateTimeOffset"; + public static final String USE_DATETIME_OFFSET_DESC = "Use DateTimeOffset to model date-time properties"; + public static final String ENSURE_UNIQUE_PARAMS = "ensureUniqueParams"; public static final String ENSURE_UNIQUE_PARAMS_DESC = "Whether to ensure parameter names are unique in an operation (rename parameters that are not)."; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index 3a97237ddab..b68efe4fff9 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -25,6 +25,7 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig private static final Logger LOGGER = LoggerFactory.getLogger(CSharpClientCodegen.class); protected boolean optionalAssemblyInfoFlag = true; protected boolean optionalMethodArgumentFlag = true; + protected boolean useDateTimeOffsetFlag = false; protected String packageTitle = "Swagger Library"; protected String packageProductName = "SwaggerLibrary"; protected String packageDescription = "A library generated from a Swagger doc"; @@ -76,6 +77,7 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig "List", "Dictionary", "DateTime?", + "DateTimeOffset?", "String", "Boolean", "Double", @@ -114,6 +116,8 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig "e.g. void square(int x=10) (.net 4.0+ only).")); cliOptions.add(CliOption.newBoolean(CodegenConstants.OPTIONAL_ASSEMBLY_INFO, CodegenConstants.OPTIONAL_ASSEMBLY_INFO_DESC).defaultValue(Boolean.TRUE.toString())); + cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC).defaultValue(sourceFolder)); + cliOptions.add(CliOption.newBoolean(CodegenConstants.USE_DATETIME_OFFSET, CodegenConstants.USE_DATETIME_OFFSET_DESC)); } @Override @@ -126,6 +130,14 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig additionalProperties.put(CodegenConstants.PACKAGE_VERSION, packageVersion); } + if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)){ + setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); + } + else + { + additionalProperties.put(CodegenConstants.SOURCE_FOLDER, this.sourceFolder); + } + if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) { setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME)); apiPackage = packageName + ".Api"; @@ -135,6 +147,13 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig additionalProperties.put(CodegenConstants.PACKAGE_NAME, packageName); } + // Use DateTimeOffset + if (additionalProperties.containsKey(CodegenConstants.USE_DATETIME_OFFSET)) + { + useDateTimeOffset(Boolean.valueOf(additionalProperties.get(CodegenConstants.USE_DATETIME_OFFSET).toString())); + } + additionalProperties.put(CodegenConstants.USE_DATETIME_OFFSET, useDateTimeOffsetFlag); + additionalProperties.put("clientPackage", clientPackage); // Add properties used by AssemblyInfo.mustache @@ -320,6 +339,15 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig this.optionalMethodArgumentFlag = flag; } + public void useDateTimeOffset(boolean flag) { + this.useDateTimeOffsetFlag = flag; + if (flag) + typeMapping.put("datetime", "DateTimeOffset?"); + else + typeMapping.put("datetime", "DateTime?"); + } + + public void setPackageName(String packageName) { this.packageName = packageName; } @@ -328,6 +356,10 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig this.packageVersion = packageVersion; } + public void setSourceFolder(String sourceFolder) { + this.sourceFolder = sourceFolder; + } + @Override public Map postProcessModels(Map objs) { List models = (List) objs.get("models"); diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 142b2e6bbb9..023790b5a38 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -194,6 +194,12 @@ namespace {{packageName}}.Client // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 // For example: 2009-06-15T13:45:30.0000000 return ((DateTime)obj).ToString (Configuration.DateTimeFormat); + else if (obj is DateTimeOffset) + // Return a formatted date string - Can be customized with Configuration.DateTimeFormat + // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o") + // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 + // For example: 2009-06-15T13:45:30.0000000 + return ((DateTimeOffset)obj).ToString (Configuration.DateTimeFormat); else if (obj is IList) { var flattenedString = new StringBuilder(); diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java index 7b35ed020b9..c0cd6a6e9c8 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java @@ -34,6 +34,10 @@ public class CSharpClientOptionsTest extends AbstractOptionsTest { clientCodegen.setOptionalAssemblyInfoFlag(true); times = 1; + clientCodegen.setSourceFolder(CSharpClientOptionsProvider.SOURCE_FOLDER_VALUE); + times = 1; + clientCodegen.useDateTimeOffset(true); + times = 1; }}; } } diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java index 97228fdccc0..6e3b14c580d 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java @@ -9,7 +9,8 @@ import java.util.Map; public class CSharpClientOptionsProvider implements OptionsProvider { public static final String PACKAGE_NAME_VALUE = "swagger_client_csharp"; public static final String PACKAGE_VERSION_VALUE = "1.0.0-SNAPSHOT"; - + public static final String SOURCE_FOLDER_VALUE = "src_csharp"; + @Override public String getLanguage() { return "csharp"; @@ -23,6 +24,8 @@ public class CSharpClientOptionsProvider implements OptionsProvider { .put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, "true") .put(CodegenConstants.OPTIONAL_METHOD_ARGUMENT, "true") .put(CodegenConstants.OPTIONAL_ASSEMBLY_INFO, "true") + .put(CodegenConstants.USE_DATETIME_OFFSET, "true") + .put(CodegenConstants.SOURCE_FOLDER, SOURCE_FOLDER_VALUE) .build(); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs index f0232c330f0..0fc92c7266e 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs @@ -48,7 +48,7 @@ namespace SwaggerClientTest.TestApiClient { ApiClient api = new ApiClient (); // test datetime with a time zone - DateTime dateWithTz = DateTime.Parse("2008-04-10T13:30:00.0000000-04:00", null, System.Globalization.DateTimeStyles.RoundtripKind); + DateTimeOffset dateWithTz = DateTimeOffset.Parse("2008-04-10T13:30:00.0000000-04:00", null, System.Globalization.DateTimeStyles.RoundtripKind); Assert.AreEqual("2008-04-10T13:30:00.0000000-04:00", api.ParameterToString(dateWithTz)); } From ebe090572f466f418d0561f2155b725af8e5e9bf Mon Sep 17 00:00:00 2001 From: John Hancock Date: Wed, 6 Jan 2016 20:02:43 -0500 Subject: [PATCH 2/3] CSharp: add support for DateTimeOffset and sourceFolder configuration options Adds option to use DateTimeOffset to model datetime fields instead of DateTime to allow preservation of timezone information. Modifies ApiClient.ParameterToString to support DateTimeOffset. Also adds sourceFolder option. --- .../languages/CSharpClientCodegen.java | 60 +++++++++---------- .../csharp/CSharpClientOptionsTest.java | 9 ++- .../options/CSharpClientOptionsProvider.java | 6 +- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index b68efe4fff9..322729ac8c0 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -25,7 +25,7 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig private static final Logger LOGGER = LoggerFactory.getLogger(CSharpClientCodegen.class); protected boolean optionalAssemblyInfoFlag = true; protected boolean optionalMethodArgumentFlag = true; - protected boolean useDateTimeOffsetFlag = false; + protected boolean useDateTimeOffsetFlag = false; protected String packageTitle = "Swagger Library"; protected String packageProductName = "SwaggerLibrary"; protected String packageDescription = "A library generated from a Swagger doc"; @@ -77,7 +77,7 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig "List", "Dictionary", "DateTime?", - "DateTimeOffset?", + "DateTimeOffset?", "String", "Boolean", "Double", @@ -116,8 +116,8 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig "e.g. void square(int x=10) (.net 4.0+ only).")); cliOptions.add(CliOption.newBoolean(CodegenConstants.OPTIONAL_ASSEMBLY_INFO, CodegenConstants.OPTIONAL_ASSEMBLY_INFO_DESC).defaultValue(Boolean.TRUE.toString())); - cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC).defaultValue(sourceFolder)); - cliOptions.add(CliOption.newBoolean(CodegenConstants.USE_DATETIME_OFFSET, CodegenConstants.USE_DATETIME_OFFSET_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC).defaultValue(sourceFolder)); + cliOptions.add(CliOption.newBoolean(CodegenConstants.USE_DATETIME_OFFSET, CodegenConstants.USE_DATETIME_OFFSET_DESC)); } @Override @@ -130,14 +130,14 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig additionalProperties.put(CodegenConstants.PACKAGE_VERSION, packageVersion); } - if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)){ - setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); - } - else - { - additionalProperties.put(CodegenConstants.SOURCE_FOLDER, this.sourceFolder); - } - + if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)){ + setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); + } + else + { + additionalProperties.put(CodegenConstants.SOURCE_FOLDER, this.sourceFolder); + } + if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) { setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME)); apiPackage = packageName + ".Api"; @@ -147,13 +147,13 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig additionalProperties.put(CodegenConstants.PACKAGE_NAME, packageName); } - // Use DateTimeOffset - if (additionalProperties.containsKey(CodegenConstants.USE_DATETIME_OFFSET)) - { - useDateTimeOffset(Boolean.valueOf(additionalProperties.get(CodegenConstants.USE_DATETIME_OFFSET).toString())); - } - additionalProperties.put(CodegenConstants.USE_DATETIME_OFFSET, useDateTimeOffsetFlag); - + // Use DateTimeOffset + if (additionalProperties.containsKey(CodegenConstants.USE_DATETIME_OFFSET)) + { + useDateTimeOffset(Boolean.valueOf(additionalProperties.get(CodegenConstants.USE_DATETIME_OFFSET).toString())); + } + additionalProperties.put(CodegenConstants.USE_DATETIME_OFFSET, useDateTimeOffsetFlag); + additionalProperties.put("clientPackage", clientPackage); // Add properties used by AssemblyInfo.mustache @@ -339,15 +339,15 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig this.optionalMethodArgumentFlag = flag; } - public void useDateTimeOffset(boolean flag) { - this.useDateTimeOffsetFlag = flag; - if (flag) - typeMapping.put("datetime", "DateTimeOffset?"); - else - typeMapping.put("datetime", "DateTime?"); + public void useDateTimeOffset(boolean flag) { + this.useDateTimeOffsetFlag = flag; + if (flag) + typeMapping.put("datetime", "DateTimeOffset?"); + else + typeMapping.put("datetime", "DateTime?"); } - + public void setPackageName(String packageName) { this.packageName = packageName; } @@ -356,10 +356,10 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig this.packageVersion = packageVersion; } - public void setSourceFolder(String sourceFolder) { - this.sourceFolder = sourceFolder; - } - + public void setSourceFolder(String sourceFolder) { + this.sourceFolder = sourceFolder; + } + @Override public Map postProcessModels(Map objs) { List models = (List) objs.get("models"); diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java index c0cd6a6e9c8..367977e2b05 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java @@ -33,11 +33,10 @@ public class CSharpClientOptionsTest extends AbstractOptionsTest { times = 1; clientCodegen.setOptionalAssemblyInfoFlag(true); times = 1; - - clientCodegen.setSourceFolder(CSharpClientOptionsProvider.SOURCE_FOLDER_VALUE); - times = 1; - clientCodegen.useDateTimeOffset(true); - times = 1; + clientCodegen.setSourceFolder(CSharpClientOptionsProvider.SOURCE_FOLDER_VALUE); + times = 1; + clientCodegen.useDateTimeOffset(true); + times = 1; }}; } } diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java index 6e3b14c580d..0c2da1f3fa2 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java @@ -9,7 +9,7 @@ import java.util.Map; public class CSharpClientOptionsProvider implements OptionsProvider { public static final String PACKAGE_NAME_VALUE = "swagger_client_csharp"; public static final String PACKAGE_VERSION_VALUE = "1.0.0-SNAPSHOT"; - public static final String SOURCE_FOLDER_VALUE = "src_csharp"; + public static final String SOURCE_FOLDER_VALUE = "src_csharp"; @Override public String getLanguage() { @@ -24,8 +24,8 @@ public class CSharpClientOptionsProvider implements OptionsProvider { .put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, "true") .put(CodegenConstants.OPTIONAL_METHOD_ARGUMENT, "true") .put(CodegenConstants.OPTIONAL_ASSEMBLY_INFO, "true") - .put(CodegenConstants.USE_DATETIME_OFFSET, "true") - .put(CodegenConstants.SOURCE_FOLDER, SOURCE_FOLDER_VALUE) + .put(CodegenConstants.USE_DATETIME_OFFSET, "true") + .put(CodegenConstants.SOURCE_FOLDER, SOURCE_FOLDER_VALUE) .build(); } From 2a7fc2d00e58be0552522487e79734e5587bf142 Mon Sep 17 00:00:00 2001 From: John Hancock Date: Fri, 8 Jan 2016 10:51:30 -0500 Subject: [PATCH 3/3] Fixed whitespace/tab issues --- .../src/main/java/io/swagger/codegen/CodegenConstants.java | 4 ++-- .../src/main/resources/csharp/ApiClient.mustache | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java index 6fa62061300..4a4f9e037ef 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java @@ -46,8 +46,8 @@ public class CodegenConstants { public static final String SORT_PARAMS_BY_REQUIRED_FLAG = "sortParamsByRequiredFlag"; public static final String SORT_PARAMS_BY_REQUIRED_FLAG_DESC = "Sort method arguments to place required parameters before optional parameters."; - public static final String USE_DATETIME_OFFSET = "useDateTimeOffset"; - public static final String USE_DATETIME_OFFSET_DESC = "Use DateTimeOffset to model date-time properties"; + public static final String USE_DATETIME_OFFSET = "useDateTimeOffset"; + public static final String USE_DATETIME_OFFSET_DESC = "Use DateTimeOffset to model date-time properties"; public static final String ENSURE_UNIQUE_PARAMS = "ensureUniqueParams"; public static final String ENSURE_UNIQUE_PARAMS_DESC = "Whether to ensure parameter names are unique in an operation (rename parameters that are not)."; diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 023790b5a38..fab938460fc 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -194,12 +194,12 @@ namespace {{packageName}}.Client // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 // For example: 2009-06-15T13:45:30.0000000 return ((DateTime)obj).ToString (Configuration.DateTimeFormat); - else if (obj is DateTimeOffset) + else if (obj is DateTimeOffset) // Return a formatted date string - Can be customized with Configuration.DateTimeFormat // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o") // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 // For example: 2009-06-15T13:45:30.0000000 - return ((DateTimeOffset)obj).ToString (Configuration.DateTimeFormat); + return ((DateTimeOffset)obj).ToString (Configuration.DateTimeFormat); else if (obj is IList) { var flattenedString = new StringBuilder();