From 85323a8d9623e134d72b9f67ca3dcf75ce5f0314 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Tue, 19 Mar 2019 16:48:55 +0100 Subject: [PATCH 1/8] Add test #929 --- .../Generation/EnumGenerationTests.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs b/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs index 02da9fffd..ee1c63f3e 100644 --- a/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs +++ b/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs @@ -155,5 +155,29 @@ public async Task When_string_enum_property_has_default_then_default_is_converte //// Assert Assert.Equal("C", schema.Properties["MyEnumeration"].Default); } + + public class Party + { + public MyEnumeration? EnumValue { get; set; } + + public bool ShouldSerializeEnumValue() + { + return EnumValue.HasValue; + } + } + + [Fact] + public async Task When_enum_property_has_should_serialize_then_no_npe() + { + //// Arrange + var schema = await JsonSchema4.FromTypeAsync(new JsonSchemaGeneratorSettings()); + + //// Act + var json = schema.ToJson(); + + //// Assert + Assert.True(schema.Properties.ContainsKey("EnumValue")); + Assert.NotNull(json); + } } } \ No newline at end of file From 36552c6c708c374db545d1d3dbb43fdcfefa7b05 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Tue, 19 Mar 2019 17:19:51 +0100 Subject: [PATCH 2/8] Fix property type resolution for any schemas in definitions, https://github.com/RSuter/NSwag/issues/2028 --- .../InheritanceTests.cs | 44 +++++++++++++++++++ .../CSharpTypeResolver.cs | 2 +- .../TypeScriptTypeResolver.cs | 2 +- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/NJsonSchema.CodeGeneration.CSharp.Tests/InheritanceTests.cs b/src/NJsonSchema.CodeGeneration.CSharp.Tests/InheritanceTests.cs index af000f453..8472a9e17 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp.Tests/InheritanceTests.cs +++ b/src/NJsonSchema.CodeGeneration.CSharp.Tests/InheritanceTests.cs @@ -88,5 +88,49 @@ public async Task When_class_with_discriminator_has_base_class_then_csharp_is_ge Assert.Contains("class ExceptionBase : Exception", code); Assert.Contains("class MyException : ExceptionBase", code); } + + [Fact] + public async Task When_property_references_any_schema_with_inheritance_then_property_type_is_correct() + { + //// Arrange + var json = @"{ + ""type"": ""object"", + ""properties"": { + ""dog"": { + ""$ref"": ""#/definitions/Dog"" + } + }, + ""definitions"": { + ""Pet"": { + ""type"": ""object"", + ""properties"": { + ""name"": { + ""type"": ""string"" + } + } + }, + ""Dog"": { + ""title"": ""Dog"", + ""description"": """", + ""allOf"": [ + { + ""$ref"": ""#/definitions/Pet"" + }, + { + ""type"": ""object"" + } + ] + } + } +}"; + var schema = await JsonSchema4.FromJsonAsync(json); + var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings { ClassStyle = CSharpClassStyle.Poco }); + + //// Act + var code = generator.GenerateFile(); + + //// Assert + Assert.Contains("public Dog Dog { get; set; }", code); + } } } diff --git a/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs b/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs index a38e866c7..3ee7d0a69 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs +++ b/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs @@ -65,7 +65,7 @@ public string Resolve(JsonSchema4 schema, bool isNullable, string typeNameHint, // Primitive schemas (no new type) - if (schema.ActualTypeSchema.IsAnyType) + if (schema.ActualTypeSchema.IsAnyType && !schema.HasReference) return "object"; var type = schema.ActualTypeSchema.Type; diff --git a/src/NJsonSchema.CodeGeneration.TypeScript/TypeScriptTypeResolver.cs b/src/NJsonSchema.CodeGeneration.TypeScript/TypeScriptTypeResolver.cs index 4424501a0..659fbe4a1 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript/TypeScriptTypeResolver.cs +++ b/src/NJsonSchema.CodeGeneration.TypeScript/TypeScriptTypeResolver.cs @@ -80,7 +80,7 @@ private string Resolve(JsonSchema4 schema, string typeNameHint, bool addInterfac // Primitive schemas (no new type) - if (schema.ActualTypeSchema.IsAnyType) + if (schema.ActualTypeSchema.IsAnyType && !schema.HasReference) return "any"; var type = schema.ActualTypeSchema.Type; From 1590ac8a76ec2664245d38bad54cd3471d703ff8 Mon Sep 17 00:00:00 2001 From: Meinrad Jean-Richard Date: Tue, 19 Mar 2019 17:29:03 +0100 Subject: [PATCH 3/8] Test and potential Fix for Interfaces. (#909) (#921) --- .../InterfaceTests.cs | 62 +++++++++++++++++++ .../Generation/JsonSchemaGenerator.cs | 2 +- 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/NJsonSchema.CodeGeneration.CSharp.Tests/InterfaceTests.cs diff --git a/src/NJsonSchema.CodeGeneration.CSharp.Tests/InterfaceTests.cs b/src/NJsonSchema.CodeGeneration.CSharp.Tests/InterfaceTests.cs new file mode 100644 index 000000000..751a5c0d7 --- /dev/null +++ b/src/NJsonSchema.CodeGeneration.CSharp.Tests/InterfaceTests.cs @@ -0,0 +1,62 @@ +using System.Threading.Tasks; +using NJsonSchema.Generation; +using Xunit; + +namespace NJsonSchema.CodeGeneration.CSharp.Tests +{ + public class InterfaceTests + { + public interface IPerson + { + string LastName { get; set; } + string FirstName { get; set; } + } + + public class Person : IPerson + { + public string LastName { get; set; } + public string FirstName { get; set; } + } + + [Fact] + public async Task When_interface_has_properties_then_properties_are_included_in_schema() + { + //// Arrange + var schema = await JsonSchema4.FromTypeAsync(new JsonSchemaGeneratorSettings()); + + //// Act + var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings + { + ClassStyle = CSharpClassStyle.Poco, + SchemaType = SchemaType.Swagger2 + }); + var code = generator.GenerateFile("Person"); + + //// Assert + Assert.Equal(2, schema.Properties.Count); + Assert.Contains("public string LastName { get; set; }\n", code); + Assert.Contains("public string FirstName { get; set; }\n", code); + } + + [Fact] + public async Task When_class_implements_interface_then_properties_are_included_in_schema() + { + //// Arrange + var schema = await JsonSchema4.FromTypeAsync(new JsonSchemaGeneratorSettings()); + + //// Act + var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings + { + ClassStyle = CSharpClassStyle.Poco, + SchemaType = SchemaType.Swagger2 + }); + var code = generator.GenerateFile("Person"); + + //// Assert + Assert.Equal(2, schema.Properties.Count); + Assert.Contains("public string LastName { get; set; }\n", code); + Assert.Contains("public string FirstName { get; set; }\n", code); + } + } + +} diff --git a/src/NJsonSchema/Generation/JsonSchemaGenerator.cs b/src/NJsonSchema/Generation/JsonSchemaGenerator.cs index 1cb09147b..8b23bb6dc 100644 --- a/src/NJsonSchema/Generation/JsonSchemaGenerator.cs +++ b/src/NJsonSchema/Generation/JsonSchemaGenerator.cs @@ -602,7 +602,7 @@ private async Task GeneratePropertiesAsync(Type type, JsonSchema4 schema, JsonSc var info = propertiesAndFields.FirstOrDefault(p => p.Name == property.UnderlyingName); var propertyInfo = info as PropertyInfo; #if !LEGACY - if (Settings.GenerateAbstractProperties || propertyInfo == null || + if (Settings.GenerateAbstractProperties || propertyInfo == null || propertyInfo.DeclaringType.GetTypeInfo().IsInterface || (propertyInfo.GetMethod?.IsAbstract != true && propertyInfo.SetMethod?.IsAbstract != true)) #else if (Settings.GenerateAbstractProperties || propertyInfo == null || From 195e59665810aa4eb17606d5bf251b1849e1ba96 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Tue, 19 Mar 2019 17:32:21 +0100 Subject: [PATCH 4/8] Add legacy support, #921 --- src/NJsonSchema/Generation/JsonSchemaGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NJsonSchema/Generation/JsonSchemaGenerator.cs b/src/NJsonSchema/Generation/JsonSchemaGenerator.cs index 8b23bb6dc..754b68a05 100644 --- a/src/NJsonSchema/Generation/JsonSchemaGenerator.cs +++ b/src/NJsonSchema/Generation/JsonSchemaGenerator.cs @@ -605,7 +605,7 @@ private async Task GeneratePropertiesAsync(Type type, JsonSchema4 schema, JsonSc if (Settings.GenerateAbstractProperties || propertyInfo == null || propertyInfo.DeclaringType.GetTypeInfo().IsInterface || (propertyInfo.GetMethod?.IsAbstract != true && propertyInfo.SetMethod?.IsAbstract != true)) #else - if (Settings.GenerateAbstractProperties || propertyInfo == null || + if (Settings.GenerateAbstractProperties || propertyInfo == null || propertyInfo.DeclaringType.GetTypeInfo().IsInterface || (propertyInfo.GetGetMethod()?.IsAbstract != true && propertyInfo.GetSetMethod()?.IsAbstract != true)) #endif { From a1a0fe7fa83a04405d7b753d50b9361c5874cbb2 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Tue, 19 Mar 2019 17:33:01 +0100 Subject: [PATCH 5/8] v9.13.25 --- .../NJsonSchema.CodeGeneration.CSharp.csproj | 2 +- .../NJsonSchema.CodeGeneration.TypeScript.csproj | 2 +- .../NJsonSchema.CodeGeneration.csproj | 2 +- src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj | 2 +- src/NJsonSchema/NJsonSchema.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj b/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj index 8e1e37ee4..11a6d277f 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj +++ b/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net451 JSON Schema reader, generator and validator for .NET - 9.13.24 + 9.13.25 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj b/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj index f9766a8a7..c2886d589 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj +++ b/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net451 JSON Schema reader, generator and validator for .NET - 9.13.24 + 9.13.25 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj b/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj index cb631e9df..d675aba3a 100644 --- a/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj +++ b/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net451 JSON Schema reader, generator and validator for .NET - 9.13.24 + 9.13.25 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj b/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj index ad46da1b5..e35ff6945 100644 --- a/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj +++ b/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net45 JSON Schema reader, generator and validator for .NET - 9.13.24 + 9.13.25 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema/NJsonSchema.csproj b/src/NJsonSchema/NJsonSchema.csproj index 1f798bff4..d151de3cf 100644 --- a/src/NJsonSchema/NJsonSchema.csproj +++ b/src/NJsonSchema/NJsonSchema.csproj @@ -2,7 +2,7 @@ netstandard1.0;netstandard2.0;net40;net45 JSON Schema reader, generator and validator for .NET - 9.13.24 + 9.13.25 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md From 15b54533d12eba28b275f306b2c2c80c3276ebc9 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Tue, 19 Mar 2019 21:41:10 +0100 Subject: [PATCH 6/8] Convert comma to underline in enum names, closes https://github.com/RSuter/NSwag/issues/2009 --- src/NJsonSchema.CodeGeneration/DefaultEnumNameGenerator.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NJsonSchema.CodeGeneration/DefaultEnumNameGenerator.cs b/src/NJsonSchema.CodeGeneration/DefaultEnumNameGenerator.cs index e635dd926..f8adf236a 100644 --- a/src/NJsonSchema.CodeGeneration/DefaultEnumNameGenerator.cs +++ b/src/NJsonSchema.CodeGeneration/DefaultEnumNameGenerator.cs @@ -27,6 +27,7 @@ public string Generate(int index, string name, object value, JsonSchema4 schema) return ConversionUtilities.ConvertToUpperCamelCase(name .Replace(":", "-").Replace(@"""", @""), true) .Replace(".", "_") + .Replace(",", "_") .Replace("#", "_") .Replace("-", "_") .Replace("\\", "_"); From 61e4f21639753377026b4fe82f6a7807e54fd20f Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Tue, 19 Mar 2019 21:43:10 +0100 Subject: [PATCH 7/8] Name empty enum names as "Empty", closes https://github.com/RSuter/NSwag/issues/2011 --- src/NJsonSchema.CodeGeneration/DefaultEnumNameGenerator.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NJsonSchema.CodeGeneration/DefaultEnumNameGenerator.cs b/src/NJsonSchema.CodeGeneration/DefaultEnumNameGenerator.cs index f8adf236a..8eb4a6baf 100644 --- a/src/NJsonSchema.CodeGeneration/DefaultEnumNameGenerator.cs +++ b/src/NJsonSchema.CodeGeneration/DefaultEnumNameGenerator.cs @@ -19,6 +19,11 @@ public class DefaultEnumNameGenerator : IEnumNameGenerator /// The enumeration name. public string Generate(int index, string name, object value, JsonSchema4 schema) { + if (string.IsNullOrEmpty(name)) + { + return "Empty"; + } + if (name.StartsWith("_-")) { name = "__" + name.Substring(2); From bfa58337f0007bfea525f7858b5401c056fa9761 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Wed, 20 Mar 2019 16:35:12 +0100 Subject: [PATCH 8/8] v9.13.25 --- .../NJsonSchema.CodeGeneration.CSharp.csproj | 2 +- .../NJsonSchema.CodeGeneration.TypeScript.csproj | 2 +- .../NJsonSchema.CodeGeneration.csproj | 2 +- src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj | 2 +- src/NJsonSchema/NJsonSchema.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj b/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj index 11a6d277f..0757c7ca8 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj +++ b/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net451 JSON Schema reader, generator and validator for .NET - 9.13.25 + 9.13.26 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj b/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj index c2886d589..8ed7c62b3 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj +++ b/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net451 JSON Schema reader, generator and validator for .NET - 9.13.25 + 9.13.26 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj b/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj index d675aba3a..d5568d8b0 100644 --- a/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj +++ b/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net451 JSON Schema reader, generator and validator for .NET - 9.13.25 + 9.13.26 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj b/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj index e35ff6945..707b68bd1 100644 --- a/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj +++ b/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net45 JSON Schema reader, generator and validator for .NET - 9.13.25 + 9.13.26 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema/NJsonSchema.csproj b/src/NJsonSchema/NJsonSchema.csproj index d151de3cf..bdf7a232e 100644 --- a/src/NJsonSchema/NJsonSchema.csproj +++ b/src/NJsonSchema/NJsonSchema.csproj @@ -2,7 +2,7 @@ netstandard1.0;netstandard2.0;net40;net45 JSON Schema reader, generator and validator for .NET - 9.13.25 + 9.13.26 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md