From 0742d53282868662f4b5fd2d040972681b5e0453 Mon Sep 17 00:00:00 2001 From: Alexander Kykc Date: Thu, 8 Dec 2016 18:44:26 +0200 Subject: [PATCH 1/3] NJsonSchema used instead of non-free JSON.Net schema generator --- ...cy.Metadata.Swagger.DemoApplication.csproj | 4 ++-- .../app.config | 2 +- .../packages.config | 2 +- .../Core/LicenseInstsaller.cs | 12 ----------- Nancy.Metadata.Swagger/Core/SchemaCache.cs | 2 +- .../Fluent/SwaggerEndpointInfoExtensions.cs | 20 ++++++------------- .../Model/SwaggerSpecification.cs | 2 +- .../Modules/SwaggerDocsModuleBase.cs | 2 +- .../Nancy.Metadata.Swagger.csproj | 9 ++++----- Nancy.Metadata.Swagger/app.config | 2 +- Nancy.Metadata.Swagger/packages.config | 4 ++-- 11 files changed, 20 insertions(+), 41 deletions(-) delete mode 100644 Nancy.Metadata.Swagger/Core/LicenseInstsaller.cs diff --git a/Nancy.Metadata.Swagger.DemoApplication/Nancy.Metadata.Swagger.DemoApplication.csproj b/Nancy.Metadata.Swagger.DemoApplication/Nancy.Metadata.Swagger.DemoApplication.csproj index 08be2e0..fdc4200 100644 --- a/Nancy.Metadata.Swagger.DemoApplication/Nancy.Metadata.Swagger.DemoApplication.csproj +++ b/Nancy.Metadata.Swagger.DemoApplication/Nancy.Metadata.Swagger.DemoApplication.csproj @@ -54,8 +54,8 @@ ..\packages\Nancy.Serialization.JsonNet.1.2.0\lib\net40\Nancy.Serialization.JsonNet.dll True - - ..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True diff --git a/Nancy.Metadata.Swagger.DemoApplication/app.config b/Nancy.Metadata.Swagger.DemoApplication/app.config index 5316136..d928310 100644 --- a/Nancy.Metadata.Swagger.DemoApplication/app.config +++ b/Nancy.Metadata.Swagger.DemoApplication/app.config @@ -5,7 +5,7 @@ - + diff --git a/Nancy.Metadata.Swagger.DemoApplication/packages.config b/Nancy.Metadata.Swagger.DemoApplication/packages.config index c253cb1..f0a21cd 100644 --- a/Nancy.Metadata.Swagger.DemoApplication/packages.config +++ b/Nancy.Metadata.Swagger.DemoApplication/packages.config @@ -4,5 +4,5 @@ - + \ No newline at end of file diff --git a/Nancy.Metadata.Swagger/Core/LicenseInstsaller.cs b/Nancy.Metadata.Swagger/Core/LicenseInstsaller.cs deleted file mode 100644 index 04e7620..0000000 --- a/Nancy.Metadata.Swagger/Core/LicenseInstsaller.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Newtonsoft.Json.Schema; - -namespace Nancy.Metadata.Swagger.Core -{ - public class LicenseInstsaller - { - public static void SetJsonSchemaLicense(string licenseKey) - { - License.RegisterLicense(licenseKey); - } - } -} \ No newline at end of file diff --git a/Nancy.Metadata.Swagger/Core/SchemaCache.cs b/Nancy.Metadata.Swagger/Core/SchemaCache.cs index 4dc6aa8..12f6ee8 100644 --- a/Nancy.Metadata.Swagger/Core/SchemaCache.cs +++ b/Nancy.Metadata.Swagger/Core/SchemaCache.cs @@ -5,6 +5,6 @@ namespace Nancy.Metadata.Swagger.Core { public static class SchemaCache { - public static Dictionary Cache = new Dictionary(); + public static Dictionary Cache = new Dictionary(); } } \ No newline at end of file diff --git a/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs b/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs index 945136b..c267260 100644 --- a/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs +++ b/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs @@ -4,7 +4,6 @@ using Nancy.Metadata.Swagger.Core; using Nancy.Metadata.Swagger.Model; using Newtonsoft.Json.Schema; -using Newtonsoft.Json.Schema.Generation; namespace Nancy.Metadata.Swagger.Fluent { @@ -134,22 +133,15 @@ private static string GetOrSaveSchemaReference(Type type) { return key; } - - JSchemaGenerator generator = new JSchemaGenerator - { - SchemaIdGenerationHandling = SchemaIdGenerationHandling.FullTypeName, - SchemaReferenceHandling = SchemaReferenceHandling.None - }; - - JSchema schema = generator.Generate(type); + + var schema = NJsonSchema.JsonSchema4.FromType(type, new NJsonSchema.Generation.JsonSchemaGeneratorSettings { }); // I didn't find the way how to disallow JSchemaGenerator to use nullable types, swagger doesn't work with them + //string tmp = schema.ToJson(); + //string s = @"\""type\"":[\s\n\r]*\[[\s\n\r]*\""(\w+)\"",[\s\n\r]*\""null\""[\s\n\r]*\]"; + //tmp = Regex.Replace(tmp, s, "\"type\": \"$1\""); - string tmp = schema.ToString(); - string s = @"\""type\"":[\s\n\r]*\[[\s\n\r]*\""(\w+)\"",[\s\n\r]*\""null\""[\s\n\r]*\]"; - tmp = Regex.Replace(tmp, s, "\"type\": \"$1\""); - - SchemaCache.Cache[key] = JSchema.Parse(tmp); + SchemaCache.Cache[key] = schema; return key; } diff --git a/Nancy.Metadata.Swagger/Model/SwaggerSpecification.cs b/Nancy.Metadata.Swagger/Model/SwaggerSpecification.cs index c57ce56..7080111 100644 --- a/Nancy.Metadata.Swagger/Model/SwaggerSpecification.cs +++ b/Nancy.Metadata.Swagger/Model/SwaggerSpecification.cs @@ -25,6 +25,6 @@ public class SwaggerSpecification public Dictionary> PathInfos { get; set; } [JsonProperty("definitions")] - public Dictionary ModelDefinitions { get; set; } + public Dictionary ModelDefinitions { get; set; } } } \ No newline at end of file diff --git a/Nancy.Metadata.Swagger/Modules/SwaggerDocsModuleBase.cs b/Nancy.Metadata.Swagger/Modules/SwaggerDocsModuleBase.cs index c173049..d3b0e6b 100644 --- a/Nancy.Metadata.Swagger/Modules/SwaggerDocsModuleBase.cs +++ b/Nancy.Metadata.Swagger/Modules/SwaggerDocsModuleBase.cs @@ -90,7 +90,7 @@ private void GenerateSpecification() // add definitions if (swaggerSpecification.ModelDefinitions == null) { - swaggerSpecification.ModelDefinitions = new Dictionary(); + swaggerSpecification.ModelDefinitions = new Dictionary(); } foreach (string key in SchemaCache.Cache.Keys) diff --git a/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj b/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj index 980e4a1..76d43d9 100644 --- a/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj +++ b/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj @@ -39,12 +39,12 @@ ..\packages\Nancy.1.2.0\lib\net40\Nancy.dll True - - ..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True - - ..\packages\Newtonsoft.Json.Schema.2.0.2\lib\net45\Newtonsoft.Json.Schema.dll + + ..\packages\NJsonSchema.6.3.6185.19861\lib\net45\NJsonSchema.dll True @@ -55,7 +55,6 @@ - diff --git a/Nancy.Metadata.Swagger/app.config b/Nancy.Metadata.Swagger/app.config index 9ca82da..0a0c8e6 100644 --- a/Nancy.Metadata.Swagger/app.config +++ b/Nancy.Metadata.Swagger/app.config @@ -4,7 +4,7 @@ - + diff --git a/Nancy.Metadata.Swagger/packages.config b/Nancy.Metadata.Swagger/packages.config index a1c8ebb..f754fef 100644 --- a/Nancy.Metadata.Swagger/packages.config +++ b/Nancy.Metadata.Swagger/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file From 9448a79b6cdf1d457faa16109b3267078f322993 Mon Sep 17 00:00:00 2001 From: Alexander Kykc Date: Sat, 10 Dec 2016 21:47:58 +0200 Subject: [PATCH 2/3] fixed null support, fixed submodel references --- .../Core/CustomJsonConverter.cs | 55 +++++++++++++++++++ .../Core/TypeNameGenerator.cs | 21 +++++++ .../Fluent/SwaggerEndpointInfoExtensions.cs | 13 ++--- .../Model/SwaggerSpecification.cs | 2 +- .../Nancy.Metadata.Swagger.csproj | 2 + 5 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 Nancy.Metadata.Swagger/Core/CustomJsonConverter.cs create mode 100644 Nancy.Metadata.Swagger/Core/TypeNameGenerator.cs diff --git a/Nancy.Metadata.Swagger/Core/CustomJsonConverter.cs b/Nancy.Metadata.Swagger/Core/CustomJsonConverter.cs new file mode 100644 index 0000000..9fa74a8 --- /dev/null +++ b/Nancy.Metadata.Swagger/Core/CustomJsonConverter.cs @@ -0,0 +1,55 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Nancy.Metadata.Swagger.Core +{ + public class CustomJsonConverter : JsonConverter + { + public override bool CanConvert(Type objectType) + { + return objectType == typeof(Dictionary); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + JObject j = new JObject(); + + // Rather crude hack to have all necessary type definitions on one level. + // The good thing is that it's save: as we use Type.FullName as + // schema type name, there shouldn't be any conflicts, if two requests have + // same submodel of Namespace.SpecificType type, they are guaranteed to be the + // same type + foreach (var pair in (value as Dictionary)) + { + var el = JObject.Parse(pair.Value.ToJson()); + + var defs = el.GetValue("definitions"); + + if (defs != null) + { + foreach (JProperty content in el.GetValue("definitions")) + { + j.Remove(content.Name); + j.Add(content.Name, content.Value); + } + } + + el.Remove("definitions"); + + j.Add(pair.Key, el); + } + + j.WriteTo(writer); + } + } +} diff --git a/Nancy.Metadata.Swagger/Core/TypeNameGenerator.cs b/Nancy.Metadata.Swagger/Core/TypeNameGenerator.cs new file mode 100644 index 0000000..6b452e9 --- /dev/null +++ b/Nancy.Metadata.Swagger/Core/TypeNameGenerator.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Nancy.Metadata.Swagger.Core +{ + public class TypeNameGenerator : NJsonSchema.ITypeNameGenerator, NJsonSchema.ISchemaNameGenerator + { + public string Generate(Type type) + { + return type.FullName; + } + + public string Generate(NJsonSchema.JsonSchema4 schema, string typeNameHint) + { + return typeNameHint; + } + } +} diff --git a/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs b/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs index c267260..70b2ae3 100644 --- a/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs +++ b/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs @@ -134,13 +134,12 @@ private static string GetOrSaveSchemaReference(Type type) return key; } - var schema = NJsonSchema.JsonSchema4.FromType(type, new NJsonSchema.Generation.JsonSchemaGeneratorSettings { }); - - // I didn't find the way how to disallow JSchemaGenerator to use nullable types, swagger doesn't work with them - //string tmp = schema.ToJson(); - //string s = @"\""type\"":[\s\n\r]*\[[\s\n\r]*\""(\w+)\"",[\s\n\r]*\""null\""[\s\n\r]*\]"; - //tmp = Regex.Replace(tmp, s, "\"type\": \"$1\""); - + var schema = NJsonSchema.JsonSchema4.FromType(type, new NJsonSchema.Generation.JsonSchemaGeneratorSettings{ + NullHandling = NJsonSchema.NullHandling.Swagger, + TypeNameGenerator = new TypeNameGenerator(), + SchemaNameGenerator = new TypeNameGenerator() + }); + SchemaCache.Cache[key] = schema; return key; diff --git a/Nancy.Metadata.Swagger/Model/SwaggerSpecification.cs b/Nancy.Metadata.Swagger/Model/SwaggerSpecification.cs index 7080111..1aee249 100644 --- a/Nancy.Metadata.Swagger/Model/SwaggerSpecification.cs +++ b/Nancy.Metadata.Swagger/Model/SwaggerSpecification.cs @@ -24,7 +24,7 @@ public class SwaggerSpecification [JsonProperty("paths")] public Dictionary> PathInfos { get; set; } - [JsonProperty("definitions")] + [JsonProperty("definitions"), JsonConverter(typeof(Core.CustomJsonConverter))] public Dictionary ModelDefinitions { get; set; } } } \ No newline at end of file diff --git a/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj b/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj index 76d43d9..e65e525 100644 --- a/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj +++ b/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj @@ -55,8 +55,10 @@ + + From a7ce691c703627521e7ede68c99d814ad6ad4789 Mon Sep 17 00:00:00 2001 From: Alexander Kykc Date: Tue, 6 Jun 2017 09:31:07 +0300 Subject: [PATCH 3/3] dependencies updated to their latest versions --- ...cy.Metadata.Swagger.DemoApplication.csproj | 20 +++++++++---------- .../app.config | 2 +- .../packages.config | 10 +++++----- .../Core/TypeNameGenerator.cs | 6 ++++++ .../Fluent/SwaggerEndpointInfoExtensions.cs | 6 +++++- .../Nancy.Metadata.Swagger.csproj | 12 +++++------ Nancy.Metadata.Swagger/app.config | 2 +- Nancy.Metadata.Swagger/packages.config | 6 +++--- 8 files changed, 37 insertions(+), 27 deletions(-) diff --git a/Nancy.Metadata.Swagger.DemoApplication/Nancy.Metadata.Swagger.DemoApplication.csproj b/Nancy.Metadata.Swagger.DemoApplication/Nancy.Metadata.Swagger.DemoApplication.csproj index fdc4200..671c716 100644 --- a/Nancy.Metadata.Swagger.DemoApplication/Nancy.Metadata.Swagger.DemoApplication.csproj +++ b/Nancy.Metadata.Swagger.DemoApplication/Nancy.Metadata.Swagger.DemoApplication.csproj @@ -38,24 +38,24 @@ - - ..\packages\Nancy.1.2.0\lib\net40\Nancy.dll + + ..\packages\Nancy.1.4.3\lib\net40\Nancy.dll True - - ..\packages\Nancy.Hosting.Self.1.2.0\lib\net40\Nancy.Hosting.Self.dll + + ..\packages\Nancy.Hosting.Self.1.4.1\lib\net40\Nancy.Hosting.Self.dll True - - ..\packages\Nancy.Metadata.Modules.1.2.0\lib\net40\Nancy.Metadata.Modules.dll + + ..\packages\Nancy.Metadata.Modules.1.4.1\lib\net40\Nancy.Metadata.Modules.dll True - - ..\packages\Nancy.Serialization.JsonNet.1.2.0\lib\net40\Nancy.Serialization.JsonNet.dll + + ..\packages\Nancy.Serialization.JsonNet.1.4.1\lib\net40\Nancy.Serialization.JsonNet.dll True - - ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll True diff --git a/Nancy.Metadata.Swagger.DemoApplication/app.config b/Nancy.Metadata.Swagger.DemoApplication/app.config index d928310..c593f53 100644 --- a/Nancy.Metadata.Swagger.DemoApplication/app.config +++ b/Nancy.Metadata.Swagger.DemoApplication/app.config @@ -5,7 +5,7 @@ - + diff --git a/Nancy.Metadata.Swagger.DemoApplication/packages.config b/Nancy.Metadata.Swagger.DemoApplication/packages.config index f0a21cd..417cd16 100644 --- a/Nancy.Metadata.Swagger.DemoApplication/packages.config +++ b/Nancy.Metadata.Swagger.DemoApplication/packages.config @@ -1,8 +1,8 @@  - - - - - + + + + + \ No newline at end of file diff --git a/Nancy.Metadata.Swagger/Core/TypeNameGenerator.cs b/Nancy.Metadata.Swagger/Core/TypeNameGenerator.cs index 6b452e9..f463ebf 100644 --- a/Nancy.Metadata.Swagger/Core/TypeNameGenerator.cs +++ b/Nancy.Metadata.Swagger/Core/TypeNameGenerator.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using NJsonSchema; namespace Nancy.Metadata.Swagger.Core { @@ -17,5 +18,10 @@ public string Generate(NJsonSchema.JsonSchema4 schema, string typeNameHint) { return typeNameHint; } + + public string Generate(JsonSchema4 schema, string typeNameHint, ICollection reservedTypeNames) + { + return typeNameHint; + } } } diff --git a/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs b/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs index 70b2ae3..23415ea 100644 --- a/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs +++ b/Nancy.Metadata.Swagger/Fluent/SwaggerEndpointInfoExtensions.cs @@ -134,11 +134,15 @@ private static string GetOrSaveSchemaReference(Type type) return key; } - var schema = NJsonSchema.JsonSchema4.FromType(type, new NJsonSchema.Generation.JsonSchemaGeneratorSettings{ + var task = NJsonSchema.JsonSchema4.FromTypeAsync(type, new NJsonSchema.Generation.JsonSchemaGeneratorSettings{ NullHandling = NJsonSchema.NullHandling.Swagger, TypeNameGenerator = new TypeNameGenerator(), SchemaNameGenerator = new TypeNameGenerator() }); + + task.Wait(); + + var schema = task.Result; SchemaCache.Cache[key] = schema; diff --git a/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj b/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj index e65e525..80610e6 100644 --- a/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj +++ b/Nancy.Metadata.Swagger/Nancy.Metadata.Swagger.csproj @@ -35,16 +35,16 @@ false - - ..\packages\Nancy.1.2.0\lib\net40\Nancy.dll + + ..\packages\Nancy.1.4.3\lib\net40\Nancy.dll True - - ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll True - - ..\packages\NJsonSchema.6.3.6185.19861\lib\net45\NJsonSchema.dll + + ..\packages\NJsonSchema.9.1.6\lib\net45\NJsonSchema.dll True diff --git a/Nancy.Metadata.Swagger/app.config b/Nancy.Metadata.Swagger/app.config index 0a0c8e6..d8020dc 100644 --- a/Nancy.Metadata.Swagger/app.config +++ b/Nancy.Metadata.Swagger/app.config @@ -4,7 +4,7 @@ - + diff --git a/Nancy.Metadata.Swagger/packages.config b/Nancy.Metadata.Swagger/packages.config index f754fef..3382686 100644 --- a/Nancy.Metadata.Swagger/packages.config +++ b/Nancy.Metadata.Swagger/packages.config @@ -1,6 +1,6 @@  - - - + + + \ No newline at end of file