From 75e55c5a0466b2483d25f2c113b7a6b756365ea4 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 26 Nov 2020 20:46:18 +0000 Subject: [PATCH 1/7] fix(NJsonSchema.CodeGeneration.TypeScript): for strict null checking, include explicit '| null' to return type of createInstance (#1287) --- .../Templates/Class.liquid | 2 +- .../Templates/File.ReferenceHandling.liquid | 2 +- .../Templates/KnockoutClass.liquid | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NJsonSchema.CodeGeneration.TypeScript/Templates/Class.liquid b/src/NJsonSchema.CodeGeneration.TypeScript/Templates/Class.liquid index 6ba1cf28e..46f37bd93 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript/Templates/Class.liquid +++ b/src/NJsonSchema.CodeGeneration.TypeScript/Templates/Class.liquid @@ -93,7 +93,7 @@ {% endif -%} } - static fromJS(data: any{% if HandleReferences %}, _mappings?: any{% endif %}): {{ ClassName }} { + static fromJS(data: any{% if HandleReferences %}, _mappings?: any{% endif %}): {{ ClassName }}{% if HandleReferences %} | null{% endif %} { data = typeof data === 'object' ? data : {}; {% if HandleReferences -%} {% if HasBaseDiscriminator -%} diff --git a/src/NJsonSchema.CodeGeneration.TypeScript/Templates/File.ReferenceHandling.liquid b/src/NJsonSchema.CodeGeneration.TypeScript/Templates/File.ReferenceHandling.liquid index 10d8401a7..092651124 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript/Templates/File.ReferenceHandling.liquid +++ b/src/NJsonSchema.CodeGeneration.TypeScript/Templates/File.ReferenceHandling.liquid @@ -41,7 +41,7 @@ return json; } -function createInstance(data: any, mappings: any, type: any): T { +function createInstance(data: any, mappings: any, type: any): T | null { if (!mappings) mappings = []; if (!data) diff --git a/src/NJsonSchema.CodeGeneration.TypeScript/Templates/KnockoutClass.liquid b/src/NJsonSchema.CodeGeneration.TypeScript/Templates/KnockoutClass.liquid index 360966182..8a108c6b0 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript/Templates/KnockoutClass.liquid +++ b/src/NJsonSchema.CodeGeneration.TypeScript/Templates/KnockoutClass.liquid @@ -37,7 +37,7 @@ } } - static fromJS(data: any{% if HandleReferences %}, _mappings?: any{% endif %}): {{ ClassName }} { + static fromJS(data: any{% if HandleReferences %}, _mappings?: any{% endif %}): {{ ClassName }}{% if HandleReferences %} | null{% endif %} { {% if HandleReferences -%} {% if HasBaseDiscriminator -%} {% for derivedClass in DerivedClasses -%} From bc828340ab42541aeecfe1557654e2609711aee2 Mon Sep 17 00:00:00 2001 From: jacobpovar Date: Wed, 16 Dec 2020 18:53:57 +0300 Subject: [PATCH 2/7] Use nullable reference for AnyType if required (#1289) --- .../NullableReferenceTypesTests.cs | 152 ++++++++++++++++++ .../CSharpTypeResolver.cs | 7 +- 2 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 src/NJsonSchema.CodeGeneration.CSharp.Tests/NullableReferenceTypesTests.cs diff --git a/src/NJsonSchema.CodeGeneration.CSharp.Tests/NullableReferenceTypesTests.cs b/src/NJsonSchema.CodeGeneration.CSharp.Tests/NullableReferenceTypesTests.cs new file mode 100644 index 000000000..5291206cf --- /dev/null +++ b/src/NJsonSchema.CodeGeneration.CSharp.Tests/NullableReferenceTypesTests.cs @@ -0,0 +1,152 @@ +using System.ComponentModel.DataAnnotations; +using System.Threading.Tasks; +using NJsonSchema.CodeGeneration.CSharp; +using NJsonSchema.Generation; +using Xunit; + +namespace NJsonSchema.CodeGeneration.Tests.CSharp +{ + public class NullableReferenceTypesTests + { + private class ClassWithRequiredObject + { + public object Property { get; set; } + + [Required] + [Newtonsoft.Json.JsonProperty("property2", Required = Newtonsoft.Json.Required.Always)] + public object Property2 { get; set; } + } + + [Fact] + public async Task When_property_is_optional_and_GenerateNullableReferenceTypes_is_not_set_then_CSharp_property_is_not_nullable() + { + //// Arrange + var schema = JsonSchema.FromType(new JsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + }); + var schemaData = schema.ToJson(); + + //// Act + var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings + { + ClassStyle = CSharpClassStyle.Poco, + SchemaType = SchemaType.OpenApi3, + GenerateNullableReferenceTypes = false + }); + var code = generator.GenerateFile("MyClass"); + + //// Assert + Assert.Contains("public object Property { get; set; }", code); + Assert.Contains("public object Property2 { get; set; }", code); + } + + [Fact] + public async Task When_property_is_optional_and_GenerateNullableOptionalProperties_is_set_then_CSharp_property_is_nullable() + { + //// Arrange + var schema = JsonSchema.FromType(new JsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + }); + var schemaData = schema.ToJson(); + + //// Act + var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings + { + ClassStyle = CSharpClassStyle.Poco, + SchemaType = SchemaType.OpenApi3, + GenerateNullableReferenceTypes = true + }); + var code = generator.GenerateFile("MyClass"); + + //// Assert + Assert.Contains("public object? Property { get; set; }= default!;", code); + Assert.Contains("public object Property2 { get; set; }= default!;", code); + } + + [Fact] + public async Task When_generating_from_json_schema_property_is_optional_and_GenerateNullableOptionalProperties_is_not_set_then_CSharp_property() + { + //// Arrange + + // CSharpGenerator `new object()` adds = new object() initializer to property only if it's explicitly marked + // as having `type: object` in json schema + var schemaJson = @" + { + ""type"": ""object"", + ""required"": [ + ""property2"" + ], + ""properties"": { + ""Property"": { + ""x-nullable"": true, + ""type"": ""object"" + }, + ""property2"": { + ""type"": ""object"" + } + } + } + "; + + var schema = await JsonSchema.FromJsonAsync(schemaJson); + var schemaData = schema.ToJson(); + + //// Act + var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings + { + ClassStyle = CSharpClassStyle.Poco, + SchemaType = SchemaType.OpenApi3, + GenerateNullableReferenceTypes = false + }); + var code = generator.GenerateFile("MyClass"); + + //// Assert + Assert.Contains("public object Property { get; set; }", code); + Assert.Contains("public object Property2 { get; set; } = new object();", code); + } + + [Fact] + public async Task When_generating_from_json_schema_property_is_optional_and_GenerateNullableOptionalProperties_is_set_then_CSharp_property() + { + //// Arrange + + // CSharpGenerator `new object()` adds = new object() initializer to property only if it's explicitly marked + // as having `type: object` in json schema + var schemaJson = @" + { + ""type"": ""object"", + ""required"": [ + ""property2"" + ], + ""properties"": { + ""Property"": { + ""x-nullable"": true, + ""type"": ""object"" + }, + ""property2"": { + ""type"": ""object"" + } + } + } + "; + + var schema = await JsonSchema.FromJsonAsync(schemaJson); + var schemaData = schema.ToJson(); + + //// Act + var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings + { + ClassStyle = CSharpClassStyle.Poco, + SchemaType = SchemaType.OpenApi3, + GenerateNullableReferenceTypes = true + }); + var code = generator.GenerateFile("MyClass"); + + //// Assert + Assert.Contains("public object? Property { get; set; }= default!;", code); + Assert.Contains("public object Property2 { get; set; } = new object();", code); + } + } +} \ No newline at end of file diff --git a/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs b/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs index cf0a5eef3..fb26820d8 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs +++ b/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs @@ -75,13 +75,15 @@ schema is JsonSchemaProperty property && isNullable = true; } + var markAsNullableType = Settings.GenerateNullableReferenceTypes && isNullable; + if (schema.ActualTypeSchema.IsAnyType && schema.InheritedSchema == null && // not in inheritance hierarchy schema.AllOf.Count == 0 && !Types.Keys.Contains(schema) && !schema.HasReference) { - return Settings.AnyType; + return markAsNullableType ? Settings.AnyType + "?" : Settings.AnyType; } var type = schema.ActualTypeSchema.Type; @@ -107,7 +109,8 @@ schema is JsonSchemaProperty property && return ResolveBoolean(isNullable); } - var nullableReferenceType = Settings.GenerateNullableReferenceTypes && isNullable ? "?" : string.Empty; + + var nullableReferenceType = markAsNullableType ? "?" : string.Empty; if (schema.IsBinary) { From a2e8418e236f5967d3446159f98630e4af484719 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Thu, 17 Dec 2020 11:44:46 +0100 Subject: [PATCH 3/7] Update Namotion.Reflection --- src/NJsonSchema/NJsonSchema.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NJsonSchema/NJsonSchema.csproj b/src/NJsonSchema/NJsonSchema.csproj index 541124a00..3bc888880 100644 --- a/src/NJsonSchema/NJsonSchema.csproj +++ b/src/NJsonSchema/NJsonSchema.csproj @@ -28,7 +28,7 @@ - + From 4d479517eb58ad97cb6b503d123a4d78739309d3 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Thu, 17 Dec 2020 17:11:03 +0100 Subject: [PATCH 4/7] v10.3.2 --- .../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 af7c4fedc..3bd413464 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 - 10.3.1 + 10.3.2 json schema validation generator .net Copyright © Rico Suter, 2020 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 c3783337e..0c8c9cc67 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 - 10.3.1 + 10.3.2 json schema validation generator .net Copyright © Rico Suter, 2020 https://github.com/RicoSuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj b/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj index bf683063d..aa7360e22 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 - 10.3.1 + 10.3.2 json schema validation generator .net Copyright © Rico Suter, 2020 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 76cc1d586..223c598e3 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 - 10.3.1 + 10.3.2 json schema validation generator .net Copyright © Rico Suter, 2020 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema/NJsonSchema.csproj b/src/NJsonSchema/NJsonSchema.csproj index 3bc888880..fb891f0e7 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 - 10.3.1 + 10.3.2 json schema validation generator .net Copyright © Rico Suter, 2020 https://github.com/RicoSuter/NJsonSchema/blob/master/LICENSE.md From 39a14b5f5af0f6a4cf0ccb53aa03c948d12909e8 Mon Sep 17 00:00:00 2001 From: ChangeTheCode Date: Fri, 18 Dec 2020 10:18:54 +0100 Subject: [PATCH 5/7] fix(generator): fix round issue for sample date generator (#1297) --- .../Generation/SampleJsonDataGeneratorTests.cs | 8 ++++---- src/NJsonSchema/Generation/SampleJsonDataGenerator.cs | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/NJsonSchema.Tests/Generation/SampleJsonDataGeneratorTests.cs b/src/NJsonSchema.Tests/Generation/SampleJsonDataGeneratorTests.cs index f4dbd0741..5d6700591 100644 --- a/src/NJsonSchema.Tests/Generation/SampleJsonDataGeneratorTests.cs +++ b/src/NJsonSchema.Tests/Generation/SampleJsonDataGeneratorTests.cs @@ -141,7 +141,7 @@ public async Task PropertyWithIntegerMinimumDefiniton() [Fact] - public async Task PropertyWithFloatMinimumDefiniton() + public async Task PropertyWithFloatMinimumDefinition() { //// Arrange var data = @"{ @@ -172,8 +172,8 @@ public async Task PropertyWithFloatMinimumDefiniton() ""properties"": { ""value"": { ""type"": ""number"", - ""maximum"": 5.0, - ""minimum"": 1.0 + ""maximum"": 5.00001, + ""minimum"": 1.000012 } } } @@ -188,7 +188,7 @@ public async Task PropertyWithFloatMinimumDefiniton() var validationResult = schema.Validate(testJson); Assert.NotNull(validationResult); Assert.Equal(0, validationResult.Count); - Assert.Equal(1.0, testJson.SelectToken("body.numberContent.value").Value()); + Assert.Equal(1.000012, testJson.SelectToken("body.numberContent.value").Value()); } [Fact] diff --git a/src/NJsonSchema/Generation/SampleJsonDataGenerator.cs b/src/NJsonSchema/Generation/SampleJsonDataGenerator.cs index 33e1ac26f..a4dcb7eba 100644 --- a/src/NJsonSchema/Generation/SampleJsonDataGenerator.cs +++ b/src/NJsonSchema/Generation/SampleJsonDataGenerator.cs @@ -102,15 +102,15 @@ private static JToken HandleNumberType(JsonSchema schema) { if (schema.ExclusiveMinimumRaw != null) { - return JToken.FromObject(float.Parse(schema.Minimum.ToString()) + 0.1); + return JToken.FromObject((decimal)(float.Parse(schema.Minimum.ToString()) + 0.1)); } else if (schema.ExclusiveMinimum != null) { - return JToken.FromObject(float.Parse(schema.ExclusiveMinimum.ToString())); + return JToken.FromObject(decimal.Parse(schema.ExclusiveMinimum.ToString())); } else if (schema.Minimum.HasValue) { - return float.Parse(schema.Minimum.ToString()); + return decimal.Parse(schema.Minimum.ToString()); } return JToken.FromObject(0.0); } From 303aacff1ca6e815c0bc30423298e93bc4a3f000 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Fri, 15 Jan 2021 00:24:28 +0100 Subject: [PATCH 6/7] Expose format in PropertyModel (liquid), https://github.com/RicoSuter/NSwag/issues/3246 --- src/NJsonSchema.CodeGeneration/Models/PropertyModelBase.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/NJsonSchema.CodeGeneration/Models/PropertyModelBase.cs b/src/NJsonSchema.CodeGeneration/Models/PropertyModelBase.cs index d3b6a3b32..858e9d241 100644 --- a/src/NJsonSchema.CodeGeneration/Models/PropertyModelBase.cs +++ b/src/NJsonSchema.CodeGeneration/Models/PropertyModelBase.cs @@ -70,6 +70,9 @@ protected PropertyModelBase( /// Gets the property extension data. public IDictionary ExtensionData => _property.ExtensionData; + /// Gets the JSON Schema format property. + public string Format => _property.ActualSchema.Format; + /// Gets the type name hint for the property. protected string GetTypeNameHint() { From 16cf7494821134abfb148462617e3e824ee23626 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Fri, 15 Jan 2021 18:48:54 +0100 Subject: [PATCH 7/7] v10.3.3 --- .../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 3bd413464..2d762a185 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 - 10.3.2 + 10.3.3 json schema validation generator .net Copyright © Rico Suter, 2020 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 0c8c9cc67..06d707c59 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 - 10.3.2 + 10.3.3 json schema validation generator .net Copyright © Rico Suter, 2020 https://github.com/RicoSuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj b/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj index aa7360e22..703e17552 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 - 10.3.2 + 10.3.3 json schema validation generator .net Copyright © Rico Suter, 2020 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 223c598e3..9a398640a 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 - 10.3.2 + 10.3.3 json schema validation generator .net Copyright © Rico Suter, 2020 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema/NJsonSchema.csproj b/src/NJsonSchema/NJsonSchema.csproj index fb891f0e7..3ac5ecda0 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 - 10.3.2 + 10.3.3 json schema validation generator .net Copyright © Rico Suter, 2020 https://github.com/RicoSuter/NJsonSchema/blob/master/LICENSE.md