From 003c373aefc69dfa27a307ff3c477402ba1b125f Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Thu, 11 Nov 2021 23:15:04 +0100 Subject: [PATCH 01/51] v14 --- .../NSwag.Annotations.csproj | 2 +- .../NSwag.AspNet.Owin.csproj | 12 +- .../NSwag.AspNet.WebApi.csproj | 10 +- .../NSwag.AspNetCore.Launcher.csproj | 2 +- src/NSwag.AspNetCore/NSwag.AspNetCore.csproj | 8 +- .../CustomAssemblyLoadContext.cs | 2 +- .../NSwag.AssemblyLoader.csproj | 20 +-- .../NSwag.CodeGeneration.CSharp.Tests.csproj | 2 +- .../NSwag.CodeGeneration.CSharp.csproj | 12 +- .../NSwag.CodeGeneration.Tests.csproj | 2 +- ...wag.CodeGeneration.TypeScript.Tests.csproj | 2 +- .../NSwag.CodeGeneration.TypeScript.csproj | 12 +- .../NSwag.CodeGeneration.csproj | 10 +- .../Generation/OpenApiGeneratorCommandBase.cs | 88 +++++------- src/NSwag.Commands/NSwag.Commands.csproj | 12 +- src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj | 8 +- src/NSwag.Core.Yaml/OpenApiYamlDocument.cs | 2 +- src/NSwag.Core/NSwag.Core.csproj | 10 +- src/NSwag.Core/OpenApiDocument.cs | 2 +- ...wag.Generation.AspNetCore.Tests.Web.csproj | 2 +- .../NSwag.Generation.AspNetCore.Tests.csproj | 2 +- .../AspNetCoreOpenApiDocumentGenerator.cs | 40 ++++-- .../NSwag.Generation.AspNetCore.csproj | 13 +- .../NSwag.Generation.WebApi.csproj | 4 +- .../WebApiOpenApiDocumentGenerator.cs | 4 +- src/NSwag.Generation/NSwag.Generation.csproj | 8 +- .../OpenApiDocumentGenerator.cs | 12 +- .../OpenApiDocumentGeneratorSettings.cs | 26 ++-- .../OpenApiSchemaGenerator.cs | 2 +- .../OperationResponseProcessorBase.cs | 10 +- src/NSwag.Min.sln | 124 +++++++++++++++- .../NSwag.Sample.NETCore21.csproj | 2 +- src/switcher.json | 133 +++++++++++++++++- 33 files changed, 419 insertions(+), 181 deletions(-) diff --git a/src/NSwag.Annotations/NSwag.Annotations.csproj b/src/NSwag.Annotations/NSwag.Annotations.csproj index e287c13d5b..01fdc36bde 100644 --- a/src/NSwag.Annotations/NSwag.Annotations.csproj +++ b/src/NSwag.Annotations/NSwag.Annotations.csproj @@ -1,6 +1,6 @@  - netstandard1.0;net45;netstandard2.0 + netstandard2.0;net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet diff --git a/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj b/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj index 1f49836cba..f52f60becc 100644 --- a/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj +++ b/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj @@ -1,6 +1,6 @@  - net45 + net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,8 +13,8 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -31,10 +31,10 @@ - + TRACE;DEBUG;AspNetOwin;NET45 - + TRACE;RELEASE;AspNetOwin;NET45 @@ -49,10 +49,10 @@ - + diff --git a/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj b/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj index bcc9b81a5c..45144c9ae1 100644 --- a/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj +++ b/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj @@ -1,6 +1,6 @@  - net45 + net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,21 +13,21 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - + TRACE;DEBUG;NET45 - + diff --git a/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj b/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj index 1a8f7bf8ad..7833ad5071 100644 --- a/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj +++ b/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj @@ -18,6 +18,6 @@ - + \ No newline at end of file diff --git a/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj b/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj index ee4ddddbf5..9d03698d55 100644 --- a/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj +++ b/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj @@ -1,6 +1,6 @@  - net451;netstandard1.6;netstandard2.0;netcoreapp3.1;net5.0;net6.0 + netstandard2.0;net461;netcoreapp3.1;net5.0;net6.0 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 Swagger Documentation AspNetCore NetCore TypeScript CodeGen @@ -39,17 +39,17 @@ - + - + - + diff --git a/src/NSwag.AssemblyLoader/CustomAssemblyLoadContext.cs b/src/NSwag.AssemblyLoader/CustomAssemblyLoadContext.cs index c81c3cedb9..6e064abe52 100644 --- a/src/NSwag.AssemblyLoader/CustomAssemblyLoadContext.cs +++ b/src/NSwag.AssemblyLoader/CustomAssemblyLoadContext.cs @@ -6,7 +6,7 @@ // Rico Suter, mail@rsuter.com //----------------------------------------------------------------------- -#if !NET451 +#if !NET461 using System; using System.Collections.Generic; diff --git a/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj b/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj index 43e6a53b7c..f3d48417a3 100644 --- a/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj +++ b/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj @@ -1,6 +1,6 @@  - netstandard1.6;net451;netstandard2.0 + net461;netstandard2.0 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,23 +13,22 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - - TRACE;DEBUG;FullNet;NET451 + + TRACE;DEBUG;FullNet - - TRACE;RELEASE;FullNet;NET451 + + TRACE;RELEASE;FullNet - - + @@ -38,4 +37,7 @@ 4.3.0 + + + \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj b/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj index cb4db6f7c8..a2127d6e2e 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj +++ b/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj b/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj index 765b9c23fd..2568fa1a3d 100644 --- a/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj +++ b/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj @@ -1,6 +1,6 @@  - netstandard1.3;net451;netstandard2.0 + netstandard2.0;net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,8 +13,8 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -60,16 +60,14 @@ - + + - - - \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj b/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj index aa73c4cd3b..cf7ca04b88 100644 --- a/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj +++ b/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj b/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj index c2ceb414ff..18f5ff27d1 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj b/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj index b7adfd56bd..4156fe7f60 100644 --- a/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj +++ b/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj @@ -1,6 +1,6 @@  - netstandard1.3;net451;netstandard2.0 + netstandard2.0;net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,8 +13,8 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -41,16 +41,14 @@ - + + - - - \ No newline at end of file diff --git a/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj b/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj index dd2a5be508..0c19744437 100644 --- a/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj +++ b/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj @@ -1,6 +1,6 @@  - netstandard1.3;net451;netstandard2.0 + netstandard2.0;net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,21 +13,21 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - - + + \ No newline at end of file diff --git a/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs b/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs index e29105f6c2..a4917d0e4f 100644 --- a/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs +++ b/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs @@ -10,6 +10,7 @@ using System; using System.Linq; using System.Reflection; +using System.Text.Json; using System.Threading.Tasks; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; @@ -43,27 +44,6 @@ protected OpenApiGeneratorCommandBase() [JsonIgnore] protected override TSettings Settings { get; } - [Argument(Name = nameof(DefaultPropertyNameHandling), IsRequired = false, Description = "The default property name handling ('Default' or 'CamelCase').")] - public PropertyNameHandling DefaultPropertyNameHandling - { - get => Settings.DefaultPropertyNameHandling; - set => Settings.DefaultPropertyNameHandling = value; - } - - [Argument(Name = nameof(DefaultReferenceTypeNullHandling), IsRequired = false, Description = "The default reference type null handling (Null (default) or NotNull).")] - public ReferenceTypeNullHandling DefaultReferenceTypeNullHandling - { - get => Settings.DefaultReferenceTypeNullHandling; - set => Settings.DefaultReferenceTypeNullHandling = value; - } - - [Argument(Name = nameof(DefaultDictionaryValueReferenceTypeNullHandling), IsRequired = false, Description = "The default reference type null handling of dictionary value types (NotNull (default) or Null).")] - public ReferenceTypeNullHandling DefaultDictionaryValueReferenceTypeNullHandling - { - get => Settings.DefaultDictionaryValueReferenceTypeNullHandling; - set => Settings.DefaultDictionaryValueReferenceTypeNullHandling = value; - } - [Argument(Name = nameof(DefaultResponseReferenceTypeNullHandling), IsRequired = false, Description = "The default response reference type null handling (default: NotNull (default) or Null).")] public ReferenceTypeNullHandling DefaultResponseReferenceTypeNullHandling { @@ -78,77 +58,70 @@ public bool GenerateOriginalParameterNames set => Settings.GenerateOriginalParameterNames = value; } - [Argument(Name = "DefaultEnumHandling", IsRequired = false, Description = "The default enum handling ('String' or 'Integer'), default: Integer.")] - public EnumHandling DefaultEnumHandling - { - get => Settings.DefaultEnumHandling; - set => Settings.DefaultEnumHandling = value; - } - [Argument(Name = "FlattenInheritanceHierarchy", IsRequired = false, Description = "Flatten the inheritance hierarchy instead of using allOf to describe inheritance (default: false).")] public bool FlattenInheritanceHierarchy { - get => Settings.FlattenInheritanceHierarchy; - set => Settings.FlattenInheritanceHierarchy = value; + get => Settings.SchemaSettings.FlattenInheritanceHierarchy; + set => Settings.SchemaSettings.FlattenInheritanceHierarchy = value; } [Argument(Name = "GenerateKnownTypes", IsRequired = false, Description = "Generate schemas for types in KnownTypeAttribute attributes (default: true).")] public bool GenerateKnownTypes { - get => Settings.GenerateKnownTypes; - set => Settings.GenerateKnownTypes = value; + get => Settings.SchemaSettings.GenerateKnownTypes; + set => Settings.SchemaSettings.GenerateKnownTypes = value; } [Argument(Name = "GenerateEnumMappingDescription", IsRequired = false, Description = "Generate a description with number to enum name mappings (for integer enums only, default: false).")] public bool GenerateEnumMappingDescription { - get => Settings.GenerateEnumMappingDescription; - set => Settings.GenerateEnumMappingDescription = value; + get => Settings.SchemaSettings.GenerateEnumMappingDescription; + set => Settings.SchemaSettings.GenerateEnumMappingDescription = value; } [Argument(Name = "GenerateXmlObjects", IsRequired = false, Description = "Generate xmlObject representation for definitions (default: false).")] public bool GenerateXmlObjects { - get => Settings.GenerateXmlObjects; - set => Settings.GenerateXmlObjects = value; + get => Settings.SchemaSettings.GenerateXmlObjects; + set => Settings.SchemaSettings.GenerateXmlObjects = value; } [Argument(Name = "GenerateAbstractProperties", IsRequired = false, Description = "Generate abstract properties (i.e. interface and abstract properties. " + "Properties may defined multiple times in a inheritance hierarchy, default: false).")] public bool GenerateAbstractProperties { - get => Settings.GenerateAbstractProperties; - set => Settings.GenerateAbstractProperties = value; + get => Settings.SchemaSettings.GenerateAbstractProperties; + set => Settings.SchemaSettings.GenerateAbstractProperties = value; } [Argument(Name = "GenerateAbstractSchemas", IsRequired = false, Description = "Generate the x-abstract flag on schemas (default: true).")] public bool GenerateAbstractSchemas { - get => Settings.GenerateAbstractSchemas; - set => Settings.GenerateAbstractSchemas = value; + get => Settings.SchemaSettings.GenerateAbstractSchemas; + set => Settings.SchemaSettings.GenerateAbstractSchemas = value; } [Argument(Name = "IgnoreObsoleteProperties", IsRequired = false, Description = "Ignore properties with the ObsoleteAttribute (default: false).")] public bool IgnoreObsoleteProperties { - get => Settings.IgnoreObsoleteProperties; - set => Settings.IgnoreObsoleteProperties = value; + get => Settings.SchemaSettings.IgnoreObsoleteProperties; + set => Settings.SchemaSettings.IgnoreObsoleteProperties = value; } [Argument(Name = "AllowReferencesWithProperties", IsRequired = false, Description = "Use $ref references even if additional properties are defined on " + "the object (otherwise allOf/oneOf with $ref is used, default: false).")] public bool AllowReferencesWithProperties { - get => Settings.AllowReferencesWithProperties; - set => Settings.AllowReferencesWithProperties = value; + get => Settings.SchemaSettings.AllowReferencesWithProperties; + set => Settings.SchemaSettings.AllowReferencesWithProperties = value; } [Argument(Name = "ExcludedTypeNames", IsRequired = false, Description = "The excluded type names (same as JsonSchemaIgnoreAttribute).")] public string[] ExcludedTypeNames { - get => Settings.ExcludedTypeNames; - set => Settings.ExcludedTypeNames = value; + get => Settings.SchemaSettings.ExcludedTypeNames; + set => Settings.SchemaSettings.ExcludedTypeNames = value; } [Argument(Name = "ServiceHost", IsRequired = false, Description = "Overrides the service host of the web service (optional, use '.' to remove the hostname).")] @@ -234,25 +207,36 @@ public bool UseHttpAttributeNameAsOperationId public async Task CreateSettingsAsync(AssemblyLoader.AssemblyLoader assemblyLoader, IServiceProvider serviceProvider, string workingDirectory) { var mvcOptions = serviceProvider?.GetRequiredService>().Value; + #if NET6_0 || NET5_0 || NETCOREAPP3_1 || NETCOREAPP3_0 - JsonSerializerSettings serializerSettings; + JsonSerializerSettings newtonsoftSettings = null; + JsonSerializerOptions systemTextJsonOptions = null; + try { var mvcJsonOptions = serviceProvider?.GetRequiredService>(); - serializerSettings = mvcJsonOptions?.Value?.SerializerSettings; + newtonsoftSettings = mvcJsonOptions?.Value?.SerializerSettings; } catch { - serializerSettings = AspNetCoreOpenApiDocumentGenerator.GetSystemTextJsonSettings(serviceProvider); + systemTextJsonOptions = AspNetCoreOpenApiDocumentGenerator.GetSystemTextJsonSettings(serviceProvider); } #else + JsonSerializerOptions systemTextJsonOptions = null; var mvcJsonOptions = serviceProvider?.GetRequiredService>(); - var serializerSettings = mvcJsonOptions?.Value?.SerializerSettings; + var newtonsoftSettings = mvcJsonOptions?.Value?.SerializerSettings; #endif - Settings.ApplySettings(serializerSettings, mvcOptions); - Settings.DocumentTemplate = await GetDocumentTemplateAsync(workingDirectory); + if (systemTextJsonOptions != null) + { + Settings.ApplySettings(new SystemTextJsonSchemaGeneratorSettings { SerializerOptions = systemTextJsonOptions }, mvcOptions); + } + else if (newtonsoftSettings != null) + { + Settings.ApplySettings(new NewtonsoftJsonSchemaGeneratorSettings { SerializerSettings = newtonsoftSettings }, mvcOptions); + } + Settings.DocumentTemplate = await GetDocumentTemplateAsync(workingDirectory); InitializeCustomTypes(assemblyLoader); return Settings; diff --git a/src/NSwag.Commands/NSwag.Commands.csproj b/src/NSwag.Commands/NSwag.Commands.csproj index ec6645e1c1..d7d5618054 100644 --- a/src/NSwag.Commands/NSwag.Commands.csproj +++ b/src/NSwag.Commands/NSwag.Commands.csproj @@ -63,16 +63,16 @@ - - - - - + + + + + @@ -89,4 +89,4 @@ 4.3.0 - + \ No newline at end of file diff --git a/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj b/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj index d8a62086fd..6feef15a03 100644 --- a/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj +++ b/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj @@ -1,6 +1,6 @@  - netstandard1.3;net45;netstandard2.0 + netstandard2.0;net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,15 +13,15 @@ ../NSwag.snk https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git NSwag - + \ No newline at end of file diff --git a/src/NSwag.Core.Yaml/OpenApiYamlDocument.cs b/src/NSwag.Core.Yaml/OpenApiYamlDocument.cs index c477c3e383..3082acd6bb 100644 --- a/src/NSwag.Core.Yaml/OpenApiYamlDocument.cs +++ b/src/NSwag.Core.Yaml/OpenApiYamlDocument.cs @@ -112,7 +112,7 @@ private static Func CreateReferenceResol { return document => { - var schemaResolver = new OpenApiSchemaResolver(document, new JsonSchemaGeneratorSettings()); + var schemaResolver = new OpenApiSchemaResolver(document, new SystemTextJsonSchemaGeneratorSettings()); return new JsonAndYamlReferenceResolver(schemaResolver); }; } diff --git a/src/NSwag.Core/NSwag.Core.csproj b/src/NSwag.Core/NSwag.Core.csproj index 0d0da9d3e6..3e7606ab19 100644 --- a/src/NSwag.Core/NSwag.Core.csproj +++ b/src/NSwag.Core/NSwag.Core.csproj @@ -1,6 +1,6 @@  - netstandard1.0;net45;netstandard2.0 + netstandard2.0;net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,8 +13,8 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git NSwag @@ -25,7 +25,6 @@ - @@ -35,4 +34,7 @@ + + + \ No newline at end of file diff --git a/src/NSwag.Core/OpenApiDocument.cs b/src/NSwag.Core/OpenApiDocument.cs index f13dba182e..554da65d1c 100644 --- a/src/NSwag.Core/OpenApiDocument.cs +++ b/src/NSwag.Core/OpenApiDocument.cs @@ -205,7 +205,7 @@ public static async Task FromJsonAsync(string data, string docu } else { - var schemaResolver = new OpenApiSchemaResolver(document, new JsonSchemaGeneratorSettings()); + var schemaResolver = new OpenApiSchemaResolver(document, new SystemTextJsonSchemaGeneratorSettings()); return new JsonReferenceResolver(schemaResolver); } }, contractResolver, cancellationToken).ConfigureAwait(false); diff --git a/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj b/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj index 49f5791582..1cd65f6b75 100644 --- a/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj +++ b/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj b/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj index 8d4660cd04..5396a15eda 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj +++ b/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs b/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs index 2f11f8d5bc..0db820b59a 100644 --- a/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs +++ b/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Text.Json; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Abstractions; @@ -49,12 +50,24 @@ public Task GenerateAsync(object serviceProvider) var typedServiceProvider = (IServiceProvider)serviceProvider; var mvcOptions = typedServiceProvider.GetRequiredService>(); - var settings = - mvcOptions.Value.OutputFormatters.Any(f => f.GetType().Name == "SystemTextJsonOutputFormatter") ? - GetSystemTextJsonSettings(typedServiceProvider) : - GetJsonSerializerSettings(typedServiceProvider) ?? GetSystemTextJsonSettings(typedServiceProvider); - Settings.ApplySettings(settings, mvcOptions.Value); + var newtonsoftSettings = GetJsonSerializerSettings(typedServiceProvider); + var systemTextJsonOptions = mvcOptions.Value.OutputFormatters + .Any(f => f.GetType().Name == "SystemTextJsonOutputFormatter") ? + GetSystemTextJsonSettings(typedServiceProvider) : null; + + if (systemTextJsonOptions != null) + { + Settings.ApplySettings(new SystemTextJsonSchemaGeneratorSettings { SerializerOptions = systemTextJsonOptions }, mvcOptions.Value); + } + else if (newtonsoftSettings != null) + { + Settings.ApplySettings(new NewtonsoftJsonSchemaGeneratorSettings { SerializerSettings = newtonsoftSettings }, mvcOptions.Value); + } + else + { + Settings.ApplySettings(new SystemTextJsonSchemaGeneratorSettings(), mvcOptions.Value); + } var apiDescriptionGroupCollectionProvider = typedServiceProvider.GetRequiredService(); return GenerateAsync(apiDescriptionGroupCollectionProvider.ApiDescriptionGroups); @@ -121,7 +134,7 @@ public async Task GenerateAsync(ApiDescriptionGroupCollection a .ToArray(); var document = await CreateDocumentAsync().ConfigureAwait(false); - var schemaResolver = new OpenApiSchemaResolver(document, Settings); + var schemaResolver = new OpenApiSchemaResolver(document, Settings.SchemaSettings); var apiGroups = apiDescriptions .Select(apiDescription => new Tuple(apiDescription, apiDescription.ActionDescriptor)) @@ -148,7 +161,7 @@ public async Task GenerateAsync(ApiDescriptionGroupCollection a /// Gets the default serializer settings representing System.Text.Json. /// The settings. - public static JsonSerializerSettings GetSystemTextJsonSettings(IServiceProvider serviceProvider) + public static JsonSerializerOptions GetSystemTextJsonSettings(IServiceProvider serviceProvider) { // If the ASP.NET Core website does not use Newtonsoft.JSON we need to provide a // contract resolver which reflects best the System.Text.Json behavior. @@ -163,9 +176,9 @@ public static JsonSerializerSettings GetSystemTextJsonSettings(IServiceProvider var options = serviceProvider?.GetService(optionsType) as dynamic; var jsonOptions = (object)options?.Value?.JsonSerializerOptions; - if (jsonOptions != null && jsonOptions.GetType().FullName == "System.Text.Json.JsonSerializerOptions") + if (jsonOptions is JsonSerializerOptions) { - return SystemTextJsonUtilities.ConvertJsonOptionsToNewtonsoftSettings(jsonOptions); + return (JsonSerializerOptions)jsonOptions; } } catch @@ -173,10 +186,7 @@ public static JsonSerializerSettings GetSystemTextJsonSettings(IServiceProvider } } - return new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }; + return null; } private List GenerateApiGroups( @@ -355,7 +365,7 @@ await OpenApiDocument.FromJsonAsync(Settings.DocumentTemplate).ConfigureAwait(fa new OpenApiDocument(); document.Generator = $"NSwag v{OpenApiDocument.ToolchainVersion} (NJsonSchema v{JsonSchema.ToolchainVersion})"; - document.SchemaType = Settings.SchemaType; + document.SchemaType = Settings.SchemaSettings.SchemaType; if (document.Info == null) { @@ -471,7 +481,7 @@ private string GetOperationId(OpenApiDocument document, ApiDescription apiDescri else { // From HTTP method and route - operationId = + operationId = httpMethod[0].ToString().ToUpperInvariant() + httpMethod.Substring(1) + string.Join("", apiDescription.RelativePath .Split('/', '\\', '}', ']', '-', '_') diff --git a/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj b/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj index 60680b9f7e..e8792cf448 100644 --- a/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj +++ b/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj @@ -1,6 +1,6 @@  - netstandard1.6;net451;netstandard2.0;netcoreapp3.1;net5.0;net6.0 + netstandard2.0;net461;netcoreapp3.1;net5.0;net6.0 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 Swagger Documentation AspNetCore @@ -26,15 +26,12 @@ - - - - + - + @@ -53,6 +50,8 @@ + + - + \ No newline at end of file diff --git a/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj b/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj index 2c76aaea93..78b60425df 100644 --- a/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj +++ b/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj @@ -1,6 +1,6 @@  - netstandard1.0;net45;netstandard2.0 + netstandard2.0;net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -24,12 +24,12 @@ - + \ No newline at end of file diff --git a/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGenerator.cs b/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGenerator.cs index 1f66dd1218..3e32e40f50 100644 --- a/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGenerator.cs +++ b/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGenerator.cs @@ -79,7 +79,7 @@ public Task GenerateForControllerAsync(Type controllerType) public async Task GenerateForControllersAsync(IEnumerable controllerTypes) { var document = await CreateDocumentAsync().ConfigureAwait(false); - var schemaResolver = new OpenApiSchemaResolver(document, Settings); + var schemaResolver = new OpenApiSchemaResolver(document, Settings.SchemaSettings); var usedControllerTypes = new List(); foreach (var controllerType in controllerTypes) @@ -110,7 +110,7 @@ await OpenApiDocument.FromJsonAsync(Settings.DocumentTemplate).ConfigureAwait(fa new OpenApiDocument(); document.Generator = "NSwag v" + OpenApiDocument.ToolchainVersion + " (NJsonSchema v" + JsonSchema.ToolchainVersion + ")"; - document.SchemaType = Settings.SchemaType; + document.SchemaType = Settings.SchemaSettings.SchemaType; document.Consumes = new List { "application/json" }; document.Produces = new List { "application/json" }; diff --git a/src/NSwag.Generation/NSwag.Generation.csproj b/src/NSwag.Generation/NSwag.Generation.csproj index 00a8e8419e..41cd44b626 100644 --- a/src/NSwag.Generation/NSwag.Generation.csproj +++ b/src/NSwag.Generation/NSwag.Generation.csproj @@ -1,6 +1,6 @@  - netstandard1.0;net45;netstandard2.0 + netstandard2.0;net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.0 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,8 +13,8 @@ Rico Suter NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -27,12 +27,12 @@ - + \ No newline at end of file diff --git a/src/NSwag.Generation/OpenApiDocumentGenerator.cs b/src/NSwag.Generation/OpenApiDocumentGenerator.cs index 7e8fc6d997..f9f2f89f6c 100644 --- a/src/NSwag.Generation/OpenApiDocumentGenerator.cs +++ b/src/NSwag.Generation/OpenApiDocumentGenerator.cs @@ -40,7 +40,7 @@ public OpenApiParameter CreateUntypedPathParameter(string parameterName, string parameter.Kind = OpenApiParameterKind.Path; parameter.IsRequired = true; - if (_settings.SchemaType == SchemaType.Swagger2) + if (_settings.SchemaSettings.SchemaType == SchemaType.Swagger2) { parameter.IsNullableRaw = false; } @@ -83,9 +83,9 @@ public OpenApiParameter CreatePrimitiveParameter(string name, ContextualParamete /// The parameter. public OpenApiParameter CreatePrimitiveParameter(string name, string description, ContextualType contextualParameter) { - var typeDescription = _settings.ReflectionService.GetDescription(contextualParameter, _settings); + var typeDescription = _settings.SchemaSettings.ReflectionService.GetDescription(contextualParameter, _settings.SchemaSettings); - var operationParameter = _settings.SchemaType == SchemaType.Swagger2 + var operationParameter = _settings.SchemaSettings.SchemaType == SchemaType.Swagger2 ? CreatePrimitiveSwaggerParameter(contextualParameter, typeDescription) : CreatePrimitiveOpenApiParameter(contextualParameter, typeDescription); @@ -104,7 +104,7 @@ public OpenApiParameter CreatePrimitiveParameter(string name, string description private OpenApiParameter CreatePrimitiveOpenApiParameter(ContextualType contextualParameter, JsonTypeDescription typeDescription) { OpenApiParameter operationParameter; - if (typeDescription.RequiresSchemaReference(_settings.TypeMappers)) + if (typeDescription.RequiresSchemaReference(_settings.SchemaSettings.TypeMappers)) { operationParameter = new OpenApiParameter(); operationParameter.Schema = new JsonSchema(); @@ -118,7 +118,7 @@ private OpenApiParameter CreatePrimitiveOpenApiParameter(ContextualType contextu { operationParameter.Schema.IsNullableRaw = true; - if (_settings.AllowReferencesWithProperties) + if (_settings.SchemaSettings.AllowReferencesWithProperties) { operationParameter.Schema.Reference = referencedSchema.ActualSchema; } @@ -153,7 +153,7 @@ private OpenApiParameter CreatePrimitiveOpenApiParameter(ContextualType contextu private OpenApiParameter CreatePrimitiveSwaggerParameter(ContextualType contextualParameter, JsonTypeDescription typeDescription) { OpenApiParameter operationParameter; - if (typeDescription.RequiresSchemaReference(_settings.TypeMappers)) + if (typeDescription.RequiresSchemaReference(_settings.SchemaSettings.TypeMappers)) { var referencedSchema = _settings.SchemaGenerator.Generate(contextualParameter, _schemaResolver); diff --git a/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs b/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs index 6f4d1e9b11..d026b603cd 100644 --- a/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs +++ b/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs @@ -18,16 +18,19 @@ namespace NSwag.Generation { /// Settings for the Swagger generator. - public class OpenApiDocumentGeneratorSettings : JsonSchemaGeneratorSettings + public class OpenApiDocumentGeneratorSettings { /// Initializes a new instance of the class. - public OpenApiDocumentGeneratorSettings() + public OpenApiDocumentGeneratorSettings(JsonSchemaGeneratorSettings settings) { + SchemaSettings = settings; SchemaGenerator = new OpenApiSchemaGenerator(this); DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; - SchemaType = SchemaType.Swagger2; } + /// + public JsonSchemaGeneratorSettings SchemaSettings { get; set; } + /// Gets or sets the JSON Schema generator. public OpenApiSchemaGenerator SchemaGenerator { get; set; } @@ -85,22 +88,13 @@ public void AddOperationFilter(Func filter) } /// Applies the given settings to this settings object. - /// The serializer settings. + /// The schema generator settings. /// The MVC options. - public void ApplySettings(JsonSerializerSettings serializerSettings, object mvcOptions) + public void ApplySettings(JsonSchemaGeneratorSettings schemaSettings, object mvcOptions) { - if (serializerSettings != null) + if (schemaSettings != null) { - var areSerializerSettingsSpecified = - DefaultPropertyNameHandling != PropertyNameHandling.Default || - DefaultEnumHandling != EnumHandling.Integer || - ContractResolver != null || - SerializerSettings != null; - - if (!areSerializerSettingsSpecified) - { - SerializerSettings = serializerSettings; - } + SchemaSettings = schemaSettings; } if (mvcOptions != null && mvcOptions.HasProperty("AllowEmptyInputInBodyModelBinding")) diff --git a/src/NSwag.Generation/OpenApiSchemaGenerator.cs b/src/NSwag.Generation/OpenApiSchemaGenerator.cs index 1c6665579c..9c5f3689d4 100644 --- a/src/NSwag.Generation/OpenApiSchemaGenerator.cs +++ b/src/NSwag.Generation/OpenApiSchemaGenerator.cs @@ -21,7 +21,7 @@ public class OpenApiSchemaGenerator : JsonSchemaGenerator /// Initializes a new instance of the class. /// The settings. - public OpenApiSchemaGenerator(OpenApiDocumentGeneratorSettings settings) : base(settings) + public OpenApiSchemaGenerator(OpenApiDocumentGeneratorSettings settings) : base(settings.SchemaSettings) { } diff --git a/src/NSwag.Generation/Processors/OperationResponseProcessorBase.cs b/src/NSwag.Generation/Processors/OperationResponseProcessorBase.cs index e478a3f7d0..bcb92ef19e 100644 --- a/src/NSwag.Generation/Processors/OperationResponseProcessorBase.cs +++ b/src/NSwag.Generation/Processors/OperationResponseProcessorBase.cs @@ -172,8 +172,8 @@ private void ProcessOperationDescriptions(IEnumerable r.Description)); - var typeDescription = _settings.ReflectionService.GetDescription( - contextualReturnType, _settings.DefaultResponseReferenceTypeNullHandling, _settings); + var typeDescription = _settings.SchemaSettings.ReflectionService.GetDescription( + contextualReturnType, _settings.DefaultResponseReferenceTypeNullHandling, _settings.SchemaSettings); var response = new OpenApiResponse { @@ -189,7 +189,7 @@ private void ProcessOperationDescriptions(IEnumerable r.IsNullable) && - _settings.ReflectionService.GetDescription(contextualReturnType, _settings.DefaultResponseReferenceTypeNullHandling, _settings).IsNullable; + _settings.SchemaSettings.ReflectionService.GetDescription(contextualReturnType, _settings.DefaultResponseReferenceTypeNullHandling, _settings.SchemaSettings).IsNullable; response.IsNullableRaw = isResponseNullable; response.Schema = context.SchemaGenerator.GenerateWithReferenceAndNullability( @@ -235,7 +235,7 @@ private ICollection GenerateExpectedSchemas( { var contextualResponseType = response.ResponseType.ToContextualType(); - var isNullable = _settings.ReflectionService.GetDescription(contextualResponseType, _settings).IsNullable; + var isNullable = _settings.SchemaSettings.ReflectionService.GetDescription(contextualResponseType, _settings.SchemaSettings).IsNullable; var schema = context.SchemaGenerator.GenerateWithReferenceAndNullability( contextualResponseType, isNullable, context.SchemaResolver); @@ -278,7 +278,7 @@ private void LoadDefaultSuccessResponse(ParameterInfo returnParameter, string su var returnParameterAttributes = returnParameter?.GetCustomAttributes(false)?.OfType() ?? Enumerable.Empty(); var contextualReturnParameter = returnType.ToContextualType(returnParameterAttributes); - var typeDescription = _settings.ReflectionService.GetDescription(contextualReturnParameter, _settings); + var typeDescription = _settings.SchemaSettings.ReflectionService.GetDescription(contextualReturnParameter, _settings.SchemaSettings); var responseSchema = context.SchemaGenerator.GenerateWithReferenceAndNullability( contextualReturnParameter, typeDescription.IsNullable, context.SchemaResolver); diff --git a/src/NSwag.Min.sln b/src/NSwag.Min.sln index 3eb91d6988..f63c773c81 100644 --- a/src/NSwag.Min.sln +++ b/src/NSwag.Min.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31825.309 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.CodeGeneration", "NSwag.CodeGeneration\NSwag.CodeGeneration.csproj", "{75B3F91D-687E-4FB3-AD45-CCFA3C406DB4}" EndProject @@ -79,6 +79,18 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NET60", "NSwag EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NET60Minimal", "NSwag.Sample.NET60Minimal\NSwag.Sample.NET60Minimal.csproj", "{FA78E42D-F49F-45E3-820E-331FB8E34195}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema", "..\..\NJsonSchema\src\NJsonSchema\NJsonSchema.csproj", "{5D987516-6819-40CC-AE81-C5371C1D96C5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.Yaml", "..\..\NJsonSchema\src\NJsonSchema.Yaml\NJsonSchema.Yaml.csproj", "{ADF1AA24-838F-44E1-B90A-1789A9560EBA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.CodeGeneration", "..\..\NJsonSchema\src\NJsonSchema.CodeGeneration\NJsonSchema.CodeGeneration.csproj", "{90E4985E-7DDB-4539-BA47-CB3754FB3BB5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.CodeGeneration.CSharp", "..\..\NJsonSchema\src\NJsonSchema.CodeGeneration.CSharp\NJsonSchema.CodeGeneration.CSharp.csproj", "{86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.CodeGeneration.TypeScript", "..\..\NJsonSchema\src\NJsonSchema.CodeGeneration.TypeScript\NJsonSchema.CodeGeneration.TypeScript.csproj", "{23BE3A80-94A3-47D1-9688-6A54FDE13E62}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.NewtonsoftJson", "..\..\NJsonSchema\src\NJsonSchema.NewtonsoftJson\NJsonSchema.NewtonsoftJson.csproj", "{DD24A9DC-8578-4031-912B-1939A3306F8D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -648,6 +660,114 @@ Global {FA78E42D-F49F-45E3-820E-331FB8E34195}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU {FA78E42D-F49F-45E3-820E-331FB8E34195}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU {FA78E42D-F49F-45E3-820E-331FB8E34195}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Debug|x64.ActiveCfg = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Debug|x64.Build.0 = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Debug|x86.ActiveCfg = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Debug|x86.Build.0 = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Release|Any CPU.Build.0 = Release|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Release|x64.ActiveCfg = Release|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Release|x64.Build.0 = Release|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Release|x86.ActiveCfg = Release|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.Release|x86.Build.0 = Release|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.ReleaseTypeScriptStrict|x64.ActiveCfg = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.ReleaseTypeScriptStrict|x64.Build.0 = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.ReleaseTypeScriptStrict|x86.ActiveCfg = Debug|Any CPU + {5D987516-6819-40CC-AE81-C5371C1D96C5}.ReleaseTypeScriptStrict|x86.Build.0 = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Debug|x64.ActiveCfg = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Debug|x64.Build.0 = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Debug|x86.ActiveCfg = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Debug|x86.Build.0 = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Release|Any CPU.Build.0 = Release|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Release|x64.ActiveCfg = Release|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Release|x64.Build.0 = Release|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Release|x86.ActiveCfg = Release|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.Release|x86.Build.0 = Release|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.ReleaseTypeScriptStrict|x64.ActiveCfg = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.ReleaseTypeScriptStrict|x64.Build.0 = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.ReleaseTypeScriptStrict|x86.ActiveCfg = Debug|Any CPU + {ADF1AA24-838F-44E1-B90A-1789A9560EBA}.ReleaseTypeScriptStrict|x86.Build.0 = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Debug|x64.ActiveCfg = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Debug|x64.Build.0 = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Debug|x86.ActiveCfg = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Debug|x86.Build.0 = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Release|Any CPU.Build.0 = Release|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Release|x64.ActiveCfg = Release|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Release|x64.Build.0 = Release|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Release|x86.ActiveCfg = Release|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.Release|x86.Build.0 = Release|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.ReleaseTypeScriptStrict|x64.ActiveCfg = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.ReleaseTypeScriptStrict|x64.Build.0 = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.ReleaseTypeScriptStrict|x86.ActiveCfg = Debug|Any CPU + {90E4985E-7DDB-4539-BA47-CB3754FB3BB5}.ReleaseTypeScriptStrict|x86.Build.0 = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Debug|x64.ActiveCfg = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Debug|x64.Build.0 = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Debug|x86.ActiveCfg = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Debug|x86.Build.0 = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Release|Any CPU.Build.0 = Release|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Release|x64.ActiveCfg = Release|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Release|x64.Build.0 = Release|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Release|x86.ActiveCfg = Release|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.Release|x86.Build.0 = Release|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.ReleaseTypeScriptStrict|x64.ActiveCfg = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.ReleaseTypeScriptStrict|x64.Build.0 = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.ReleaseTypeScriptStrict|x86.ActiveCfg = Debug|Any CPU + {86FB38D5-7D52-4DFB-AB51-FF39F00FB7E9}.ReleaseTypeScriptStrict|x86.Build.0 = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Debug|x64.ActiveCfg = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Debug|x64.Build.0 = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Debug|x86.ActiveCfg = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Debug|x86.Build.0 = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Release|Any CPU.Build.0 = Release|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Release|x64.ActiveCfg = Release|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Release|x64.Build.0 = Release|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Release|x86.ActiveCfg = Release|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.Release|x86.Build.0 = Release|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.ReleaseTypeScriptStrict|x64.ActiveCfg = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.ReleaseTypeScriptStrict|x64.Build.0 = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.ReleaseTypeScriptStrict|x86.ActiveCfg = Debug|Any CPU + {23BE3A80-94A3-47D1-9688-6A54FDE13E62}.ReleaseTypeScriptStrict|x86.Build.0 = Debug|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Debug|x64.ActiveCfg = Debug|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Debug|x64.Build.0 = Debug|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Debug|x86.ActiveCfg = Debug|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Debug|x86.Build.0 = Debug|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Release|Any CPU.Build.0 = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Release|x64.ActiveCfg = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Release|x64.Build.0 = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Release|x86.ActiveCfg = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.Release|x86.Build.0 = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU + {DD24A9DC-8578-4031-912B-1939A3306F8D}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj b/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj index dcd13dc0e8..3ec241e1da 100644 --- a/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj +++ b/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/switcher.json b/src/switcher.json index 2a88f4ff03..1cac1caf77 100644 --- a/src/switcher.json +++ b/src/switcher.json @@ -6,5 +6,136 @@ "NJsonSchema.CodeGeneration": "../../NJsonSchema/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj", "NJsonSchema.CodeGeneration.CSharp": "../../NJsonSchema/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj", "NJsonSchema.CodeGeneration.TypeScript": "../../NJsonSchema/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj" - } + }, + "restore": [ + { + "name": "NSwag.CodeGeneration", + "packages": [ + { + "packageName": "NJsonSchema", + "version": "10.5.2" + }, + { + "packageName": "NJsonSchema.CodeGeneration", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.Core", + "packages": [ + { + "packageName": "NJsonSchema", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.AspNet.Owin", + "packages": [ + { + "packageName": "NJsonSchema", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.AspNet.WebApi", + "packages": [ + { + "packageName": "NJsonSchema", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.Generation", + "packages": [ + { + "packageName": "NJsonSchema", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.CodeGeneration.CSharp", + "packages": [ + { + "packageName": "NJsonSchema.CodeGeneration.CSharp", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.CodeGeneration.TypeScript", + "packages": [ + { + "packageName": "NJsonSchema.CodeGeneration.TypeScript", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.Generation.WebApi", + "packages": [ + { + "packageName": "NJsonSchema", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.Core.Yaml", + "packages": [ + { + "packageName": "NJsonSchema.Yaml", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.Generation.AspNetCore", + "packages": [ + { + "packageName": "NJsonSchema", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.Commands", + "packages": [ + { + "packageName": "NJsonSchema", + "version": "10.5.2" + }, + { + "packageName": "NJsonSchema.Yaml", + "version": "10.5.2" + }, + { + "packageName": "NJsonSchema.CodeGeneration", + "version": "10.5.2" + }, + { + "packageName": "NJsonSchema.CodeGeneration.CSharp", + "version": "10.5.2" + }, + { + "packageName": "NJsonSchema.CodeGeneration.TypeScript", + "version": "10.5.2" + } + ] + }, + { + "name": "NSwag.AssemblyLoader", + "packages": [ + { + "packageName": "NJsonSchema", + "version": "10.5.2" + } + ] + } + ], + "removeProjects": true } \ No newline at end of file From bd7e4eb6319b54d77442fe95f3c4625f581c3f76 Mon Sep 17 00:00:00 2001 From: Marko Lahma Date: Sun, 28 Mar 2021 18:36:09 +0300 Subject: [PATCH 02/51] Replace DotLiquid with Fluid * update templates to follow strict liquid syntax * net461 minimum full framework --- .../NSwag.AspNet.Owin.csproj | 11 +- .../NSwag.AspNet.WebApi.csproj | 5 +- .../NSwag.AspNetCore.Launcher.csproj | 2 +- src/NSwag.AspNetCore/NSwag.AspNetCore.csproj | 6 +- src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec | 4 +- .../NSwag.AssemblyLoader.csproj | 6 +- .../NSwag.CodeGeneration.CSharp.Tests.csproj | 2 +- .../NSwag.CodeGeneration.CSharp.csproj | 15 +- .../Client.Class.HeaderParameter.liquid | 6 +- .../Client.Class.PathParameter.liquid | 10 +- .../Client.Class.ProcessResponse.liquid | 14 +- .../Client.Class.QueryParameter.liquid | 16 +- .../Client.Class.ReadObjectResponse.liquid | 24 +- .../Templates/Client.Class.liquid | 60 +- .../Templates/Client.Interface.liquid | 2 +- .../Templates/Controller.liquid | 52 +- .../Templates/File.liquid | 74 +- .../NSwag.CodeGeneration.Tests.csproj | 2 +- ...wag.CodeGeneration.TypeScript.Tests.csproj | 2 +- .../NSwag.CodeGeneration.TypeScript.csproj | 14 +- .../Templates/AngularClient.liquid | 86 +-- .../Templates/AngularJSClient.liquid | 24 +- .../Templates/AxiosClient.liquid | 22 +- .../Client.Method.Documentation.liquid | 2 +- ...nt.ProcessResponse.HandleStatusCode.liquid | 28 +- .../Client.ProcessResponse.ReadBodyEnd.liquid | 5 +- ...lient.ProcessResponse.ReadBodyStart.liquid | 12 +- .../Client.ProcessResponse.ReadHeaders.liquid | 8 +- .../Client.ProcessResponse.Return.liquid | 8 +- .../Templates/Client.ProcessResponse.liquid | 7 +- .../Templates/Client.RequestBody.liquid | 88 +-- .../Templates/Client.RequestUrl.liquid | 54 +- .../Templates/FetchClient.liquid | 69 +- .../Templates/File.Utilities.liquid | 14 +- .../Templates/File.liquid | 82 +-- .../Templates/JQueryCallbacksClient.liquid | 24 +- .../Templates/JQueryPromisesClient.liquid | 56 +- .../NSwag.CodeGeneration.csproj | 13 +- ...tsFromOperationIdOperationNameGenerator.cs | 46 +- src/NSwag.Commands/NSwag.Commands.csproj | 5 - .../NSwag.Console.x86.csproj | 2 +- src/NSwag.Console/NSwag.Console.csproj | 2 +- src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj | 6 +- src/NSwag.Core/NSwag.Core.csproj | 6 +- src/NSwag.Demo.Web/NSwag.Demo.Web.csproj | 4 +- ...wag.Generation.AspNetCore.Tests.Web.csproj | 1 - .../NSwag.Generation.AspNetCore.Tests.csproj | 2 +- .../NSwag.Generation.AspNetCore.csproj | 9 +- .../NSwag.Generation.WebApi.Tests.csproj | 10 +- .../NSwag.Generation.WebApi.csproj | 11 +- src/NSwag.Generation/NSwag.Generation.csproj | 10 +- .../PetStoreClient.cs | 680 +++++++++--------- .../ServiceClients.cs | 526 +++++++------- .../ServiceClientsContracts.cs | 145 ++-- src/NSwag.Integration.ClientPCL/UberClient.cs | 256 ++++--- src/NSwag.Integration.Console/Controllers.cs | 338 +++++---- .../ServiceClients.cs | 524 +++++++------- .../ServiceClientsContracts.cs | 137 ++-- .../NSwag.Integration.WebAPI.csproj | 2 +- src/NSwag.Integration.WebAPI/build.bat | 2 +- .../NSwag.Sample.NETCore21.csproj | 2 +- .../NSwag.Sample.NetCoreAngular.csproj | 2 +- .../NSwag.Sample.NetCoreAurelia.csproj | 2 +- .../NSwag.Sample.NetGlobalAsax.csproj | 3 +- .../NSwag.VersionMissmatchTest.csproj | 1 + src/NSwagStudio/App.config | 6 +- src/NSwagStudio/NSwagStudio.csproj | 12 +- src/NuGet.Config | 9 + src/libs/NJsonSchema.11.0.0-beta-0.nupkg | Bin 0 -> 425902 bytes ...nSchema.CodeGeneration.11.0.0-beta-0.nupkg | Bin 0 -> 42351 bytes ....CodeGeneration.CSharp.11.0.0-beta-0.nupkg | Bin 0 -> 49288 bytes ...eGeneration.TypeScript.11.0.0-beta-0.nupkg | Bin 0 -> 58644 bytes src/libs/NJsonSchema.Yaml.11.0.0-beta-0.nupkg | Bin 0 -> 21559 bytes 73 files changed, 1873 insertions(+), 1817 deletions(-) create mode 100644 src/NuGet.Config create mode 100644 src/libs/NJsonSchema.11.0.0-beta-0.nupkg create mode 100644 src/libs/NJsonSchema.CodeGeneration.11.0.0-beta-0.nupkg create mode 100644 src/libs/NJsonSchema.CodeGeneration.CSharp.11.0.0-beta-0.nupkg create mode 100644 src/libs/NJsonSchema.CodeGeneration.TypeScript.11.0.0-beta-0.nupkg create mode 100644 src/libs/NJsonSchema.Yaml.11.0.0-beta-0.nupkg diff --git a/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj b/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj index 1d2fbebffb..b3abd37967 100644 --- a/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj +++ b/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj @@ -1,6 +1,6 @@  - net45 + net461 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.4 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,8 +13,8 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -31,10 +31,10 @@ - + TRACE;DEBUG;AspNetOwin;NET45 - + TRACE;RELEASE;AspNetOwin;NET45 @@ -49,7 +49,6 @@ - diff --git a/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj b/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj index 01771c949c..4a2b9344dc 100644 --- a/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj +++ b/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj @@ -13,8 +13,8 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -25,7 +25,6 @@ - diff --git a/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj b/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj index 0f9277bf7f..d61ca242bc 100644 --- a/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj +++ b/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj @@ -18,6 +18,6 @@ - + \ No newline at end of file diff --git a/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj b/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj index 42fba923c3..7532109c33 100644 --- a/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj +++ b/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj @@ -1,6 +1,6 @@  - net451;netstandard1.6;netstandard2.0;netcoreapp3.1;net5.0;net6.0 + net461;netstandard1.6;netstandard2.0;netcoreapp3.1;net5.0;net6.0 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.4 Swagger Documentation AspNetCore NetCore TypeScript CodeGen @@ -39,7 +39,7 @@ - + @@ -49,7 +49,7 @@ - + diff --git a/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec b/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec index f252c0505d..563fb5af3c 100644 --- a/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec +++ b/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec @@ -85,8 +85,8 @@ - - + + diff --git a/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj b/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj index ca1cc829c0..18802b6d74 100644 --- a/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj +++ b/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj @@ -13,8 +13,8 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -26,7 +26,7 @@ TRACE;RELEASE;FullNet;NET461 - + diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj b/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj index cb4db6f7c8..a2127d6e2e 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj +++ b/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj b/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj index 81684359af..a93b8a26fd 100644 --- a/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj +++ b/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj @@ -1,6 +1,6 @@  - netstandard1.3;net451;netstandard2.0 + net461;netstandard2.0 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.4 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,8 +13,8 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -60,16 +60,17 @@ - + - + - + - + + \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.HeaderParameter.liquid b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.HeaderParameter.liquid index 711df0a5ab..9d686c515d 100644 --- a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.HeaderParameter.liquid +++ b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.HeaderParameter.liquid @@ -1,7 +1,7 @@ {% if parameter.IsStringArray -%} request_.Headers.TryAddWithoutValidation("{{ parameter.Name }}", {{ parameter.VariableName }}); -{% elseif parameter.IsDateTime -%} -request_.Headers.TryAddWithoutValidation("{{ parameter.Name }}", ConvertToString({{ parameter.VariableName }}{{ if parameter.IsNullable }}?{{ endif }}.ToString("{{ ParameterDateTimeFormat }}"), System.Globalization.CultureInfo.InvariantCulture)); +{% elsif parameter.IsDateTime -%} +request_.Headers.TryAddWithoutValidation("{{ parameter.Name }}", ConvertToString({{ parameter.VariableName }}{% if parameter.IsNullable %}?{% endif %}.ToString("{{ ParameterDateTimeFormat }}"), System.Globalization.CultureInfo.InvariantCulture)); {% else -%} request_.Headers.TryAddWithoutValidation("{{ parameter.Name }}", ConvertToString({{ parameter.VariableName }}, System.Globalization.CultureInfo.InvariantCulture)); -{% endif -%} +{%- endif %} diff --git a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.PathParameter.liquid b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.PathParameter.liquid index 22453b89b7..38b36b5ece 100644 --- a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.PathParameter.liquid +++ b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.PathParameter.liquid @@ -1,13 +1,13 @@ {% if parameter.IsDateTimeArray -%} urlBuilder_.Replace("{{ "{" }}{{ parameter.Name }}}", System.Uri.EscapeDataString(string.Join(",", System.Linq.Enumerable.Select({{ parameter.VariableName }}, s_ => s_.ToString("{{ ParameterDateTimeFormat }}", System.Globalization.CultureInfo.InvariantCulture))))); -{% elseif parameter.IsDateArray -%} +{% elsif parameter.IsDateArray -%} urlBuilder_.Replace("{{ "{" }}{{ parameter.Name }}}", System.Uri.EscapeDataString(string.Join(",", System.Linq.Enumerable.Select({{ parameter.VariableName }}, s_ => s_.ToString("{{ ParameterDateFormat }}", System.Globalization.CultureInfo.InvariantCulture))))); -{% elseif parameter.IsDateTime -%} +{% elsif parameter.IsDateTime -%} urlBuilder_.Replace("{{ "{" }}{{ parameter.Name }}}", System.Uri.EscapeDataString({{ parameter.VariableName }}.ToString("{{ ParameterDateTimeFormat }}", System.Globalization.CultureInfo.InvariantCulture))); -{% elseif parameter.IsDate -%} +{% elsif parameter.IsDate -%} urlBuilder_.Replace("{{ "{" }}{{ parameter.Name }}}", System.Uri.EscapeDataString({{ parameter.VariableName }}.ToString("{{ ParameterDateFormat }}", System.Globalization.CultureInfo.InvariantCulture))); -{% elseif parameter.IsArray -%} +{% elsif parameter.IsArray -%} urlBuilder_.Replace("{{ "{" }}{{ parameter.Name }}}", System.Uri.EscapeDataString(string.Join(",", System.Linq.Enumerable.Select({{ parameter.VariableName }}, s_ => ConvertToString(s_, System.Globalization.CultureInfo.InvariantCulture))))); {% else -%} urlBuilder_.Replace("{{ "{" }}{{ parameter.Name }}}", System.Uri.EscapeDataString(ConvertToString({{ parameter.VariableName }}, System.Globalization.CultureInfo.InvariantCulture))); -{% endif -%} +{%- endif %} diff --git a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.ProcessResponse.liquid b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.ProcessResponse.liquid index b8a4e6a3e2..9201c58938 100644 --- a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.ProcessResponse.liquid +++ b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.ProcessResponse.liquid @@ -2,7 +2,7 @@ {% if response.IsFile -%} {% if response.IsSuccess -%} var responseStream_ = response_.Content == null ? System.IO.Stream.Null : await response_.Content.ReadAsStreamAsync().ConfigureAwait(false); -var fileResponse_ = new FileResponse(status_, headers_, responseStream_, {% if InjectHttpClient or DisposeHttpClient == false %}null{% else %}client_{% endif %}, response_); +var fileResponse_ = new FileResponse(status_, headers_, responseStream_, {% if InjectHttpClient or DisposeHttpClient == false %}null{% else %}client_{% endif %}, response_); disposeClient_ = false; disposeResponse_ = false; // response and client are disposed by FileResponse return fileResponse_; {% else -%} @@ -14,7 +14,7 @@ var responseData_ = response_.Content == null ? null : await response_.Content.R var result_ = ({{ response.Type }})System.Convert.ChangeType(responseData_, typeof({{ response.Type }})); {% if response.IsSuccess -%} {% if operation.WrapResponse -%} -return new {{ ResponseClass }}<{{ operation.UnwrappedResultType }}>(status_, headers_, result_); +return new {{ ResponseClass }}<{{ operation.UnwrappedResultType }}>(status_, headers_, result_); {% else -%} return result_; {% endif -%} @@ -31,9 +31,9 @@ if (objectResponse_.Object == null) {% endif -%} {% if response.IsSuccess -%} {% if operation.WrapResponse -%} -return new {{ ResponseClass }}<{{ operation.UnwrappedResultType }}>(status_, headers_, objectResponse_.Object); +return new {{ ResponseClass }}<{{ operation.UnwrappedResultType }}>(status_, headers_, objectResponse_.Object); {% else -%} -return objectResponse_.Object; +return objectResponse_.Object; {% endif -%} {% endif -%} {% if response.IsSuccess == false -%} @@ -52,7 +52,7 @@ throw new {{ ExceptionClass }}<{{ response.Type }}>("{{ response.ExceptionDescri {% endif -%} {% endif -%} {% endif -%} -{% elseif response.IsSuccess -%} +{% elsif response.IsSuccess -%} {% if operation.HasResultType -%} {% if operation.WrapResponse -%} return new {{ ResponseClass }}<{{ operation.UnwrappedResultType }}>(status_, headers_, {{ operation.UnwrappedResultDefaultValue }}); @@ -61,7 +61,7 @@ return {{ operation.UnwrappedResultDefaultValue }}; {% endif -%} {% else -%} {% if operation.WrapResponse -%} -return new {{ ResponseClass }}(status_, headers_); +return new {{ ResponseClass }}(status_, headers_); {% else -%} return; {% endif -%} @@ -69,4 +69,4 @@ return; {% else -%}{% comment %} implied: `if !response.HasType` so just read it as text {% endcomment %} string responseText_ = ( response_.Content == null ) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new {{ ExceptionClass }}("{{ response.ExceptionDescription }}", status_, responseText_, headers_, null); -{% endif -%} \ No newline at end of file +{% endif %} \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.QueryParameter.liquid b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.QueryParameter.liquid index a7fd119ff0..6bf155757e 100644 --- a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.QueryParameter.liquid +++ b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.QueryParameter.liquid @@ -1,16 +1,16 @@ {% if parameter.IsDateTimeArray -%} foreach (var item_ in {{ parameter.VariableName }}) { urlBuilder_.Append(System.Uri.EscapeDataString("{{ parameter.Name }}") + "=").Append(System.Uri.EscapeDataString(item_.ToString("{{ ParameterDateTimeFormat }}", System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } -{% elseif parameter.IsDateArray -%} +{% elsif parameter.IsDateArray -%} foreach (var item_ in {{ parameter.VariableName }}) { urlBuilder_.Append(System.Uri.EscapeDataString("{{ parameter.Name }}") + "=").Append(System.Uri.EscapeDataString(item_.ToString("{{ ParameterDateFormat }}", System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } -{% elseif parameter.IsDateTime -%} +{% elsif parameter.IsDateTime -%} urlBuilder_.Append(System.Uri.EscapeDataString("{{ parameter.Name }}") + "=").Append(System.Uri.EscapeDataString({% if parameter.IsNullable and parameter.IsRequired %}{{ parameter.VariableName }} != null ? {% endif %}{{ parameter.VariableName }}{% if parameter.IsSystemNullable %}.Value{% endif %}.ToString("{{ ParameterDateTimeFormat }}", System.Globalization.CultureInfo.InvariantCulture){% if parameter.IsNullable and parameter.IsRequired %} : "{{ QueryNullValue }}"{% endif %})).Append("&"); -{% elseif parameter.IsDate -%} +{% elsif parameter.IsDate -%} urlBuilder_.Append(System.Uri.EscapeDataString("{{ parameter.Name }}") + "=").Append(System.Uri.EscapeDataString({% if parameter.IsNullable and parameter.IsRequired %}{{ parameter.VariableName }} != null ? {% endif %}{{ parameter.VariableName }}{% if parameter.IsSystemNullable %}.Value{% endif %}.ToString("{{ ParameterDateFormat }}", System.Globalization.CultureInfo.InvariantCulture){% if parameter.IsNullable and parameter.IsRequired %} : "{{ QueryNullValue }}"{% endif %})).Append("&"); -{% elseif parameter.IsArray -%} +{% elsif parameter.IsArray -%} foreach (var item_ in {{ parameter.VariableName }}) { urlBuilder_.Append(System.Uri.EscapeDataString("{{ parameter.Name }}") + "=").Append(System.Uri.EscapeDataString(ConvertToString(item_, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } -{% elseif parameter.IsDictionary -%} +{% elsif parameter.IsDictionary -%} foreach (var item_ in {{ parameter.VariableName }}) { urlBuilder_.Append(System.Uri.EscapeDataString(item_.Key) + "=").Append(System.Uri.EscapeDataString(ConvertToString(item_.Value, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } -{% elseif parameter.IsDeepObject -%} +{% elsif parameter.IsDeepObject -%} {% for property in parameter.PropertyNames -%} if ({{parameter.Name}}.{{property.Name}} != null) { @@ -29,14 +29,14 @@ if ({{parameter.Name}}.{{property.Name}} != null && {{parameter.Name}}.{{propert urlBuilder_.Append("&"); } {% endfor -%} -{% elseif parameter.Explode and parameter.IsForm and parameter.IsObject -%} +{% elsif parameter.Explode and parameter.IsForm and parameter.IsObject -%} {% for property in parameter.PropertyNames -%} if ({{parameter.Name}}.{{property.Name}} != null) { urlBuilder_.Append(System.Uri.EscapeDataString("{{property.Key}}") + "=").Append(System.Uri.EscapeDataString(ConvertToString({{parameter.Name}}.{{property.Name}}, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } {% endfor -%} -{% elseif parameter.HasAdditionalProperties == false -%} +{% elsif parameter.HasAdditionalProperties == false -%} urlBuilder_.Append(System.Uri.EscapeDataString("{{ parameter.Name }}") + "=").Append(System.Uri.EscapeDataString({% if parameter.IsNullable and parameter.IsRequired %}{{ parameter.VariableName }} != null ? {% endif %}ConvertToString({{ parameter.VariableName }}, System.Globalization.CultureInfo.InvariantCulture){% if parameter.IsNullable and parameter.IsRequired %} : "{{ QueryNullValue }}"{% endif %})).Append("&"); {% endif -%} {% if parameter.HasAdditionalProperties -%} diff --git a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.ReadObjectResponse.liquid b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.ReadObjectResponse.liquid index cac5df5107..8f5da03152 100644 --- a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.ReadObjectResponse.liquid +++ b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.ReadObjectResponse.liquid @@ -4,11 +4,11 @@ protected virtual async System.Threading.Tasks.Task> Rea { if (response == null || response.Content == null) { -{% if GenerateNullableReferenceTypes -%} +{%- if GenerateNullableReferenceTypes -%} return new ObjectResponseResult(default(T)!, string.Empty); -{% else -%} +{%- else -%} return new ObjectResponseResult(default(T), string.Empty); -{% endif -%} +{%- endif -%} } if (ReadResponseAsString) @@ -17,11 +17,11 @@ protected virtual async System.Threading.Tasks.Task> Rea try { var typedBody = {% if UseSystemTextJson %}System.Text.Json.JsonSerializer.Deserialize{% else %}Newtonsoft.Json.JsonConvert.DeserializeObject{% endif %}(responseText, {% if UseRequestAndResponseSerializationSettings %}Response{% endif %}JsonSerializerSettings); -{% if GenerateNullableReferenceTypes -%} +{%- if GenerateNullableReferenceTypes -%} return new ObjectResponseResult(typedBody!, responseText); -{% else -%} +{%- else -%} return new ObjectResponseResult(typedBody, responseText); -{% endif -%} +{%- endif -%} } catch ({% if UseSystemTextJson %}System.Text.Json.JsonException{% else %}Newtonsoft.Json.JsonException{% endif %} exception) { @@ -34,21 +34,21 @@ protected virtual async System.Threading.Tasks.Task> Rea try { using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) -{% if UseSystemTextJson -%} +{%- if UseSystemTextJson -%} { var typedBody = await System.Text.Json.JsonSerializer.DeserializeAsync(responseStream, {% if UseRequestAndResponseSerializationSettings %}Response{% endif %}JsonSerializerSettings, cancellationToken).ConfigureAwait(false); -{% else -%} +{%- else -%} using (var streamReader = new System.IO.StreamReader(responseStream)) using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) { var serializer = Newtonsoft.Json.JsonSerializer.Create({% if UseRequestAndResponseSerializationSettings %}Response{% endif %}JsonSerializerSettings); var typedBody = serializer.Deserialize(jsonTextReader); -{% endif -%} -{% if GenerateNullableReferenceTypes -%} +{%- endif -%} +{%- if GenerateNullableReferenceTypes -%} return new ObjectResponseResult(typedBody!, string.Empty); -{% else -%} +{%- else -%} return new ObjectResponseResult(typedBody, string.Empty); -{% endif -%} +{%- endif -%} } } catch ({% if UseSystemTextJson %}System.Text.Json.JsonException{% else %}Newtonsoft.Json.JsonException{% endif %} exception) diff --git a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.liquid b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.liquid index 32fced3463..715ae14d86 100644 --- a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.liquid +++ b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Class.liquid @@ -21,14 +21,14 @@ {% if InjectHttpClient -%} _httpClient = httpClient; {% endif -%} -{% elseif UseBaseUrl and HasBaseUrl == false -%} - public {{ Class }}(string baseUrl{% if InjectHttpClient -%}, {{ HttpClientType }} httpClient{% endif %}) +{% elsif UseBaseUrl and HasBaseUrl == false %} + public {{ Class }}(string baseUrl{% if InjectHttpClient %}, {{ HttpClientType }} httpClient{% endif %}) { BaseUrl = baseUrl; {% if InjectHttpClient -%} _httpClient = httpClient; {% endif -%} -{% elseif InjectHttpClient -%} +{% elsif InjectHttpClient %} public {{ Class }}({{ HttpClientType }} httpClient) { _httpClient = httpClient; @@ -68,10 +68,10 @@ } {% endif -%} -{% if ExposeJsonSerializerSettings %} -{% assign serializerSettingsAccessModifier = "public" -%} +{% if ExposeJsonSerializerSettings -%} +{% assign serializerSettingsAccessModifier = "public" %} {% else -%} -{% assign serializerSettingsAccessModifier = "protected" -%} +{% assign serializerSettingsAccessModifier = "protected" %} {% endif -%} {% if UseRequestAndResponseSerializationSettings -%} {{ serializerSettingsAccessModifier }} {{ JsonSerializerSettingsType }} RequestJsonSerializerSettings { get { return _requestSettings.Value; } } @@ -94,7 +94,7 @@ partial void PrepareRequest({{ HttpClientType }} client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); partial void ProcessResponse({{ HttpClientType }} client, System.Net.Http.HttpResponseMessage response); {% endif -%} -{% for operation in Operations -%} +{% for operation in Operations %} {% if GenerateOptionalParameters == false -%} {% template Client.Method.Documentation %} {% template Client.Method.Annotations %} @@ -165,7 +165,7 @@ {% if InjectHttpClient -%} var client_ = _httpClient; -{% elseif UseHttpClientCreationMethod -%} +{% elsif UseHttpClientCreationMethod -%} var client_ = await CreateHttpClientAsync(cancellationToken).ConfigureAwait(false); {% else -%} var client_ = new {{ HttpClientType }}(); @@ -183,7 +183,7 @@ using (var request_ = new System.Net.Http.HttpRequestMessage()) {% endif -%} { -{% for parameter in operation.HeaderParameters -%} +{% for parameter in operation.HeaderParameters %} {% if parameter.IsRequired -%} if ({{ parameter.VariableName }} == null) throw new System.ArgumentNullException("{{ parameter.VariableName }}"); @@ -202,10 +202,10 @@ var content_ = new System.Net.Http.StreamContent({{ operation.ContentParameter.VariableName }}); content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("{{ operation.Consumes }}"); {% endif -%} -{% elseif operation.HasXmlBodyParameter -%} +{% elsif operation.HasXmlBodyParameter -%} var content_ = new System.Net.Http.StringContent({{ operation.ContentParameter.VariableName }}); content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("{{ operation.Consumes }}"); -{% elseif operation.ConsumesFormUrlEncoded -%} +{% elsif operation.ConsumesFormUrlEncoded -%} var json_ = Newtonsoft.Json.JsonConvert.SerializeObject({{ operation.ContentParameter.VariableName }}, _settings.Value); var dictionary_ = Newtonsoft.Json.JsonConvert.DeserializeObject>(json_, _settings.Value); var content_ = new System.Net.Http.FormUrlEncodedContent(dictionary_); @@ -235,7 +235,7 @@ var content_ = new System.Net.Http.MultipartFormDataContent(boundary_); content_.Headers.Remove("Content-Type"); content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_); -{% for parameter in operation.FormParameters -%} +{% for parameter in operation.FormParameters %} {% if parameter.IsNullable -%} if ({{ parameter.VariableName }} != null) {% else -%} @@ -259,12 +259,12 @@ content_{{ parameter.VariableName }}_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse({{ parameter.VariableName }}.ContentType); content_.Add(content_{{ parameter.VariableName }}_, "{{ parameter.Name }}", {{ parameter.VariableName }}.FileName ?? "{{ parameter.Name }}"); {% endif -%} -{% elseif parameter.IsArray -%} +{% elsif parameter.IsArray -%} foreach (var item_ in {{ parameter.VariableName }}) { content_.Add(new System.Net.Http.StringContent(ConvertToString(item_, System.Globalization.CultureInfo.InvariantCulture)), "{{ parameter.Name }}"); } -{% elseif parameter.IsObject -%} +{% elsif parameter.IsObject -%} content_.Add(new System.Net.Http.StringContent({% if UseSystemTextJson %}System.Text.Json.JsonSerializer.Serialize{% else %}Newtonsoft.Json.JsonConvert.SerializeObject{% endif %}({{ parameter.VariableName }}, {% if UseRequestAndResponseSerializationSettings %}_requestSettings{% else %}_settings{% endif %}.Value)), "{{ parameter.Name }}"); {% else -%} content_.Add(new System.Net.Http.StringContent(ConvertToString({{ parameter.VariableName }}, System.Globalization.CultureInfo.InvariantCulture)), "{{ parameter.Name }}"); @@ -273,7 +273,7 @@ {% endfor -%} request_.Content = content_; {% endif -%} -{% elseif operation.IsGetOrDeleteOrHead == false -%} +{% elsif operation.IsGetOrDeleteOrHead == false -%} request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "{{ operation.Produces }}"); {% endif -%} {% endif -%} @@ -282,7 +282,7 @@ request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("{{ operation.Produces }}")); {% endif -%} -{% if GeneratePrepareRequestAndProcessResponseAsAsyncMethods -%} +{% if GeneratePrepareRequestAndProcessResponseAsAsyncMethods %} await PrepareRequestAsync(client_, request_, urlBuilder_).ConfigureAwait(false); {% else -%} PrepareRequest(client_, request_, urlBuilder_); @@ -296,8 +296,8 @@ {% else -%} PrepareRequest(client_, request_, url_); {% endif -%} - {% template Client.Class.BeforeSend %} + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -309,11 +309,11 @@ headers_[item_.Key] = item_.Value; } -{% if GeneratePrepareRequestAndProcessResponseAsAsyncMethods -%} +{% if GeneratePrepareRequestAndProcessResponseAsAsyncMethods %} await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); -{% else -%} +{% else %} ProcessResponse(client_, response_); -{% endif -%} +{% endif %} var status_ = (int)response_.StatusCode; {% for response in operation.Responses -%} @@ -329,38 +329,38 @@ {% assign response = operation.DefaultResponse -%} {% template Client.Class.ProcessResponse %} } -{% elseif operation.HasSuccessResponse -%} +{% elsif operation.HasSuccessResponse -%} { var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); throw new {{ ExceptionClass }}("{{ operation.DefaultResponse.ExceptionDescription }}", status_, responseData_, headers_, null); } -{% elseif operation.HasResultType -%} -{% if operation.WrapResponse and operation.UnwrappedResultType != "FileResponse" -%} +{% elsif operation.HasResultType -%} +{% if operation.WrapResponse and operation.UnwrappedResultType != "FileResponse" %} return new {{ ResponseClass }}<{{ operation.UnwrappedResultType }}>(status_, headers_, {{ operation.UnwrappedResultDefaultValue }}); {% else -%} return {{ operation.UnwrappedResultDefaultValue }}; {% endif -%} -{% elseif operation.WrapResponse -%} +{% elsif operation.WrapResponse -%} return new {{ ResponseClass }}(status_, headers_); {% endif -%} {% else -%} {% if operation.HasSuccessResponse == false -%} -{% comment %} +{% comment -%} If the success response has already been explicitely declared, there is no need for this default code (because handled above). Otherwise, return default values on success because we don't want to throw on "unknown status code". Success is always expected -{% endcomment -%} +{%- endcomment %} if (status_ == 200 || status_ == 204) { {% if operation.HasResultType -%} -{% if operation.WrapResponse and operation.UnwrappedResultType != "FileResponse" -%} +{% if operation.WrapResponse and operation.UnwrappedResultType != "FileResponse" %} return new {{ ResponseClass }}<{{ operation.UnwrappedResultType }}>(status_, headers_, {{ operation.UnwrappedResultDefaultValue }}); {% else -%} return {{ operation.UnwrappedResultDefaultValue }}; {% endif -%} -{% elseif operation.WrapResponse -%} +{% elsif operation.WrapResponse -%} return new {{ ResponseClass }}(status_, headers_); -{% else -%}{% comment %} This method isn't expected to return a value. Just return. {% endcomment -%} +{% else -%}{% comment %} This method isn't expected to return a value. Just return. {% endcomment %} return; {% endif -%} } @@ -386,7 +386,7 @@ } } -{% endfor -%} +{% endfor %} protected struct ObjectResponseResult { public ObjectResponseResult(T responseObject, string responseText) diff --git a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Interface.liquid b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Interface.liquid index c392a6ec1b..8fbb51e451 100644 --- a/src/NSwag.CodeGeneration.CSharp/Templates/Client.Interface.liquid +++ b/src/NSwag.CodeGeneration.CSharp/Templates/Client.Interface.liquid @@ -15,7 +15,7 @@ public partial interface I{{ Class }}{% if HasClientBaseInterface %} : {{ Client {% template Client.Method.Annotations %} {{ operation.SyncResultType }} {{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.Type }} {{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %} = null{% endif %}{% if parameter.IsLast == false %}, {% endif %}{% endfor %}); -{% endif -%} +{%- endif %} /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. {% template Client.Method.Documentation %} {% template Client.Method.Annotations %} diff --git a/src/NSwag.CodeGeneration.CSharp/Templates/Controller.liquid b/src/NSwag.CodeGeneration.CSharp/Templates/Controller.liquid index e5e9c813fb..1fa20de5f8 100644 --- a/src/NSwag.CodeGeneration.CSharp/Templates/Controller.liquid +++ b/src/NSwag.CodeGeneration.CSharp/Templates/Controller.liquid @@ -2,36 +2,36 @@ [System.CodeDom.Compiler.GeneratedCode("NSwag", "{{ ToolchainVersion }}")] public interface I{{ Class }}Controller { -{% for operation in Operations -%} -{% if operation.HasSummary -%} +{%- for operation in Operations %} +{%- if operation.HasSummary %} /// {{ operation.Summary | csharpdocs }} -{% endif -%} -{% for parameter in operation.Parameters -%} -{% if parameter.HasDescription -%} +{%- endif %} +{%- for parameter in operation.Parameters %} +{%- if parameter.HasDescription %} /// {{ parameter.Description | csharpdocs }} -{% endif -%} -{% endfor -%} -{% if operation.HasResultDescription -%} +{%- endif %} +{%- endfor %} +{%- if operation.HasResultDescription %} /// {{ operation.ResultDescription | csharpdocs }} {% endif -%} -{% if operation.IsDeprecated -%} +{%- if operation.IsDeprecated %} [System.Obsolete] -{% endif -%} - {{ operation.ResultType }} {{ operation.ActualOperationName }}Async({% for parameter in operation.Parameters %}{{ parameter.TypeInControllerInterface }} {{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional and parameter.HasDefault == false %} = null{% endif %}{% if parameter.IsLast == false or UseCancellationToken %}, {% endif %}{% endfor %}{% if UseCancellationToken %}System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken){% endif %}); +{%- endif %} + {{ operation.ResultType }} {{ operation.ActualOperationName }}Async({% for parameter in operation.Parameters %}{% assign parameterOptional = GenerateOptionalParameters and parameter.IsOptional %}{{ parameter.TypeInControllerInterface }} {{ parameter.VariableName }}{% if parameterOptional and parameter.HasDefault == false %} = null{% endif %}{% if parameter.IsLast == false or UseCancellationToken %}, {% endif %}{% endfor %}{% if UseCancellationToken %}System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken){% endif %}); -{% endfor -%} +{%- endfor %} } +{%- endif %} -{% endif -%} [System.CodeDom.Compiler.GeneratedCode("NSwag", "{{ ToolchainVersion }}")] -{% if HasBasePath -%} -{% if IsAspNetCore -%} +{%- if HasBasePath -%} +{%- if IsAspNetCore -%} [{{ AspNetNamespace }}.Route("{{ BasePath }}")] -{% else -%} +{%- else -%} [{{ AspNetNamespace }}.RoutePrefix("{{ BasePath }}")] -{% endif -%} -{% endif -%} -{% if GeneratePartialControllers -%} +{%- endif -%} +{%- endif -%} +{%- if GeneratePartialControllers -%} {% template Controller.Class.Annotations %} public partial class {{ Class }}Controller : {% if HasBaseClass %}{{ BaseClass }}{% else %}{{ AspNetNamespace }}.{% if IsAspNetCore %}ControllerBase{% else %}ApiController{% endif %}{% endif %} { @@ -59,9 +59,9 @@ public partial class {{ Class }}Controller : {% if HasBaseClass %}{{ BaseClass } {% endif -%} {% template Controller.Method.Annotations %} [{{ AspNetNamespace }}.Http{{ operation.HttpMethodUpper }}, {{ AspNetNamespace }}.Route("{{ operation.Path }}"{% if operation.HasRouteName %}, Name = "{{ operation.RouteName }}"{% endif %})] - public {% if IsAspNetCore and operation.WrapResponse %}async System.Threading.Tasks.Task{% elsif operation.WrapResponse %}async System.Threading.Tasks.Task{% else %}{{ operation.ResultType }}{% endif %} {{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{% if parameter.IsQuery %}[{{ AspNetNamespace }}.{% if IsAspNetCore -%}FromQuery{% else -%}FromUri{% endif -%}{% if parameter.IsValidIdentifier == false %}(Name = "{{ parameter.Name }}"){% endif %}] {% endif %}{% if parameter.IsHeader %}[{% if IsAspNetCore -%}{{ AspNetNamespace }}.{% endif -%}FromHeader{% if parameter.IsValidIdentifier == false %}(Name = "{{ parameter.Name }}"){% endif %}] {% endif %}{% if parameter.IsBody and parameter.IsBinaryBody == false %}[{{ AspNetNamespace }}.FromBody] {% endif %}{% if GenerateModelValidationAttributes and parameter.IsRequired %}[{{ RequiredAttributeType }}] {% endif %}{{ parameter.Type }} {{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %} = null{% endif %}{% if parameter.IsLast == false or UseCancellationToken %}, {% endif %}{% endfor %}{% if UseCancellationToken %}System.Threading.CancellationToken cancellationToken{% endif %}) + public {% if IsAspNetCore and operation.WrapResponse %}async System.Threading.Tasks.Task{% elsif operation.WrapResponse %}async System.Threading.Tasks.Task{% else %}{{ operation.ResultType }}{% endif %} {{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{% if parameter.IsQuery %}[{{ AspNetNamespace }}.{% if IsAspNetCore -%}FromQuery{% else -%}FromUri{%- endif %}{% if parameter.IsValidIdentifier == false %}(Name = "{{ parameter.Name }}"){% endif %}] {% endif %}{% if parameter.IsHeader %}[{% if IsAspNetCore -%}{{ AspNetNamespace }}.{%- endif %}FromHeader{% if parameter.IsValidIdentifier == false %}(Name = "{{ parameter.Name }}"){% endif %}] {% endif %}{% if parameter.IsBody and parameter.IsBinaryBody == false %}[{{ AspNetNamespace }}.FromBody] {% endif %}{% if GenerateModelValidationAttributes and parameter.IsRequired %}[{{ RequiredAttributeType }}] {% endif %}{{ parameter.Type }} {{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %} = null{% endif %}{% if parameter.IsLast == false or UseCancellationToken %}, {% endif %}{% endfor %}{% if UseCancellationToken %}System.Threading.CancellationToken cancellationToken{% endif %}) { -{% if IsAspNetCore and operation.WrapResponse -%} +{%- if IsAspNetCore and operation.WrapResponse %} var result = await _implementation.{{ operation.ActualOperationName }}Async({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if parameter.HasDefault %} ?? {{parameter.Default}}{% endif %}{% if parameter.IsLast == false or UseCancellationToken %}, {% endif %}{% endfor %}{% if UseCancellationToken %}cancellationToken{% endif %}).ConfigureAwait(false); var status = result.StatusCode; @@ -71,7 +71,7 @@ public partial class {{ Class }}Controller : {% if HasBaseClass %}{{ BaseClass } Request.HttpContext.Response.Headers.Add(header.Key, new Microsoft.Extensions.Primitives.StringValues(header.Value.ToArray())); return response; -{% elsif operation.WrapResponse -%} +{%- elsif operation.WrapResponse %} var result = await _implementation.{{ operation.ActualOperationName }}Async({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if parameter.HasDefault %} ?? {{parameter.Default}}{% endif %}{% if parameter.IsLast == false or UseCancellationToken %}, {% endif %}{% endfor %}{% if UseCancellationToken %}cancellationToken{% endif %}).ConfigureAwait(false); var status = (System.Net.HttpStatusCode)result.StatusCode; @@ -81,14 +81,14 @@ public partial class {{ Class }}Controller : {% if HasBaseClass %}{{ BaseClass } response.Headers.Add(header.Key, header.Value); return response; -{% else -%} +{%- else %} return _implementation.{{ operation.ActualOperationName }}Async({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if parameter.HasDefault %} ?? {{parameter.Default}}{% endif %}{% if parameter.IsLast == false or UseCancellationToken %}, {% endif %}{% endfor %}{% if UseCancellationToken %}cancellationToken{% endif %}); {% endif -%} } {% endfor -%} } -{% elseif GenerateAbstractControllers -%} +{% elsif GenerateAbstractControllers -%} {% template Controller.Class.Annotations %} public abstract class {{ Class }}ControllerBase : {% if HasBaseClass %}{{ BaseClass }}{% else %}{{ AspNetNamespace }}.{% if IsAspNetCore %}ControllerBase{% else %}ApiController{% endif %}{% endif %} { @@ -109,8 +109,8 @@ public abstract class {{ Class }}ControllerBase : {% if HasBaseClass %}{{ BaseCl {% endif -%} {% template Controller.Method.Annotations %} [{{ AspNetNamespace }}.Http{{ operation.HttpMethodUpper }}, {{ AspNetNamespace }}.Route("{{ operation.Path }}"{% if operation.HasRouteName %}, Name = "{{ operation.RouteName }}"{% endif %})] - public abstract {% if operation.WrapResponse %}System.Threading.Tasks.Task{% else %}{{ operation.ResultType }}{% endif %} {{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{% if parameter.IsQuery %}[{{ AspNetNamespace }}.{% if IsAspNetCore -%}FromQuery{% else -%}FromUri{% endif -%}{% if parameter.IsValidIdentifier == false %}(Name = "{{ parameter.Name }}"){% endif %}] {% endif %}{% if parameter.IsHeader %}[{% if IsAspNetCore -%}{{ AspNetNamespace }}.{% endif -%}FromHeader{% if parameter.IsValidIdentifier == false %}(Name = "{{ parameter.Name }}"){% endif %}] {% endif %}{% if parameter.IsBody and parameter.IsBinaryBody == false %}[{{ AspNetNamespace }}.FromBody] {% endif %}{% if GenerateModelValidationAttributes and parameter.IsRequired %}[{{ RequiredAttributeType }}] {% endif %}{{ parameter.Type }} {{ parameter.VariableName }}{% if parameter.HasDefault %} = {{parameter.Default}}{% endif %}{% if GenerateOptionalParameters and parameter.IsOptional and parameter.HasDefault == false %} = null{% endif %}{% if parameter.IsLast == false or UseCancellationToken %}, {% endif %}{% endfor %}{% if UseCancellationToken %}System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken){% endif %}); + public abstract {% if operation.WrapResponse %}System.Threading.Tasks.Task{% else %}{{ operation.ResultType }}{% endif %} {{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{% if parameter.IsQuery %}[{{ AspNetNamespace }}.{% if IsAspNetCore -%}FromQuery{% else -%}FromUri{%- endif %}{% if parameter.IsValidIdentifier == false %}(Name = "{{ parameter.Name }}"){% endif %}] {% endif %}{% if parameter.IsHeader %}[{% if IsAspNetCore -%}{{ AspNetNamespace }}.{%- endif %}FromHeader{% if parameter.IsValidIdentifier == false %}(Name = "{{ parameter.Name }}"){% endif %}] {% endif %}{% if parameter.IsBody and parameter.IsBinaryBody == false %}[{{ AspNetNamespace }}.FromBody] {% endif %}{% if GenerateModelValidationAttributes and parameter.IsRequired %}[{{ RequiredAttributeType }}] {% endif %}{{ parameter.Type }} {{ parameter.VariableName }}{% if parameter.HasDefault %} = {{parameter.Default}}{% endif %}{% if GenerateOptionalParameters and parameter.IsOptional and parameter.HasDefault == false %} = null{% endif %}{% if parameter.IsLast == false or UseCancellationToken %}, {% endif %}{% endfor %}{% if UseCancellationToken %}System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken){% endif %}); {% endfor -%} } -{% endif -%} +{%- endif %} diff --git a/src/NSwag.CodeGeneration.CSharp/Templates/File.liquid b/src/NSwag.CodeGeneration.CSharp/Templates/File.liquid index 2a6bbc2d29..def547218e 100644 --- a/src/NSwag.CodeGeneration.CSharp/Templates/File.liquid +++ b/src/NSwag.CodeGeneration.CSharp/Templates/File.liquid @@ -10,7 +10,7 @@ {% if GenerateNullableReferenceTypes -%} #nullable enable -{% endif -%} +{%- endif %} {% for usage in NamespaceUsages -%} using {{ usage }}; {% endfor -%} @@ -32,7 +32,7 @@ namespace {{ Namespace }} {% if GenerateContracts -%} {{ Classes | tab }} -{% if RequiresFileParameterType -%} +{%- if RequiresFileParameterType -%} [System.CodeDom.Compiler.GeneratedCode("NSwag", "{{ ToolchainVersion }}")] public partial class FileParameter { @@ -41,20 +41,20 @@ namespace {{ Namespace }} { } -{% if GenerateNullableReferenceTypes -%} +{%- if GenerateNullableReferenceTypes -%} public FileParameter(System.IO.Stream data, string? fileName) -{% else -%} +{%- else -%} public FileParameter(System.IO.Stream data, string fileName) -{% endif -%} +{%- endif -%} : this (data, fileName, null) { } -{% if GenerateNullableReferenceTypes -%} +{%- if GenerateNullableReferenceTypes -%} public FileParameter(System.IO.Stream data, string? fileName, string? contentType) -{% else -%} +{%- else -%} public FileParameter(System.IO.Stream data, string fileName, string contentType) -{% endif -%} +{%- endif -%} { Data = data; FileName = fileName; @@ -63,29 +63,29 @@ namespace {{ Namespace }} public System.IO.Stream Data { get; private set; } -{% if GenerateNullableReferenceTypes -%} +{%- if GenerateNullableReferenceTypes -%} public string? FileName { get; private set; } public string? ContentType { get; private set; } -{% else -%} +{%- else -%} public string FileName { get; private set; } public string ContentType { get; private set; } -{% endif -%} +{%- endif -%} } -{% endif -%} -{% if GenerateFileResponseClass -%} +{%- endif %} +{%- if GenerateFileResponseClass %} [System.CodeDom.Compiler.GeneratedCode("NSwag", "{{ ToolchainVersion }}")] public partial class FileResponse : System.IDisposable { -{% if GenerateNullableReferenceTypes -%} +{%- if GenerateNullableReferenceTypes -%} private System.IDisposable? _client; private System.IDisposable? _response; -{% else -%} +{%- else -%} private System.IDisposable _client; private System.IDisposable _response; -{% endif -%} +{%- endif -%} public int StatusCode { get; private set; } @@ -98,11 +98,11 @@ namespace {{ Namespace }} get { return StatusCode == 206; } } -{% if GenerateNullableReferenceTypes -%} +{%- if GenerateNullableReferenceTypes -%} public FileResponse(int statusCode, System.Collections.Generic.IReadOnlyDictionary> headers, System.IO.Stream stream, System.IDisposable? client, System.IDisposable? response) -{% else -%} +{%- else -%} public FileResponse(int statusCode, System.Collections.Generic.IReadOnlyDictionary> headers, System.IO.Stream stream, System.IDisposable client, System.IDisposable response) -{% endif -%} +{%- endif -%} { StatusCode = statusCode; Headers = headers; @@ -121,9 +121,9 @@ namespace {{ Namespace }} } } -{% endif -%} -{% if WrapResponses and GenerateResponseClasses -%} -{% for responseClassName in ResponseClassNames -%} +{%- endif %} +{%- if WrapResponses and GenerateResponseClasses %} +{%- for responseClassName in ResponseClassNames %} [System.CodeDom.Compiler.GeneratedCode("NSwag", "{{ ToolchainVersion }}")] public partial class {{ responseClassName }} { @@ -150,28 +150,28 @@ namespace {{ Namespace }} } } -{% endfor %} -{% endif -%} -{% if GenerateExceptionClasses -%} -{% for exceptionClassName in ExceptionClassNames -%} +{%- endfor %} +{%- endif %} +{%- if GenerateExceptionClasses %} +{%- for exceptionClassName in ExceptionClassNames %} [System.CodeDom.Compiler.GeneratedCode("NSwag", "{{ ToolchainVersion }}")] public partial class {{ exceptionClassName }} : System.Exception { public int StatusCode { get; private set; } -{% if GenerateNullableReferenceTypes -%} +{%- if GenerateNullableReferenceTypes -%} public string? Response { get; private set; } -{% else -%} +{%- else -%} public string Response { get; private set; } -{% endif -%} +{%- endif -%} public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } -{% if GenerateNullableReferenceTypes -%} +{%- if GenerateNullableReferenceTypes -%} public {{ exceptionClassName }}(string message, int statusCode, string? response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Exception? innerException) -{% else -%} +{%- else -%} public {{ exceptionClassName }}(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Exception innerException) -{% endif -%} +{%- endif -%} : base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException) { StatusCode = statusCode; @@ -190,11 +190,11 @@ namespace {{ Namespace }} { public TResult Result { get; private set; } -{% if GenerateNullableReferenceTypes -%} +{%- if GenerateNullableReferenceTypes -%} public {{ exceptionClassName }}(string message, int statusCode, string? response, System.Collections.Generic.IReadOnlyDictionary> headers, TResult result, System.Exception? innerException) -{% else -%} +{%- else -%} public {{ exceptionClassName }}(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary> headers, TResult result, System.Exception innerException) -{% endif -%} +{%- endif -%} : base(message, statusCode, response, headers, innerException) { Result = result; @@ -203,12 +203,12 @@ namespace {{ Namespace }} {% endfor -%} {% endif -%} -{% endif -%} +{%- endif %} {% if GenerateImplementation -%} {% if RequiresJsonExceptionConverter -%} {% template JsonExceptionConverter %} {% endif -%} -{% endif -%} +{%- endif %} } diff --git a/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj b/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj index aa73c4cd3b..cf7ca04b88 100644 --- a/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj +++ b/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj b/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj index c2ceb414ff..18f5ff27d1 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj b/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj index 6220043790..d4ba6e8a86 100644 --- a/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj +++ b/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj @@ -1,6 +1,6 @@  - netstandard1.3;net451;netstandard2.0 + net461;netstandard2.0 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.4 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,8 +13,8 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -41,16 +41,16 @@ - + - + - + - + \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/AngularClient.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/AngularClient.liquid index 684b1a7c47..aced4792d0 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/AngularClient.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/AngularClient.liquid @@ -5,7 +5,7 @@ {% template Client.Method.Documentation %} {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false%}, {% endif %}{% endfor %}): Observable<{{ operation.ResultType }}>; {% endfor -%}} -{% endif -%} +{%- endif -%} {% if Framework.Angular.UseSingletonProvider -%} @Injectable({ @@ -13,91 +13,91 @@ }) {% else -%} @Injectable() -{% endif -%} +{%- endif -%} {% if ExportTypes %}export {% endif %}class {{ Class }} {% if HasBaseClass %}extends {{ BaseClass }} {% endif %}{% if GenerateClientInterfaces %}implements I{{ Class }} {% endif %}{ private http: {{ Framework.Angular.HttpClass }}; private baseUrl: string; protected jsonParseReviver: {% if SupportsStrictNullChecks %}((key: string, value: any) => any) | undefined{% else %}(key: string, value: any) => any{% endif %} = undefined; -{% if HasExtendedConstructor == false -%} +{%- if HasExtendedConstructor == false -%} constructor({% if HasConfigurationClass %}@Inject({{ ConfigurationClass }}) configuration: {{ ConfigurationClass }}, {% endif %}@Inject({{ Framework.Angular.HttpClass }}) http: {{ Framework.Angular.HttpClass }}, @Optional() @Inject({{ Framework.Angular.BaseUrlTokenName }}) baseUrl?: string) { -{% if HasBaseClass -%} +{%- if HasBaseClass -%} super({% if HasConfigurationClass %}configuration{% endif %}); -{% endif -%} +{%- endif -%} this.http = http; -{% if UseGetBaseUrlMethod -%} +{%- if UseGetBaseUrlMethod -%} this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : this.getBaseUrl("{{ BaseUrl }}"); -{% else -%} +{%- else -%} this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "{{ BaseUrl }}"; -{% endif -%} +{%- endif -%} } -{% endif -%} +{%- endif -%} {% if HasExtensionCode -%} {{ ExtensionCode }} -{% endif -%} -{% for operation in Operations -%} +{%- endif -%} +{% for operation in Operations %} {% template Client.Method.Documentation %} - {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false or IncludeHttpContext == true%}, {% endif %}{% endfor %}{% if IncludeHttpContext%}httpContext?: HttpContext{% endif %}) : Observable<{{ operation.ResultType }}> { + {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false or IncludeHttpContext == true%}, {% endif %}{% endfor %}{% if IncludeHttpContext%}httpContext?: HttpContext{% endif %}): Observable<{{ operation.ResultType }}> { {% template Client.RequestUrl %} -{% if operation.HasBody -%} +{%- if operation.HasBody -%} {% template Client.RequestBody %} -{% endif -%} +{%- endif -%} let options_ : any = { -{% if operation.HasBody -%} +{%- if operation.HasBody -%} body: content_, -{% endif -%} -{% if Framework.Angular.UseHttpClient -%} +{%- endif -%} +{%- if Framework.Angular.UseHttpClient -%} observe: "response", responseType: "blob", -{% if Framework.Angular.WithCredentials -%} +{%- if Framework.Angular.WithCredentials -%} withCredentials: true, -{% endif -%} -{% else -%} +{%- endif -%} +{%- else -%} method: "{{ operation.HttpMethodLower }}", -{% endif -%} -{% if operation.IsFile and Framework.Angular.UseHttpClient == false -%} +{%- endif -%} +{%- if operation.IsFile and Framework.Angular.UseHttpClient == false -%} responseType: ResponseContentType.Blob, -{% endif -%} -{% if IncludeHttpContext -%} +{%- endif -%} +{%- if IncludeHttpContext -%} context: httpContext, -{% endif -%} +{%- endif -%} headers: new {% if Framework.Angular.UseHttpClient %}HttpHeaders{% else %}Headers{% endif %}({ -{% for parameter in operation.HeaderParameters -%} +{%- for parameter in operation.HeaderParameters -%} "{{ parameter.Name }}": {{ parameter.VariableName }} !== undefined && {{ parameter.VariableName }} !== null ? "" + {{ parameter.VariableName }} : "", -{% endfor -%} -{% if operation.HasContent or operation.ConsumesFormUrlEncoded -%} +{%- endfor -%} +{%- if operation.HasContent or operation.ConsumesFormUrlEncoded -%} "Content-Type": "{{ operation.Consumes }}", -{% endif -%} -{% if operation.HasResultType and operation.HasAcceptHeaderParameterParameter == false -%} +{%- endif -%} +{%- if operation.HasResultType and operation.HasAcceptHeaderParameterParameter == false -%} "Accept": "{{ operation.Produces }}" -{% endif -%} +{%- endif -%} }) }; -{% if UseTransformOptionsMethod -%} +{% if UseTransformOptionsMethod -%} return {{ Framework.RxJs.ObservableFromMethod }}(this.transformOptions(options_)).{% if Framework.UseRxJs6 %}pipe({% endif %}{{ Framework.RxJs.ObservableMergeMapMethod }}(transformedOptions_ => { return this.http.request({% if Framework.Angular.UseHttpClient %}"{{ operation.HttpMethodLower }}", {% endif %}url_, transformedOptions_); }){% if Framework.UseRxJs6 %}){% endif %}.{% if Framework.UseRxJs6 %}pipe({% endif %}{{ Framework.RxJs.ObservableMergeMapMethod }}((response_: any) => { -{% else -%} +{%- else -%} return this.http.request({% if Framework.Angular.UseHttpClient %}"{{ operation.HttpMethodLower }}", {% endif %}url_, options_).{% if Framework.UseRxJs6 %}pipe({% endif %}{{ Framework.RxJs.ObservableMergeMapMethod }}((response_ : any) => { -{% endif -%} -{% if UseTransformResultMethod -%} +{%- endif -%} +{%- if UseTransformResultMethod -%} return this.transformResult(url_, response_, (r) => this.process{{ operation.ActualOperationNameUpper }}(r)); -{% else -%} +{%- else -%} return this.process{{ operation.ActualOperationNameUpper }}(response_); -{% endif -%} +{%- endif -%} }){% if Framework.UseRxJs6 %}){% endif %}.{% if Framework.UseRxJs6 %}pipe({% endif %}{{ Framework.RxJs.ObservableCatchMethod }}((response_: any) => { if (response_ instanceof {% if Framework.Angular.UseHttpClient %}HttpResponseBase{% else %}Response{% endif %}) { try { -{% if UseTransformResultMethod -%} +{%- if UseTransformResultMethod -%} return this.transformResult(url_, response_, (r) => this.process{{ operation.ActualOperationNameUpper }}(r)); -{% else -%} +{%- else -%} return this.process{{ operation.ActualOperationNameUpper }}(response_); -{% endif -%} +{%- endif -%} } catch (e) { return >{{ Framework.RxJs.ObservableThrowMethod }}(e); } @@ -108,14 +108,14 @@ protected process{{ operation.ActualOperationNameUpper }}(response: {% if Framework.Angular.UseHttpClient %}HttpResponseBase{% else %}Response{% endif %}): Observable<{{ operation.ResultType }}> { const status = response.status; -{% if Framework.Angular.UseHttpClient -%} +{%- if Framework.Angular.UseHttpClient -%} const responseBlob = response instanceof HttpResponse ? response.body : (response).error instanceof Blob ? (response).error : undefined; -{% endif -%} +{%- endif -%} {% template Client.ProcessResponse %} } {% endfor -%} } -{% endif -%} \ No newline at end of file +{%- endif -%} diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/AngularJSClient.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/AngularJSClient.liquid index 28690543fc..7636aa519c 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/AngularJSClient.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/AngularJSClient.liquid @@ -5,7 +5,7 @@ {% template Client.Method.Documentation %} {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false %}, {% endif %}{% endfor %}): ng.IPromise<{{ operation.ResultType }}>; {% endfor -%}} -{% endif -%} +{%- endif -%} {% if ExportTypes %}export {% endif %}class {{ Class }} {% if HasBaseClass %}extends {{ BaseClass }} {% endif %}{% if GenerateClientInterfaces %}implements I{{ Class }} {% endif %}{ private baseUrl: string{% if SupportsStrictNullChecks %} | undefined{% endif %} = undefined; @@ -13,25 +13,25 @@ private q: ng.IQService; protected jsonParseReviver: {% if SupportsStrictNullChecks %}((key: string, value: any) => any) | undefined{% else %}(key: string, value: any) => any{% endif %} = undefined; -{% if HasExtendedConstructor == false %} +{%- if HasExtendedConstructor == false -%} constructor({% if HasConfigurationClass %}configuration: {{ ConfigurationClass }}, {% endif %}$http: ng.IHttpService, $q: ng.IQService, baseUrl?: string) { -{% if HasBaseClass -%} +{%- if HasBaseClass -%} super({% if HasConfigurationClass %}configuration{% endif %}); -{% endif -%} +{%- endif -%} this.http = $http; this.q = $q; -{% if UseGetBaseUrlMethod -%} +{%- if UseGetBaseUrlMethod -%} this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : this.getBaseUrl("{{ BaseUrl }}"); -{% else -%} +{%- else -%} this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "{{ BaseUrl }}"; -{% endif -%} +{%- endif -%} } -{% endif -%} +{%- endif -%} {% if HasExtensionCode -%} {{ ExtensionCode }} -{% endif -%} -{% for operation in Operations -%} +{%- endif -%} +{% for operation in Operations %} {% template Client.Method.Documentation %} {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false %}, {% endif %}{% endfor %}): ng.IPromise<{{ operation.ResultType }}> { @@ -52,7 +52,7 @@ {% endif -%} transformResponse: [], headers: { -{% for parameter in operation.HeaderParameters -%} +{%- for parameter in operation.HeaderParameters -%} "{{ parameter.Name }}": {{ parameter.VariableName }} !== undefined && {{ parameter.VariableName }} !== null ? "" + {{ parameter.VariableName }} : "", {% endfor -%} {% if operation.HasContent or operation.ConsumesFormUrlEncoded -%} @@ -94,4 +94,4 @@ } {% endfor -%} } -{% endif -%} +{%- endif -%} diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/AxiosClient.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/AxiosClient.liquid index b8455e6cec..1bac043121 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/AxiosClient.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/AxiosClient.liquid @@ -5,31 +5,31 @@ {% template Client.Method.Documentation %} {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false %}, {% endif %}{% endfor %}): Promise<{{ operation.ResultType }}>; {% endfor -%}} -{% endif -%} +{%- endif %} {% if ExportTypes %}export {% endif %}class {{ Class }} {% if HasBaseClass %}extends {{ BaseClass }} {% endif %}{% if GenerateClientInterfaces %}implements I{{ Class }} {% endif %}{ private instance: AxiosInstance; private baseUrl: string; protected jsonParseReviver: {% if SupportsStrictNullChecks %}((key: string, value: any) => any) | undefined{% else %}(key: string, value: any) => any{% endif %} = undefined; -{% if HasExtendedConstructor == false -%} +{%- if HasExtendedConstructor == false %} constructor({% if HasConfigurationClass %}configuration: {{ ConfigurationClass }}, {% endif %}baseUrl?: string, instance?: AxiosInstance) { -{% if HasBaseClass -%} +{%- if HasBaseClass %} super({% if HasConfigurationClass %}configuration{% endif %}); -{% endif -%} +{%- endif %} this.instance = instance ? instance : axios.create(); -{% if UseGetBaseUrlMethod -%} +{%- if UseGetBaseUrlMethod %} this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : this.getBaseUrl("{{ BaseUrl }}"); -{% else -%} +{%- else %} this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "{{ BaseUrl }}"; -{% endif -%} +{%- endif %} } -{% endif -%} +{%- endif %} {% if HasExtensionCode -%} {{ ExtensionCode }} -{% endif -%} -{% for operation in Operations -%} +{%- endif %} +{% for operation in Operations %} {% template Client.Method.Documentation %} {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false %}, {% endif %}{% endfor %} {% if operation.Parameters.size > 0 %},{%endif%} cancelToken?: CancelToken | undefined): Promise<{{ operation.ResultType }}> { @@ -89,4 +89,4 @@ } {% endfor -%} } -{% endif -%} +{%- endif %} diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.Method.Documentation.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.Method.Documentation.liquid index 4c25851e79..2756d01c1f 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.Method.Documentation.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.Method.Documentation.liquid @@ -15,4 +15,4 @@ * @deprecated {% endif -%} */ -{% endif -%} \ No newline at end of file +{%- endif %} \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.HandleStatusCode.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.HandleStatusCode.liquid index deb24b0872..716311358f 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.HandleStatusCode.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.HandleStatusCode.liquid @@ -1,7 +1,7 @@ {% if operation.CanRequestBlobs and response.IsFile -%} {% if Framework.IsAngularJS -%} const contentDisposition = response.headers ? response.headers("content-disposition") : undefined; -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} const contentDisposition = response.headers ? response.headers["content-disposition"] : undefined; {% else -%} const contentDisposition = response.headers ? response.headers.get("content-disposition") : undefined; @@ -11,9 +11,9 @@ const fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : {% if operation.WrapResponse -%} {% if Framework.IsAngular -%} return {{ Framework.RxJs.ObservableOfMethod }}(new {{ operation.ResponseClass }}(status, _headers, { fileName: fileName, data: {% if Framework.Angular.UseHttpClient %}responseBlob{% else %}response.blob(){% endif %}, status: status, headers: _headers })); -{% elseif Framework.IsAngularJS -%} +{% elsif Framework.IsAngularJS -%} return this.q.resolve(new {{ operation.ResponseClass }}(status, _headers, { fileName: fileName, status: status, data: new Blob([response.data]), headers: _headers })); -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} return Promise.resolve<{{ operation.ResultType }}>(new {{ operation.ResponseClass }}(status, _headers, { fileName: fileName, status: status, data: new Blob([response.data]), headers: _headers })); {% else -%} return response.blob().then(blob => { return new {{ operation.ResponseClass }}(status, _headers, { fileName: fileName, data: blob, status: status, headers: _headers }); }); @@ -21,9 +21,9 @@ return response.blob().then(blob => { return new {{ operation.ResponseClass }}(s {% else -%} {% if Framework.IsAngular -%} return {{ Framework.RxJs.ObservableOfMethod }}({ fileName: fileName, data: {% if Framework.Angular.UseHttpClient %}responseBlob{% else %}response.blob(){% endif %}, status: status, headers: _headers }); -{% elseif Framework.IsAngularJS -%} +{% elsif Framework.IsAngularJS -%} return this.q.resolve({ fileName: fileName, status: status, data: new Blob([response.data]), headers: _headers }); -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} return Promise.resolve({ fileName: fileName, status: status, data: response.data as Blob, headers: _headers }); {% else -%} return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; }); @@ -52,9 +52,9 @@ result{{ response.StatusCode }} = _responseText === "" ? null : <{{ response.Typ {% if operation.WrapResponse -%} {% if Framework.IsAngular -%} return {{ Framework.RxJs.ObservableOfMethod }}(new {{ operation.ResponseClass }}(status, _headers, result{{ response.StatusCode }})); -{% elseif Framework.IsAngularJS -%} +{% elsif Framework.IsAngularJS -%} return this.q.resolve(new {{ operation.ResponseClass }}(status, _headers, result{{ response.StatusCode }})); -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} return Promise.resolve<{{ operation.ResultType }}>(new {{ operation.ResultType }}(status, _headers, result{{ response.StatusCode }})); {% else -%} return new {{ operation.ResponseClass }}(status, _headers, result{{ response.StatusCode }}); @@ -62,9 +62,9 @@ return new {{ operation.ResponseClass }}(status, _headers, result{{ response.Sta {% else -%} {% if Framework.IsAngular -%} return {{ Framework.RxJs.ObservableOfMethod }}(result{{ response.StatusCode }}); -{% elseif Framework.IsAngularJS -%} +{% elsif Framework.IsAngularJS -%} return this.q.resolve(result{{ response.StatusCode }}); -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} return Promise.resolve<{{ operation.ResultType }}>(result{{ response.StatusCode }}); {% else -%} return result{{ response.StatusCode }}; @@ -73,13 +73,13 @@ return result{{ response.StatusCode }}; {% else -%} return throwException({% if Framework.IsAngularJS %}this.q, {% endif %}"{{ response.ExceptionDescription }}", status, _responseText, _headers, result{{ response.StatusCode }}); {% endif -%} -{% elseif response.IsSuccess -%} +{% elsif response.IsSuccess -%} {% if operation.WrapResponse -%} {% if Framework.IsAngular -%} return {{ Framework.RxJs.ObservableOfMethod }}<{{ operation.ResultType }}>(new {{ operation.ResponseClass }}(status, _headers, null)); -{% elseif Framework.IsAngularJS -%} +{% elsif Framework.IsAngularJS -%} return this.q.resolve<{{ operation.ResultType }}>(new {{ operation.ResponseClass }}(status, _headers, null)); -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} return Promise.resolve<{{ operation.ResultType }}>(new {{ operation.ResultType }}(status, _headers, null)); {% else -%} return new {{ operation.ResponseClass }}(status, _headers, null); @@ -87,9 +87,9 @@ return new {{ operation.ResponseClass }}(status, _headers, null); {% else -%} {% if Framework.IsAngular -%} return {{ Framework.RxJs.ObservableOfMethod }}<{{ operation.ResultType }}>(null); -{% elseif Framework.IsAngularJS -%} +{% elsif Framework.IsAngularJS -%} return this.q.resolve<{{ operation.ResultType }}>(null); -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} return Promise.resolve<{{ operation.ResultType }}>(null); {% else -%} return{% if operation.HasResultType %} null{% endif %}; diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadBodyEnd.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadBodyEnd.liquid index 6c743c8e42..ef0d8793f0 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadBodyEnd.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadBodyEnd.liquid @@ -1,7 +1,8 @@ {% if Framework.IsFetchOrAurelia or operation.RequestAngularBlobs or Framework.Angular.UseHttpClient or operation.RequestAngularJSBlobs -%} -{% if Framework.IsAngular and Framework.UseRxJs6 and (Framework.Angular.UseHttpClient or operation.RequestAngularBlobs) -%} +{%- assign condition_temp = Framework.Angular.UseHttpClient or operation.RequestAngularBlobs %} +{% if Framework.IsAngular and Framework.UseRxJs6 and condition_temp -%} })); {% else -%} }); {% endif -%} -{% endif -%} +{%- endif %} diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadBodyStart.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadBodyStart.liquid index e48951a63f..c72374c0c2 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadBodyStart.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadBodyStart.liquid @@ -1,24 +1,24 @@ {% if Framework.IsFetchOrAurelia -%} return response.text().then((_responseText) => { -{% elseif Framework.Angular.UseHttpClient -%} +{% elsif Framework.Angular.UseHttpClient -%} {% if Framework.UseRxJs6 -%} return blobToText(responseBlob).pipe({{ Framework.RxJs.ObservableMergeMapMethod }}({{ Framework.RxJs.ResponseTextProperty }} => { {% else -%} return blobToText(responseBlob).flatMap({{ Framework.RxJs.ResponseTextProperty }} => { {% endif -%} -{% elseif operation.RequestAngularBlobs -%} +{% elsif operation.RequestAngularBlobs -%} {% if Framework.UseRxJs6 -%} return blobToText(response.blob()).pipe({{ Framework.RxJs.ObservableMergeMapMethod }}({{ Framework.RxJs.ResponseTextProperty }} => { {% else -%} return blobToText(response.blob()).flatMap({{ Framework.RxJs.ResponseTextProperty }} => { {% endif -%} -{% elseif operation.RequestAngularJSBlobs -%} +{% elsif operation.RequestAngularJSBlobs -%} return blobToText(new Blob([response.data]), this.q).then({{ Framework.RxJs.ResponseTextProperty }} => { -{% elseif Framework.IsAngular -%} +{% elsif Framework.IsAngular -%} const _responseText = response.text(); -{% elseif Framework.IsAngularJS -%} +{% elsif Framework.IsAngularJS -%} const _responseText = response.data; -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} const _responseText = response.data; {% else -%} const _responseText = xhr.responseText; diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadHeaders.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadHeaders.liquid index 523545f12d..eb40f398f3 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadHeaders.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.ReadHeaders.liquid @@ -4,9 +4,9 @@ let _headers: any = {}; if (response.headers) { for (let key of response.headers {% else -%} let _headers: any = response.headers ? response.headers.toJSON() : {}; {% endif -%} -{% elseif Framework.IsFetchOrAurelia -%} +{% elsif Framework.IsFetchOrAurelia -%} let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} let _headers: any = {}; if (response.headers && typeof response.headers === "object") { for (let k in response.headers) { @@ -15,6 +15,6 @@ if (response.headers && typeof response.headers === "object") { } } } -{% else -%} +{%- else -%} let _headers: any = {}; -{% endif -%} \ No newline at end of file +{%- endif -%} \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.Return.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.Return.liquid index 6199f4ba37..661dbc6310 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.Return.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.Return.liquid @@ -4,19 +4,19 @@ return Promise.resolve<{{ operation.ResultType }}>(new {{ operation.ResponseClas {% else -%} return Promise.resolve<{{ operation.ResultType }}>(null); {% endif -%} -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} {% if operation.WrapResponse -%} return Promise.resolve<{{ operation.ResultType }}>(new {{ operation.ResponseClass }}(status, _headers, null)); {% else -%} return Promise.resolve<{{ operation.ResultType }}>(null); {% endif -%} -{% elseif Framework.IsAngular -%} +{% elsif Framework.IsAngular -%} {% if operation.WrapResponse -%} return {{ Framework.RxJs.ObservableOfMethod }}<{{ operation.ResultType }}>(new {{ operation.ResponseClass }}(status, _headers, null)); {% else -%} return {{ Framework.RxJs.ObservableOfMethod }}<{{ operation.ResultType }}>(null); {% endif -%} -{% elseif Framework.IsAngularJS -%} +{% elsif Framework.IsAngularJS -%} {% if operation.WrapResponse -%} return this.q.resolve<{{ operation.ResultType }}>(new {{ operation.ResponseClass }}(status, _headers, null)); {% else -%} @@ -28,4 +28,4 @@ return new {{ operation.ResponseClass }}(status, _headers, null); {% else -%} return{% if operation.HasResultType %} null{% endif %}; {% endif -%} -{% endif -%} +{%- endif -%} \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.liquid index 0862627a79..cd0c82b2fd 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.ProcessResponse.liquid @@ -8,14 +8,13 @@ if (status === {{ response.StatusCode }}{% if response.CheckChunkedStatusCode %} } else {% endfor -%} {% if operation.HasDefaultResponse -%} { -{% assign response = operation.DefaultResponse -%} +{%- assign response = operation.DefaultResponse -%} {% template Client.ProcessResponse.HandleStatusCode %} } -{% else -%} -if (status !== 200 && status !== 204) { +{%- else %}if (status !== 200 && status !== 204) { {% template Client.ProcessResponse.ReadBodyStart %} return throwException({% if Framework.IsAngularJS %}this.q, {% endif %}"An unexpected server error occurred.", status, _responseText, _headers); {% template Client.ProcessResponse.ReadBodyEnd %} } -{% template Client.ProcessResponse.Return %} +{% template Client.ProcessResponse.Return -%} {% endif -%} \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.RequestBody.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.RequestBody.liquid index 82fcece8bc..be64a59c97 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.RequestBody.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.RequestBody.liquid @@ -1,29 +1,29 @@ -{% if operation.HasFormParameters -%} -{% if operation.ConsumesFormUrlEncoded -%} +{%- if operation.HasFormParameters -%} +{%- if operation.ConsumesFormUrlEncoded -%} let content_ = ""; -{% for parameter in operation.FormParameters -%} -{% if parameter.IsRequired -%} -{% if parameter.IsNullable -%} +{%- for parameter in operation.FormParameters -%} +{%- if parameter.IsRequired -%} +{%- if parameter.IsNullable -%} if ({{ parameter.VariableName }} === undefined) throw new Error("The parameter '{{ parameter.VariableName }}' must be defined."); else -{% else -%} +{%- else -%} if ({{ parameter.VariableName }} === undefined || {{ parameter.VariableName }} === null) throw new Error("The parameter '{{ parameter.VariableName }}' must be defined and cannot be null."); else -{% endif -%} -{% else -%} -{% if parameter.IsNullable -%} +{%- endif -%} +{%- else -%} +{%- if parameter.IsNullable -%} if ({{ parameter.VariableName }} !== undefined) -{% else -%} +{%- else -%} if ({{ parameter.VariableName }} === null) throw new Error("The parameter '{{ parameter.VariableName }}' cannot be null."); else if ({{ parameter.VariableName }} !== undefined) -{% endif -%} -{% endif -%} -{% if parameter.IsDateOrDateTimeArray -%} +{%- endif -%} +{%- endif -%} +{%- if parameter.IsDateOrDateTimeArray -%} {{ parameter.VariableName }} && {{ parameter.VariableName }}.forEach(item_ => { content_ += encodeURIComponent("{{ parameter.Name }}") + "=" + encodeURIComponent(item_ ? "" + item_.toJSON() : "null") + "&"; }); -{% elseif parameter.IsObjectArray -%} +{%- elsif parameter.IsObjectArray -%} {{ parameter.VariableName }} && {{ parameter.VariableName }}.forEach((item_, index_) => { for (let attr_ in item_) { if (item_.hasOwnProperty(attr_)) { @@ -31,57 +31,57 @@ else if ({{ parameter.VariableName }} !== undefined) } } }); -{% elseif parameter.IsDateOrDateTime -%} +{%- elsif parameter.IsDateOrDateTime -%} content_ += encodeURIComponent("{{ parameter.Name }}") + "=" + encodeURIComponent({{ parameter.VariableName }} ? "" + {{ parameter.VariableName }}.toJSON() : "{{ QueryNullValue }}") + "&"; -{% elseif parameter.IsArray -%} +{%- elsif parameter.IsArray -%} {{ parameter.VariableName }} && {{ parameter.VariableName }}.forEach(item => { content_ += encodeURIComponent("{{ parameter.Name }}") + "=" + encodeURIComponent("" + item) + "&"; }); -{% else -%} +{%- else -%} content_ += encodeURIComponent("{{ parameter.Name }}") + "=" + encodeURIComponent("" + {{ parameter.VariableName }}) + "&"; -{% endif -%} -{% endfor -%} +{%- endif -%} +{%- endfor -%} content_ = content_.replace(/&$/, ""); -{% else -%} +{%- else -%} const content_ = new FormData(); {% for parameter in operation.FormParameters -%} -{% if parameter.IsNullable -%} +{%- if parameter.IsNullable -%} if ({{ parameter.VariableName }} !== null && {{ parameter.VariableName }} !== undefined) -{% else -%} +{%- else -%} if ({{ parameter.VariableName }} === null || {{ parameter.VariableName }} === undefined) throw new Error("The parameter '{{ parameter.VariableName }}' cannot be null."); else -{% endif -%} -{% if parameter.IsFile -%} -{% if parameter.IsArray -%} +{%- endif -%} +{%- if parameter.IsFile -%} +{%- if parameter.IsArray -%} {{ parameter.VariableName }}.forEach(item_ => content_.append("{{ parameter.Name }}", item_.data, item_.fileName ? item_.fileName : "{{ parameter.Name }}") ); -{% else -%} +{%- else -%} content_.append("{{ parameter.Name }}", {{ parameter.VariableName }}.data, {{ parameter.VariableName }}.fileName ? {{ parameter.VariableName }}.fileName : "{{ parameter.Name }}"); -{% endif -%} -{% elseif parameter.IsDateOrDateTime -%} +{%- endif -%} +{%- elsif parameter.IsDateOrDateTime -%} content_.append("{{ parameter.Name }}", {{ parameter.VariableName }}.toJSON()); -{% elseif parameter.IsObject -%} +{%- elsif parameter.IsObject -%} content_.append("{{ parameter.Name }}", JSON.stringify({{ parameter.VariableName }})); -{% elseif parameter.IsArray -%} +{%- elsif parameter.IsArray -%} {{ parameter.VariableName }}.forEach(item_ => content_.append("{{ parameter.Name }}", item_.toString())); -{% else -%} +{%- else -%} content_.append("{{ parameter.Name }}", {{ parameter.VariableName }}.toString()); -{% endif -%} -{% endfor -%} -{% endif -%} -{% else -%} -{% if operation.HasContent -%} -{% if operation.HasBinaryBodyParameter -%} +{%- endif -%} +{%- endfor -%} +{%- endif -%} +{%- else -%} +{%- if operation.HasContent -%} +{%- if operation.HasBinaryBodyParameter -%} const content_ = {{ operation.ContentParameter.VariableName }}; -{% elseif operation.HasXmlBodyParameter -%} +{%- elsif operation.HasXmlBodyParameter -%} const content_ = {{ operation.ContentParameter.VariableName }}; -{% elseif operation.Consumes == "application/x-www-form-urlencoded" -%} +{% elsif operation.Consumes == "application/x-www-form-urlencoded" -%} const content_ = Object.keys({{ operation.ContentParameter.VariableName }} as any).map((key) => { return encodeURIComponent(key) + '=' + encodeURIComponent(({{ operation.ContentParameter.VariableName }} as any)[key]); }).join('&') -{% else -%} +{%- else -%} const content_ = JSON.stringify({{ operation.ContentParameter.VariableName }}); -{% endif -%} -{% else -%} +{%- endif -%} +{%- else -%} const content_ = undefined; -{% endif -%} -{% endif -%} \ No newline at end of file +{%- endif -%} +{%- endif -%} diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.RequestUrl.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.RequestUrl.liquid index 7fbe7135b8..5363775df2 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/Client.RequestUrl.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/Client.RequestUrl.liquid @@ -1,60 +1,60 @@ let url_ = this.baseUrl + "/{{ operation.Path }}{% if operation.HasQueryParameters %}?{% endif %}"; {% for parameter in operation.PathParameters -%} -{% if parameter.IsRequired -%} +{% if parameter.IsRequired -%} if ({{ parameter.VariableName }} === undefined || {{ parameter.VariableName }} === null) throw new Error("The parameter '{{ parameter.VariableName }}' must be defined."); -{% else -%} +{% else -%} if ({{ parameter.VariableName }} !== null && {{ parameter.VariableName }} !== undefined) -{% endif -%} -{% if parameter.IsDateOrDateTimeArray -%} +{% endif -%} +{% if parameter.IsDateOrDateTimeArray -%} url_ = url_.replace("{{ "{" }}{{ parameter.Name }}}", encodeURIComponent({{ parameter.VariableName }}.map(s_ => s_ ? s_.{{ parameter.GetDateTimeToString }} : "null").join())); -{% elseif parameter.IsDateOrDateTime -%} +{% elsif parameter.IsDateOrDateTime -%} url_ = url_.replace("{{ "{" }}{{ parameter.Name }}}", encodeURIComponent({{ parameter.VariableName }} ? "" + {{ parameter.VariableName }}.{{ parameter.GetDateTimeToString }} : "null")); -{% elseif parameter.IsArray -%} +{% elsif parameter.IsArray -%} url_ = url_.replace("{{ "{" }}{{ parameter.Name }}}", encodeURIComponent({{ parameter.VariableName }}.join())); -{% else -%} +{% else -%} url_ = url_.replace("{{ "{" }}{{ parameter.Name }}}", encodeURIComponent("" + {{ parameter.VariableName }})); -{% endif -%} -{% if parameter.IsOptional -%} +{% endif -%} +{% if parameter.IsOptional -%} else url_ = url_.replace("/{{ "{" }}{{ parameter.Name }}}", ""); -{% endif -%} +{% endif -%} {% endfor -%} {% for parameter in operation.QueryParameters -%} -{% if parameter.IsRequired -%} -{% if parameter.IsNullable -%} +{% if parameter.IsRequired -%} +{% if parameter.IsNullable -%} if ({{ parameter.VariableName }} === undefined) throw new Error("The parameter '{{ parameter.VariableName }}' must be defined."); else if({{ parameter.VariableName }} !== null) -{% else -%} +{% else -%} if ({{ parameter.VariableName }} === undefined || {{ parameter.VariableName }} === null) throw new Error("The parameter '{{ parameter.VariableName }}' must be defined and cannot be null."); else -{% endif -%} -{% else -%} -{% if parameter.IsNullable -%} +{% endif -%} +{% else -%} +{% if parameter.IsNullable -%} if ({{ parameter.VariableName }} !== undefined && {{ parameter.VariableName }} !== null) -{% else -%} +{% else -%} if ({{ parameter.VariableName }} === null) throw new Error("The parameter '{{ parameter.VariableName }}' cannot be null."); else if ({{ parameter.VariableName }} !== undefined) -{% endif -%} -{% endif -%} -{% if parameter.IsDateOrDateTimeArray -%} +{% endif -%} +{% endif -%} +{% if parameter.IsDateOrDateTimeArray -%} {{ parameter.VariableName }} && {{ parameter.VariableName }}.forEach(item_ => { url_ += "{{ parameter.Name }}=" + encodeURIComponent(item_ ? "" + item_.toJSON() : "null") + "&"; }); -{% elseif parameter.IsObjectArray -%} +{% elsif parameter.IsObjectArray -%} {{ parameter.VariableName }} && {{ parameter.VariableName }}.forEach((item, index) => { for (let attr in item) if (item.hasOwnProperty(attr)) { url_ += "{{ parameter.Name }}[" + index + "]." + attr + "=" + encodeURIComponent("" + (item)[attr]) + "&"; } }); -{% elseif parameter.IsDateOrDateTime -%} - url_ += "{{ parameter.Name }}=" + encodeURIComponent({{ parameter.VariableName }} ? "" + {{ parameter.VariableName }}.{{ parameter.GetDateTimeToString }} : "{{ QueryNullValue }}") + "&"; -{% elseif parameter.IsArray -%} +{% elsif parameter.IsDateOrDateTime -%} + url_ += "{{ parameter.Name }}=" + encodeURIComponent({{ parameter.VariableName }} ? "" + {{ parameter.VariableName }}.toJSON() : "{{ QueryNullValue }}") + "&"; +{% elsif parameter.IsArray -%} {{ parameter.VariableName }} && {{ parameter.VariableName }}.forEach(item => { url_ += "{{ parameter.Name }}=" + encodeURIComponent("" + item) + "&"; }); -{% else -%} +{% else -%} url_ += "{{ parameter.Name }}=" + encodeURIComponent("" + {{ parameter.VariableName }}) + "&"; -{% endif -%} +{% endif -%} {% endfor -%} -url_ = url_.replace(/[?&]$/, ""); +url_ = url_.replace(/[?&]$/, ""); \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/FetchClient.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/FetchClient.liquid index 3f9a8fe638..7c4fb757b3 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/FetchClient.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/FetchClient.liquid @@ -1,80 +1,81 @@ {% if HasOperations -%} {% if GenerateClientInterfaces -%} {% if ExportTypes %}export {% endif %}interface I{{ Class }} { -{% for operation in Operations -%} +{% for operation in Operations %} + {% template Client.Method.Documentation %} {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false %}, {% endif %}{% endfor %}): Promise<{{ operation.ResultType }}>; -{% endfor -%}} -{% endif -%} +{%- endfor %}} +{%- endif -%} {% if UseAureliaHttpInjection -%} @inject({% if HasConfigurationClass %}{{ ConfigurationClass }}, {% endif %}String, HttpClient) -{% endif -%} +{%- endif -%} {% if ExportTypes %}export {% endif %}class {{ Class }} {% if HasBaseClass %}extends {{ BaseClass }} {% endif %}{% if GenerateClientInterfaces %}implements I{{ Class }} {% endif %}{ private http: { fetch(url: RequestInfo, init?: RequestInit): Promise }; private baseUrl: string; protected jsonParseReviver: {% if SupportsStrictNullChecks %}((key: string, value: any) => any) | undefined{% else %}(key: string, value: any) => any{% endif %} = undefined; - -{% if HasExtendedConstructor == false -%} +{{ '' }} +{%- if HasExtendedConstructor == false -%} constructor({% if HasConfigurationClass %}configuration: {{ ConfigurationClass }}, {% endif %}baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) { -{% if HasBaseClass -%} +{%- if HasBaseClass -%} super({% if HasConfigurationClass %}configuration{% endif %}); -{% endif -%} +{%- endif -%} this.http = http ? http : window; -{% if UseGetBaseUrlMethod -%} +{%- if UseGetBaseUrlMethod -%} this.baseUrl = this.getBaseUrl("{{ BaseUrl }}", baseUrl); -{% else -%} +{%- else -%} this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "{{ BaseUrl }}"; -{% endif -%} +{%- endif -%} } -{% endif -%} -{% if HasExtensionCode -%} +{%- endif -%} +{%- if HasExtensionCode -%} {{ ExtensionCode }} -{% endif -%} -{% for operation in Operations -%} +{%- endif -%} +{% for operation in Operations %} {% template Client.Method.Documentation %} {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false %}, {% endif %}{% endfor %}{% if UseAbortSignal %}{% if operation.Parameters.size > 0 %}, {% endif %}signal?: AbortSignal | undefined{% endif %}): Promise<{{ operation.ResultType }}> { {% template Client.RequestUrl %} -{% if operation.HasBody -%} +{%- if operation.HasBody -%} {% template Client.RequestBody %} -{% endif -%} +{%- endif -%} let options_ = { -{% if operation.HasBody -%} +{%- if operation.HasBody -%} body: content_, -{% endif -%} +{%- endif -%} method: "{{ operation.HttpMethodUpper | upcase }}", -{% if UseAbortSignal -%} +{%- if UseAbortSignal -%} signal, -{% endif -%} +{%- endif -%} headers: { -{% for parameter in operation.HeaderParameters -%} +{%- for parameter in operation.HeaderParameters -%} "{{ parameter.Name }}": {{ parameter.VariableName }} !== undefined && {{ parameter.VariableName }} !== null ? "" + {{ parameter.VariableName }} : "", -{% endfor -%} -{% if operation.HasContent or operation.ConsumesFormUrlEncoded -%} +{%- endfor -%} +{%- if operation.HasContent or operation.ConsumesFormUrlEncoded -%} "Content-Type": "{{ operation.Consumes }}", -{% endif -%} -{% if operation.HasResultType and operation.HasAcceptHeaderParameterParameter == false -%} +{%- endif -%} +{%- if operation.HasResultType and operation.HasAcceptHeaderParameterParameter == false -%} "Accept": "{{ operation.Produces }}" -{% endif -%} +{%- endif -%} } }; -{% if UseTransformOptionsMethod -%} +{%- if UseTransformOptionsMethod -%} return this.transformOptions(options_).then(transformedOptions_ => { return this.http.fetch(url_, transformedOptions_); }).then((_response: Response) => { -{% else -%} +{%- else -%} return this.http.fetch(url_, options_).then((_response: Response) => { -{% endif -%} -{% if UseTransformResultMethod -%} +{%- endif -%} +{%- if UseTransformResultMethod -%} return this.transformResult(url_, _response, (_response: Response) => this.process{{ operation.ActualOperationNameUpper }}(_response)); -{% else -%} +{%- else -%} return this.process{{ operation.ActualOperationNameUpper }}(_response); -{% endif -%} +{%- endif -%} }); } @@ -84,4 +85,4 @@ } {% endfor -%} } -{% endif -%} +{%- endif -%} diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/File.Utilities.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/File.Utilities.liquid index f8e8bc8727..14f8a8377d 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/File.Utilities.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/File.Utilities.liquid @@ -3,7 +3,7 @@ function throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): Observable { {% if WrapDtoExceptions -%} return {{ Framework.RxJs.ObservableThrowMethod }}(new {{ ExceptionClassName }}(message, status, response, headers, result)); -{% else -%} +{%- else -%} if (result !== null && result !== undefined) return {{ Framework.RxJs.ObservableThrowMethod }}(result); else @@ -11,11 +11,11 @@ function throwException(message: string, status: number, response: string, heade {% endif -%} } -{% elseif Framework.IsAngularJS -%} +{% elsif Framework.IsAngularJS -%} function throwException(q: ng.IQService, message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): ng.IPromise { {% if WrapDtoExceptions -%} return q.reject(new {{ ExceptionClassName }}(message, status, response, headers, result)); -{% else -%} +{%- else -%} if (result !== null && result !== undefined) return q.reject(result); else @@ -27,7 +27,7 @@ function throwException(q: ng.IQService, message: string, status: number, respon function throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any { {% if WrapDtoExceptions -%} throw new {{ ExceptionClassName }}(message, status, response, headers, result); -{% else -%} +{%- else -%} if (result !== null && result !== undefined) throw result; else @@ -35,7 +35,7 @@ function throwException(message: string, status: number, response: string, heade {% endif -%} } -{% endif -%} +{%- endif -%} {% if Framework.IsAngular -%} function blobToText(blob: any): Observable { return new Observable((observer: any) => { @@ -53,7 +53,7 @@ function blobToText(blob: any): Observable { }); } -{% elseif Framework.IsAngularJS -%} +{% elsif Framework.IsAngularJS -%} function blobToText(blob: Blob, q: ng.IQService): ng.IPromise { return new q((resolve) => { let reader = new FileReader(); @@ -62,7 +62,7 @@ function blobToText(blob: Blob, q: ng.IQService): ng.IPromise { }); } -{% elseif Framework.IsAxios -%} +{% elsif Framework.IsAxios -%} function isAxiosError(obj: any | undefined): obj is AxiosError { return obj && obj.isAxiosError === true; } diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/File.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/File.liquid index 19bc7ab946..51a199dc8d 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/File.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/File.liquid @@ -12,10 +12,10 @@ {{ ExtensionCodeImport -}} {% if ImportRequiredTypes -%} -{% if GenerateClientClasses -%} -{% if Framework.IsAngular -%} +{%- if GenerateClientClasses -%} +{%- if Framework.IsAngular -%} -{% if Framework.UseRxJs5 -%} +{%- if Framework.UseRxJs5 -%} import 'rxjs/add/observable/fromPromise'; import 'rxjs/add/observable/of'; import 'rxjs/add/observable/throw'; @@ -25,66 +25,66 @@ import 'rxjs/add/operator/mergeMap'; import 'rxjs/add/operator/catch'; import { Observable } from 'rxjs/Observable'; -{% else -%} +{%- else -%} import { mergeMap as {{ Framework.RxJs.ObservableMergeMapMethod }}, catchError as {{ Framework.RxJs.ObservableCatchMethod }} } from 'rxjs/operators'; import { Observable, {% if UseTransformOptionsMethod %}from as {{ Framework.RxJs.ObservableFromMethod }}, {% endif %}throwError as {{ Framework.RxJs.ObservableThrowMethod }}, of as {{ Framework.RxJs.ObservableOfMethod }} } from 'rxjs'; -{% endif -%} +{%- endif -%} import { Injectable, Inject, Optional, {{ Framework.Angular.InjectionTokenType }} } from '@angular/core'; -{% if Framework.Angular.UseHttpClient -%} +{%- if Framework.Angular.UseHttpClient -%} import { HttpClient, HttpHeaders, HttpResponse, HttpResponseBase{% if IncludeHttpContext %}, HttpContext{% endif %} } from '@angular/common/http'; -{% else -%} +{%- else -%} import { Http, Headers, ResponseContentType, Response{% if UseTransformOptionsMethod %}, RequestOptionsArgs{% endif %} } from '@angular/http'; -{% endif -%} -{% endif -%} -{% if Framework.IsAurelia -%} +{%- endif -%} +{%- endif -%} +{%- if Framework.IsAurelia -%} import { inject } from 'aurelia-framework'; import { HttpClient, RequestInit } from 'aurelia-fetch-client'; -{% endif -%} -{% if Framework.IsAngularJS -%} +{%- endif -%} +{%- if Framework.IsAngularJS -%} import * as ng from 'angular'; -{% endif -%} -{% if Framework.IsAxios -%} +{%- endif -%} +{%- if Framework.IsAxios -%} import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, CancelToken } from 'axios'; -{% endif -%} -{% if Framework.IsKnockout -%} +{%- endif -%} +{%- if Framework.IsKnockout -%} import * as ko from 'knockout'; -{% endif -%} -{% if Framework.IsJQuery -%} +{%- endif -%} +{%- if Framework.IsJQuery -%} import * as jQuery from 'jquery'; -{% endif -%} -{% endif -%} -{% if Framework.UseMomentJS -%} +{%- endif -%} +{%- endif -%} +{%- if Framework.UseMomentJS -%} import * as moment from 'moment'; -{% if RequiresMomentJSDuration -%} +{%- if RequiresMomentJSDuration -%} import 'moment-duration-format'; -{% endif -%} -{% endif -%} -{% if Framework.UseDayJS -%} +{%- endif -%} +{%- endif -%} +{%- if Framework.UseDayJS -%} import * as dayjs from 'dayjs'; -{% endif -%} -{% if Framework.UseLuxon -%} +{%- endif -%} +{%- if Framework.UseLuxon -%} import { DateTime, Duration } from "luxon"; -{% endif -%} -{% endif -%} +{%- endif -%} +{%- endif -%} {% if HasModuleName -%} {% if ExportTypes %}export {% endif %}module {{ ModuleName }} { -{% endif -%} +{%- endif -%} {% if HasNamespace -%} namespace {{ Namespace }} { -{% endif -%} +{%- endif -%} {% if GenerateClientClasses and Framework.IsAngular -%} {% if ExportTypes %}export {% endif %}const {{ Framework.Angular.BaseUrlTokenName }} = new {{ Framework.Angular.InjectionTokenType }}{% if Framework.Angular.InjectionTokenType == "InjectionToken" %}{% endif %}('{{ Framework.Angular.BaseUrlTokenName }}'); -{% endif -%} +{%- endif -%} {{ ExtensionCodeTop }} {{ Clients }} @@ -92,7 +92,7 @@ namespace {{ Namespace }} { {{ Types }} {% if WrapResponses and GenerateResponseClasses -%} -{% for responseClassName in ResponseClassNames -%} +{%- for responseClassName in ResponseClassNames -%} {% if ExportTypes %}export {% endif %}class {{ responseClassName }} { status: number; headers: { [key: string]: any; }; @@ -106,15 +106,15 @@ namespace {{ Namespace }} { } } -{% endfor -%} -{% endif -%} +{%- endfor -%} +{%- endif -%} {% if RequiresFileParameterInterface -%} {% if ExportTypes %}export {% endif %}interface FileParameter { data: any; fileName: string; } -{% endif -%} +{%- endif -%} {% if RequiresFileResponseInterface -%} {% if ExportTypes %}export {% endif %}interface FileResponse { data: Blob; @@ -123,7 +123,7 @@ namespace {{ Namespace }} { headers?: { [name: string]: any }; } -{% endif -%} +{%- endif -%} {% if RequiresExceptionClass -%} {% if ExportTypes %}export {% endif %}class {{ ExceptionClassName }} extends Error { message: string; @@ -149,15 +149,15 @@ namespace {{ Namespace }} { } } -{% endif -%} +{%- endif -%} {% if GenerateClientClasses -%} {% template File.Utilities %} -{% endif -%} +{%- endif -%} {{ ExtensionCodeBottom }} {% if HasNamespace -%} } -{% endif -%} +{%- endif -%} {% if HasModuleName -%} } -{% endif -%} \ No newline at end of file +{%- endif -%} diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/JQueryCallbacksClient.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/JQueryCallbacksClient.liquid index 4f9a871d0d..46d484da89 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/JQueryCallbacksClient.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/JQueryCallbacksClient.liquid @@ -28,7 +28,7 @@ {{ ExtensionCode }} {% endif -%} -{% for operation in Operations -%} +{% for operation in Operations %} {% template Client.Method.Documentation %} {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}, {% endfor %}onSuccess?: ({% if operation.HasResultType %}result: {{ operation.ResultType }}{% endif %}) => void, onFail?: (exception: {{ operation.ExceptionType }}, reason: string) => void): JQueryXHR { @@ -44,21 +44,21 @@ type: "{{ operation.HttpMethodLower }}", {% if operation.HasBody -%} data: content_, -{% endif -%} -{% if operation.HasFormParameters -%} +{% endif -%} +{% if operation.HasFormParameters -%} mimeType: "multipart/form-data", contentType: false, -{% else -%} +{% else -%} dataType: "text", -{% endif -%} +{% endif -%} headers: { -{% for parameter in operation.HeaderParameters -%} +{% for parameter in operation.HeaderParameters -%} "{{ parameter.Name }}": {{ parameter.VariableName }} !== undefined && {{ parameter.VariableName }} !== null ? "" + {{ parameter.VariableName }} : "", -{% endfor -%} -{% if operation.HasContent or operation.ConsumesFormUrlEncoded -%} +{% endfor -%} +{% if operation.HasContent or operation.ConsumesFormUrlEncoded -%} "Content-Type": "{{ operation.Consumes }}", -{% endif -%} -{% if operation.HasResultType and operation.HasAcceptHeaderParameterParameter == false -%} +{% endif -%} +{% if operation.HasResultType and operation.HasAcceptHeaderParameterParameter == false -%} "Accept": "{{ operation.Produces }}" {% endif -%} } @@ -77,9 +77,9 @@ try { {% if UseTransformResultMethod -%} let result = this.transformResult(_url, xhr, (xhr) => this.process{{ operation.ActualOperationNameUpper }}(xhr)); -{% else -%} +{% else -%} let result = this.process{{ operation.ActualOperationNameUpper }}(xhr); -{% endif -%} +{% endif -%} if (onSuccess !== undefined) onSuccess(result); } catch (e) { diff --git a/src/NSwag.CodeGeneration.TypeScript/Templates/JQueryPromisesClient.liquid b/src/NSwag.CodeGeneration.TypeScript/Templates/JQueryPromisesClient.liquid index a1e8e19dd6..7823585c78 100644 --- a/src/NSwag.CodeGeneration.TypeScript/Templates/JQueryPromisesClient.liquid +++ b/src/NSwag.CodeGeneration.TypeScript/Templates/JQueryPromisesClient.liquid @@ -6,30 +6,30 @@ {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false %}, {% endif %}{% endfor %}): {{ PromiseType }}<{{ operation.ResultType }}>; {% endfor -%} } -{% endif -%} +{%- endif -%} {% if ExportTypes %}export {% endif %}class {{ Class }} {% if HasBaseClass %}extends {{ BaseClass }} {% endif %}{% if GenerateClientInterfaces %}implements I{{ Class }} {% endif %}{ baseUrl: string; beforeSend: any = undefined; protected jsonParseReviver: {% if SupportsStrictNullChecks %}((key: string, value: any) => any) | undefined{% else -%}(key: string, value: any) => any{% endif %} = undefined; -{% if HasExtendedConstructor == false -%} +{%- if HasExtendedConstructor == false -%} constructor({% if HasConfigurationClass %}configuration: {{ ConfigurationClass }}, {% endif %}baseUrl?: string) { -{% if HasBaseClass -%} +{%- if HasBaseClass -%} super({% if HasConfigurationClass %}configuration{% endif %}); -{% endif -%} -{% if UseGetBaseUrlMethod -%} +{%- endif -%} +{%- if UseGetBaseUrlMethod -%} this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : this.getBaseUrl("{{ BaseUrl }}"); -{% else -%} +{%- else -%} this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "{{ BaseUrl }}"; -{% endif -%} +{%- endif -%} } -{% endif -%} +{%- endif -%} {% if HasExtensionCode -%} {{ ExtensionCode }} -{% endif -%} -{% for operation in Operations -%} +{%- endif -%} +{% for operation in Operations %} {% template Client.Method.Documentation %} {{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false %}, {% endif %}{% endfor %}) { @@ -41,35 +41,37 @@ private {{ operation.ActualOperationName }}WithCallbacks({% for parameter in operation.Parameters %}{{ parameter.VariableName }}: {{ parameter.Type }}{{ parameter.TypePostfix }}, {% endfor %}onSuccess?: (result: {{ operation.ResultType }}) => void, onFail?: (exception: {{ operation.ExceptionType }}, reason: string) => void) { {% template Client.RequestUrl %} -{% if operation.HasBody -%} +{%- if operation.HasBody -%} {% template Client.RequestBody %} -{% endif -%} +{%- endif -%} jQuery.ajax({% if UseTransformOptionsMethod %}this.transformOptions({% endif %}{ url: url_, beforeSend: this.beforeSend, type: "{{ operation.HttpMethodLower }}", -{% if operation.HasBody -%} +{%- if operation.HasBody -%} data: content_, -{% endif -%} -{% if operation.HasFormParameters -%} +{%- endif -%} +{%- if operation.HasFormParameters -%} mimeType: "multipart/form-data", contentType: false, -{% else -%} +{%- else -%} dataType: "text", -{% endif -%} +{%- endif -%} headers: { -{% for parameter in operation.HeaderParameters -%} +{%- for parameter in operation.HeaderParameters -%} "{{ parameter.Name }}": {{ parameter.VariableName }} !== undefined && {{ parameter.VariableName }} !== null ? "" + {{ parameter.VariableName }} : "", {% endfor -%} -{% if operation.HasContent or operation.ConsumesFormUrlEncoded -%} +{%- if operation.HasContent or operation.ConsumesFormUrlEncoded -%} "Content-Type": "{{ operation.Consumes }}", -{% endif -%} -{% if operation.HasResultType and operation.HasAcceptHeaderParameterParameter == false -%} +{%- endif -%} +{%- if operation.HasResultType and operation.HasAcceptHeaderParameterParameter == false -%} "Accept": "{{ operation.Produces }}" -{% endif -%} +{%- endif -%} } - }{% if UseTransformOptionsMethod %}){% endif %}).done((_data, _textStatus, xhr) => { + }{% if UseTransformOptionsMethod -%} +){% endif -%} +).done((_data, _textStatus, xhr) => { this.process{{ operation.ActualOperationNameUpper }}WithCallbacks(url_, xhr, onSuccess, onFail); }).fail((xhr) => { this.process{{ operation.ActualOperationNameUpper }}WithCallbacks(url_, xhr, onSuccess, onFail); @@ -78,11 +80,11 @@ private process{{ operation.ActualOperationNameUpper }}WithCallbacks(_url: string, xhr: any, onSuccess?: any, onFail?: any): void { try { -{% if UseTransformResultMethod -%} +{%- if UseTransformResultMethod -%} let result = this.transformResult(_url, xhr, (xhr) => this.process{{ operation.ActualOperationNameUpper }}(xhr)); -{% else -%} +{%- else -%} let result = this.process{{ operation.ActualOperationNameUpper }}(xhr); -{% endif -%} +{%- endif -%} if (onSuccess !== undefined) onSuccess(result); } catch (e) { @@ -98,4 +100,4 @@ } {% endfor -%} } -{% endif -%} +{%- endif -%} \ No newline at end of file diff --git a/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj b/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj index 4ccb4ecd10..4609eb7aa0 100644 --- a/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj +++ b/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj @@ -1,6 +1,6 @@  - netstandard1.3;net451;netstandard2.0 + net461;netstandard2.0 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.4 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,19 +13,16 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - - - - - + + diff --git a/src/NSwag.CodeGeneration/OperationNameGenerators/MultipleClientsFromOperationIdOperationNameGenerator.cs b/src/NSwag.CodeGeneration/OperationNameGenerators/MultipleClientsFromOperationIdOperationNameGenerator.cs index a7d3df5ae7..b9eadf41d1 100644 --- a/src/NSwag.CodeGeneration/OperationNameGenerators/MultipleClientsFromOperationIdOperationNameGenerator.cs +++ b/src/NSwag.CodeGeneration/OperationNameGenerators/MultipleClientsFromOperationIdOperationNameGenerator.cs @@ -6,6 +6,8 @@ // Rico Suter, mail@rsuter.com //----------------------------------------------------------------------- +using System; +using System.Diagnostics; using System.Linq; using NJsonSchema; @@ -25,7 +27,7 @@ public class MultipleClientsFromOperationIdOperationNameGenerator : IOperationNa /// The client name. public virtual string GetClientName(OpenApiDocument document, string path, string httpMethod, OpenApiOperation operation) { - return GetClientName(operation); + return GetClientName(operation).ToString(); } /// Gets the operation name for a given operation. @@ -39,38 +41,50 @@ public virtual string GetOperationName(OpenApiDocument document, string path, st var clientName = GetClientName(operation); var operationName = GetOperationName(operation); - var hasOperationWithSameName = document.Operations - .Where(o => o.Operation != operation) - .Any(o => GetClientName(o.Operation) == clientName && GetOperationName(o.Operation) == operationName); + var hasOperationWithSameName = false; + foreach (var o in document.Operations) + { + if (o.Operation != operation) + { + if (GetClientName(o.Operation).SequenceEqual(clientName) && GetOperationName(o.Operation).SequenceEqual(operationName)) + { + hasOperationWithSameName = true; + break; + } + } + } if (hasOperationWithSameName) { - if (operationName.ToLowerInvariant().StartsWith("get")) + if (operationName.StartsWith("get".AsSpan(), StringComparison.InvariantCultureIgnoreCase)) { - var isArrayResponse = operation.ActualResponses.ContainsKey("200") && - operation.ActualResponses["200"].Schema?.ActualSchema - .Type.HasFlag(JsonObjectType.Array) == true; + var isArrayResponse = operation.ActualResponses.TryGetValue("200", out var response) && + response.Schema?.ActualSchema.Type.HasFlag(JsonObjectType.Array) == true; if (isArrayResponse) { - return "GetAll" + operationName.Substring(3); + return "GetAll" + operationName.Slice(3).ToString(); } } } - return operationName; + return operationName.ToString(); } - private string GetClientName(OpenApiOperation operation) + private static ReadOnlySpan GetClientName(OpenApiOperation operation) { - var segments = operation.OperationId.Split('_').Reverse().ToArray(); - return segments.Length >= 2 ? segments[1] : string.Empty; + var idx = operation.OperationId.IndexOf('_'); + return idx != -1 && idx < operation.OperationId.Length - 1 + ? operation.OperationId.AsSpan(0,idx) + : string.Empty.AsSpan(); } - private string GetOperationName(OpenApiOperation operation) + private static ReadOnlySpan GetOperationName(OpenApiOperation operation) { - var segments = operation.OperationId.Split('_').Reverse().ToArray(); - return segments.FirstOrDefault() ?? "Index"; + var idx = operation.OperationId.LastIndexOf('_'); + return idx != -1 && idx < operation.OperationId.Length - 1 + ? operation.OperationId.AsSpan(idx + 1) + : operation.OperationId.AsSpan(); } } } \ No newline at end of file diff --git a/src/NSwag.Commands/NSwag.Commands.csproj b/src/NSwag.Commands/NSwag.Commands.csproj index 743d1d8d18..acdf003645 100644 --- a/src/NSwag.Commands/NSwag.Commands.csproj +++ b/src/NSwag.Commands/NSwag.Commands.csproj @@ -63,11 +63,6 @@ - - - - - diff --git a/src/NSwag.Console.x86/NSwag.Console.x86.csproj b/src/NSwag.Console.x86/NSwag.Console.x86.csproj index c128e39287..9947bcec1d 100644 --- a/src/NSwag.Console.x86/NSwag.Console.x86.csproj +++ b/src/NSwag.Console.x86/NSwag.Console.x86.csproj @@ -38,7 +38,7 @@ - + diff --git a/src/NSwag.Console/NSwag.Console.csproj b/src/NSwag.Console/NSwag.Console.csproj index fe7820c078..8de069fb1a 100644 --- a/src/NSwag.Console/NSwag.Console.csproj +++ b/src/NSwag.Console/NSwag.Console.csproj @@ -36,7 +36,7 @@ - + diff --git a/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj b/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj index e706a837e8..971a975ac5 100644 --- a/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj +++ b/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj @@ -13,12 +13,12 @@ ../NSwag.snk https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git NSwag - + diff --git a/src/NSwag.Core/NSwag.Core.csproj b/src/NSwag.Core/NSwag.Core.csproj index 5ce38dd972..680798363c 100644 --- a/src/NSwag.Core/NSwag.Core.csproj +++ b/src/NSwag.Core/NSwag.Core.csproj @@ -13,8 +13,8 @@ Rico Suter https://raw.githubusercontent.com/RicoSuter/NSwag/master/assets/NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git NSwag @@ -25,7 +25,7 @@ - + diff --git a/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj b/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj index af09afb45a..b1e103908e 100644 --- a/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj +++ b/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj @@ -14,7 +14,7 @@ Properties NSwag.Demo.Web NSwag.Demo.Web - v4.6 + v4.6.1 win true @@ -142,7 +142,7 @@ - + diff --git a/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj b/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj index 86be908a2f..5bb666669d 100644 --- a/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj +++ b/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj @@ -6,7 +6,6 @@ - diff --git a/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj b/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj index a1791e4a6c..2a4f0f6ab7 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj +++ b/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj b/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj index 87fccf516d..92d4cf9a61 100644 --- a/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj +++ b/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj @@ -1,6 +1,6 @@  - netstandard1.6;net451;netstandard2.0;netcoreapp3.1;net5.0;net6.0 + netstandard1.6;net461;netstandard2.0;netcoreapp3.1;net5.0;net6.0 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.4 Swagger Documentation AspNetCore @@ -26,15 +26,12 @@ - - - - + - + diff --git a/src/NSwag.Generation.WebApi.Tests/NSwag.Generation.WebApi.Tests.csproj b/src/NSwag.Generation.WebApi.Tests/NSwag.Generation.WebApi.Tests.csproj index 034f0a930a..0cec0c12e3 100644 --- a/src/NSwag.Generation.WebApi.Tests/NSwag.Generation.WebApi.Tests.csproj +++ b/src/NSwag.Generation.WebApi.Tests/NSwag.Generation.WebApi.Tests.csproj @@ -15,6 +15,7 @@ + $(NoWarn);MSB3277;MSB3247;CS1591;CS0618;NU1605 true @@ -137,7 +138,6 @@ - @@ -145,13 +145,13 @@ - + - - - + + + diff --git a/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj b/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj index 8dbd9fa4f5..6ea39f9e2e 100644 --- a/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj +++ b/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj @@ -1,6 +1,6 @@  - netstandard1.0;net45;netstandard2.0 + net461;netstandard2.0 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.4 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -24,10 +24,15 @@ - + - + + + + + + diff --git a/src/NSwag.Generation/NSwag.Generation.csproj b/src/NSwag.Generation/NSwag.Generation.csproj index 53203f26f2..0937d2a056 100644 --- a/src/NSwag.Generation/NSwag.Generation.csproj +++ b/src/NSwag.Generation/NSwag.Generation.csproj @@ -1,6 +1,6 @@  - netstandard1.0;net45;netstandard2.0 + net461;netstandard1.6;netstandard2.0 NSwag: The OpenAPI/Swagger API toolchain for .NET and TypeScript 13.14.4 OpenAPI Swagger AspNetCore Documentation CodeGen TypeScript WebApi AspNet @@ -13,8 +13,8 @@ Rico Suter NuGetIcon.png - git - https://github.com/RicoSuter/NSwag.git + git + https://github.com/RicoSuter/NSwag.git bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -27,9 +27,9 @@ - + - + diff --git a/src/NSwag.Integration.ClientPCL/PetStoreClient.cs b/src/NSwag.Integration.ClientPCL/PetStoreClient.cs index 25e5197e3c..827e8bd12f 100644 --- a/src/NSwag.Integration.ClientPCL/PetStoreClient.cs +++ b/src/NSwag.Integration.ClientPCL/PetStoreClient.cs @@ -1,6 +1,6 @@ //---------------------- // -// Generated using the NSwag toolchain v13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org) +// Generated using the NSwag toolchain v (http://NSwag.org) // //---------------------- @@ -16,7 +16,7 @@ namespace PetStore { using System = global::System; - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial interface IPetStoreClient { /// uploads an image @@ -26,7 +26,7 @@ public partial interface IPetStoreClient /// successful operation /// A server side error occurred. System.Threading.Tasks.Task UploadFileAsync(long petId, string additionalMetadata, FileParameter file); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// uploads an image /// ID of pet to update @@ -35,38 +35,38 @@ public partial interface IPetStoreClient /// successful operation /// A server side error occurred. System.Threading.Tasks.Task UploadFileAsync(long petId, string additionalMetadata, FileParameter file, System.Threading.CancellationToken cancellationToken); - + /// Update an existing pet /// Pet object that needs to be added to the store /// A server side error occurred. System.Threading.Tasks.Task UpdatePetAsync(Pet body); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Update an existing pet /// Pet object that needs to be added to the store /// A server side error occurred. System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threading.CancellationToken cancellationToken); - + /// Finds Pets by status /// Status values that need to be considered for filter /// successful operation /// A server side error occurred. System.Threading.Tasks.Task> FindPetsByStatusAsync(System.Collections.Generic.IEnumerable status); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Finds Pets by status /// Status values that need to be considered for filter /// successful operation /// A server side error occurred. System.Threading.Tasks.Task> FindPetsByStatusAsync(System.Collections.Generic.IEnumerable status, System.Threading.CancellationToken cancellationToken); - + /// Finds Pets by tags /// Tags to filter by /// successful operation /// A server side error occurred. [System.Obsolete] System.Threading.Tasks.Task> FindPetsByTagsAsync(System.Collections.Generic.IEnumerable tags); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Finds Pets by tags /// Tags to filter by @@ -74,27 +74,27 @@ public partial interface IPetStoreClient /// A server side error occurred. [System.Obsolete] System.Threading.Tasks.Task> FindPetsByTagsAsync(System.Collections.Generic.IEnumerable tags, System.Threading.CancellationToken cancellationToken); - + /// Find pet by ID /// ID of pet to return /// successful operation /// A server side error occurred. System.Threading.Tasks.Task GetPetByIdAsync(long petId); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Find pet by ID /// ID of pet to return /// successful operation /// A server side error occurred. System.Threading.Tasks.Task GetPetByIdAsync(long petId, System.Threading.CancellationToken cancellationToken); - + /// Updates a pet in the store with form data /// ID of pet that needs to be updated /// Updated name of the pet /// Updated status of the pet /// A server side error occurred. System.Threading.Tasks.Task UpdatePetWithFormAsync(long petId, string name, string status); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Updates a pet in the store with form data /// ID of pet that needs to be updated @@ -102,123 +102,123 @@ public partial interface IPetStoreClient /// Updated status of the pet /// A server side error occurred. System.Threading.Tasks.Task UpdatePetWithFormAsync(long petId, string name, string status, System.Threading.CancellationToken cancellationToken); - + /// Deletes a pet /// Pet id to delete /// A server side error occurred. System.Threading.Tasks.Task DeletePetAsync(string api_key, long petId); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Deletes a pet /// Pet id to delete /// A server side error occurred. System.Threading.Tasks.Task DeletePetAsync(string api_key, long petId, System.Threading.CancellationToken cancellationToken); - + /// Returns pet inventories by status /// successful operation /// A server side error occurred. System.Threading.Tasks.Task> GetInventoryAsync(); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Returns pet inventories by status /// successful operation /// A server side error occurred. System.Threading.Tasks.Task> GetInventoryAsync(System.Threading.CancellationToken cancellationToken); - + /// Place an order for a pet /// order placed for purchasing the pet /// successful operation /// A server side error occurred. System.Threading.Tasks.Task PlaceOrderAsync(Order body); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Place an order for a pet /// order placed for purchasing the pet /// successful operation /// A server side error occurred. System.Threading.Tasks.Task PlaceOrderAsync(Order body, System.Threading.CancellationToken cancellationToken); - + /// Find purchase order by ID /// ID of pet that needs to be fetched /// successful operation /// A server side error occurred. System.Threading.Tasks.Task GetOrderByIdAsync(long orderId); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Find purchase order by ID /// ID of pet that needs to be fetched /// successful operation /// A server side error occurred. System.Threading.Tasks.Task GetOrderByIdAsync(long orderId, System.Threading.CancellationToken cancellationToken); - + /// Delete purchase order by ID /// ID of the order that needs to be deleted /// A server side error occurred. System.Threading.Tasks.Task DeleteOrderAsync(long orderId); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Delete purchase order by ID /// ID of the order that needs to be deleted /// A server side error occurred. System.Threading.Tasks.Task DeleteOrderAsync(long orderId, System.Threading.CancellationToken cancellationToken); - + /// Creates list of users with given input array /// List of user object /// successful operation /// A server side error occurred. System.Threading.Tasks.Task CreateUsersWithListInputAsync(System.Collections.Generic.IEnumerable body); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Creates list of users with given input array /// List of user object /// successful operation /// A server side error occurred. System.Threading.Tasks.Task CreateUsersWithListInputAsync(System.Collections.Generic.IEnumerable body, System.Threading.CancellationToken cancellationToken); - + /// Get user by user name /// The name that needs to be fetched. Use user1 for testing. /// successful operation /// A server side error occurred. System.Threading.Tasks.Task GetUserByNameAsync(string username); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Get user by user name /// The name that needs to be fetched. Use user1 for testing. /// successful operation /// A server side error occurred. System.Threading.Tasks.Task GetUserByNameAsync(string username, System.Threading.CancellationToken cancellationToken); - + /// Updated user /// name that need to be updated /// Updated user object /// A server side error occurred. System.Threading.Tasks.Task UpdateUserAsync(string username, User body); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Updated user /// name that need to be updated /// Updated user object /// A server side error occurred. System.Threading.Tasks.Task UpdateUserAsync(string username, User body, System.Threading.CancellationToken cancellationToken); - + /// Delete user /// The name that needs to be deleted /// A server side error occurred. System.Threading.Tasks.Task DeleteUserAsync(string username); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Delete user /// The name that needs to be deleted /// A server side error occurred. System.Threading.Tasks.Task DeleteUserAsync(string username, System.Threading.CancellationToken cancellationToken); - + /// Logs user into the system /// The user name for login /// The password for login in clear text /// successful operation /// A server side error occurred. System.Threading.Tasks.Task LoginUserAsync(string username, string password); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Logs user into the system /// The user name for login @@ -226,78 +226,78 @@ public partial interface IPetStoreClient /// successful operation /// A server side error occurred. System.Threading.Tasks.Task LoginUserAsync(string username, string password, System.Threading.CancellationToken cancellationToken); - + /// Logs out current logged in user session /// successful operation /// A server side error occurred. System.Threading.Tasks.Task LogoutUserAsync(); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Logs out current logged in user session /// successful operation /// A server side error occurred. System.Threading.Tasks.Task LogoutUserAsync(System.Threading.CancellationToken cancellationToken); - + /// Creates list of users with given input array /// List of user object /// successful operation /// A server side error occurred. System.Threading.Tasks.Task CreateUsersWithArrayInputAsync(System.Collections.Generic.IEnumerable body); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Creates list of users with given input array /// List of user object /// successful operation /// A server side error occurred. System.Threading.Tasks.Task CreateUsersWithArrayInputAsync(System.Collections.Generic.IEnumerable body, System.Threading.CancellationToken cancellationToken); - + /// Create user /// Created user object /// successful operation /// A server side error occurred. System.Threading.Tasks.Task CreateUserAsync(User body); - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Create user /// Created user object /// successful operation /// A server side error occurred. System.Threading.Tasks.Task CreateUserAsync(User body, System.Threading.CancellationToken cancellationToken); - + } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class PetStoreClient : IPetStoreClient { private string _baseUrl = "https://petstore.swagger.io/v2"; private System.Lazy _settings; - + public PetStoreClient() { _settings = new System.Lazy(CreateSerializerSettings); } - + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() { var settings = new Newtonsoft.Json.JsonSerializerSettings(); UpdateJsonSerializerSettings(settings); return settings; } - + public string BaseUrl { get { return _baseUrl; } set { _baseUrl = value; } } - + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } - + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); - - + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + /// uploads an image /// ID of pet to update /// Additional data to pass to server @@ -308,7 +308,7 @@ public System.Threading.Tasks.Task UploadFileAsync(long petId, stri { return UploadFileAsync(petId, additionalMetadata, file, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// uploads an image /// ID of pet to update @@ -320,11 +320,11 @@ public async System.Threading.Tasks.Task UploadFileAsync(long petId { if (petId == null) throw new System.ArgumentNullException("petId"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/pet/{petId}/uploadImage"); urlBuilder_.Replace("{petId}", System.Uri.EscapeDataString(ConvertToString(petId, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -335,10 +335,12 @@ public async System.Threading.Tasks.Task UploadFileAsync(long petId var content_ = new System.Net.Http.MultipartFormDataContent(boundary_); content_.Headers.Remove("Content-Type"); content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_); + if (additionalMetadata != null) { content_.Add(new System.Net.Http.StringContent(ConvertToString(additionalMetadata, System.Globalization.CultureInfo.InvariantCulture)), "additionalMetadata"); } + if (file != null) { var content_file_ = new System.Net.Http.StreamContent(file.Data); @@ -349,14 +351,14 @@ public async System.Threading.Tasks.Task UploadFileAsync(long petId request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -367,9 +369,9 @@ public async System.Threading.Tasks.Task UploadFileAsync(long petId foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -399,7 +401,7 @@ public async System.Threading.Tasks.Task UploadFileAsync(long petId client_.Dispose(); } } - + /// Add a new pet to the store /// Pet object that needs to be added to the store /// A server side error occurred. @@ -407,7 +409,7 @@ protected System.Threading.Tasks.Task AddPetCoreAsync(Pet body) { return AddPetCoreAsync(body, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Add a new pet to the store /// Pet object that needs to be added to the store @@ -416,10 +418,10 @@ protected async System.Threading.Tasks.Task AddPetCoreAsync(Pet body, System.Thr { if (body == null) throw new System.ArgumentNullException("body"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/pet"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -430,14 +432,14 @@ protected async System.Threading.Tasks.Task AddPetCoreAsync(Pet body, System.Thr content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -448,9 +450,9 @@ protected async System.Threading.Tasks.Task AddPetCoreAsync(Pet body, System.Thr foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 405) { @@ -458,8 +460,10 @@ protected async System.Threading.Tasks.Task AddPetCoreAsync(Pet body, System.Thr throw new SwaggerException("Invalid input", status_, responseText_, headers_, null); } else + if (status_ == 200 || status_ == 204) { + return; } else @@ -481,7 +485,7 @@ protected async System.Threading.Tasks.Task AddPetCoreAsync(Pet body, System.Thr client_.Dispose(); } } - + /// Update an existing pet /// Pet object that needs to be added to the store /// A server side error occurred. @@ -489,7 +493,7 @@ public System.Threading.Tasks.Task UpdatePetAsync(Pet body) { return UpdatePetAsync(body, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Update an existing pet /// Pet object that needs to be added to the store @@ -498,10 +502,10 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi { if (body == null) throw new System.ArgumentNullException("body"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/pet"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -512,14 +516,14 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("PUT"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -530,9 +534,9 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 400) { @@ -552,8 +556,10 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi throw new SwaggerException("Validation exception", status_, responseText_, headers_, null); } else + if (status_ == 200 || status_ == 204) { + return; } else @@ -575,7 +581,7 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi client_.Dispose(); } } - + /// Finds Pets by status /// Status values that need to be considered for filter /// successful operation @@ -584,7 +590,7 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi { return FindPetsByStatusAsync(status, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Finds Pets by status /// Status values that need to be considered for filter @@ -594,12 +600,12 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi { if (status == null) throw new System.ArgumentNullException("status"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/pet/findByStatus?"); foreach (var item_ in status) { urlBuilder_.Append(System.Uri.EscapeDataString("status") + "=").Append(System.Uri.EscapeDataString(ConvertToString(item_, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } urlBuilder_.Length--; - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -608,14 +614,14 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -626,9 +632,9 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -664,7 +670,7 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi client_.Dispose(); } } - + /// Finds Pets by tags /// Tags to filter by /// successful operation @@ -674,7 +680,7 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi { return FindPetsByTagsAsync(tags, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Finds Pets by tags /// Tags to filter by @@ -685,12 +691,12 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi { if (tags == null) throw new System.ArgumentNullException("tags"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/pet/findByTags?"); foreach (var item_ in tags) { urlBuilder_.Append(System.Uri.EscapeDataString("tags") + "=").Append(System.Uri.EscapeDataString(ConvertToString(item_, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } urlBuilder_.Length--; - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -699,14 +705,14 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -717,9 +723,9 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -755,7 +761,7 @@ public async System.Threading.Tasks.Task UpdatePetAsync(Pet body, System.Threadi client_.Dispose(); } } - + /// Find pet by ID /// ID of pet to return /// successful operation @@ -764,7 +770,7 @@ public System.Threading.Tasks.Task GetPetByIdAsync(long petId) { return GetPetByIdAsync(petId, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Find pet by ID /// ID of pet to return @@ -774,11 +780,11 @@ public async System.Threading.Tasks.Task GetPetByIdAsync(long petId, System { if (petId == null) throw new System.ArgumentNullException("petId"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/pet/{petId}"); urlBuilder_.Replace("{petId}", System.Uri.EscapeDataString(ConvertToString(petId, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -787,14 +793,14 @@ public async System.Threading.Tasks.Task GetPetByIdAsync(long petId, System { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -805,9 +811,9 @@ public async System.Threading.Tasks.Task GetPetByIdAsync(long petId, System foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -849,7 +855,7 @@ public async System.Threading.Tasks.Task GetPetByIdAsync(long petId, System client_.Dispose(); } } - + /// Updates a pet in the store with form data /// ID of pet that needs to be updated /// Updated name of the pet @@ -859,7 +865,7 @@ public System.Threading.Tasks.Task UpdatePetWithFormAsync(long petId, string nam { return UpdatePetWithFormAsync(petId, name, status, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Updates a pet in the store with form data /// ID of pet that needs to be updated @@ -870,11 +876,11 @@ public async System.Threading.Tasks.Task UpdatePetWithFormAsync(long petId, stri { if (petId == null) throw new System.ArgumentNullException("petId"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/pet/{petId}"); urlBuilder_.Replace("{petId}", System.Uri.EscapeDataString(ConvertToString(petId, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -888,14 +894,14 @@ public async System.Threading.Tasks.Task UpdatePetWithFormAsync(long petId, stri keyValues_.Add(new System.Collections.Generic.KeyValuePair("status", ConvertToString(status, System.Globalization.CultureInfo.InvariantCulture))); request_.Content = new System.Net.Http.FormUrlEncodedContent(keyValues_); request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -906,9 +912,9 @@ public async System.Threading.Tasks.Task UpdatePetWithFormAsync(long petId, stri foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 405) { @@ -916,8 +922,10 @@ public async System.Threading.Tasks.Task UpdatePetWithFormAsync(long petId, stri throw new SwaggerException("Invalid input", status_, responseText_, headers_, null); } else + if (status_ == 200 || status_ == 204) { + return; } else @@ -939,7 +947,7 @@ public async System.Threading.Tasks.Task UpdatePetWithFormAsync(long petId, stri client_.Dispose(); } } - + /// Deletes a pet /// Pet id to delete /// A server side error occurred. @@ -947,7 +955,7 @@ public System.Threading.Tasks.Task DeletePetAsync(string api_key, long petId) { return DeletePetAsync(api_key, petId, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Deletes a pet /// Pet id to delete @@ -956,28 +964,29 @@ public async System.Threading.Tasks.Task DeletePetAsync(string api_key, long pet { if (petId == null) throw new System.ArgumentNullException("petId"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/pet/{petId}"); urlBuilder_.Replace("{petId}", System.Uri.EscapeDataString(ConvertToString(petId, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try { using (var request_ = new System.Net.Http.HttpRequestMessage()) { + if (api_key != null) request_.Headers.TryAddWithoutValidation("api_key", ConvertToString(api_key, System.Globalization.CultureInfo.InvariantCulture)); request_.Method = new System.Net.Http.HttpMethod("DELETE"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -988,9 +997,9 @@ public async System.Threading.Tasks.Task DeletePetAsync(string api_key, long pet foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 400) { @@ -1004,8 +1013,10 @@ public async System.Threading.Tasks.Task DeletePetAsync(string api_key, long pet throw new SwaggerException("Pet not found", status_, responseText_, headers_, null); } else + if (status_ == 200 || status_ == 204) { + return; } else @@ -1027,7 +1038,7 @@ public async System.Threading.Tasks.Task DeletePetAsync(string api_key, long pet client_.Dispose(); } } - + /// Returns pet inventories by status /// successful operation /// A server side error occurred. @@ -1035,7 +1046,7 @@ public async System.Threading.Tasks.Task DeletePetAsync(string api_key, long pet { return GetInventoryAsync(System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Returns pet inventories by status /// successful operation @@ -1044,7 +1055,7 @@ public async System.Threading.Tasks.Task DeletePetAsync(string api_key, long pet { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/store/inventory"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1053,14 +1064,14 @@ public async System.Threading.Tasks.Task DeletePetAsync(string api_key, long pet { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1071,9 +1082,9 @@ public async System.Threading.Tasks.Task DeletePetAsync(string api_key, long pet foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1103,7 +1114,7 @@ public async System.Threading.Tasks.Task DeletePetAsync(string api_key, long pet client_.Dispose(); } } - + /// Place an order for a pet /// order placed for purchasing the pet /// successful operation @@ -1112,7 +1123,7 @@ public System.Threading.Tasks.Task PlaceOrderAsync(Order body) { return PlaceOrderAsync(body, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Place an order for a pet /// order placed for purchasing the pet @@ -1122,10 +1133,10 @@ public async System.Threading.Tasks.Task PlaceOrderAsync(Order body, Syst { if (body == null) throw new System.ArgumentNullException("body"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/store/order"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1137,14 +1148,14 @@ public async System.Threading.Tasks.Task PlaceOrderAsync(Order body, Syst request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1155,9 +1166,9 @@ public async System.Threading.Tasks.Task PlaceOrderAsync(Order body, Syst foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1193,7 +1204,7 @@ public async System.Threading.Tasks.Task PlaceOrderAsync(Order body, Syst client_.Dispose(); } } - + /// Find purchase order by ID /// ID of pet that needs to be fetched /// successful operation @@ -1202,7 +1213,7 @@ public System.Threading.Tasks.Task GetOrderByIdAsync(long orderId) { return GetOrderByIdAsync(orderId, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Find purchase order by ID /// ID of pet that needs to be fetched @@ -1212,11 +1223,11 @@ public async System.Threading.Tasks.Task GetOrderByIdAsync(long orderId, { if (orderId == null) throw new System.ArgumentNullException("orderId"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/store/order/{orderId}"); urlBuilder_.Replace("{orderId}", System.Uri.EscapeDataString(ConvertToString(orderId, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1225,14 +1236,14 @@ public async System.Threading.Tasks.Task GetOrderByIdAsync(long orderId, { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1243,9 +1254,9 @@ public async System.Threading.Tasks.Task GetOrderByIdAsync(long orderId, foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1287,7 +1298,7 @@ public async System.Threading.Tasks.Task GetOrderByIdAsync(long orderId, client_.Dispose(); } } - + /// Delete purchase order by ID /// ID of the order that needs to be deleted /// A server side error occurred. @@ -1295,7 +1306,7 @@ public System.Threading.Tasks.Task DeleteOrderAsync(long orderId) { return DeleteOrderAsync(orderId, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Delete purchase order by ID /// ID of the order that needs to be deleted @@ -1304,11 +1315,11 @@ public async System.Threading.Tasks.Task DeleteOrderAsync(long orderId, System.T { if (orderId == null) throw new System.ArgumentNullException("orderId"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/store/order/{orderId}"); urlBuilder_.Replace("{orderId}", System.Uri.EscapeDataString(ConvertToString(orderId, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1316,14 +1327,14 @@ public async System.Threading.Tasks.Task DeleteOrderAsync(long orderId, System.T using (var request_ = new System.Net.Http.HttpRequestMessage()) { request_.Method = new System.Net.Http.HttpMethod("DELETE"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1334,9 +1345,9 @@ public async System.Threading.Tasks.Task DeleteOrderAsync(long orderId, System.T foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 400) { @@ -1350,8 +1361,10 @@ public async System.Threading.Tasks.Task DeleteOrderAsync(long orderId, System.T throw new SwaggerException("Order not found", status_, responseText_, headers_, null); } else + if (status_ == 200 || status_ == 204) { + return; } else @@ -1373,7 +1386,7 @@ public async System.Threading.Tasks.Task DeleteOrderAsync(long orderId, System.T client_.Dispose(); } } - + /// Creates list of users with given input array /// List of user object /// successful operation @@ -1382,7 +1395,7 @@ public System.Threading.Tasks.Task CreateUsersWithListInputAsync(System.Collecti { return CreateUsersWithListInputAsync(body, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Creates list of users with given input array /// List of user object @@ -1392,10 +1405,10 @@ public async System.Threading.Tasks.Task CreateUsersWithListInputAsync(System.Co { if (body == null) throw new System.ArgumentNullException("body"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/user/createWithList"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1406,14 +1419,14 @@ public async System.Threading.Tasks.Task CreateUsersWithListInputAsync(System.Co content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1424,9 +1437,9 @@ public async System.Threading.Tasks.Task CreateUsersWithListInputAsync(System.Co foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; } finally @@ -1442,7 +1455,7 @@ public async System.Threading.Tasks.Task CreateUsersWithListInputAsync(System.Co client_.Dispose(); } } - + /// Get user by user name /// The name that needs to be fetched. Use user1 for testing. /// successful operation @@ -1451,7 +1464,7 @@ public System.Threading.Tasks.Task GetUserByNameAsync(string username) { return GetUserByNameAsync(username, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Get user by user name /// The name that needs to be fetched. Use user1 for testing. @@ -1461,11 +1474,11 @@ public async System.Threading.Tasks.Task GetUserByNameAsync(string usernam { if (username == null) throw new System.ArgumentNullException("username"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/user/{username}"); urlBuilder_.Replace("{username}", System.Uri.EscapeDataString(ConvertToString(username, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1474,14 +1487,14 @@ public async System.Threading.Tasks.Task GetUserByNameAsync(string usernam { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1492,9 +1505,9 @@ public async System.Threading.Tasks.Task GetUserByNameAsync(string usernam foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1536,7 +1549,7 @@ public async System.Threading.Tasks.Task GetUserByNameAsync(string usernam client_.Dispose(); } } - + /// Updated user /// name that need to be updated /// Updated user object @@ -1545,7 +1558,7 @@ public System.Threading.Tasks.Task UpdateUserAsync(string username, User body) { return UpdateUserAsync(username, body, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Updated user /// name that need to be updated @@ -1555,14 +1568,14 @@ public async System.Threading.Tasks.Task UpdateUserAsync(string username, User b { if (username == null) throw new System.ArgumentNullException("username"); - + if (body == null) throw new System.ArgumentNullException("body"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/user/{username}"); urlBuilder_.Replace("{username}", System.Uri.EscapeDataString(ConvertToString(username, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1573,14 +1586,14 @@ public async System.Threading.Tasks.Task UpdateUserAsync(string username, User b content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("PUT"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1591,9 +1604,9 @@ public async System.Threading.Tasks.Task UpdateUserAsync(string username, User b foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 400) { @@ -1607,8 +1620,10 @@ public async System.Threading.Tasks.Task UpdateUserAsync(string username, User b throw new SwaggerException("User not found", status_, responseText_, headers_, null); } else + if (status_ == 200 || status_ == 204) { + return; } else @@ -1630,7 +1645,7 @@ public async System.Threading.Tasks.Task UpdateUserAsync(string username, User b client_.Dispose(); } } - + /// Delete user /// The name that needs to be deleted /// A server side error occurred. @@ -1638,7 +1653,7 @@ public System.Threading.Tasks.Task DeleteUserAsync(string username) { return DeleteUserAsync(username, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Delete user /// The name that needs to be deleted @@ -1647,11 +1662,11 @@ public async System.Threading.Tasks.Task DeleteUserAsync(string username, System { if (username == null) throw new System.ArgumentNullException("username"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/user/{username}"); urlBuilder_.Replace("{username}", System.Uri.EscapeDataString(ConvertToString(username, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1659,14 +1674,14 @@ public async System.Threading.Tasks.Task DeleteUserAsync(string username, System using (var request_ = new System.Net.Http.HttpRequestMessage()) { request_.Method = new System.Net.Http.HttpMethod("DELETE"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1677,9 +1692,9 @@ public async System.Threading.Tasks.Task DeleteUserAsync(string username, System foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 400) { @@ -1693,8 +1708,10 @@ public async System.Threading.Tasks.Task DeleteUserAsync(string username, System throw new SwaggerException("User not found", status_, responseText_, headers_, null); } else + if (status_ == 200 || status_ == 204) { + return; } else @@ -1716,7 +1733,7 @@ public async System.Threading.Tasks.Task DeleteUserAsync(string username, System client_.Dispose(); } } - + /// Logs user into the system /// The user name for login /// The password for login in clear text @@ -1726,7 +1743,7 @@ public System.Threading.Tasks.Task LoginUserAsync(string username, strin { return LoginUserAsync(username, password, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Logs user into the system /// The user name for login @@ -1737,16 +1754,16 @@ public async System.Threading.Tasks.Task LoginUserAsync(string username, { if (username == null) throw new System.ArgumentNullException("username"); - + if (password == null) throw new System.ArgumentNullException("password"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/user/login?"); urlBuilder_.Append(System.Uri.EscapeDataString("username") + "=").Append(System.Uri.EscapeDataString(ConvertToString(username, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); urlBuilder_.Append(System.Uri.EscapeDataString("password") + "=").Append(System.Uri.EscapeDataString(ConvertToString(password, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); urlBuilder_.Length--; - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1755,14 +1772,14 @@ public async System.Threading.Tasks.Task LoginUserAsync(string username, { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1773,9 +1790,9 @@ public async System.Threading.Tasks.Task LoginUserAsync(string username, foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1811,7 +1828,7 @@ public async System.Threading.Tasks.Task LoginUserAsync(string username, client_.Dispose(); } } - + /// Logs out current logged in user session /// successful operation /// A server side error occurred. @@ -1819,7 +1836,7 @@ public System.Threading.Tasks.Task LogoutUserAsync() { return LogoutUserAsync(System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Logs out current logged in user session /// successful operation @@ -1828,7 +1845,7 @@ public async System.Threading.Tasks.Task LogoutUserAsync(System.Threading.Cancel { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/user/logout"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1836,14 +1853,14 @@ public async System.Threading.Tasks.Task LogoutUserAsync(System.Threading.Cancel using (var request_ = new System.Net.Http.HttpRequestMessage()) { request_.Method = new System.Net.Http.HttpMethod("GET"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1854,9 +1871,9 @@ public async System.Threading.Tasks.Task LogoutUserAsync(System.Threading.Cancel foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; } finally @@ -1872,7 +1889,7 @@ public async System.Threading.Tasks.Task LogoutUserAsync(System.Threading.Cancel client_.Dispose(); } } - + /// Creates list of users with given input array /// List of user object /// successful operation @@ -1881,7 +1898,7 @@ public System.Threading.Tasks.Task CreateUsersWithArrayInputAsync(System.Collect { return CreateUsersWithArrayInputAsync(body, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Creates list of users with given input array /// List of user object @@ -1891,10 +1908,10 @@ public async System.Threading.Tasks.Task CreateUsersWithArrayInputAsync(System.C { if (body == null) throw new System.ArgumentNullException("body"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/user/createWithArray"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1905,14 +1922,14 @@ public async System.Threading.Tasks.Task CreateUsersWithArrayInputAsync(System.C content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1923,9 +1940,9 @@ public async System.Threading.Tasks.Task CreateUsersWithArrayInputAsync(System.C foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; } finally @@ -1941,7 +1958,7 @@ public async System.Threading.Tasks.Task CreateUsersWithArrayInputAsync(System.C client_.Dispose(); } } - + /// Create user /// Created user object /// successful operation @@ -1950,7 +1967,7 @@ public System.Threading.Tasks.Task CreateUserAsync(User body) { return CreateUserAsync(body, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Create user /// Created user object @@ -1960,10 +1977,10 @@ public async System.Threading.Tasks.Task CreateUserAsync(User body, System.Threa { if (body == null) throw new System.ArgumentNullException("body"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/user"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1974,14 +1991,14 @@ public async System.Threading.Tasks.Task CreateUserAsync(User body, System.Threa content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1992,9 +2009,9 @@ public async System.Threading.Tasks.Task CreateUserAsync(User body, System.Threa foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; } finally @@ -2010,7 +2027,7 @@ public async System.Threading.Tasks.Task CreateUserAsync(User body, System.Threa client_.Dispose(); } } - + protected struct ObjectResponseResult { public ObjectResponseResult(T responseObject, string responseText) @@ -2018,21 +2035,21 @@ public ObjectResponseResult(T responseObject, string responseText) this.Object = responseObject; this.Text = responseText; } - + public T Object { get; } - + public string Text { get; } } - + public bool ReadResponseAsString { get; set; } - + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) { if (response == null || response.Content == null) { return new ObjectResponseResult(default(T), string.Empty); } - + if (ReadResponseAsString) { var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); @@ -2067,14 +2084,14 @@ protected virtual async System.Threading.Tasks.Task> Rea } } } - + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) { if (value == null) { return ""; } - + if (value is System.Enum) { var name = System.Enum.GetName(value.GetType(), value); @@ -2090,7 +2107,7 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu return attribute.Value != null ? attribute.Value : name; } } - + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); return converted == null ? string.Empty : converted; } @@ -2108,7 +2125,7 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu var array = System.Linq.Enumerable.OfType((System.Array) value); return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); } - + var result = System.Convert.ToString(value, cultureInfo); return result == null ? "" : result; } @@ -2120,7 +2137,7 @@ public partial class ApiResponse : System.ComponentModel.INotifyPropertyChanged private int? _code; private string _type; private string _message; - + [Newtonsoft.Json.JsonProperty("code", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public int? Code { @@ -2134,7 +2151,7 @@ public int? Code } } } - + [Newtonsoft.Json.JsonProperty("type", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Type { @@ -2148,7 +2165,7 @@ public string Type } } } - + [Newtonsoft.Json.JsonProperty("message", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Message { @@ -2162,25 +2179,23 @@ public string Message } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Category : System.ComponentModel.INotifyPropertyChanged { private long? _id; private string _name; - + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public long? Id { @@ -2194,7 +2209,7 @@ public long? Id } } } - + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Name { @@ -2208,19 +2223,17 @@ public string Name } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Pet : System.ComponentModel.INotifyPropertyChanged { @@ -2230,7 +2243,7 @@ public partial class Pet : System.ComponentModel.INotifyPropertyChanged private System.Collections.ObjectModel.ObservableCollection _photoUrls = new System.Collections.ObjectModel.ObservableCollection(); private System.Collections.ObjectModel.ObservableCollection _tags; private PetStatus? _status; - + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public long? Id { @@ -2244,7 +2257,7 @@ public long? Id } } } - + [Newtonsoft.Json.JsonProperty("category", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public Category Category { @@ -2258,7 +2271,7 @@ public Category Category } } } - + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public string Name @@ -2273,7 +2286,7 @@ public string Name } } } - + [Newtonsoft.Json.JsonProperty("photoUrls", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public System.Collections.ObjectModel.ObservableCollection PhotoUrls @@ -2288,7 +2301,7 @@ public System.Collections.ObjectModel.ObservableCollection PhotoUrls } } } - + [Newtonsoft.Json.JsonProperty("tags", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public System.Collections.ObjectModel.ObservableCollection Tags { @@ -2302,7 +2315,7 @@ public System.Collections.ObjectModel.ObservableCollection Tags } } } - + /// pet status in the store [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] @@ -2318,25 +2331,23 @@ public PetStatus? Status } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Tag : System.ComponentModel.INotifyPropertyChanged { private long? _id; private string _name; - + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public long? Id { @@ -2350,7 +2361,7 @@ public long? Id } } } - + [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Name { @@ -2364,19 +2375,17 @@ public string Name } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Order : System.ComponentModel.INotifyPropertyChanged { @@ -2386,7 +2395,7 @@ public partial class Order : System.ComponentModel.INotifyPropertyChanged private System.DateTime? _shipDate; private OrderStatus? _status; private bool? _complete; - + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public long? Id { @@ -2400,7 +2409,7 @@ public long? Id } } } - + [Newtonsoft.Json.JsonProperty("petId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public long? PetId { @@ -2414,7 +2423,7 @@ public long? PetId } } } - + [Newtonsoft.Json.JsonProperty("quantity", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public int? Quantity { @@ -2428,7 +2437,7 @@ public int? Quantity } } } - + [Newtonsoft.Json.JsonProperty("shipDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public System.DateTime? ShipDate { @@ -2442,7 +2451,7 @@ public System.DateTime? ShipDate } } } - + /// Order Status [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] @@ -2458,7 +2467,7 @@ public OrderStatus? Status } } } - + [Newtonsoft.Json.JsonProperty("complete", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public bool? Complete { @@ -2472,19 +2481,17 @@ public bool? Complete } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class User : System.ComponentModel.INotifyPropertyChanged { @@ -2496,7 +2503,7 @@ public partial class User : System.ComponentModel.INotifyPropertyChanged private string _password; private string _phone; private int? _userStatus; - + [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public long? Id { @@ -2510,7 +2517,7 @@ public long? Id } } } - + [Newtonsoft.Json.JsonProperty("username", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Username { @@ -2524,7 +2531,7 @@ public string Username } } } - + [Newtonsoft.Json.JsonProperty("firstName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string FirstName { @@ -2538,7 +2545,7 @@ public string FirstName } } } - + [Newtonsoft.Json.JsonProperty("lastName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string LastName { @@ -2552,7 +2559,7 @@ public string LastName } } } - + [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Email { @@ -2566,7 +2573,7 @@ public string Email } } } - + [Newtonsoft.Json.JsonProperty("password", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Password { @@ -2580,7 +2587,7 @@ public string Password } } } - + [Newtonsoft.Json.JsonProperty("phone", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Phone { @@ -2594,7 +2601,7 @@ public string Phone } } } - + /// User Status [Newtonsoft.Json.JsonProperty("userStatus", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public int? UserStatus @@ -2609,62 +2616,63 @@ public int? UserStatus } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum Anonymous { + [System.Runtime.Serialization.EnumMember(Value = @"available")] Available = 0, - + [System.Runtime.Serialization.EnumMember(Value = @"pending")] Pending = 1, - + [System.Runtime.Serialization.EnumMember(Value = @"sold")] Sold = 2, - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum PetStatus { + [System.Runtime.Serialization.EnumMember(Value = @"available")] Available = 0, - + [System.Runtime.Serialization.EnumMember(Value = @"pending")] Pending = 1, - + [System.Runtime.Serialization.EnumMember(Value = @"sold")] Sold = 2, - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum OrderStatus { + [System.Runtime.Serialization.EnumMember(Value = @"placed")] Placed = 0, - + [System.Runtime.Serialization.EnumMember(Value = @"approved")] Approved = 1, - + [System.Runtime.Serialization.EnumMember(Value = @"delivered")] Delivered = 2, - + } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class FileParameter { public FileParameter(System.IO.Stream data) @@ -2691,7 +2699,9 @@ public FileParameter(System.IO.Stream data, string fileName, string contentType) public string ContentType { get; private set; } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class SwaggerException : System.Exception { public int StatusCode { get; private set; } @@ -2714,7 +2724,7 @@ public override string ToString() } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class SwaggerException : SwaggerException { public TResult Result { get; private set; } diff --git a/src/NSwag.Integration.ClientPCL/ServiceClients.cs b/src/NSwag.Integration.ClientPCL/ServiceClients.cs index 2a6fdb1ca0..73917d248f 100644 --- a/src/NSwag.Integration.ClientPCL/ServiceClients.cs +++ b/src/NSwag.Integration.ClientPCL/ServiceClients.cs @@ -1,6 +1,6 @@ //---------------------- // -// Generated using the NSwag toolchain v13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org) +// Generated using the NSwag toolchain v (http://NSwag.org) // //---------------------- @@ -18,52 +18,51 @@ namespace NSwag.Integration.ClientPCL { using System = global::System; - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class GeoClient : ClientBase { private string _baseUrl = "http://localhost:13452"; private System.Net.Http.HttpClient _httpClient; private System.Lazy _settings; - + public GeoClient(System.Net.Http.HttpClient httpClient) { _httpClient = httpClient; _settings = new System.Lazy(CreateSerializerSettings); } - + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() { var settings = new Newtonsoft.Json.JsonSerializerSettings { PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All, Converters = new Newtonsoft.Json.JsonConverter[] { new Newtonsoft.Json.Converters.StringEnumConverter(), new JsonExceptionConverter() } }; UpdateJsonSerializerSettings(settings); return settings; } - + public string BaseUrl { get { return _baseUrl; } set { _baseUrl = value; } } - + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } - - - + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + /// A server side error occurred. public System.Threading.Tasks.Task FromBodyTestAsync(GeoPoint location) { return FromBodyTestAsync(location, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task FromBodyTestAsync(GeoPoint location, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Geo/FromBodyTest"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -74,14 +73,14 @@ public async System.Threading.Tasks.Task FromBodyTestAsync(GeoP content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -92,9 +91,9 @@ public async System.Threading.Tasks.Task FromBodyTestAsync(GeoP foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -119,13 +118,13 @@ public async System.Threading.Tasks.Task FromBodyTestAsync(GeoP client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task FromUriTestAsync(double? latitude, double? longitude) { return FromUriTestAsync(latitude, longitude, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task FromUriTestAsync(double? latitude, double? longitude, System.Threading.CancellationToken cancellationToken) @@ -141,7 +140,7 @@ public async System.Threading.Tasks.Task FromUriTestAsync(doubl urlBuilder_.Append(System.Uri.EscapeDataString("Longitude") + "=").Append(System.Uri.EscapeDataString(ConvertToString(longitude, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -150,14 +149,14 @@ public async System.Threading.Tasks.Task FromUriTestAsync(doubl { request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -168,9 +167,9 @@ public async System.Threading.Tasks.Task FromUriTestAsync(doubl foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -195,20 +194,20 @@ public async System.Threading.Tasks.Task FromUriTestAsync(doubl client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task AddPolygonAsync(System.Collections.Generic.IEnumerable points) { return AddPolygonAsync(points, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task AddPolygonAsync(System.Collections.Generic.IEnumerable points, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Geo/AddPolygon"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -219,14 +218,14 @@ public async System.Threading.Tasks.Task AddPolygonAsync(System content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -237,9 +236,9 @@ public async System.Threading.Tasks.Task AddPolygonAsync(System foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -264,13 +263,13 @@ public async System.Threading.Tasks.Task AddPolygonAsync(System client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task FilterAsync(System.Collections.Generic.IEnumerable currentStates) { return FilterAsync(currentStates, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task FilterAsync(System.Collections.Generic.IEnumerable currentStates, System.Threading.CancellationToken cancellationToken) @@ -282,7 +281,7 @@ public async System.Threading.Tasks.Task FilterAsync(System.Col foreach (var item_ in currentStates) { urlBuilder_.Append(System.Uri.EscapeDataString("currentStates") + "=").Append(System.Uri.EscapeDataString(ConvertToString(item_, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } } urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -291,14 +290,14 @@ public async System.Threading.Tasks.Task FilterAsync(System.Col { request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -309,9 +308,9 @@ public async System.Threading.Tasks.Task FilterAsync(System.Col foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -336,13 +335,13 @@ public async System.Threading.Tasks.Task FilterAsync(System.Col client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task>> ReverseAsync(System.Collections.Generic.IEnumerable values) { return ReverseAsync(values, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task>> ReverseAsync(System.Collections.Generic.IEnumerable values, System.Threading.CancellationToken cancellationToken) @@ -354,7 +353,7 @@ public async System.Threading.Tasks.Task FilterAsync(System.Col foreach (var item_ in values) { urlBuilder_.Append(System.Uri.EscapeDataString("values") + "=").Append(System.Uri.EscapeDataString(ConvertToString(item_, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } } urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -364,14 +363,14 @@ public async System.Threading.Tasks.Task FilterAsync(System.Col request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -382,9 +381,9 @@ public async System.Threading.Tasks.Task FilterAsync(System.Col foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -410,20 +409,20 @@ public async System.Threading.Tasks.Task FilterAsync(System.Col client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task RefreshAsync() { return RefreshAsync(System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task RefreshAsync(System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Geo/Refresh"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -432,14 +431,14 @@ public async System.Threading.Tasks.Task RefreshAsync(System.Th { request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -450,9 +449,9 @@ public async System.Threading.Tasks.Task RefreshAsync(System.Th foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -477,20 +476,20 @@ public async System.Threading.Tasks.Task RefreshAsync(System.Th client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task> UploadFileAsync(FileParameter file) { return UploadFileAsync(file, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task> UploadFileAsync(FileParameter file, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Geo/UploadFile"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -501,6 +500,7 @@ public async System.Threading.Tasks.Task> UploadFileAsync( var content_ = new System.Net.Http.MultipartFormDataContent(boundary_); content_.Headers.Remove("Content-Type"); content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_); + if (file != null) { var content_file_ = new System.Net.Http.StreamContent(file.Data); @@ -511,14 +511,14 @@ public async System.Threading.Tasks.Task> UploadFileAsync( request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -529,9 +529,9 @@ public async System.Threading.Tasks.Task> UploadFileAsync( foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -561,20 +561,20 @@ public async System.Threading.Tasks.Task> UploadFileAsync( client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task UploadFilesAsync(System.Collections.Generic.IEnumerable files) { return UploadFilesAsync(files, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task UploadFilesAsync(System.Collections.Generic.IEnumerable files, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Geo/UploadFiles"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -585,6 +585,7 @@ public async System.Threading.Tasks.Task UploadFilesAsync(Syste var content_ = new System.Net.Http.MultipartFormDataContent(boundary_); content_.Headers.Remove("Content-Type"); content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_); + if (files != null) { foreach (var item_ in files) @@ -597,14 +598,14 @@ public async System.Threading.Tasks.Task UploadFilesAsync(Syste } request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -615,9 +616,9 @@ public async System.Threading.Tasks.Task UploadFilesAsync(Syste foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -642,14 +643,14 @@ public async System.Threading.Tasks.Task UploadFilesAsync(Syste client_.Dispose(); } } - + /// A server side error occurred. /// A custom error occured. public System.Threading.Tasks.Task SaveItemsAsync(GenericRequestOfAddressAndPerson request) { return SaveItemsAsync(request, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. /// A custom error occured. @@ -657,7 +658,7 @@ public async System.Threading.Tasks.Task SaveItemsAsync(Generic { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Geo/SaveItems"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -668,14 +669,14 @@ public async System.Threading.Tasks.Task SaveItemsAsync(Generic content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -686,9 +687,9 @@ public async System.Threading.Tasks.Task SaveItemsAsync(Generic foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -727,20 +728,20 @@ public async System.Threading.Tasks.Task SaveItemsAsync(Generic client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task GetUploadedFileAsync(int id, bool? @override) { return GetUploadedFileAsync(id, @override, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task GetUploadedFileAsync(int id, bool? @override, System.Threading.CancellationToken cancellationToken) { if (id == null) throw new System.ArgumentNullException("id"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Geo/GetUploadedFile/{id}?"); urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); @@ -749,7 +750,7 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int urlBuilder_.Append(System.Uri.EscapeDataString("override") + "=").Append(System.Uri.EscapeDataString(ConvertToString(@override, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -758,14 +759,14 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -776,14 +777,14 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200 || status_ == 206) { var responseStream_ = response_.Content == null ? System.IO.Stream.Null : await response_.Content.ReadAsStreamAsync().ConfigureAwait(false); - var fileResponse_ = new FileResponse(status_, headers_, responseStream_, null, response_); + var fileResponse_ = new FileResponse(status_, headers_, responseStream_, null, response_); disposeClient_ = false; disposeResponse_ = false; // response and client are disposed by FileResponse return fileResponse_; } @@ -806,13 +807,13 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task> PostDoubleAsync(double? value) { return PostDoubleAsync(value, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task> PostDoubleAsync(double? value, System.Threading.CancellationToken cancellationToken) @@ -824,7 +825,7 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int urlBuilder_.Append(System.Uri.EscapeDataString("value") + "=").Append(System.Uri.EscapeDataString(ConvertToString(value, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -834,14 +835,14 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -852,9 +853,9 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -880,7 +881,7 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int client_.Dispose(); } } - + protected struct ObjectResponseResult { public ObjectResponseResult(T responseObject, string responseText) @@ -888,21 +889,21 @@ public ObjectResponseResult(T responseObject, string responseText) this.Object = responseObject; this.Text = responseText; } - + public T Object { get; } - + public string Text { get; } } - + public bool ReadResponseAsString { get; set; } - + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) { if (response == null || response.Content == null) { return new ObjectResponseResult(default(T), string.Empty); } - + if (ReadResponseAsString) { var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); @@ -937,14 +938,14 @@ protected virtual async System.Threading.Tasks.Task> Rea } } } - + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) { if (value == null) { return ""; } - + if (value is System.Enum) { var name = System.Enum.GetName(value.GetType(), value); @@ -960,7 +961,7 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu return attribute.Value != null ? attribute.Value : name; } } - + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); return converted == null ? string.Empty : converted; } @@ -978,58 +979,57 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu var array = System.Linq.Enumerable.OfType((System.Array) value); return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); } - + var result = System.Convert.ToString(value, cultureInfo); return result == null ? "" : result; } } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class PersonsClient : ClientBase { private string _baseUrl = "http://localhost:13452"; private System.Net.Http.HttpClient _httpClient; private System.Lazy _settings; - + public PersonsClient(System.Net.Http.HttpClient httpClient) { _httpClient = httpClient; _settings = new System.Lazy(CreateSerializerSettings); } - + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() { var settings = new Newtonsoft.Json.JsonSerializerSettings { PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All, Converters = new Newtonsoft.Json.JsonConverter[] { new Newtonsoft.Json.Converters.StringEnumConverter(), new JsonExceptionConverter() } }; UpdateJsonSerializerSettings(settings); return settings; } - + public string BaseUrl { get { return _baseUrl; } set { _baseUrl = value; } } - + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } - - - + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + /// A server side error occurred. public System.Threading.Tasks.Task>> GetAllAsync() { return GetAllAsync(System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task>> GetAllAsync(System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1038,14 +1038,14 @@ public string BaseUrl { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1056,9 +1056,9 @@ public string BaseUrl foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1084,20 +1084,20 @@ public string BaseUrl client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task AddAsync(Person person) { return AddAsync(person, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task AddAsync(Person person, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1108,14 +1108,14 @@ public async System.Threading.Tasks.Task AddAsync(Person person content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1126,9 +1126,9 @@ public async System.Threading.Tasks.Task AddAsync(Person person foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -1153,24 +1153,24 @@ public async System.Threading.Tasks.Task AddAsync(Person person client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task>> FindAsync(Gender gender) { return FindAsync(gender, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task>> FindAsync(Gender gender, System.Threading.CancellationToken cancellationToken) { if (gender == null) throw new System.ArgumentNullException("gender"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons/find/{gender}"); urlBuilder_.Replace("{gender}", System.Uri.EscapeDataString(ConvertToString(gender, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1180,14 +1180,14 @@ public async System.Threading.Tasks.Task AddAsync(Person person request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1198,9 +1198,9 @@ public async System.Threading.Tasks.Task AddAsync(Person person foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1226,13 +1226,13 @@ public async System.Threading.Tasks.Task AddAsync(Person person client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task>> FindOptionalAsync(Gender? gender) { return FindOptionalAsync(gender, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task>> FindOptionalAsync(Gender? gender, System.Threading.CancellationToken cancellationToken) @@ -1241,7 +1241,7 @@ public async System.Threading.Tasks.Task AddAsync(Person person urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons/find2?"); urlBuilder_.Append(System.Uri.EscapeDataString("gender") + "=").Append(System.Uri.EscapeDataString(gender != null ? ConvertToString(gender, System.Globalization.CultureInfo.InvariantCulture) : "")).Append("&"); urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1251,14 +1251,14 @@ public async System.Threading.Tasks.Task AddAsync(Person person request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1269,9 +1269,9 @@ public async System.Threading.Tasks.Task AddAsync(Person person foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1297,14 +1297,14 @@ public async System.Threading.Tasks.Task AddAsync(Person person client_.Dispose(); } } - + /// A server side error occurred. /// A server side error occurred. public System.Threading.Tasks.Task> GetAsync(System.Guid id) { return GetAsync(id, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. /// A server side error occurred. @@ -1312,11 +1312,11 @@ public async System.Threading.Tasks.Task> GetAsync(Syste { if (id == null) throw new System.ArgumentNullException("id"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons/{id}"); urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1325,14 +1325,14 @@ public async System.Threading.Tasks.Task> GetAsync(Syste { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1343,9 +1343,9 @@ public async System.Threading.Tasks.Task> GetAsync(Syste foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 500) { @@ -1385,24 +1385,24 @@ public async System.Threading.Tasks.Task> GetAsync(Syste client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task DeleteAsync(System.Guid id) { return DeleteAsync(id, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) { if (id == null) throw new System.ArgumentNullException("id"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons/{id}"); urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1410,14 +1410,14 @@ public async System.Threading.Tasks.Task DeleteAsync(System.Gui using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) { request_.Method = new System.Net.Http.HttpMethod("DELETE"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1428,9 +1428,9 @@ public async System.Threading.Tasks.Task DeleteAsync(System.Gui foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -1455,20 +1455,20 @@ public async System.Threading.Tasks.Task DeleteAsync(System.Gui client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task> TransformAsync(Person person) { return TransformAsync(person, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task> TransformAsync(Person person, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons/transform"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1480,14 +1480,14 @@ public async System.Threading.Tasks.Task> TransformAsync request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1498,9 +1498,9 @@ public async System.Threading.Tasks.Task> TransformAsync foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1526,14 +1526,14 @@ public async System.Threading.Tasks.Task> TransformAsync client_.Dispose(); } } - + /// A server side error occurred. /// A server side error occurred. public System.Threading.Tasks.Task> ThrowAsync(System.Guid id) { return ThrowAsync(id, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. /// A server side error occurred. @@ -1541,12 +1541,12 @@ public async System.Threading.Tasks.Task> ThrowAsync(Sys { if (id == null) throw new System.ArgumentNullException("id"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons/Throw?"); urlBuilder_.Append(System.Uri.EscapeDataString("id") + "=").Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1556,14 +1556,14 @@ public async System.Threading.Tasks.Task> ThrowAsync(Sys request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1574,9 +1574,9 @@ public async System.Threading.Tasks.Task> ThrowAsync(Sys foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1620,7 +1620,7 @@ public async System.Threading.Tasks.Task> ThrowAsync(Sys client_.Dispose(); } } - + /// Gets the name of a person. /// The person ID. /// The person's name. @@ -1630,7 +1630,7 @@ public System.Threading.Tasks.Task> GetNameAsync(System. { return GetNameAsync(id, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Gets the name of a person. /// The person ID. @@ -1641,11 +1641,11 @@ public async System.Threading.Tasks.Task> GetNameAsync(S { if (id == null) throw new System.ArgumentNullException("id"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons/{id}/Name"); urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1654,14 +1654,14 @@ public async System.Threading.Tasks.Task> GetNameAsync(S { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1672,9 +1672,9 @@ public async System.Threading.Tasks.Task> GetNameAsync(S foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1718,20 +1718,20 @@ public async System.Threading.Tasks.Task> GetNameAsync(S client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task> AddXmlAsync(string person) { return AddXmlAsync(person, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task> AddXmlAsync(string person, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons/AddXml"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1743,14 +1743,14 @@ public async System.Threading.Tasks.Task> AddXmlAsync(st request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1761,9 +1761,9 @@ public async System.Threading.Tasks.Task> AddXmlAsync(st foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1789,20 +1789,20 @@ public async System.Threading.Tasks.Task> AddXmlAsync(st client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task> UploadAsync(FileParameter data) { return UploadAsync(data, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task> UploadAsync(FileParameter data, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Persons/upload"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -1814,14 +1814,14 @@ public async System.Threading.Tasks.Task> UploadAsync(Fi request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1832,9 +1832,9 @@ public async System.Threading.Tasks.Task> UploadAsync(Fi foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1860,7 +1860,7 @@ public async System.Threading.Tasks.Task> UploadAsync(Fi client_.Dispose(); } } - + protected struct ObjectResponseResult { public ObjectResponseResult(T responseObject, string responseText) @@ -1868,21 +1868,21 @@ public ObjectResponseResult(T responseObject, string responseText) this.Object = responseObject; this.Text = responseText; } - + public T Object { get; } - + public string Text { get; } } - + public bool ReadResponseAsString { get; set; } - + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) { if (response == null || response.Content == null) { return new ObjectResponseResult(default(T), string.Empty); } - + if (ReadResponseAsString) { var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); @@ -1917,14 +1917,14 @@ protected virtual async System.Threading.Tasks.Task> Rea } } } - + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) { if (value == null) { return ""; } - + if (value is System.Enum) { var name = System.Enum.GetName(value.GetType(), value); @@ -1940,7 +1940,7 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu return attribute.Value != null ? attribute.Value : name; } } - + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); return converted == null ? string.Empty : converted; } @@ -1958,33 +1958,33 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu var array = System.Linq.Enumerable.OfType((System.Array) value); return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); } - + var result = System.Convert.ToString(value, cultureInfo); return result == null ? "" : result; } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] internal class JsonExceptionConverter : Newtonsoft.Json.JsonConverter { private readonly Newtonsoft.Json.Serialization.DefaultContractResolver _defaultContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); private readonly System.Collections.Generic.IDictionary _searchedNamespaces; private readonly bool _hideStackTrace = false; - + public JsonExceptionConverter() { _searchedNamespaces = new System.Collections.Generic.Dictionary { { typeof(System.Exception).Namespace, System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(System.Exception)).Assembly } }; } - + public override bool CanWrite => true; - + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) { var exception = value as System.Exception; if (exception != null) { var resolver = serializer.ContractResolver as Newtonsoft.Json.Serialization.DefaultContractResolver ?? _defaultContractResolver; - + var jObject = new Newtonsoft.Json.Linq.JObject(); jObject.Add(resolver.GetResolvedPropertyName("discriminator"), exception.GetType().Name); jObject.Add(resolver.GetResolvedPropertyName("Message"), exception.Message); @@ -1992,7 +1992,7 @@ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, jObject.Add(resolver.GetResolvedPropertyName("Source"), exception.Source); jObject.Add(resolver.GetResolvedPropertyName("InnerException"), exception.InnerException != null ? Newtonsoft.Json.Linq.JToken.FromObject(exception.InnerException, serializer) : null); - + foreach (var property in GetExceptionProperties(value.GetType())) { var propertyValue = property.Key.GetValue(exception); @@ -2002,37 +2002,37 @@ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.Linq.JToken.FromObject(propertyValue, serializer))); } } - + value = jObject; } - + serializer.Serialize(writer, value); } - + public override bool CanConvert(System.Type objectType) { return System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(System.Exception)).IsAssignableFrom(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType)); } - + public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) { var jObject = serializer.Deserialize(reader); if (jObject == null) return null; - + var newSerializer = new Newtonsoft.Json.JsonSerializer(); newSerializer.ContractResolver = (Newtonsoft.Json.Serialization.IContractResolver)System.Activator.CreateInstance(serializer.ContractResolver.GetType()); - + var field = GetField(typeof(Newtonsoft.Json.Serialization.DefaultContractResolver), "_sharedCache"); if (field != null) field.SetValue(newSerializer.ContractResolver, false); - + dynamic resolver = newSerializer.ContractResolver; if (System.Reflection.RuntimeReflectionExtensions.GetRuntimeProperty(newSerializer.ContractResolver.GetType(), "IgnoreSerializableAttribute") != null) resolver.IgnoreSerializableAttribute = true; if (System.Reflection.RuntimeReflectionExtensions.GetRuntimeProperty(newSerializer.ContractResolver.GetType(), "IgnoreSerializableInterface") != null) resolver.IgnoreSerializableInterface = true; - + Newtonsoft.Json.Linq.JToken token; if (jObject.TryGetValue("discriminator", System.StringComparison.OrdinalIgnoreCase, out token)) { @@ -2053,11 +2053,11 @@ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type o break; } } - + } } } - + var value = jObject.ToObject(objectType, newSerializer); foreach (var property in GetExceptionProperties(value.GetType())) { @@ -2072,15 +2072,15 @@ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type o field.SetValue(value, propertyValue); } } - + SetExceptionFieldValue(jObject, "Message", value, "_message", resolver, newSerializer); SetExceptionFieldValue(jObject, "StackTrace", value, "_stackTraceString", resolver, newSerializer); SetExceptionFieldValue(jObject, "Source", value, "_source", resolver, newSerializer); SetExceptionFieldValue(jObject, "InnerException", value, "_innerException", resolver, serializer); - + return value; } - + private System.Reflection.FieldInfo GetField(System.Type type, string fieldName) { var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(type).GetDeclaredField(fieldName); @@ -2088,7 +2088,7 @@ private System.Reflection.FieldInfo GetField(System.Type type, string fieldName) return GetField(System.Reflection.IntrospectionExtensions.GetTypeInfo(type).BaseType, fieldName); return field; } - + private System.Collections.Generic.IDictionary GetExceptionProperties(System.Type exceptionType) { var result = new System.Collections.Generic.Dictionary(); @@ -2097,13 +2097,13 @@ private System.Reflection.FieldInfo GetField(System.Type type, string fieldName) { var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(property); var propertyName = attribute != null ? attribute.PropertyName : property.Name; - + if (!System.Linq.Enumerable.Contains(new[] { "Message", "StackTrace", "Source", "InnerException", "Data", "TargetSite", "HelpLink", "HResult" }, propertyName)) result[property] = propertyName; } return result; } - + private void SetExceptionFieldValue(Newtonsoft.Json.Linq.JObject jObject, string propertyName, object value, string fieldName, Newtonsoft.Json.Serialization.IContractResolver resolver, Newtonsoft.Json.JsonSerializer serializer) { var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(System.Exception)).GetDeclaredField(fieldName); diff --git a/src/NSwag.Integration.ClientPCL/ServiceClientsContracts.cs b/src/NSwag.Integration.ClientPCL/ServiceClientsContracts.cs index dd3966108c..3288afcccb 100644 --- a/src/NSwag.Integration.ClientPCL/ServiceClientsContracts.cs +++ b/src/NSwag.Integration.ClientPCL/ServiceClientsContracts.cs @@ -1,6 +1,6 @@ //---------------------- // -// Generated using the NSwag toolchain v13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org) +// Generated using the NSwag toolchain v (http://NSwag.org) // //---------------------- @@ -19,132 +19,129 @@ namespace NSwag.Integration.ClientPCL.Contracts [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class GeoPoint + public partial class GeoPoint { [Newtonsoft.Json.JsonProperty("Latitude", Required = Newtonsoft.Json.Required.Always)] public double Latitude { get; set; } - + [Newtonsoft.Json.JsonProperty("Longitude", Required = Newtonsoft.Json.Required.Always)] public double Longitude { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class GenericRequestOfAddressAndPerson + public partial class GenericRequestOfAddressAndPerson { [Newtonsoft.Json.JsonProperty("Item1", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public Address Item1 { get; set; } - + [Newtonsoft.Json.JsonProperty("Item2", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public Person Item2 { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Address + public partial class Address { [Newtonsoft.Json.JsonProperty("IsPrimary", Required = Newtonsoft.Json.Required.Always)] public bool IsPrimary { get; set; } - + [Newtonsoft.Json.JsonProperty("City", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string City { get; set; } - - + } - + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "discriminator")] [JsonInheritanceAttribute("Teacher", typeof(Teacher))] [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Person + public partial class Person { [Newtonsoft.Json.JsonProperty("Id", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.Guid Id { get; set; } - + /// Gets or sets the first name. [Newtonsoft.Json.JsonProperty("FirstName", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] [System.ComponentModel.DataAnnotations.StringLength(int.MaxValue, MinimumLength = 2)] public string FirstName { get; set; } - + /// Gets or sets the last name. [Newtonsoft.Json.JsonProperty("LastName", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public string LastName { get; set; } - + [Newtonsoft.Json.JsonProperty("Gender", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public Gender Gender { get; set; } - + [Newtonsoft.Json.JsonProperty("DateOfBirth", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTime DateOfBirth { get; set; } - + [Newtonsoft.Json.JsonProperty("Weight", Required = Newtonsoft.Json.Required.Always)] public decimal Weight { get; set; } - + [Newtonsoft.Json.JsonProperty("Height", Required = Newtonsoft.Json.Required.Always)] public double Height { get; set; } - + [Newtonsoft.Json.JsonProperty("Age", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Range(5, 99)] public int Age { get; set; } - + [Newtonsoft.Json.JsonProperty("AverageSleepTime", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.TimeSpan AverageSleepTime { get; set; } - + [Newtonsoft.Json.JsonProperty("Address", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public Address Address { get; set; } = new Address(); - + [Newtonsoft.Json.JsonProperty("Children", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public System.Collections.ObjectModel.ObservableCollection Children { get; set; } = new System.Collections.ObjectModel.ObservableCollection(); - + [Newtonsoft.Json.JsonProperty("Skills", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public System.Collections.Generic.Dictionary Skills { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum Gender { + [System.Runtime.Serialization.EnumMember(Value = @"Male")] Male = 0, - + [System.Runtime.Serialization.EnumMember(Value = @"Female")] Female = 1, - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum SkillLevel { + Low = 0, - + Medium = 1, - + Height = 2, - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Teacher : Person { [Newtonsoft.Json.JsonProperty("Course", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Course { get; set; } - + [Newtonsoft.Json.JsonProperty("SkillLevel", Required = Newtonsoft.Json.Required.Always)] public SkillLevel SkillLevel { get; set; } = NSwag.Integration.ClientPCL.Contracts.SkillLevel.Medium; - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] [Newtonsoft.Json.JsonObjectAttribute] public partial class PersonNotFoundException : System.Exception @@ -152,10 +149,9 @@ public partial class PersonNotFoundException : System.Exception [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.Guid Id { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple = true)] internal class JsonInheritanceAttribute : System.Attribute @@ -165,41 +161,41 @@ public JsonInheritanceAttribute(string key, System.Type type) Key = key; Type = type; } - + public string Key { get; } - + public System.Type Type { get; } } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] internal class JsonInheritanceConverter : Newtonsoft.Json.JsonConverter { internal static readonly string DefaultDiscriminatorName = "discriminator"; - + private readonly string _discriminator; - + [System.ThreadStatic] private static bool _isReading; - + [System.ThreadStatic] private static bool _isWriting; - + public JsonInheritanceConverter() { _discriminator = DefaultDiscriminatorName; } - + public JsonInheritanceConverter(string discriminator) { _discriminator = discriminator; } - + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) { try { _isWriting = true; - + var jObject = Newtonsoft.Json.Linq.JObject.FromObject(value, serializer); jObject.AddFirst(new Newtonsoft.Json.Linq.JProperty(_discriminator, GetSubtypeDiscriminator(value.GetType()))); writer.WriteToken(jObject.CreateReader()); @@ -209,7 +205,7 @@ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, _isWriting = false; } } - + public override bool CanWrite { get @@ -222,7 +218,7 @@ public override bool CanWrite return true; } } - + public override bool CanRead { get @@ -235,28 +231,28 @@ public override bool CanRead return true; } } - + public override bool CanConvert(System.Type objectType) { return true; } - + public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) { var jObject = serializer.Deserialize(reader); if (jObject == null) return null; - + var discriminatorValue = jObject.GetValue(_discriminator); var discriminator = discriminatorValue != null ? Newtonsoft.Json.Linq.Extensions.Value(discriminatorValue) : null; var subtype = GetObjectSubtype(objectType, discriminator); - + var objectContract = serializer.ContractResolver.ResolveContract(subtype) as Newtonsoft.Json.Serialization.JsonObjectContract; if (objectContract == null || System.Linq.Enumerable.All(objectContract.Properties, p => p.PropertyName != _discriminator)) { jObject.Remove(_discriminator); } - + try { _isReading = true; @@ -267,7 +263,7 @@ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type o _isReading = false; } } - + private System.Type GetObjectSubtype(System.Type objectType, string discriminator) { foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) @@ -275,10 +271,10 @@ private System.Type GetObjectSubtype(System.Type objectType, string discriminato if (attribute.Key == discriminator) return attribute.Type; } - + return objectType; } - + private string GetSubtypeDiscriminator(System.Type objectType) { foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) @@ -286,12 +282,12 @@ private string GetSubtypeDiscriminator(System.Type objectType) if (attribute.Type == objectType) return attribute.Key; } - + return objectType.Name; } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class FileParameter { public FileParameter(System.IO.Stream data) @@ -318,7 +314,7 @@ public FileParameter(System.IO.Stream data, string fileName, string contentType) public string ContentType { get; private set; } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class FileResponse : System.IDisposable { private System.IDisposable _client; @@ -354,7 +350,7 @@ public void Dispose() } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class SwaggerResponse { public int StatusCode { get; private set; } @@ -368,7 +364,7 @@ public SwaggerResponse(int statusCode, System.Collections.Generic.IReadOnlyDicti } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class SwaggerResponse : SwaggerResponse { public TResult Result { get; private set; } @@ -380,7 +376,8 @@ public SwaggerResponse(int statusCode, System.Collections.Generic.IReadOnlyDicti } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class GeoClientException : System.Exception { public int StatusCode { get; private set; } @@ -403,7 +400,7 @@ public override string ToString() } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class GeoClientException : GeoClientException { public TResult Result { get; private set; } @@ -415,7 +412,7 @@ public GeoClientException(string message, int statusCode, string response, Syste } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class PersonsClientException : System.Exception { public int StatusCode { get; private set; } @@ -438,7 +435,7 @@ public override string ToString() } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class PersonsClientException : PersonsClientException { public TResult Result { get; private set; } diff --git a/src/NSwag.Integration.ClientPCL/UberClient.cs b/src/NSwag.Integration.ClientPCL/UberClient.cs index 90607f9b3e..f9d4f3bae0 100644 --- a/src/NSwag.Integration.ClientPCL/UberClient.cs +++ b/src/NSwag.Integration.ClientPCL/UberClient.cs @@ -1,6 +1,6 @@ //---------------------- // -// Generated using the NSwag toolchain v13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org) +// Generated using the NSwag toolchain v (http://NSwag.org) // //---------------------- @@ -16,40 +16,40 @@ namespace Uber { using System = global::System; - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class Client { private string _baseUrl = "https://api.uber.com/v1"; private System.Net.Http.HttpClient _httpClient; private System.Lazy _settings; - + public Client(System.Net.Http.HttpClient httpClient) { _httpClient = httpClient; _settings = new System.Lazy(CreateSerializerSettings); } - + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() { var settings = new Newtonsoft.Json.JsonSerializerSettings(); UpdateJsonSerializerSettings(settings); return settings; } - + public string BaseUrl { get { return _baseUrl; } set { _baseUrl = value; } } - + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } - + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); - - + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + /// Product Types /// Latitude component of location. /// Longitude component of location. @@ -59,7 +59,7 @@ public string BaseUrl { return ProductsAsync(latitude, longitude, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Product Types /// Latitude component of location. @@ -70,16 +70,16 @@ public string BaseUrl { if (latitude == null) throw new System.ArgumentNullException("latitude"); - + if (longitude == null) throw new System.ArgumentNullException("longitude"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/products?"); urlBuilder_.Append(System.Uri.EscapeDataString("latitude") + "=").Append(System.Uri.EscapeDataString(ConvertToString(latitude, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); urlBuilder_.Append(System.Uri.EscapeDataString("longitude") + "=").Append(System.Uri.EscapeDataString(ConvertToString(longitude, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -88,14 +88,14 @@ public string BaseUrl { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -106,9 +106,9 @@ public string BaseUrl foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -142,7 +142,7 @@ public string BaseUrl client_.Dispose(); } } - + /// Price Estimates /// Latitude component of start location. /// Longitude component of start location. @@ -154,7 +154,7 @@ public string BaseUrl { return PriceAsync(start_latitude, start_longitude, end_latitude, end_longitude, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Price Estimates /// Latitude component of start location. @@ -167,16 +167,16 @@ public string BaseUrl { if (start_latitude == null) throw new System.ArgumentNullException("start_latitude"); - + if (start_longitude == null) throw new System.ArgumentNullException("start_longitude"); - + if (end_latitude == null) throw new System.ArgumentNullException("end_latitude"); - + if (end_longitude == null) throw new System.ArgumentNullException("end_longitude"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/estimates/price?"); urlBuilder_.Append(System.Uri.EscapeDataString("start_latitude") + "=").Append(System.Uri.EscapeDataString(ConvertToString(start_latitude, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); @@ -184,7 +184,7 @@ public string BaseUrl urlBuilder_.Append(System.Uri.EscapeDataString("end_latitude") + "=").Append(System.Uri.EscapeDataString(ConvertToString(end_latitude, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); urlBuilder_.Append(System.Uri.EscapeDataString("end_longitude") + "=").Append(System.Uri.EscapeDataString(ConvertToString(end_longitude, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -193,14 +193,14 @@ public string BaseUrl { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -211,9 +211,9 @@ public string BaseUrl foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -247,7 +247,7 @@ public string BaseUrl client_.Dispose(); } } - + /// Time Estimates /// Latitude component of start location. /// Longitude component of start location. @@ -259,7 +259,7 @@ public string BaseUrl { return TimeAsync(start_latitude, start_longitude, customer_uuid, product_id, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Time Estimates /// Latitude component of start location. @@ -272,10 +272,10 @@ public string BaseUrl { if (start_latitude == null) throw new System.ArgumentNullException("start_latitude"); - + if (start_longitude == null) throw new System.ArgumentNullException("start_longitude"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/estimates/time?"); urlBuilder_.Append(System.Uri.EscapeDataString("start_latitude") + "=").Append(System.Uri.EscapeDataString(ConvertToString(start_latitude, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); @@ -289,7 +289,7 @@ public string BaseUrl urlBuilder_.Append(System.Uri.EscapeDataString("product_id") + "=").Append(System.Uri.EscapeDataString(ConvertToString(product_id, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -298,14 +298,14 @@ public string BaseUrl { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -316,9 +316,9 @@ public string BaseUrl foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -352,7 +352,7 @@ public string BaseUrl client_.Dispose(); } } - + /// User Profile /// Profile information for a user /// A server side error occurred. @@ -360,7 +360,7 @@ public System.Threading.Tasks.Task MeAsync() { return MeAsync(System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// User Profile /// Profile information for a user @@ -369,7 +369,7 @@ public async System.Threading.Tasks.Task MeAsync(System.Threading.Cance { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/me"); - + var client_ = _httpClient; var disposeClient_ = false; try @@ -378,14 +378,14 @@ public async System.Threading.Tasks.Task MeAsync(System.Threading.Cance { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -396,9 +396,9 @@ public async System.Threading.Tasks.Task MeAsync(System.Threading.Cance foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -432,7 +432,7 @@ public async System.Threading.Tasks.Task MeAsync(System.Threading.Cance client_.Dispose(); } } - + /// User Activity /// Offset the list of returned results by this amount. Default is zero. /// Number of items to retrieve. Default is 5, maximum is 100. @@ -442,7 +442,7 @@ public System.Threading.Tasks.Task HistoryAsync(int? offset, int? li { return HistoryAsync(offset, limit, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// User Activity /// Offset the list of returned results by this amount. Default is zero. @@ -462,7 +462,7 @@ public async System.Threading.Tasks.Task HistoryAsync(int? offset, i urlBuilder_.Append(System.Uri.EscapeDataString("limit") + "=").Append(System.Uri.EscapeDataString(ConvertToString(limit, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } urlBuilder_.Length--; - + var client_ = _httpClient; var disposeClient_ = false; try @@ -471,14 +471,14 @@ public async System.Threading.Tasks.Task HistoryAsync(int? offset, i { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -489,9 +489,9 @@ public async System.Threading.Tasks.Task HistoryAsync(int? offset, i foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -525,7 +525,7 @@ public async System.Threading.Tasks.Task HistoryAsync(int? offset, i client_.Dispose(); } } - + protected struct ObjectResponseResult { public ObjectResponseResult(T responseObject, string responseText) @@ -533,21 +533,21 @@ public ObjectResponseResult(T responseObject, string responseText) this.Object = responseObject; this.Text = responseText; } - + public T Object { get; } - + public string Text { get; } } - + public bool ReadResponseAsString { get; set; } - + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) { if (response == null || response.Content == null) { return new ObjectResponseResult(default(T), string.Empty); } - + if (ReadResponseAsString) { var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); @@ -582,14 +582,14 @@ protected virtual async System.Threading.Tasks.Task> Rea } } } - + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) { if (value == null) { return ""; } - + if (value is System.Enum) { var name = System.Enum.GetName(value.GetType(), value); @@ -605,7 +605,7 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu return attribute.Value != null ? attribute.Value : name; } } - + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); return converted == null ? string.Empty : converted; } @@ -623,7 +623,7 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu var array = System.Linq.Enumerable.OfType((System.Array) value); return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); } - + var result = System.Convert.ToString(value, cultureInfo); return result == null ? "" : result; } @@ -637,7 +637,7 @@ public partial class Product : System.ComponentModel.INotifyPropertyChanged private string _display_name; private string _capacity; private string _image; - + /// Unique identifier representing a specific product for a given latitude & longitude. For example, uberX in San Francisco will have a different product_id than uberX in Los Angeles. [Newtonsoft.Json.JsonProperty("product_id", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Product_id @@ -652,7 +652,7 @@ public string Product_id } } } - + /// Description of product. [Newtonsoft.Json.JsonProperty("description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Description @@ -667,7 +667,7 @@ public string Description } } } - + /// Display name of product. [Newtonsoft.Json.JsonProperty("display_name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Display_name @@ -682,7 +682,7 @@ public string Display_name } } } - + /// Capacity of product. For example, 4 people. [Newtonsoft.Json.JsonProperty("capacity", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Capacity @@ -697,7 +697,7 @@ public string Capacity } } } - + /// Image URL representing the product. [Newtonsoft.Json.JsonProperty("image", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Image @@ -712,19 +712,17 @@ public string Image } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class PriceEstimate : System.ComponentModel.INotifyPropertyChanged { @@ -735,7 +733,7 @@ public partial class PriceEstimate : System.ComponentModel.INotifyPropertyChange private double? _low_estimate; private double? _high_estimate; private double? _surge_multiplier; - + /// Unique identifier representing a specific product for a given latitude & longitude. For example, uberX in San Francisco will have a different product_id than uberX in Los Angeles [Newtonsoft.Json.JsonProperty("product_id", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Product_id @@ -750,7 +748,7 @@ public string Product_id } } } - + /// [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) currency code. [Newtonsoft.Json.JsonProperty("currency_code", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Currency_code @@ -765,7 +763,7 @@ public string Currency_code } } } - + /// Display name of product. [Newtonsoft.Json.JsonProperty("display_name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Display_name @@ -780,7 +778,7 @@ public string Display_name } } } - + /// Formatted string of estimate in local currency of the start location. Estimate could be a range, a single number (flat rate) or "Metered" for TAXI. [Newtonsoft.Json.JsonProperty("estimate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Estimate @@ -795,7 +793,7 @@ public string Estimate } } } - + /// Lower bound of the estimated price. [Newtonsoft.Json.JsonProperty("low_estimate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public double? Low_estimate @@ -810,7 +808,7 @@ public double? Low_estimate } } } - + /// Upper bound of the estimated price. [Newtonsoft.Json.JsonProperty("high_estimate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public double? High_estimate @@ -825,7 +823,7 @@ public double? High_estimate } } } - + /// Expected surge multiplier. Surge is active if surge_multiplier is greater than 1. Price estimate already factors in the surge multiplier. [Newtonsoft.Json.JsonProperty("surge_multiplier", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public double? Surge_multiplier @@ -840,19 +838,17 @@ public double? Surge_multiplier } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Profile : System.ComponentModel.INotifyPropertyChanged { @@ -861,7 +857,7 @@ public partial class Profile : System.ComponentModel.INotifyPropertyChanged private string _email; private string _picture; private string _promo_code; - + /// First name of the Uber user. [Newtonsoft.Json.JsonProperty("first_name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string First_name @@ -876,7 +872,7 @@ public string First_name } } } - + /// Last name of the Uber user. [Newtonsoft.Json.JsonProperty("last_name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Last_name @@ -891,7 +887,7 @@ public string Last_name } } } - + /// Email address of the Uber user [Newtonsoft.Json.JsonProperty("email", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Email @@ -906,7 +902,7 @@ public string Email } } } - + /// Image URL of the Uber user. [Newtonsoft.Json.JsonProperty("picture", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Picture @@ -921,7 +917,7 @@ public string Picture } } } - + /// Promo code of the Uber user. [Newtonsoft.Json.JsonProperty("promo_code", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Promo_code @@ -936,24 +932,22 @@ public string Promo_code } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Activity : System.ComponentModel.INotifyPropertyChanged { private string _uuid; - + /// Unique identifier for the activity [Newtonsoft.Json.JsonProperty("uuid", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Uuid @@ -968,19 +962,17 @@ public string Uuid } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Activities : System.ComponentModel.INotifyPropertyChanged { @@ -988,7 +980,7 @@ public partial class Activities : System.ComponentModel.INotifyPropertyChanged private int? _limit; private int? _count; private System.Collections.ObjectModel.ObservableCollection _history; - + /// Position in pagination. [Newtonsoft.Json.JsonProperty("offset", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public int? Offset @@ -1003,7 +995,7 @@ public int? Offset } } } - + /// Number of items to retrieve (100 max). [Newtonsoft.Json.JsonProperty("limit", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public int? Limit @@ -1018,7 +1010,7 @@ public int? Limit } } } - + /// Total number of items available. [Newtonsoft.Json.JsonProperty("count", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public int? Count @@ -1033,7 +1025,7 @@ public int? Count } } } - + [Newtonsoft.Json.JsonProperty("history", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public System.Collections.ObjectModel.ObservableCollection History { @@ -1047,26 +1039,24 @@ public System.Collections.ObjectModel.ObservableCollection History } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Error : System.ComponentModel.INotifyPropertyChanged { private int? _code; private string _message; private string _fields; - + [Newtonsoft.Json.JsonProperty("code", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public int? Code { @@ -1080,7 +1070,7 @@ public int? Code } } } - + [Newtonsoft.Json.JsonProperty("message", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Message { @@ -1094,7 +1084,7 @@ public string Message } } } - + [Newtonsoft.Json.JsonProperty("fields", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Fields { @@ -1108,20 +1098,20 @@ public string Fields } } } - - + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; - + protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) { var handler = PropertyChanged; - if (handler != null) + if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } - } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class SwaggerException : System.Exception { public int StatusCode { get; private set; } @@ -1144,7 +1134,7 @@ public override string ToString() } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class SwaggerException : SwaggerException { public TResult Result { get; private set; } diff --git a/src/NSwag.Integration.Console/Controllers.cs b/src/NSwag.Integration.Console/Controllers.cs index a0202e7387..c332785d13 100644 --- a/src/NSwag.Integration.Console/Controllers.cs +++ b/src/NSwag.Integration.Console/Controllers.cs @@ -1,6 +1,6 @@ //---------------------- // -// Generated using the NSwag toolchain v13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org) +// Generated using the NSwag toolchain v (http://NSwag.org) // //---------------------- @@ -18,349 +18,398 @@ namespace MyNamespace { using System = global::System; - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public interface IGeoController { + + + System.Threading.Tasks.Task FromBodyTestAsync(GeoPoint location); - + + + System.Threading.Tasks.Task FromUriTestAsync(double? latitude, double? longitude); - + + System.Threading.Tasks.Task AddPolygonAsync(System.Collections.Generic.IEnumerable points); - + + System.Threading.Tasks.Task FilterAsync(System.Collections.Generic.IEnumerable currentStates); - + + System.Threading.Tasks.Task> ReverseAsync(System.Collections.Generic.IEnumerable values); - + + System.Threading.Tasks.Task RefreshAsync(); - + + System.Threading.Tasks.Task UploadFileAsync(FileParameter file); - + + System.Threading.Tasks.Task UploadFilesAsync(System.Collections.Generic.IEnumerable files); - + + System.Threading.Tasks.Task SaveItemsAsync(GenericRequestOfAddressAndPerson request); - + + + System.Threading.Tasks.Task GetUploadedFileAsync(int id, bool @override); - + + System.Threading.Tasks.Task PostDoubleAsync(double? value); - + } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] + public partial class GeoController : System.Web.Http.ApiController { private IGeoController _implementation; - + public GeoController(IGeoController implementation) { _implementation = implementation; } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Geo/FromBodyTest")] public System.Threading.Tasks.Task FromBodyTest([System.Web.Http.FromBody] GeoPoint location) { + return _implementation.FromBodyTestAsync(location); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Geo/FromUriTest")] public System.Threading.Tasks.Task FromUriTest([System.Web.Http.FromUri] double? latitude, [System.Web.Http.FromUri] double? longitude) { + return _implementation.FromUriTestAsync(latitude, longitude); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Geo/AddPolygon")] public System.Threading.Tasks.Task AddPolygon([System.Web.Http.FromBody] System.Collections.Generic.IEnumerable points) { + return _implementation.AddPolygonAsync(points); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Geo/Filter")] public System.Threading.Tasks.Task Filter([System.Web.Http.FromUri] System.Collections.Generic.IEnumerable currentStates) { + return _implementation.FilterAsync(currentStates); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Geo/Reverse")] public System.Threading.Tasks.Task> Reverse([System.Web.Http.FromUri] System.Collections.Generic.IEnumerable values) { + return _implementation.ReverseAsync(values); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Geo/Refresh")] public System.Threading.Tasks.Task Refresh() { + return _implementation.RefreshAsync(); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Geo/UploadFile")] public System.Threading.Tasks.Task UploadFile(FileParameter file) { + return _implementation.UploadFileAsync(file); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Geo/UploadFiles")] public System.Threading.Tasks.Task UploadFiles(System.Collections.Generic.IEnumerable files) { + return _implementation.UploadFilesAsync(files); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Geo/SaveItems")] public System.Threading.Tasks.Task SaveItems([System.Web.Http.FromBody] GenericRequestOfAddressAndPerson request) { + return _implementation.SaveItemsAsync(request); } - + [System.Web.Http.HttpGet, System.Web.Http.Route("api/Geo/GetUploadedFile/{id}")] public System.Threading.Tasks.Task GetUploadedFile(int id, [System.Web.Http.FromUri(Name = "override")] bool? @override) { + return _implementation.GetUploadedFileAsync(id, @override ?? false); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Geo/PostDouble")] public System.Threading.Tasks.Task PostDouble([System.Web.Http.FromUri] double? value) { + return _implementation.PostDoubleAsync(value); } - + } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public interface IPersonsController { + System.Threading.Tasks.Task> GetAllAsync(); - + + System.Threading.Tasks.Task AddAsync(Person person); - + + System.Threading.Tasks.Task> FindAsync(Gender gender); - + + System.Threading.Tasks.Task> FindOptionalAsync(Gender? gender); - + + System.Threading.Tasks.Task GetAsync(System.Guid id); - + + System.Threading.Tasks.Task DeleteAsync(System.Guid id); - + + System.Threading.Tasks.Task TransformAsync(Person person); - + + System.Threading.Tasks.Task ThrowAsync(System.Guid id); - + /// Gets the name of a person. + /// The person ID. + /// The person's name. + System.Threading.Tasks.Task GetNameAsync(System.Guid id); - + + System.Threading.Tasks.Task AddXmlAsync(string person); - + + System.Threading.Tasks.Task UploadAsync(System.Web.HttpPostedFileBase data); - + } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] + public partial class PersonsController : System.Web.Http.ApiController { private IPersonsController _implementation; - + public PersonsController(IPersonsController implementation) { _implementation = implementation; } - + [System.Web.Http.HttpGet, System.Web.Http.Route("api/Persons")] public System.Threading.Tasks.Task> GetAll() { + return _implementation.GetAllAsync(); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Persons")] public System.Threading.Tasks.Task Add([System.Web.Http.FromBody] Person person) { + return _implementation.AddAsync(person); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Persons/find/{gender}")] public System.Threading.Tasks.Task> Find(Gender gender) { + return _implementation.FindAsync(gender); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Persons/find2")] public System.Threading.Tasks.Task> FindOptional([System.Web.Http.FromUri] Gender? gender) { + return _implementation.FindOptionalAsync(gender); } - + [System.Web.Http.HttpGet, System.Web.Http.Route("api/Persons/{id}")] public System.Threading.Tasks.Task Get(System.Guid id) { + return _implementation.GetAsync(id); } - + [System.Web.Http.HttpDelete, System.Web.Http.Route("api/Persons/{id}")] public System.Threading.Tasks.Task Delete(System.Guid id) { + return _implementation.DeleteAsync(id); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Persons/transform")] public System.Threading.Tasks.Task Transform([System.Web.Http.FromBody] Person person) { + return _implementation.TransformAsync(person); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Persons/Throw")] public System.Threading.Tasks.Task Throw([System.Web.Http.FromUri] System.Guid id) { + return _implementation.ThrowAsync(id); } - + /// Gets the name of a person. /// The person ID. /// The person's name. [System.Web.Http.HttpGet, System.Web.Http.Route("api/Persons/{id}/Name")] public System.Threading.Tasks.Task GetName(System.Guid id) { + return _implementation.GetNameAsync(id); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Persons/AddXml")] public System.Threading.Tasks.Task AddXml([System.Web.Http.FromBody] string person) { + return _implementation.AddXmlAsync(person); } - + [System.Web.Http.HttpPost, System.Web.Http.Route("api/Persons/upload")] public System.Threading.Tasks.Task Upload(System.Web.HttpPostedFileBase data) { + return _implementation.UploadAsync(data); } - + } [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class GeoPoint + public partial class GeoPoint { [Newtonsoft.Json.JsonProperty("Latitude", Required = Newtonsoft.Json.Required.Always)] public double Latitude { get; set; } - + [Newtonsoft.Json.JsonProperty("Longitude", Required = Newtonsoft.Json.Required.Always)] public double Longitude { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class GenericRequestOfAddressAndPerson + public partial class GenericRequestOfAddressAndPerson { [Newtonsoft.Json.JsonProperty("Item1", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public Address Item1 { get; set; } - + [Newtonsoft.Json.JsonProperty("Item2", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public Person Item2 { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Address + public partial class Address { [Newtonsoft.Json.JsonProperty("IsPrimary", Required = Newtonsoft.Json.Required.Always)] public bool IsPrimary { get; set; } - + [Newtonsoft.Json.JsonProperty("City", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string City { get; set; } - - + } - + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "discriminator")] [JsonInheritanceAttribute("Teacher", typeof(Teacher))] [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Person + public partial class Person { [Newtonsoft.Json.JsonProperty("Id", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.Guid Id { get; set; } - + /// Gets or sets the first name. [Newtonsoft.Json.JsonProperty("FirstName", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] [System.ComponentModel.DataAnnotations.StringLength(int.MaxValue, MinimumLength = 2)] public string FirstName { get; set; } - + /// Gets or sets the last name. [Newtonsoft.Json.JsonProperty("LastName", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public string LastName { get; set; } - + [Newtonsoft.Json.JsonProperty("Gender", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public Gender Gender { get; set; } - + [Newtonsoft.Json.JsonProperty("DateOfBirth", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTime DateOfBirth { get; set; } - + [Newtonsoft.Json.JsonProperty("Weight", Required = Newtonsoft.Json.Required.Always)] public decimal Weight { get; set; } - + [Newtonsoft.Json.JsonProperty("Height", Required = Newtonsoft.Json.Required.Always)] public double Height { get; set; } - + [Newtonsoft.Json.JsonProperty("Age", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Range(5, 99)] public int Age { get; set; } - + [Newtonsoft.Json.JsonProperty("AverageSleepTime", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.TimeSpan AverageSleepTime { get; set; } - + [Newtonsoft.Json.JsonProperty("Address", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public Address Address { get; set; } = new Address(); - + [Newtonsoft.Json.JsonProperty("Children", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public System.Collections.Generic.List Children { get; set; } = new System.Collections.Generic.List(); - + [Newtonsoft.Json.JsonProperty("Skills", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public System.Collections.Generic.Dictionary Skills { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum Gender { + [System.Runtime.Serialization.EnumMember(Value = @"Male")] Male = 0, - + [System.Runtime.Serialization.EnumMember(Value = @"Female")] Female = 1, - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum SkillLevel { + Low = 0, - + Medium = 1, - + Height = 2, - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Teacher : Person { [Newtonsoft.Json.JsonProperty("Course", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Course { get; set; } - + [Newtonsoft.Json.JsonProperty("SkillLevel", Required = Newtonsoft.Json.Required.Always)] public SkillLevel SkillLevel { get; set; } = MyNamespace.SkillLevel.Medium; - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] [Newtonsoft.Json.JsonObjectAttribute] public partial class PersonNotFoundException : System.Exception @@ -368,10 +417,9 @@ public partial class PersonNotFoundException : System.Exception [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.Guid Id { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple = true)] internal class JsonInheritanceAttribute : System.Attribute @@ -381,41 +429,41 @@ public JsonInheritanceAttribute(string key, System.Type type) Key = key; Type = type; } - + public string Key { get; } - + public System.Type Type { get; } } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] internal class JsonInheritanceConverter : Newtonsoft.Json.JsonConverter { internal static readonly string DefaultDiscriminatorName = "discriminator"; - + private readonly string _discriminator; - + [System.ThreadStatic] private static bool _isReading; - + [System.ThreadStatic] private static bool _isWriting; - + public JsonInheritanceConverter() { _discriminator = DefaultDiscriminatorName; } - + public JsonInheritanceConverter(string discriminator) { _discriminator = discriminator; } - + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) { try { _isWriting = true; - + var jObject = Newtonsoft.Json.Linq.JObject.FromObject(value, serializer); jObject.AddFirst(new Newtonsoft.Json.Linq.JProperty(_discriminator, GetSubtypeDiscriminator(value.GetType()))); writer.WriteToken(jObject.CreateReader()); @@ -425,7 +473,7 @@ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, _isWriting = false; } } - + public override bool CanWrite { get @@ -438,7 +486,7 @@ public override bool CanWrite return true; } } - + public override bool CanRead { get @@ -451,28 +499,28 @@ public override bool CanRead return true; } } - + public override bool CanConvert(System.Type objectType) { return true; } - + public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) { var jObject = serializer.Deserialize(reader); if (jObject == null) return null; - + var discriminatorValue = jObject.GetValue(_discriminator); var discriminator = discriminatorValue != null ? Newtonsoft.Json.Linq.Extensions.Value(discriminatorValue) : null; var subtype = GetObjectSubtype(objectType, discriminator); - + var objectContract = serializer.ContractResolver.ResolveContract(subtype) as Newtonsoft.Json.Serialization.JsonObjectContract; if (objectContract == null || System.Linq.Enumerable.All(objectContract.Properties, p => p.PropertyName != _discriminator)) { jObject.Remove(_discriminator); } - + try { _isReading = true; @@ -483,7 +531,7 @@ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type o _isReading = false; } } - + private System.Type GetObjectSubtype(System.Type objectType, string discriminator) { foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) @@ -491,10 +539,10 @@ private System.Type GetObjectSubtype(System.Type objectType, string discriminato if (attribute.Key == discriminator) return attribute.Type; } - + return objectType; } - + private string GetSubtypeDiscriminator(System.Type objectType) { foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) @@ -502,12 +550,12 @@ private string GetSubtypeDiscriminator(System.Type objectType) if (attribute.Type == objectType) return attribute.Key; } - + return objectType.Name; } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class FileParameter { public FileParameter(System.IO.Stream data) @@ -534,7 +582,7 @@ public FileParameter(System.IO.Stream data, string fileName, string contentType) public string ContentType { get; private set; } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class FileResponse : System.IDisposable { private System.IDisposable _client; @@ -570,27 +618,27 @@ public void Dispose() } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] internal class JsonExceptionConverter : Newtonsoft.Json.JsonConverter { private readonly Newtonsoft.Json.Serialization.DefaultContractResolver _defaultContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); private readonly System.Collections.Generic.IDictionary _searchedNamespaces; private readonly bool _hideStackTrace = false; - + public JsonExceptionConverter() { _searchedNamespaces = new System.Collections.Generic.Dictionary { { typeof(System.Exception).Namespace, System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(System.Exception)).Assembly } }; } - + public override bool CanWrite => true; - + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) { var exception = value as System.Exception; if (exception != null) { var resolver = serializer.ContractResolver as Newtonsoft.Json.Serialization.DefaultContractResolver ?? _defaultContractResolver; - + var jObject = new Newtonsoft.Json.Linq.JObject(); jObject.Add(resolver.GetResolvedPropertyName("discriminator"), exception.GetType().Name); jObject.Add(resolver.GetResolvedPropertyName("Message"), exception.Message); @@ -598,7 +646,7 @@ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, jObject.Add(resolver.GetResolvedPropertyName("Source"), exception.Source); jObject.Add(resolver.GetResolvedPropertyName("InnerException"), exception.InnerException != null ? Newtonsoft.Json.Linq.JToken.FromObject(exception.InnerException, serializer) : null); - + foreach (var property in GetExceptionProperties(value.GetType())) { var propertyValue = property.Key.GetValue(exception); @@ -608,37 +656,37 @@ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.Linq.JToken.FromObject(propertyValue, serializer))); } } - + value = jObject; } - + serializer.Serialize(writer, value); } - + public override bool CanConvert(System.Type objectType) { return System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(System.Exception)).IsAssignableFrom(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType)); } - + public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) { var jObject = serializer.Deserialize(reader); if (jObject == null) return null; - + var newSerializer = new Newtonsoft.Json.JsonSerializer(); newSerializer.ContractResolver = (Newtonsoft.Json.Serialization.IContractResolver)System.Activator.CreateInstance(serializer.ContractResolver.GetType()); - + var field = GetField(typeof(Newtonsoft.Json.Serialization.DefaultContractResolver), "_sharedCache"); if (field != null) field.SetValue(newSerializer.ContractResolver, false); - + dynamic resolver = newSerializer.ContractResolver; if (System.Reflection.RuntimeReflectionExtensions.GetRuntimeProperty(newSerializer.ContractResolver.GetType(), "IgnoreSerializableAttribute") != null) resolver.IgnoreSerializableAttribute = true; if (System.Reflection.RuntimeReflectionExtensions.GetRuntimeProperty(newSerializer.ContractResolver.GetType(), "IgnoreSerializableInterface") != null) resolver.IgnoreSerializableInterface = true; - + Newtonsoft.Json.Linq.JToken token; if (jObject.TryGetValue("discriminator", System.StringComparison.OrdinalIgnoreCase, out token)) { @@ -659,11 +707,11 @@ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type o break; } } - + } } } - + var value = jObject.ToObject(objectType, newSerializer); foreach (var property in GetExceptionProperties(value.GetType())) { @@ -678,15 +726,15 @@ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type o field.SetValue(value, propertyValue); } } - + SetExceptionFieldValue(jObject, "Message", value, "_message", resolver, newSerializer); SetExceptionFieldValue(jObject, "StackTrace", value, "_stackTraceString", resolver, newSerializer); SetExceptionFieldValue(jObject, "Source", value, "_source", resolver, newSerializer); SetExceptionFieldValue(jObject, "InnerException", value, "_innerException", resolver, serializer); - + return value; } - + private System.Reflection.FieldInfo GetField(System.Type type, string fieldName) { var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(type).GetDeclaredField(fieldName); @@ -694,7 +742,7 @@ private System.Reflection.FieldInfo GetField(System.Type type, string fieldName) return GetField(System.Reflection.IntrospectionExtensions.GetTypeInfo(type).BaseType, fieldName); return field; } - + private System.Collections.Generic.IDictionary GetExceptionProperties(System.Type exceptionType) { var result = new System.Collections.Generic.Dictionary(); @@ -703,13 +751,13 @@ private System.Reflection.FieldInfo GetField(System.Type type, string fieldName) { var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(property); var propertyName = attribute != null ? attribute.PropertyName : property.Name; - + if (!System.Linq.Enumerable.Contains(new[] { "Message", "StackTrace", "Source", "InnerException", "Data", "TargetSite", "HelpLink", "HResult" }, propertyName)) result[property] = propertyName; } return result; } - + private void SetExceptionFieldValue(Newtonsoft.Json.Linq.JObject jObject, string propertyName, object value, string fieldName, Newtonsoft.Json.Serialization.IContractResolver resolver, Newtonsoft.Json.JsonSerializer serializer) { var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(System.Exception)).GetDeclaredField(fieldName); diff --git a/src/NSwag.Integration.Console/ServiceClients.cs b/src/NSwag.Integration.Console/ServiceClients.cs index c024210b76..078d3dc2db 100644 --- a/src/NSwag.Integration.Console/ServiceClients.cs +++ b/src/NSwag.Integration.Console/ServiceClients.cs @@ -1,6 +1,6 @@ //---------------------- // -// Generated using the NSwag toolchain v13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org) +// Generated using the NSwag toolchain v (http://NSwag.org) // //---------------------- @@ -18,44 +18,44 @@ namespace NSwag.Integration.Console { using System = global::System; - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class GeoClient { private System.Lazy _settings; - + public GeoClient() { _settings = new System.Lazy(CreateSerializerSettings); } - + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() { var settings = new Newtonsoft.Json.JsonSerializerSettings { Converters = new Newtonsoft.Json.JsonConverter[] { new Newtonsoft.Json.Converters.StringEnumConverter(), new JsonExceptionConverter() } }; UpdateJsonSerializerSettings(settings); return settings; } - + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } - + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); - - + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + /// A server side error occurred. public System.Threading.Tasks.Task FromBodyTestAsync(GeoPoint location) { return FromBodyTestAsync(location, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task FromBodyTestAsync(GeoPoint location, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Geo/FromBodyTest"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -66,14 +66,14 @@ public async System.Threading.Tasks.Task FromBodyTestAsync(GeoPoint location, Sy content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -84,9 +84,9 @@ public async System.Threading.Tasks.Task FromBodyTestAsync(GeoPoint location, Sy foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -111,13 +111,13 @@ public async System.Threading.Tasks.Task FromBodyTestAsync(GeoPoint location, Sy client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task FromUriTestAsync(double? latitude, double? longitude) { return FromUriTestAsync(latitude, longitude, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task FromUriTestAsync(double? latitude, double? longitude, System.Threading.CancellationToken cancellationToken) @@ -133,7 +133,7 @@ public async System.Threading.Tasks.Task FromUriTestAsync(double? latitude, doub urlBuilder_.Append(System.Uri.EscapeDataString("Longitude") + "=").Append(System.Uri.EscapeDataString(ConvertToString(longitude, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } urlBuilder_.Length--; - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -142,14 +142,14 @@ public async System.Threading.Tasks.Task FromUriTestAsync(double? latitude, doub { request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -160,9 +160,9 @@ public async System.Threading.Tasks.Task FromUriTestAsync(double? latitude, doub foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -187,20 +187,20 @@ public async System.Threading.Tasks.Task FromUriTestAsync(double? latitude, doub client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task AddPolygonAsync(System.Collections.Generic.IEnumerable points) { return AddPolygonAsync(points, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task AddPolygonAsync(System.Collections.Generic.IEnumerable points, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Geo/AddPolygon"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -211,14 +211,14 @@ public async System.Threading.Tasks.Task AddPolygonAsync(System.Collections.Gene content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -229,9 +229,9 @@ public async System.Threading.Tasks.Task AddPolygonAsync(System.Collections.Gene foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -256,13 +256,13 @@ public async System.Threading.Tasks.Task AddPolygonAsync(System.Collections.Gene client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task FilterAsync(System.Collections.Generic.IEnumerable currentStates) { return FilterAsync(currentStates, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task FilterAsync(System.Collections.Generic.IEnumerable currentStates, System.Threading.CancellationToken cancellationToken) @@ -274,7 +274,7 @@ public async System.Threading.Tasks.Task FilterAsync(System.Collections.Generic. foreach (var item_ in currentStates) { urlBuilder_.Append(System.Uri.EscapeDataString("currentStates") + "=").Append(System.Uri.EscapeDataString(ConvertToString(item_, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } } urlBuilder_.Length--; - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -283,14 +283,14 @@ public async System.Threading.Tasks.Task FilterAsync(System.Collections.Generic. { request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -301,9 +301,9 @@ public async System.Threading.Tasks.Task FilterAsync(System.Collections.Generic. foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -328,13 +328,13 @@ public async System.Threading.Tasks.Task FilterAsync(System.Collections.Generic. client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task> ReverseAsync(System.Collections.Generic.IEnumerable values) { return ReverseAsync(values, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task> ReverseAsync(System.Collections.Generic.IEnumerable values, System.Threading.CancellationToken cancellationToken) @@ -346,7 +346,7 @@ public async System.Threading.Tasks.Task FilterAsync(System.Collections.Generic. foreach (var item_ in values) { urlBuilder_.Append(System.Uri.EscapeDataString("values") + "=").Append(System.Uri.EscapeDataString(ConvertToString(item_, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } } urlBuilder_.Length--; - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -356,14 +356,14 @@ public async System.Threading.Tasks.Task FilterAsync(System.Collections.Generic. request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -374,9 +374,9 @@ public async System.Threading.Tasks.Task FilterAsync(System.Collections.Generic. foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -402,20 +402,20 @@ public async System.Threading.Tasks.Task FilterAsync(System.Collections.Generic. client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task RefreshAsync() { return RefreshAsync(System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task RefreshAsync(System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Geo/Refresh"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -424,14 +424,14 @@ public async System.Threading.Tasks.Task RefreshAsync(System.Threading.Cancellat { request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -442,9 +442,9 @@ public async System.Threading.Tasks.Task RefreshAsync(System.Threading.Cancellat foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -469,20 +469,20 @@ public async System.Threading.Tasks.Task RefreshAsync(System.Threading.Cancellat client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task UploadFileAsync(FileParameter file) { return UploadFileAsync(file, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task UploadFileAsync(FileParameter file, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Geo/UploadFile"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -493,6 +493,7 @@ public async System.Threading.Tasks.Task UploadFileAsync(FileParameter fil var content_ = new System.Net.Http.MultipartFormDataContent(boundary_); content_.Headers.Remove("Content-Type"); content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_); + if (file != null) { var content_file_ = new System.Net.Http.StreamContent(file.Data); @@ -503,14 +504,14 @@ public async System.Threading.Tasks.Task UploadFileAsync(FileParameter fil request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -521,9 +522,9 @@ public async System.Threading.Tasks.Task UploadFileAsync(FileParameter fil foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -553,20 +554,20 @@ public async System.Threading.Tasks.Task UploadFileAsync(FileParameter fil client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task UploadFilesAsync(System.Collections.Generic.IEnumerable files) { return UploadFilesAsync(files, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task UploadFilesAsync(System.Collections.Generic.IEnumerable files, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Geo/UploadFiles"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -577,6 +578,7 @@ public async System.Threading.Tasks.Task UploadFilesAsync(System.Collections.Gen var content_ = new System.Net.Http.MultipartFormDataContent(boundary_); content_.Headers.Remove("Content-Type"); content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_); + if (files != null) { foreach (var item_ in files) @@ -589,14 +591,14 @@ public async System.Threading.Tasks.Task UploadFilesAsync(System.Collections.Gen } request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -607,9 +609,9 @@ public async System.Threading.Tasks.Task UploadFilesAsync(System.Collections.Gen foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -634,14 +636,14 @@ public async System.Threading.Tasks.Task UploadFilesAsync(System.Collections.Gen client_.Dispose(); } } - + /// A server side error occurred. /// A custom error occured. public System.Threading.Tasks.Task SaveItemsAsync(GenericRequestOfAddressAndPerson request) { return SaveItemsAsync(request, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. /// A custom error occured. @@ -649,7 +651,7 @@ public async System.Threading.Tasks.Task SaveItemsAsync(GenericRequestOfAddressA { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Geo/SaveItems"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -660,14 +662,14 @@ public async System.Threading.Tasks.Task SaveItemsAsync(GenericRequestOfAddressA content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -678,9 +680,9 @@ public async System.Threading.Tasks.Task SaveItemsAsync(GenericRequestOfAddressA foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -719,20 +721,20 @@ public async System.Threading.Tasks.Task SaveItemsAsync(GenericRequestOfAddressA client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task GetUploadedFileAsync(int id, bool? @override) { return GetUploadedFileAsync(id, @override, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task GetUploadedFileAsync(int id, bool? @override, System.Threading.CancellationToken cancellationToken) { if (id == null) throw new System.ArgumentNullException("id"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Geo/GetUploadedFile/{id}?"); urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); @@ -741,7 +743,7 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int urlBuilder_.Append(System.Uri.EscapeDataString("override") + "=").Append(System.Uri.EscapeDataString(ConvertToString(@override, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } urlBuilder_.Length--; - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -750,14 +752,14 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -768,14 +770,14 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200 || status_ == 206) { var responseStream_ = response_.Content == null ? System.IO.Stream.Null : await response_.Content.ReadAsStreamAsync().ConfigureAwait(false); - var fileResponse_ = new FileResponse(status_, headers_, responseStream_, client_, response_); + var fileResponse_ = new FileResponse(status_, headers_, responseStream_, client_, response_); disposeClient_ = false; disposeResponse_ = false; // response and client are disposed by FileResponse return fileResponse_; } @@ -798,13 +800,13 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task PostDoubleAsync(double? value) { return PostDoubleAsync(value, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task PostDoubleAsync(double? value, System.Threading.CancellationToken cancellationToken) @@ -816,7 +818,7 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int urlBuilder_.Append(System.Uri.EscapeDataString("value") + "=").Append(System.Uri.EscapeDataString(ConvertToString(value, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); } urlBuilder_.Length--; - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -826,14 +828,14 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -844,9 +846,9 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -872,7 +874,7 @@ public async System.Threading.Tasks.Task GetUploadedFileAsync(int client_.Dispose(); } } - + protected struct ObjectResponseResult { public ObjectResponseResult(T responseObject, string responseText) @@ -880,21 +882,21 @@ public ObjectResponseResult(T responseObject, string responseText) this.Object = responseObject; this.Text = responseText; } - + public T Object { get; } - + public string Text { get; } } - + public bool ReadResponseAsString { get; set; } - + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) { if (response == null || response.Content == null) { return new ObjectResponseResult(default(T), string.Empty); } - + if (ReadResponseAsString) { var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); @@ -929,14 +931,14 @@ protected virtual async System.Threading.Tasks.Task> Rea } } } - + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) { if (value == null) { return ""; } - + if (value is System.Enum) { var name = System.Enum.GetName(value.GetType(), value); @@ -952,7 +954,7 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu return attribute.Value != null ? attribute.Value : name; } } - + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); return converted == null ? string.Empty : converted; } @@ -970,50 +972,50 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu var array = System.Linq.Enumerable.OfType((System.Array) value); return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); } - + var result = System.Convert.ToString(value, cultureInfo); return result == null ? "" : result; } } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class PersonsClient { private System.Lazy _settings; - + public PersonsClient() { _settings = new System.Lazy(CreateSerializerSettings); } - + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() { var settings = new Newtonsoft.Json.JsonSerializerSettings { Converters = new Newtonsoft.Json.JsonConverter[] { new Newtonsoft.Json.Converters.StringEnumConverter(), new JsonExceptionConverter() } }; UpdateJsonSerializerSettings(settings); return settings; } - + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } - + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); - - + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + /// A server side error occurred. public System.Threading.Tasks.Task> GetAllAsync() { return GetAllAsync(System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task> GetAllAsync(System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Persons"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1022,14 +1024,14 @@ private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1040,9 +1042,9 @@ private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1068,20 +1070,20 @@ private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task AddAsync(Person person) { return AddAsync(person, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task AddAsync(Person person, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Persons"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1092,14 +1094,14 @@ public async System.Threading.Tasks.Task AddAsync(Person person, System.Threadin content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1110,9 +1112,9 @@ public async System.Threading.Tasks.Task AddAsync(Person person, System.Threadin foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -1137,24 +1139,24 @@ public async System.Threading.Tasks.Task AddAsync(Person person, System.Threadin client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task> FindAsync(Gender gender) { return FindAsync(gender, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task> FindAsync(Gender gender, System.Threading.CancellationToken cancellationToken) { if (gender == null) throw new System.ArgumentNullException("gender"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Persons/find/{gender}"); urlBuilder_.Replace("{gender}", System.Uri.EscapeDataString(ConvertToString(gender, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1164,14 +1166,14 @@ public async System.Threading.Tasks.Task AddAsync(Person person, System.Threadin request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1182,9 +1184,9 @@ public async System.Threading.Tasks.Task AddAsync(Person person, System.Threadin foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1210,13 +1212,13 @@ public async System.Threading.Tasks.Task AddAsync(Person person, System.Threadin client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task> FindOptionalAsync(Gender? gender) { return FindOptionalAsync(gender, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task> FindOptionalAsync(Gender? gender, System.Threading.CancellationToken cancellationToken) @@ -1225,7 +1227,7 @@ public async System.Threading.Tasks.Task AddAsync(Person person, System.Threadin urlBuilder_.Append("api/Persons/find2?"); urlBuilder_.Append(System.Uri.EscapeDataString("gender") + "=").Append(System.Uri.EscapeDataString(gender != null ? ConvertToString(gender, System.Globalization.CultureInfo.InvariantCulture) : "")).Append("&"); urlBuilder_.Length--; - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1235,14 +1237,14 @@ public async System.Threading.Tasks.Task AddAsync(Person person, System.Threadin request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1253,9 +1255,9 @@ public async System.Threading.Tasks.Task AddAsync(Person person, System.Threadin foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1281,14 +1283,14 @@ public async System.Threading.Tasks.Task AddAsync(Person person, System.Threadin client_.Dispose(); } } - + /// A server side error occurred. /// A server side error occurred. public System.Threading.Tasks.Task GetAsync(System.Guid id) { return GetAsync(id, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. /// A server side error occurred. @@ -1296,11 +1298,11 @@ public async System.Threading.Tasks.Task GetAsync(System.Guid id, System { if (id == null) throw new System.ArgumentNullException("id"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Persons/{id}"); urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1309,14 +1311,14 @@ public async System.Threading.Tasks.Task GetAsync(System.Guid id, System { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1327,9 +1329,9 @@ public async System.Threading.Tasks.Task GetAsync(System.Guid id, System foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 500) { @@ -1369,24 +1371,24 @@ public async System.Threading.Tasks.Task GetAsync(System.Guid id, System client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task DeleteAsync(System.Guid id) { return DeleteAsync(id, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) { if (id == null) throw new System.ArgumentNullException("id"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Persons/{id}"); urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1394,14 +1396,14 @@ public async System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Thre using (var request_ = new System.Net.Http.HttpRequestMessage()) { request_.Method = new System.Net.Http.HttpMethod("DELETE"); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1412,9 +1414,9 @@ public async System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Thre foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 204) { @@ -1439,20 +1441,20 @@ public async System.Threading.Tasks.Task DeleteAsync(System.Guid id, System.Thre client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task TransformAsync(Person person) { return TransformAsync(person, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task TransformAsync(Person person, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Persons/transform"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1464,14 +1466,14 @@ public async System.Threading.Tasks.Task TransformAsync(Person person, S request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1482,9 +1484,9 @@ public async System.Threading.Tasks.Task TransformAsync(Person person, S foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1510,14 +1512,14 @@ public async System.Threading.Tasks.Task TransformAsync(Person person, S client_.Dispose(); } } - + /// A server side error occurred. /// A server side error occurred. public System.Threading.Tasks.Task ThrowAsync(System.Guid id) { return ThrowAsync(id, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. /// A server side error occurred. @@ -1525,12 +1527,12 @@ public async System.Threading.Tasks.Task ThrowAsync(System.Guid id, Syst { if (id == null) throw new System.ArgumentNullException("id"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Persons/Throw?"); urlBuilder_.Append(System.Uri.EscapeDataString("id") + "=").Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); urlBuilder_.Length--; - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1540,14 +1542,14 @@ public async System.Threading.Tasks.Task ThrowAsync(System.Guid id, Syst request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1558,9 +1560,9 @@ public async System.Threading.Tasks.Task ThrowAsync(System.Guid id, Syst foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1604,7 +1606,7 @@ public async System.Threading.Tasks.Task ThrowAsync(System.Guid id, Syst client_.Dispose(); } } - + /// Gets the name of a person. /// The person ID. /// The person's name. @@ -1614,7 +1616,7 @@ public System.Threading.Tasks.Task GetNameAsync(System.Guid id) { return GetNameAsync(id, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Gets the name of a person. /// The person ID. @@ -1625,11 +1627,11 @@ public async System.Threading.Tasks.Task GetNameAsync(System.Guid id, Sy { if (id == null) throw new System.ArgumentNullException("id"); - + var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Persons/{id}/Name"); urlBuilder_.Replace("{id}", System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1638,14 +1640,14 @@ public async System.Threading.Tasks.Task GetNameAsync(System.Guid id, Sy { request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1656,9 +1658,9 @@ public async System.Threading.Tasks.Task GetNameAsync(System.Guid id, Sy foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1702,20 +1704,20 @@ public async System.Threading.Tasks.Task GetNameAsync(System.Guid id, Sy client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task AddXmlAsync(string person) { return AddXmlAsync(person, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task AddXmlAsync(string person, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Persons/AddXml"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1727,14 +1729,14 @@ public async System.Threading.Tasks.Task AddXmlAsync(string person, Syst request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1745,9 +1747,9 @@ public async System.Threading.Tasks.Task AddXmlAsync(string person, Syst foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1773,20 +1775,20 @@ public async System.Threading.Tasks.Task AddXmlAsync(string person, Syst client_.Dispose(); } } - + /// A server side error occurred. public System.Threading.Tasks.Task UploadAsync(FileParameter data) { return UploadAsync(data, System.Threading.CancellationToken.None); } - + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// A server side error occurred. public async System.Threading.Tasks.Task UploadAsync(FileParameter data, System.Threading.CancellationToken cancellationToken) { var urlBuilder_ = new System.Text.StringBuilder(); urlBuilder_.Append("api/Persons/upload"); - + var client_ = new System.Net.Http.HttpClient(); var disposeClient_ = true; try @@ -1798,14 +1800,14 @@ public async System.Threading.Tasks.Task UploadAsync(FileParameter data, request_.Content = content_; request_.Method = new System.Net.Http.HttpMethod("POST"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - + PrepareRequest(client_, request_, urlBuilder_); - + var url_ = urlBuilder_.ToString(); request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - + PrepareRequest(client_, request_, url_); - + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); var disposeResponse_ = true; try @@ -1816,9 +1818,9 @@ public async System.Threading.Tasks.Task UploadAsync(FileParameter data, foreach (var item_ in response_.Content.Headers) headers_[item_.Key] = item_.Value; } - + ProcessResponse(client_, response_); - + var status_ = (int)response_.StatusCode; if (status_ == 200) { @@ -1844,7 +1846,7 @@ public async System.Threading.Tasks.Task UploadAsync(FileParameter data, client_.Dispose(); } } - + protected struct ObjectResponseResult { public ObjectResponseResult(T responseObject, string responseText) @@ -1852,21 +1854,21 @@ public ObjectResponseResult(T responseObject, string responseText) this.Object = responseObject; this.Text = responseText; } - + public T Object { get; } - + public string Text { get; } } - + public bool ReadResponseAsString { get; set; } - + protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) { if (response == null || response.Content == null) { return new ObjectResponseResult(default(T), string.Empty); } - + if (ReadResponseAsString) { var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); @@ -1901,14 +1903,14 @@ protected virtual async System.Threading.Tasks.Task> Rea } } } - + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) { if (value == null) { return ""; } - + if (value is System.Enum) { var name = System.Enum.GetName(value.GetType(), value); @@ -1924,7 +1926,7 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu return attribute.Value != null ? attribute.Value : name; } } - + var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); return converted == null ? string.Empty : converted; } @@ -1942,33 +1944,33 @@ private string ConvertToString(object value, System.Globalization.CultureInfo cu var array = System.Linq.Enumerable.OfType((System.Array) value); return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); } - + var result = System.Convert.ToString(value, cultureInfo); return result == null ? "" : result; } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] internal class JsonExceptionConverter : Newtonsoft.Json.JsonConverter { private readonly Newtonsoft.Json.Serialization.DefaultContractResolver _defaultContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); private readonly System.Collections.Generic.IDictionary _searchedNamespaces; private readonly bool _hideStackTrace = false; - + public JsonExceptionConverter() { _searchedNamespaces = new System.Collections.Generic.Dictionary { { typeof(System.Exception).Namespace, System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(System.Exception)).Assembly } }; } - + public override bool CanWrite => true; - + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) { var exception = value as System.Exception; if (exception != null) { var resolver = serializer.ContractResolver as Newtonsoft.Json.Serialization.DefaultContractResolver ?? _defaultContractResolver; - + var jObject = new Newtonsoft.Json.Linq.JObject(); jObject.Add(resolver.GetResolvedPropertyName("discriminator"), exception.GetType().Name); jObject.Add(resolver.GetResolvedPropertyName("Message"), exception.Message); @@ -1976,7 +1978,7 @@ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, jObject.Add(resolver.GetResolvedPropertyName("Source"), exception.Source); jObject.Add(resolver.GetResolvedPropertyName("InnerException"), exception.InnerException != null ? Newtonsoft.Json.Linq.JToken.FromObject(exception.InnerException, serializer) : null); - + foreach (var property in GetExceptionProperties(value.GetType())) { var propertyValue = property.Key.GetValue(exception); @@ -1986,37 +1988,37 @@ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.Linq.JToken.FromObject(propertyValue, serializer))); } } - + value = jObject; } - + serializer.Serialize(writer, value); } - + public override bool CanConvert(System.Type objectType) { return System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(System.Exception)).IsAssignableFrom(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType)); } - + public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) { var jObject = serializer.Deserialize(reader); if (jObject == null) return null; - + var newSerializer = new Newtonsoft.Json.JsonSerializer(); newSerializer.ContractResolver = (Newtonsoft.Json.Serialization.IContractResolver)System.Activator.CreateInstance(serializer.ContractResolver.GetType()); - + var field = GetField(typeof(Newtonsoft.Json.Serialization.DefaultContractResolver), "_sharedCache"); if (field != null) field.SetValue(newSerializer.ContractResolver, false); - + dynamic resolver = newSerializer.ContractResolver; if (System.Reflection.RuntimeReflectionExtensions.GetRuntimeProperty(newSerializer.ContractResolver.GetType(), "IgnoreSerializableAttribute") != null) resolver.IgnoreSerializableAttribute = true; if (System.Reflection.RuntimeReflectionExtensions.GetRuntimeProperty(newSerializer.ContractResolver.GetType(), "IgnoreSerializableInterface") != null) resolver.IgnoreSerializableInterface = true; - + Newtonsoft.Json.Linq.JToken token; if (jObject.TryGetValue("discriminator", System.StringComparison.OrdinalIgnoreCase, out token)) { @@ -2037,11 +2039,11 @@ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type o break; } } - + } } } - + var value = jObject.ToObject(objectType, newSerializer); foreach (var property in GetExceptionProperties(value.GetType())) { @@ -2056,15 +2058,15 @@ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type o field.SetValue(value, propertyValue); } } - + SetExceptionFieldValue(jObject, "Message", value, "_message", resolver, newSerializer); SetExceptionFieldValue(jObject, "StackTrace", value, "_stackTraceString", resolver, newSerializer); SetExceptionFieldValue(jObject, "Source", value, "_source", resolver, newSerializer); SetExceptionFieldValue(jObject, "InnerException", value, "_innerException", resolver, serializer); - + return value; } - + private System.Reflection.FieldInfo GetField(System.Type type, string fieldName) { var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(type).GetDeclaredField(fieldName); @@ -2072,7 +2074,7 @@ private System.Reflection.FieldInfo GetField(System.Type type, string fieldName) return GetField(System.Reflection.IntrospectionExtensions.GetTypeInfo(type).BaseType, fieldName); return field; } - + private System.Collections.Generic.IDictionary GetExceptionProperties(System.Type exceptionType) { var result = new System.Collections.Generic.Dictionary(); @@ -2081,13 +2083,13 @@ private System.Reflection.FieldInfo GetField(System.Type type, string fieldName) { var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(property); var propertyName = attribute != null ? attribute.PropertyName : property.Name; - + if (!System.Linq.Enumerable.Contains(new[] { "Message", "StackTrace", "Source", "InnerException", "Data", "TargetSite", "HelpLink", "HResult" }, propertyName)) result[property] = propertyName; } return result; } - + private void SetExceptionFieldValue(Newtonsoft.Json.Linq.JObject jObject, string propertyName, object value, string fieldName, Newtonsoft.Json.Serialization.IContractResolver resolver, Newtonsoft.Json.JsonSerializer serializer) { var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(System.Exception)).GetDeclaredField(fieldName); diff --git a/src/NSwag.Integration.Console/ServiceClientsContracts.cs b/src/NSwag.Integration.Console/ServiceClientsContracts.cs index e7abbb780b..b6cc92e06c 100644 --- a/src/NSwag.Integration.Console/ServiceClientsContracts.cs +++ b/src/NSwag.Integration.Console/ServiceClientsContracts.cs @@ -1,6 +1,6 @@ //---------------------- // -// Generated using the NSwag toolchain v13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org) +// Generated using the NSwag toolchain v (http://NSwag.org) // //---------------------- @@ -19,132 +19,129 @@ namespace NSwag.Integration.Console.Contracts [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class GeoPoint + public partial class GeoPoint { [Newtonsoft.Json.JsonProperty("Latitude", Required = Newtonsoft.Json.Required.Always)] public double Latitude { get; set; } - + [Newtonsoft.Json.JsonProperty("Longitude", Required = Newtonsoft.Json.Required.Always)] public double Longitude { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class GenericRequestOfAddressAndPerson + public partial class GenericRequestOfAddressAndPerson { [Newtonsoft.Json.JsonProperty("Item1", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public Address Item1 { get; set; } - + [Newtonsoft.Json.JsonProperty("Item2", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public Person Item2 { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Address + public partial class Address { [Newtonsoft.Json.JsonProperty("IsPrimary", Required = Newtonsoft.Json.Required.Always)] public bool IsPrimary { get; set; } - + [Newtonsoft.Json.JsonProperty("City", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string City { get; set; } - - + } - + [Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "discriminator")] [JsonInheritanceAttribute("Teacher", typeof(Teacher))] [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] - public partial class Person + public partial class Person { [Newtonsoft.Json.JsonProperty("Id", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.Guid Id { get; set; } - + /// Gets or sets the first name. [Newtonsoft.Json.JsonProperty("FirstName", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] [System.ComponentModel.DataAnnotations.StringLength(int.MaxValue, MinimumLength = 2)] public string FirstName { get; set; } - + /// Gets or sets the last name. [Newtonsoft.Json.JsonProperty("LastName", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public string LastName { get; set; } - + [Newtonsoft.Json.JsonProperty("Gender", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public Gender Gender { get; set; } - + [Newtonsoft.Json.JsonProperty("DateOfBirth", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.DateTime DateOfBirth { get; set; } - + [Newtonsoft.Json.JsonProperty("Weight", Required = Newtonsoft.Json.Required.Always)] public decimal Weight { get; set; } - + [Newtonsoft.Json.JsonProperty("Height", Required = Newtonsoft.Json.Required.Always)] public double Height { get; set; } - + [Newtonsoft.Json.JsonProperty("Age", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Range(5, 99)] public int Age { get; set; } - + [Newtonsoft.Json.JsonProperty("AverageSleepTime", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.TimeSpan AverageSleepTime { get; set; } - + [Newtonsoft.Json.JsonProperty("Address", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public Address Address { get; set; } = new Address(); - + [Newtonsoft.Json.JsonProperty("Children", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required] public System.Collections.ObjectModel.ObservableCollection Children { get; set; } = new System.Collections.ObjectModel.ObservableCollection(); - + [Newtonsoft.Json.JsonProperty("Skills", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public System.Collections.Generic.Dictionary Skills { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum Gender { + [System.Runtime.Serialization.EnumMember(Value = @"Male")] Male = 0, - + [System.Runtime.Serialization.EnumMember(Value = @"Female")] Female = 1, - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public enum SkillLevel { + Low = 0, - + Medium = 1, - + Height = 2, - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] public partial class Teacher : Person { [Newtonsoft.Json.JsonProperty("Course", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public string Course { get; set; } - + [Newtonsoft.Json.JsonProperty("SkillLevel", Required = Newtonsoft.Json.Required.Always)] public SkillLevel SkillLevel { get; set; } = NSwag.Integration.Console.Contracts.SkillLevel.Medium; - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] [Newtonsoft.Json.JsonObjectAttribute] public partial class PersonNotFoundException : System.Exception @@ -152,10 +149,9 @@ public partial class PersonNotFoundException : System.Exception [Newtonsoft.Json.JsonProperty("id", Required = Newtonsoft.Json.Required.Always)] [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] public System.Guid Id { get; set; } - - + } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple = true)] internal class JsonInheritanceAttribute : System.Attribute @@ -165,41 +161,41 @@ public JsonInheritanceAttribute(string key, System.Type type) Key = key; Type = type; } - + public string Key { get; } - + public System.Type Type { get; } } - + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")] internal class JsonInheritanceConverter : Newtonsoft.Json.JsonConverter { internal static readonly string DefaultDiscriminatorName = "discriminator"; - + private readonly string _discriminator; - + [System.ThreadStatic] private static bool _isReading; - + [System.ThreadStatic] private static bool _isWriting; - + public JsonInheritanceConverter() { _discriminator = DefaultDiscriminatorName; } - + public JsonInheritanceConverter(string discriminator) { _discriminator = discriminator; } - + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) { try { _isWriting = true; - + var jObject = Newtonsoft.Json.Linq.JObject.FromObject(value, serializer); jObject.AddFirst(new Newtonsoft.Json.Linq.JProperty(_discriminator, GetSubtypeDiscriminator(value.GetType()))); writer.WriteToken(jObject.CreateReader()); @@ -209,7 +205,7 @@ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, _isWriting = false; } } - + public override bool CanWrite { get @@ -222,7 +218,7 @@ public override bool CanWrite return true; } } - + public override bool CanRead { get @@ -235,28 +231,28 @@ public override bool CanRead return true; } } - + public override bool CanConvert(System.Type objectType) { return true; } - + public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) { var jObject = serializer.Deserialize(reader); if (jObject == null) return null; - + var discriminatorValue = jObject.GetValue(_discriminator); var discriminator = discriminatorValue != null ? Newtonsoft.Json.Linq.Extensions.Value(discriminatorValue) : null; var subtype = GetObjectSubtype(objectType, discriminator); - + var objectContract = serializer.ContractResolver.ResolveContract(subtype) as Newtonsoft.Json.Serialization.JsonObjectContract; if (objectContract == null || System.Linq.Enumerable.All(objectContract.Properties, p => p.PropertyName != _discriminator)) { jObject.Remove(_discriminator); } - + try { _isReading = true; @@ -267,7 +263,7 @@ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type o _isReading = false; } } - + private System.Type GetObjectSubtype(System.Type objectType, string discriminator) { foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) @@ -275,10 +271,10 @@ private System.Type GetObjectSubtype(System.Type objectType, string discriminato if (attribute.Key == discriminator) return attribute.Type; } - + return objectType; } - + private string GetSubtypeDiscriminator(System.Type objectType) { foreach (var attribute in System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.IntrospectionExtensions.GetTypeInfo(objectType), true)) @@ -286,12 +282,12 @@ private string GetSubtypeDiscriminator(System.Type objectType) if (attribute.Type == objectType) return attribute.Key; } - + return objectType.Name; } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class FileParameter { public FileParameter(System.IO.Stream data) @@ -318,7 +314,7 @@ public FileParameter(System.IO.Stream data, string fileName, string contentType) public string ContentType { get; private set; } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class FileResponse : System.IDisposable { private System.IDisposable _client; @@ -354,7 +350,8 @@ public void Dispose() } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class SwaggerException : System.Exception { public int StatusCode { get; private set; } @@ -377,7 +374,7 @@ public override string ToString() } } - [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.4.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")] + [System.CodeDom.Compiler.GeneratedCode("NSwag", "")] public partial class SwaggerException : SwaggerException { public TResult Result { get; private set; } diff --git a/src/NSwag.Integration.WebAPI/NSwag.Integration.WebAPI.csproj b/src/NSwag.Integration.WebAPI/NSwag.Integration.WebAPI.csproj index ef88bbca32..e2fe7aba0d 100644 --- a/src/NSwag.Integration.WebAPI/NSwag.Integration.WebAPI.csproj +++ b/src/NSwag.Integration.WebAPI/NSwag.Integration.WebAPI.csproj @@ -13,7 +13,7 @@ Properties NSwag.Integration.WebAPI NSwag.Integration.WebAPI - v4.6 + v4.6.1 win true diff --git a/src/NSwag.Integration.WebAPI/build.bat b/src/NSwag.Integration.WebAPI/build.bat index 28a13a224f..2387c4a073 100644 --- a/src/NSwag.Integration.WebAPI/build.bat +++ b/src/NSwag.Integration.WebAPI/build.bat @@ -1 +1 @@ -"../NSwag.Console/bin/Debug/net461/nswag.exe" run \ No newline at end of file +dotnet run -c Release --project "../NSwag.Console" -- run \ No newline at end of file diff --git a/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj b/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj index dcd13dc0e8..3ec241e1da 100644 --- a/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj +++ b/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/NSwag.Sample.NetCoreAngular/NSwag.Sample.NetCoreAngular.csproj b/src/NSwag.Sample.NetCoreAngular/NSwag.Sample.NetCoreAngular.csproj index 7da563573f..4b36fcc01f 100644 --- a/src/NSwag.Sample.NetCoreAngular/NSwag.Sample.NetCoreAngular.csproj +++ b/src/NSwag.Sample.NetCoreAngular/NSwag.Sample.NetCoreAngular.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/NSwag.Sample.NetCoreAurelia/NSwag.Sample.NetCoreAurelia.csproj b/src/NSwag.Sample.NetCoreAurelia/NSwag.Sample.NetCoreAurelia.csproj index 8f6c63d690..30b7fd27f7 100644 --- a/src/NSwag.Sample.NetCoreAurelia/NSwag.Sample.NetCoreAurelia.csproj +++ b/src/NSwag.Sample.NetCoreAurelia/NSwag.Sample.NetCoreAurelia.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj index 64cbb755a7..aed34581b3 100644 --- a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj +++ b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj @@ -14,7 +14,7 @@ NSwag.Sample.NetGlobalAsax NSwag.Sample.NetGlobalAsax win - v4.5.2 + v4.6.1 false true @@ -199,7 +199,6 @@ - diff --git a/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj b/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj index 49aecccd1e..d4644329fb 100644 --- a/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj +++ b/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj @@ -13,6 +13,7 @@ win true + $(NoWarn);NU1605 AnyCPU diff --git a/src/NSwagStudio/App.config b/src/NSwagStudio/App.config index b45b1c3554..67800cee11 100644 --- a/src/NSwagStudio/App.config +++ b/src/NSwagStudio/App.config @@ -8,7 +8,7 @@ - + @@ -22,10 +22,6 @@ - - - - diff --git a/src/NSwagStudio/NSwagStudio.csproj b/src/NSwagStudio/NSwagStudio.csproj index d13f099958..a649f92f7d 100644 --- a/src/NSwagStudio/NSwagStudio.csproj +++ b/src/NSwagStudio/NSwagStudio.csproj @@ -296,19 +296,17 @@ - - + - - - - - + + + + diff --git a/src/NuGet.Config b/src/NuGet.Config new file mode 100644 index 0000000000..0c74ec458f --- /dev/null +++ b/src/NuGet.Config @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/libs/NJsonSchema.11.0.0-beta-0.nupkg b/src/libs/NJsonSchema.11.0.0-beta-0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..55aa11da30b121467a8d2b962c918a7203496012 GIT binary patch literal 425902 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�#1V%^&jr8rvrcPye-FW8^K0jc z`LKVIpj(e3l=!fxK2sL+#yYmD=KhL2Rpo>6&=oipfwqtb(dO&9oE$~!3G zJ1MTnI)16kKFrAb*e@7m6QICu$<-s0js2H@{y`0V|cfX-O?XULH#C5Y&o7 z&$!*U5BA}0ry0I0e)ghY&UqSocZ8chdPnku;xgJd<;ZEWM#~7Hc!1^>f8oK!mXQu# z;=y}cQ)_w26&&DaZGy+?1@r8}~eUKPvMgEsU#k9b|q3|!7I1XH4& z^@qm5z?f<$H&e}N9LEk;!^Ip%y0P59(DNBFe5A-nB`=3zVA!8XoA$s}{n)*rY~Wz; zjem92@DSl>Ws^E$<&H9jOqX3n=?xfy*`c*$CR&Ion2=D-pkyHw+@&&RC=C@ZNm8^E z!DK@|LT|h=0)@&Y>8ecJnu=ATQd~Ls-nFMw;hol$&Vga6%aWK&t&oIX$&PTAa0uedlak3hxH6F z3E#L>H&OILi|;Dk+=A~N#8+@`7v3iCAXUOGbKk9jx19mm7it;vZG5=*fv3Bhk@1^r z>bCHVw!x+Nh^4=5-{y`b%uIb=OP5#powg2|Q?VW04B7w=eQ7cN^f#9QVw`h3Z106Y z)Dik!i439wpL%y#+B4QP4gS;E5Yas zZW%`*&iRbB-SIQ?P1S2K=Sug`bIOy{{gU1Bxl&Uk44#k^DRe*f6dRCU=Z>3fTx?wU zhI(ttHUEV}R5?9k8(%-u#wbtCbse(<$*BAn%gOok zpczqR2ZdICYNzo8&{s=_Ax$i;RGwruahfopOm{(;=NRwSUIwCztdyT*-n^}2N)!Jb znwPAzm77x?%PQQYd9ymbD)ta6lO~=Im8&eDiv>+PTb5xHn8G=BD#&O`(p$Ki0|6;X zAROLFT2Yw{h{vRUhdT7_d?SWa6rg#30+iimCm*m_CKlR-+?DsfA5rR(h;U^X9VOfrZLXh`9GU zH#jJtOa$#`<&XX$dHfK5{*;c~mdwD23D69ZB`D1Rrs!Qd{Ggu`PR1SA7$%5+8efS@ zqM&5z4>OtJSG*$@v@0M(dsTr~0Ys7t%_z^XKYEFzZfnX=8vWGdQiVn@Pe5(#Vq~DL zz*CINumSj^?!?kgN!Vg@DQrP)PBP!P@DxqstW5{T*>1@#wz za6U{bAnuWO!nO8+4Otj<$-{K%+1 z6VuwaptpTinGQN5gXPWo(Sk{nB^XmFYKzc#g${qpH`~M{JV4*MAPCln6;xB2VpCNa zGoV#*YeKW9#uuwSXtB)ZMzlH6+&7x1^~jSi@V@g_xi@Ia+T+RWUR>>}Jiu(Y2}s6| z-CKh4$hBhj%_*oHTvvNbG5_sobz@hl0Z1BHpuzFkMXOEOEsH1_-C1o%-vqn&&8NKk zFP{KU+-^(g&UR_|zmdG~aqp(ALwUEL(uBN+@S$QZOeZ9}f1O=rKEPF=q!8z4L7kR? zW8PG--wtEBTjPmzEPobMnIkUKoP)QdqCA5r3S6AbsRP$GR#C!o)BW~O_n4fzpHO0UJSTI++MI+ZM zspgm3qmwEfZ`!5Q<4YL(^DsMhb@PuE4d$zBsMD<&eax}g6>(?k^QJQG7q|yVjKi33 zR5z#R#ZPIf?Q(Z6b=tArZe-B++t4gg@ zSGaK{^MnOJn0G_$!Zw@zTl*}s)ct@Wd=(dmW95s3qD;wu2SrJ6@Z9?D?Nt?l|G`y0 zPLC5zSQs~J!*6&%7R37gKAcQRuTJaRK9HT(Dj!?RK9G4d^$>{o&D$=;H*aPd;6-Aj zuWNl200R=ZTRm_41+-ORVNz~-;roQx*m$x*R_a&Z6|k@ZM%tKI9G<&BrJ>i0-Nm8T zQY&*k(<=yoyRbY1bdrGO=qwr_tOE~wVBl!h$i=N9vghDr+YohIa|>! z!gn=&BL*AAz2~rB_G$cc#~(5DEZ1O%@26YS-0X;UH^W);)~YW{*5wO}IWSGfEmM7Z z5QEIUm5E2#(bT>^7};ulvayKnt;gfNu-`_2ID@p;*Alxr8b=&NP7)+X90Xzx^!`vB zHjSqq(>EhTSn?cYe4qR0n;Ourhn!iEK%=2=G2@?f9RCKFdT)Sc;LRJH1-|TE7vfmV z7S%VyLA$Ni2!GIPoTI{LSNM8WvSa*tK`gJF-yzX6U2c8RCC}DQm*@!2u@)+v0{(iI{q(4NYFM|_V6QFUpPE3v zML>ND{=1g_fc#81tXpod*B@Pi&{z7*Y!Fa)9S~hL|31rpJ=8rrtXp=l*Dml+9iX{l_irWg zPbDDV%8*wJq41x@y&oxmzrq2?^xJ2%+ddXGKxXSMpctEP!E0l)KP>GXBbtfMF5@p_ zc>(gm%qp%fS%Y?OitPETRdz+VP=$)ZZVK@SG7(YmI-oE|BqpK6QsAQUGpWbXoiZEIUGOQ< zUK|5=b~RLMmx+F#a9o##5Z$MZg%sA;EA2EUuv^k3(x0Ui=Z55xpi;G#EJ%-BJ2o{E zTPQs7&;6Q$qaF|Eslr*TjV)rwHH|%Qerc@wg(&xn>z85g0Q>G;nx%7+iCU_*N8Xil zf#T8yMOFeHvq>x=xvOOTzi-G18bt#v4;lpXbipH>^X=z)?_;TsKoE59iBL@74;;Y*LMbK27pGI>1jw$Gl!ne7EFVILxi^w%Jwe*z z%O5b5LESv{aKw3%_wS4oyZHs z@Ek?*UEmczIbT0%Q*cZNaT;(Mh3|0>+Vi7X8Kc7!8-LAj@R z#(Bm!O2`OtB-%`OCVIF{Nq7-}%VfS=iT&|VmMpqt97|E$xW5ra9@DBN&iHN^eN4B4 z;cV52_0t0pllxu3I@_vhR^+Dpx>X;dxi9kbt$5qLX ztNw-own~ht$`Bimmkl{)^sNu?_f|AEi;Q$fy$h}mM3WrIK;|b<4)joPg_Q1Eu?$y% zT%kLV2NSRVC;_IMCm+XB8~mGR8}?)ful^Nyl<`@f_@>jjQ@ZC~`$upgzxkQHJ0 z{A9f%=a!X|T03BSN6}lWY_nx$<~XWd%C06`8j$ZuHjN&o#xH0jK-CQkGBV_u?;Z{j ziOeAXH@_NUl@QDl(|9yz+4J_!Ejf3SlW445{#rdVUIpE{E$%Tf-$Nt{3IFKpCRW`5cgh-r5NvpCXLJ% z#L1U_3nw2N`lmp`6U)Mtht}})SWlJRk;Lz6n??QTUf%9P%+|BCQOVSFOAYtqYnM+1 zI$h#HRkwPP+DC8i5*7>*oqW2G5^k5k4VM*xo~;JFzNh@^`X{iX2WT z&VD{|C#P$Hl}y+vAymu;vyi7N-3mFU$Gb&$f(XRzQM4JfAz6wEZ|Vb!;8gu#4sp?w z4YtL%YxelQ+A|t+w2G0ZT>?{i+1`hc?lFtY$~WbjoZ|8rEvJ=VV6LlRgdB(rOwLmd zoJ{Fu{c{ zX68_yFY)|)*Nt7t-PT~P7T88bjAqG4#cYDFOmEbADjH+i!7mW0`4puV@g$_`O1Xo$ ze-ho#>PV*~dpu(tf9|B>^~of*v8@3rL$uVTHIR$bim!(jdbhd*gorX9a`GBUYdZ2n>Xl z`xg?RDaRAVMH1!bLxzJX2u7lSLG5yyoutAN4nB0_^EG>t5-~~acR&?AAoWj^RH~=d+kwx2LXlxFC7%ajnNwfW1 z(7a7?v$l#*BC1*T7QVR#7YajqzpiIqAM}X~yo0#!h5mX+QAzoddkpD2gY}!o|1RYJ zB=vKIhxj|igmJS`K?!$D>x*CZq=@sexixWJ%C%;@3Z@unJ$w-X{HOE_qJ^NH8%vyw zBm1re)vsK}`d^o4%=qvynRMH_T9@V$N4Cjvjq&0)evvSKQXA7r&7;4z# zB&o8uXBVPf-1gns8l@B`Ml2vgG+;v9uw(s{ImUBV-Io1ySPWX*f>RK1H6c#CdAW%rpfWVcSQQ6sc zfDz06QsgbaQLVfQ*862@7T(Pmo3LD%Np!Etq!|1v)h^~>lVB^^Is~PKb}mX}5h#F% zfV6}fAmSnMR)b-x8Eki}A|4vkYXMgUHs1VeQpR0^_pcbf+3)8HeQlaSr$fk1SZ;I? zy~t7G%4OWB6ApqgAKc+Tr@|sx!|Gz-L3Qv(Hj(p`Gji?&VS5`W;!;`W7C}CO=Gz#5 zvo|^*lE~$XhbvpxGF1&oQD8Tbk5GeN$FruXc1bxU>HikcxDzr)Q(X?o8$XBhAxFOz z(bW5g(`L0ZqXbV6kuOQ8J$iEIa$|Nf~K&=9#Vwt zc$RR%=5e>Czh|^VgW(lh_Gg83zm1RG(=g(E0@_bjwWe{$egx*3#wU7{J8O8K?aAkJ zBt=mJ$Nwc!!BI!r`7$^`nv&JFVdZB*>?EBa3E4(MH*SmX%&r$PkD7NYUzR|*nUEK< z57X3ZEWcKoKViYi+gukoa}dH?S5c2(Fhz~xU%=|cUAjfZfW`0Rc(Dvi2VR)_?Asq|mz7j9%BRi^;chFqM+RFAfYSBV28+>SVfk@M)Y8$;5DQ6(% z{d>1x8S`&0aPf{GMmy=`Vb1sJ6z)y;6ZP6>ij{k`w6|4r7w?Ra6DCX_BHzv_%i@0B z?=3~2ziwXTkGP>axzB+U_jutsYhfr>>j&}6ez&e+OcyBDh0OI*Z&2!c=MVK5JTc_E z*V7^Pcw_dZlZ*#+I5?j1st9W!s9>%LAX4LcpjSdrF8*BMX|uy&tC)ef<)I@_4ah)A z3v*U60dahnL#1yefBp>d-fvnuyv~(vLv0IKxkEYjvq+O|7#qlmyL9c5Gfm)ovaYWc zR6vK~tT$EAd$JvD;tnG*jkI;Oo;i;=$8V1XYTxQD0Uur$K2gAEs_MJRfw|T=cj0B` zl;pdJrrJ15o%PStPkU9BTWQ0DapwAestFo_g}hFyY}*XP5zi0hT-6IAm#0O}_866w zf_$Pli-`8WvZ1BQv=Uj7r>L_Zh#=xwT>a({2;RH64kU)V%5NM>r)G$n!mWH@zNB+5 zL4n?OF>=`&#Tg`F^e{#rs3iQm4SRa3_2EuB$c5i(DyA9E)l~#RD(0xZ#mi6%DK9Da zFMc7e34L1J)5GBp{mhP{o;u%MZ&u0D?xk>!&gEPMn2&qXwakq6=|L3Ue)_encr45i;jv8KUbc&KDH*WyN%%K2W9g{FB}*x=1uLK>I|U0W8v9zXU%Ch(G-|Rp_2Uwxkrt0HI_C2pfXPWTcV# z>OV}mLu7}bDbN~6HpnMRA&B&)fH=u&H*f{x!wz$?gB}Bd5SkV5#tnhHSduc?h%&X&h#LWp?$A6qeK{NmhAO%{|PUTKXy$ zZdzuFt^9Hw^mlq#E(PJ z`G`%a#*=gAbnXTJ=mO=3wnr-OG->FBPF_MscRm!Z>9!7qzC0T(*x*Zft4-T*nve0$ zMm4iM-PcYz9R;PGJW=_P@@6KfdAOPRW54lF9|aQhMY8gur^`>|HTyto1;+Wtc0 zx?2HxWA)d-kae-@L(pA>dwePWQAMCRnjIA5kK)E!i)0|V)>}gLgXRW?4e)`}0~&Hz zBMEI4>_+gLtQ>%g|D!9@C_vzJyXe^MSq@*PL>5Ts`%1tANjEmsUGtRo+9~PU*3Y>0RV~81l^n$#-3_|h^+q?o& zHH$`n9@+QaAZbCQdw)@NNpCHYxPx=nGS`Q#sCSTPSW~rzlLVem zH==l`?%cK+LGP4!k9moFc#IQ1Wi2o{eB#J8uh2_k>v|lX+ZzsKig68ltQ`VZKq2H+ zOBL325>kc;KlqUX97<2@dfQGlA7hYS`g9M|I76&&M1(cS5 z^eC-YKHQK45W&se34V8v2xBc|x*McMho5cSN^tje?IZZ1Y$t{O2lny^R`zkg(~EbO zt#Q_h=7`L`BC;o1p~@Z|T~8d5;VPo7g}f?gY&aY!YB*gou?RbO@!Nd^min2EoP?B3 z+esom)#)tI8!_(3IC|(>j=TC3B<=;K<$N);sKCXa6AY107TcB}>R(~F$1LuK%>m>2 z+%KBLZReUb5NXlf`jtq&7(a_@AU_1SuDqzOhVdMyyYfVIZzM^3D)4ZAPhmVqqDHvXe+U4yq)w$XT+YMGN)e zDj6uQF(sWbPCP0V7#glTMOt-~>72?pU=eIq?H3*e)?Ei|FB)`2h=`V(9!AEYjZr+*ey}trdJi#3V z!7vE_%~IUq;(|(I%1~hlJJZZNta&=lx-Us8mS_$zaSEB60GBuvFHN@HdvOVxn*_G0 zilw&@^_3Aj`_|o580dU^z27Fizc?RV9lOAIkYnDTBt?UXkR#^=?h;@;Z)J4b65fC$ z*GDMs6e;dN1b4%`PhHds=(f$=kk%RKM06wf9J9V8l|p&&dh%O<`@T+9PsjKw5>Bo^ z>wQQp24{;V=btOi+!SYv3e6DR_%1X)@n_^I`h+XJF;By74QB>Q^k)Y15Ba_bGxV>Ps$0x3n=z(h67`|#)R$nWQ?`TJ zNTy^ypB>1pcO!UOVlm6w>oVyVI(U&&FM)V$o`SAX^JeL=D=#A9B=3|31l=@6kl zaB6%qk+u*(P%1RnY#u5mUIb8sDZIlYel-AiK!iXLd2Hy&d`?s@I>T(o=?FJA1|K7Qn|Uh5NKPp`1r z$_Iy5D$sdFj}b4=uj6t?=oEqQ=d;A&HJ+(|BZfS^291zdPay@`PV-p|>s za>iOwlw_2PapdFBOM8&9-Y#Fxx~#R?w8o;O8~gA)7Y&g5Z_&S>v3GF?-gAUN4se3RqD;gvY8G;ZDHjW zvGsK}%c+7FwY@GbwodDKYf82+8=ubELGo1>wDm22@H#Fv@cC#p^?GC4gzWXEkN55h z_U0{MZVBQ$^rE0Q$ToDq3kx0F=OKN#hRSf0!xCQ7A-ee%mRO^GxJJK3+N+QD`X+9K z|IeJVgd@Op5M-CIRHMvau@bQ^!(9gC^GP%m&sqPAly7#GnkN_QuGja)V%>=HnnRlu z*(cwjDp9BHl&mT5(((MopkiFURKEfpQ@R-Ccfqx7bLLF-G7$98zIdZ#+=Aj0%FieI zQ9tJY&?oXr{B(7RR-qo`WFp;*l_q z^DP6Y%Eo}&_&;6n%4l37YyB#$X3CXcDz7ggH~3=v&W3fnOY`{USNX0(YQtDsdZQ{y zUJN;wLgkX5^@BOTzsMNhRSWpr&_0|XroT8Zn_0-V4Zp_Nd~lcJ>K#>D zeKf9jd5C3^;qD{4R?QsA?cr}->VR%kUz#XXtZ~Mla9Zt~+407h=NNeEB)<+VI?;cv zjlj9yeh^K5Q&#ugGlhxHuju(0Ha{$4f(&<3lp0lY903~JvSxiuOx5q~8Dc=bUN-AjmmukF*1Vqt4q*yZn-n`TB!3@=)b!GWvw!8q(`@xh-Oo|yM+b}Q5GNDwcd{+*=?+1M-T)yLImIuv%)Tn2kK zU_-n2s;{8bw)14v?0<2ldd{+261^hZPs#0z0!+03Fw&3&^`$91X2lPxk09!)(QFQj zm*0b-wivia?-i;k>wD)<+@ZaE0tTkg*s;;EwnmGL{*G3+$O_g8+XG^r(Rq0jGnY&XsQ(#Rz~1gn&)2e)8#(qU?L zkyu5`RXWb)w=1IE>om02neSLZT0P!$`ZBTqDsieIuB~d@_YC!_J=eA9@+MTqfr;5% znsE13yG&$%`w@SMgTK8WyhwQ)`@ASV)g!*9ThHj59)x z(t(L(<(={5QvM01(Ts_ula1Z*&a$ZGb_vT%s^y_{5j!tn2f4yiK-y|QkIfZV9(Gr;^KNXj&;>#aJAhF(Ud}e;e+Iydet>IV4wrxD+Iw-5Hyh= zkHx`gC@sC&gG%gvx|d z?J2zI@9T!c3(NiRToA0E1CoB+^F*3~&>7@EgXsfz;;*j>e+o58^j^#B7>DMmzqqAb zJ6XVncN7tb*DecN@nbFu(OF)B4Y zK370(kJ3}rW&ipp$@BldpKnu^sUA;yP`v)ga$a<&7&&Sv88}6>D&BVXqOzxH-N>$O zq`-VA&uzCo%IPoYQRO|7M;DL%w^6$?3tIPF-#-iAU^_k=@M`JLLt-1;+hkWaTP7Pe zDP_F>WEX8^$#~zu9`YJQTNp(&mT!Tw183_i!8SllRE7j`0yjJ>yzx5w5=1%DA6g(H z1#xQ!Br3-Imoiynx6Q%ktqG~M^fO#`b*PB)9YsYzw;G7#qa9gckF_|sPQg`c846IF z233{I8O(*$2TsfD3B2N!F=7o7lhrU{O?|Ee4VA4F*Km~6n^#avStSHbR_L!4r2(wdc6Df=3&2%qk$o zAd*?C26;3zX^e-4p=NP~u{)HdM${6-I1zN1ognS>Rxw-a)L5Y<;7l(i}8IIz)} z7j?%R(_cHg$Pmb4?)JeN+Y+u?t1|8ngl}jDAMjq!BP;j>4_HRoCHGtD{Bf(KkiS-58BcpUCocBK9$zU>vV9;Vgt$AOFnP$a z^<0_3(3|bQ&Z*#jg(Pe&AQK)13YXW&dzCMt%{;FIVL1gW-3rJc&d>$Yej7WFj#)tO zjP3h^nxH6pnIq27ItD~jN^lj3rp4@C2{ec*luAN69aQfLOADm)N;9DC2a^R-^z_$K z3`)r8d8v0y$kykt&wv;E5T^yVyt(_2)131zk5|_-T|9UFt)@ybOI$(7RbA18xMMz zbA^x*ACd!mn1AI6r)Al~qqEX$=hOouzN$dPv}}yW{72E`>zszE*>eB;s%ppLDr&`Q zH?MR9oz_aPx#OA8AAd>l-E&J*ryiMF$wkrEMIpofTIZLbOwye)_05*r{Cp1#dQ;wz208jush5L`D z*fD2da{VV}rV^Vg2!CnyPON~{o+;B19{Hiiz;H5ULBEdBw7Q7uf#kHVr7fo~h>_B| z(8zDFpI1n0EU0gXVN(V9k~{?Kc_Vj(CVln#mtRaYZ+X|K=Oy@0w;aGW2nJ+K9K zF{X!EaPI!{K=Sr;fD<2h6e$2uJvh z1KHo7tXIPVWF5%Fx9-hkhGw8mfb#KP?LsgH@) zLa#U^)d#W{Y>^U=QkQXMomV*Oc6@Q!GX3DMI4m+wqLAcJLRoZwa@mUV*=meU6O^5F zs;!}069(Az#lmck)8^9rkExg@&WoCmb!~Ck*6y>bt)`}b{OyQo^{*-!SXMkmN(!X4 zon4;Xvn+9nSa0;Q9Rj;(v~jL8#BF1(^Tut>VPl8 z2}si!__nYY>WU4`@eFfq=6q+w#C6S@vN5bKy&f9o&c6Cv0*M2WbohnJ!B=_! z5~GSp_40fF`2E6pIr5|f!&MT#C_fY#SJD}DE^z-upe(R2;fM{IHFD=HQ}G3&LpvUVG7|IGe~z%;rd_crjiT%+ZHn#?-}=|%EPFuFwh|d>!A$v9}52v z6D_DqeKwvMe~x@~e}w_0N}F%(SH(Fn5a$R;&aB$>{Qm>dKrX+V2wp@#1+cf)78402 zCk4vsM*7ad8lMezO3~RxSTwWoLRf#Y`8v1ipAy5?>Vz3fYOln%gfV}AeXkUHP@V5+ z-_l?f30&syNbv#rm-J6b@j+;(okKvX$<64RfZ`ck++Wp9ze6d} z`wk@--rGvh7kTx-T9u7Ver{M!vK7q&BW!w09b61KUKdF zBH_0Kn?pSEiC0^N z`V^nmuGm_4yPTt2#Lyf06}N~H{6$`|^`}<`RdU7FFB+FnnnM$#wBKPkx;{2@*zrwi4tbRu7EV zY-ECsi?AAME1o8+)56681`>>UDT0-*o2e>ANU`NI`UEg zqNo#`%0;TW-m&hdYHT7^1gCKMuyE=f7QQJOmk0z+_@LxLzy#M6K{M*9yP8sTHu9N2?Wnx73QWcU>!xgV;pc&l+im zO6Q^S=)s~0RRwR+3pn0h%*o7_b29iVFSjH6S<-%%ZZ8kpVMrv5-QW4KaoA3`_I2*{ z8qeZf^iS{=dEe?io`o>k{a}Yvy5{jLUhsAb?9N)f&)`wt{6FR25a0|J@Yw5g_Zsw~ zV215stuqPTHJoI}ISklA9B8GRhiFm?udCJ1v23F6_$T5PFWB1+E6mUfgGDx=umA=W z){lU~GLMaR|2ePGIhO14EX01f@$E}v;~NGB8{ZC4?*eAPVf!<8{v%I$pe<~C!=JKh zq1rAfWPw1wGM{7lMCXT{Z$_uZu=dqDEft(&Iq2PIu`qmu;SG}YYmzksHh42$co-!T zd(V!b5w>|)Vb<&$viTNmU^+7vPa^_@}9Rh)Vak!)FI~<7O5mxRwru%Xq7pG7S z4&04K*V#r27I{Uwzd+Cc#8VJDgTIL0bb*J%mttSiZ{$@%K`M@OR+z^*HV6JsC}@r@N6ap5#AU_#U2DpVFJkgkvA#ss z8yafX2?g26jE@PLk5`^V%|S)^0Y#^QyQouxwDF#MFU=<4T_t|bABC^DaKqXG);|gB z_yiTNAiu?THO*RW=!nrgLrmc~Ui(>$+vr_I{KbbAA+gZ0qdtmJ*Efonu(7)%-f~3O zGAn%iwYMD6#R(Hjv3OG@>L7nMG@cIU86iJ>K&gQ@f{an8;KPo1dyzi6f<5FI4873} z137%%2X>636-;~>^PARg{HhwTnDc2 z=?;CRTb*F(8LHJq96*y347vWq<~c_Am#<)I!K`Y0a zP@8ZS12@DD2eI`x;bG%9y24gne60&3&gA0hd3--AK0yL}KdMe{QXSaB4KRNPX&+ys ziw{)83ofAGQ>lvM3-hpD#T4gQdf5yD(%-okak^`P1o4hr?Q4@{ltOwS{pVEUsq;tf z>J44=O)R40KydDV`B?B=jagjEJGcB(=dj?))MD5POFhbUw|mZ&(uKart4J5Yd9p*3 zl6HqLt5I@O(rr?BiY!<|;lk9%o80M@9j@mLZtqolTBs?Cba z)K;_hJ4I{S4=7%6SK3G4#3H05IRC%Y{(OyDXdg|!X6@tE1Zuc@4$4-%NG;#3cU91> zM_=SsTxU#hq0EHh=sV1Wg&LR01T^^?*BQGX!t{9QSk$@eXuOEE2Igq3?qT9E2Ud4k z-(afNYUWd&-RREVf_t&4$0yMAy53AYlZJQQ#Cl&ckWg?R`o?!uyw1Pj&JJvlaaIR^ zafZk^)^DC0geDN*M~mi?OwW5n8NiqIeJ& z9OY)B%DoqbZ)`X*F7XbN2cN!CK?(Q{4HvJ_;KNIFB_F=l$kig4?Z9)FA*>ekL19JJ zu8PZ#@j_oG?47a&I0CKt9ic{r)4Q6m1k%Vqe-q#^C+uO5rKj0Kq1Q}J{cfc^aizeU6Mz>V&??tEf%{p@h?zb`m5ltTIu( zCt2u1`-@rt;zE0Z7w%Tn3mTUY^@6vkqJt$aq^If%`=V^t{72HYOous#Yj>5`=$lwX zUK70ZU*`2CjalS1n(P*lJE7L%zh%05-BG&GH?fFxp~-F)FBm{Sf))Rzy6u;n8gJ|CjHd5uH@>uVzs zQ>b{wJon%g_qRCVRrXxmSMSvsmg|Y|4PaaFJMgEt7rF>aK70=7V(2m}=-*ZVd1}KK zZfQYMUlozd2Q@DgOsn6%XdaI{CdY8@?BFExhP+u_FXe z>eEosf(M~*cNR{Zox-qSN&tqsFik>d`C&>xh2$OEP4htL0J8%4V;Y&#*?(~y&ew5w z(Pq(H)or82BY6KBr#2CBSZDV-f@fHlKZkhLN73dX(Al&P!O9#k`LmVui7tp!xjF)Mj3Sqn$p!rjPeLbj^44h=*9=zUwHllJ5-f$pp z1Axf`TYO#Vcs>1A$Bgb24&Kw?>!C{yiAqGLPTB`5|<(_`&jV??x-n{~UxIY5- z_HgMQAl`RoF!9T9UuY!7{#h3xsg3Qp$2H8#F1JGZS!<-@S{@r3%1+}bfpxlPXh$o1 zv-Lkctt`A1(urhFCG(+skX|6#f$U3KB7J7s)~;3-n0JrI%4XafSKG=SBYM1rYgjPb zJ!JEwV3ycv^CT<#y~?S&RyHB*RNY|qYBAcE^x8Zrg#FZVT^}pU$=TX9gq5~h*C&Kc zX@PX=0Hp2uBON#h>BIM;&-);R5O!kfOZ`IF!D6IU+Pu`y${qrHD_c_)U7fSgKC3(0 zSG@;Q_-!ksYIls~x7HY15ufa%vPeY$u(jxLh*tn_Fdxo%0 zv!;Wjo%^A@_k?Zj>R`)SqV}?@e&@EbF5Ne^v$E|J?|;T)3cs(iwQCJ_y>D%C z?qX%mF5kIVveB^VF`8XX8#rtzrKC2y+}}0K#*!!{og=n(wXq<`J1d)29eFoWT&*c> zH9ZmeHCU7j<;v_IS389Dgxs;RpFx&$6mkf=zc1?cK^JO%S99drMkOQ(G#|`rl3Zh; zL^Whvr#}jQ`hY%bvmbl8hSg?Y0=2Szeg6TSzt$5&ezpbXSIi*PeeR)YEU94z_y-BHFvL(u;y&>`d? z(e*$>*v4L1_BQsP4wCkogn4>(#=1T=SSFaQtTDyXs08Jz)tu@kX?OsX87T8$wzBIp zP-A)EzXtmx9l5@Nl9|Bj^y{9Nz}AgJIxVkzo{de+a}7&i+rh@l`clsJf$|f=mQ2EW z^j#k2=A)zALP;A1aD0^16iL`o@%nQPi&L`TL{Mg!{mX=Tr zok_G4&>Adw7V0W%!1MwuTR9HX))Goc2zv}P8Nx;r{iz+MXBO3wgQV@XGtvGvq6>kp zWD|Q~c}}7$r5ZXox^n@OD!6MgQbFFvY~e2_1hxpz4IW4G}1k_)dVE3lM(lsEaqH~6}x5V}HcZkA5yD4>39BFmvLmkgTFV;rECg#7NC(8I+h zu{MO(liOr=KcOvvTx<#(PO+a)n$TktD`Zp1t>%4QA%<5ZI!tH-n@(saq1Ravp;rmL z0UARTIvCLw_8_6L z5pq%tyVx2+jL;tVt|OXBKKHV96vKkl68J)Y!qyYonIq6f(phNLl3^}DZ%`fuPeQbh zy(iKcHa-W@Hqc5{w$_2@bG8S3!oFWOqA%DHa#IJ5&)LtuV&{o(SxA49|9gZ>_NLG3> zc0!`__X|{y(6@sGs!yS;0XG+*2823JKy;GzAoTtKrDr<3!4?n-?}KhP+2a(St3Af& zqr60DCdKZL2z(x)Fasr8A<+gxPk98|Lh|JeM`Tytqm=!UcOV~zAj&rK>3i>ie02Me z(4XMuVxh_|LJxZoIh4JGejoIEfs55p_7Q5-a!A2hrKWO#(1Cl06ijEem9Gd{1|X`h zoW|Q^Sz#E1P#P#_$!*L%2Pd6XVw7kV)6%oWL1<}WlzK2MtICE;w+4g~S_{;WP!9M! ztHdge3H{ab;G}L!6D65YFLG<5q!3z5p(HBlggybEXO(73CZR2@1j-_`oKUioOXv;q znX0rVlun_fD;)_H5z0`ys@O&S3|d7O%TT(hYE)JBLtR9fN_SNSUH=U$_b%pAdJ#GT zi=HlM3Hq3Pwov++P+R3b@(H`Z0kv0#5LyL|;|mydV>v6MiJ@) z!-E@agffQEyc&qy$~Zy`Ae}eZG-U#z=xT_Hm5HXuS=rr4*m@03^6+2H02 zVY&cqH1Qor1a9z22K0mSCLtGW)pfB`%6o($nSf3!?-M!z`!`+ecjZGuJ|LfqomF-a z`Z)~IIb|oIi!lCiu?xyBLMKBI{i*CB^gd|9#V#v*32lHVTj!>7_ltNvJpJr6X4?h}w`|I>VBNAzxQ+Avf4!0%#DgMhI`ccCo=coDj_O0UE-q z6FNmTU?`6yG>kMclGh@HhpAj_G_OO*N)8XbT`Clq1q@8)^3_cbVLNkm!plR9AQ_Lc0n5&f8JS8WB3n zI}-Ybv~-SlCX_>N=XqB`eFP+rLOvf4N9w47^g%M)+8|w7g7iHK zKPnUHyj-Mv!NzJ$uRT2!;>wJKG=$AWTD3dUhx3r0>4LO&f27Y$L;6KWq`lH3A^pws z>Hz(Fa=nBk);BF7p?k^b%oCw@mN+OCC;3%jKy#okU5*^V6r(EGaAf?h#sfVIwwwt>`o%;NJKw7nxHv{ zXksI@u~O`gW@!GP*(Bf{>BM+jJJF_3+;p&6oKOmM?*oq{*qLYC0-56qYu4;BpzWG2 z1*#T41DaenWG&FXlyd6~q{}G$V2Ud(329HFFEm6w2-nLE(dLy#Xg<~qX;EXeISj5* zEIS4@-!#57TFdK{Iwyd>6^8U}$BED=)^gAvk}7OX;wzAb2PVG*G_T)B35o2}G5a8d zHHlvVbvOD6=)xq7rEd(aAP(t#NShW{gT6mOY5BN5(%KD>#uL3kHZC&% zQ4eV+GM^{=v`$D>57Hd61^}H=|@C=ZiDn?;(eFs2BJX}=GSB%MsyO< zVxs93j+N-4wn)#8Ay+a#Ms#xzq(6}V)l;+L&k$qOVb0iKCI88ilks`S%%% z^ieQJvET1I4HU~~6nhXf*}dd%sPASQZ}Zy8XUh5S-{bcFyO-F?xppsUU5Wp@H7m?F z?FMWId5iLWJkTh%yVo9j6pJgpY)@pZvsczgWcOtu4a-4#k<8~^NS_2(JKI3*!#^F1 zqwTEbg!2&oPh&1)NgJa!v9q3ILYinL=i$6sO|Z2=x)Eq1duMWVlPGqeX>1dP{bzDh zq#bGjO=+JARFvK{2ovgiKGvPUm|U>`v@y~_O|X>OsP2qRKsu%=(r>9=pCX&8(|JJeAwS#W zF=sDBOCo$GvJKRdJP5fN#eN-(=F(Z1gKOI%6}gF2fs*iJU4?a}_UZ*{$Nq@k8U=c* z_d-;ZY$s)_MS2jj+hQ?f5##d4rI5nwpqVI^6sM&D{Ue=|__&l^Yj0m`ysSx*vfaK4 z=OzYI=1pK8H)sp_c^CX_<{tt*60jHOtdK8( zMyW_Gf!~v#-@&}ravr!|hL+jNzRsNoVj8sJw+Y8cLwR1|U+{`> z%)I}%TuRq}*GZ3ZdehQx4j*Gw*mt3*6O0A(BC4r_h50oE>IgeHLi2?*^dl zLf-@WkQGDd5wsZ6yd7FFSc#w#rOEX%z9LR?RV20HI;M1g)7$&mU$?RlgzM5uV=?=w zJT8$_|L!WnK|e=8Uw@`rHBm#f{49IU`rCDFmESBXx<5VF7=rM3V%%!2gWnk^EIdfgt(b-Q3_ z*TcStGWKFI#&V)+XRvST%89VTEOQSqzfk>^>Q?r^O!OHZ&=+j3&l&*KV@Gpi&;3A$ zR70O4gtYJxy7|Mf&bs+ChhZKSf#yg0jRpEdb;EqUhA>Y7dL$Cf*JsTH`bkYR$Cu6l z`erROn{{HyBJ^-OSF^4v_hV(hO@0Jywo|F7F#~CX{w)#}<_hi%^i*hHph=DqK;IA5 z+8@m8-Hj9$<-i`@4#yI39T>3+=p)r%0(!p2Nk6J{~sZ<6cuf8sgLG#lJnq$b^GH@u+H+|gAP%|@t7IrT#XExJ~IGST`lFo%bPr&F8wKuz& zW^;YkT-|JhgDI~cf+-IGdeZtF&;r{6h`oB1)j(6i(7ed88EBh`^$`x{sgCs58fgE1 z+QI9neqkAzt%uM??Ec1!CfOxwR?@Pq{Lv{4ihx8CfywSwFm7$+b z6z|K#ySy5j$A=G#K%J)p*D#9<=tAGeY8f&Py|zin+aI`2DT6TA z0!9Pv7%~~?Z$70!e+isVezsJ1u#zAQd9(GE>S*&cn4Lb4)xuhk46RB5wJoAvh<4^! zCiX`9z$nJbJ{W!m?3+8VMY31N-rxsRG6io)zhz1Aeebg>N$V8|S5Y6gw!ps4XDyxu z*H_YtqbttADJJPE&q1VjlY?mEL#1&gL)tW8*eyA@Hp$4rl|cItZyfPP6Yo~y?L@p< z4x;OL;(d*Hen7>Jjz06Mq0j%HVcuOEQeaze;yOfJr;`kOm!!q*~cS+9eWGtCc;Jx4`!BZE{e^ zg5QypuzC>kA_tl^Z4bMRENC80Wzt*QW*IRwp`U-NaYAbBZFYU9BuNd z-3zoyINB_u96U(r>_U0xTNA_ap%ktpjWrEGuK9KhN2_sY^HRjU$=DW60CO)IgS;G& zL%pK{vY7_7Uf?4@2l(K)W^rII=vlQI{X{bCx0xco;7@}&pV}PkWku1v2Zrz*aOEg3 zVT`udlZ{feJ6W`H=;sL7f2qC%HpertrFsCyU*$`e`Kxpc{ClcTF_l%buCNqU);ht? zpMrR33Ag&)3pBQixmO^1t>=;}>)B%8Qhd#|9wz!XdYD?T^-$H2rseC7xsI57FGh{K zeVr0go7-ejL$OqA^}<{Zy`}C3s}GDVWdn0BCBux6M6Cg-tT0NTv@X|@ec07#ftuxB z1G!@B2^2rZO!U zY`H`&qmsSE)TxN3rB)0!?q%BXvBhPp>YQvSq$wQuATfK%hLoF{uSCCfU%^WY(L|QdU%V zQtD(jKu2SJCbMAz`Tf*=D!6?j-3nbZ0DY~a5_zF8HO)6|A=@ia!N@>BYNkNjyRT*oS%5?bx>p4hCehI7)oc-~Dbbi{*vH5kNc3#_ zYPOigOY~|wtPZnOiMFKg=1W*#LVNtL_FfI8^gfAv`@q^Q8zp_lXFAdzV-qDx&5Q&z zQ=;U$7gHZ+^CjQ0>Bsrw>k*I&SI6x;Q8V+vD*{>4K0Jr7rqC|_j z?dDIhYZ9&P7Q>!mYL-C9x<;j~U;z^S+BFVPm_(PsZ6&KIkqyFJ$r?yh2f|#%;w4Ij zFjuiuiOzIRPkWkWOLVPs3qWlp+7E8eu&xpv2e)TfKZ%0+u4b#*V2P^tg_VCcTB5@f zpJ!{>B#C~S=mThmMC-uqSvE_eE#USndsHIl#NGTk_P9jp6JywOY?VY;M?DYwnqH8| zf3y#v4HB&x2`+4lL~o4r0rY`HN%eR07ug<(TGfwXFS0Kr3Q1ed*0RG|>}jx{jeW1B zbLwvX5<4x?)~PYL(PCw3HW;Th2r*HOunT1NUBW*W- zg+)sAby^JUGOaJs6Fml{y~^SU&Gvht$4Eda((PQ2-F!W3Ez#oPlhW3+&eG>g!)E~M zBi&lfyqLOy4U(wO%sFWrm`9@g;elxz*=)&II(#0W=cL<(E>EVt#$J)=?=C9I1_ z(e7&MTkME*tJ`i(+FR_ZbbAB%wz8YjZ5!}yWwmpJ+h8blZ?lFHO@~tVHft-<3w180 zzQejo^g*3DY45O!5}h5fo4?DZNfam$MN?&=se9l+|h5)3&kegdSq&`>ci?#FmyC+LQJ^ z%aUk+pAY#5tdm6N>L_U+u%{(jl)EqOL)eX}q3_amu#a_gHf<;SPDf>Fd)OsHOIZJG zd-{J^Rk}8|l(lcGz<%PRg!cIRf$X2K(-OT0Um4hI+*-)+TIz282|FZ_gHTBu+4iI$ zifb!SGjcmZsFYQ&6Q2GFThtEGN&iU?)Jy-AEt6>7jN|-Mwwll$zs)HZQ$J-dNpvP< zPTHqz8=NG1xzgw3z;}@ClIT_7JILZX3N#el4zW=ZdBE)u+b2<-;^Q24YfF?` zyxIRN){U-Po$WWa=s5qHeJ|0&MVtM&f+b^wXQrb6cnnc};W&kRcD6}Xr?OXP&L=B4O0oo?f^Wb)r z#dH;D8@L^1EhXw){A${FY=}gIi?;xpA<K8= zB%t3UYEpPL^#rqZ6DX^2P1*?-Em3=L`<}Iws1LY(&+;Uy25u+W42hz_?Ie4QP$^3q z)jjQqVejbzdrl(kJzZd*NWK^9?dBKRPZGUZ zFNR%YLwbu)J_5Ht*%*nAfZLy}fY3vJO`&gkiFqW-DT!g1*c^$vfZJs@U!pBNDQgnFCjBb=PDkt0ud%c~0@>Wl!pc}X9le)+ zlU?d#^c=bJ524w9t?SN7)Ys6GsyL+E7?9SY)Rt~jL0XH_NV=_0Ud?=z zCerQQWZ3Vlq)WF=#jBZB$(3%~iecZY(q6jNgOQ@I(p|bGwuoWAN?u<>T0doo^qJFq zHJ~vPb!%P~P=Q269bZlJS3FvL_a5i|%4~@~zjw30zcODS_DIKF={Du#ent#|%D05( zNc4-2ZdwABzXX{Lk^H`0=#^EvBw%}7_`$ZZ$HP%@P+!;RRpl|I8Y zo%PGeR>lkDx3wTYqm?p6gz5KD!7M-}g!Vw&yqdLE28_`79?xj43>zu(VNveNj5f+= zI(j9ez48;GUCN@|_cA&u{YHs&F3S2mqr39<7=ezC`5~jPa$2I8c4ssCDT~Jn^jF)n z83UE{aRTiDG(rJY3Ycl$geU)d$m2OV!_OjFKJ6ey_w z&5UB@v&jO@%)6N}N4X)9U-z3C^OPo21iCWyX2xP=utaeqKF?UHlsq8N^DypTr7V{y za&&0(XO!I%?HU={`~~HbMAlL9&0kSgO%rJUh*r%vDr=?-^lkCr=35ktN1%2Sr#9cF zY?tVPLGzk_r1%sXZR=j8d7-BH70vf5-3zrG+uZzfrGKH8W4iziD>QQK3uRc5#`jh8 zFO;(a`5j35q4^=@GNDqxqe;I2DwA%_X03+(#nxismNTm=pen_3#L#Iq`&tQ?ZbLd% z1yonMx%=+shZU!Eo7p#p9aa*h+qr(vvm;7|bSvxU1E{5RYt#FA_Kng(y7let1E{BT z8v;GDZqQU1IS4s0=JI_sZ#`m+b(8Tw%ved-)v$Dp-_p`Fa#P^G` z-^BNea>T^@o3OP(C;D zT~Lmg_%0}yOniSTRc0A{e=6a#48A{=y0Z+vKNZ(3gYUA^&%}3G8EoRatc)`8T~>-r zd{=etE`yPVfj)?-JVMzd5BPzpi{F(V3Lrl#LZ_5&_pj$Sl~O_{70dli*iGdT>9#8RH|3`C ztVG-T;Uy9qCGwf{I&5IwBT;C!~09ORnavveR%O4BP~|`s6;-K5}j7QMWXn=jWT`tS&1&S zNp$-2@CS{w*m(U1jkMT!;)7ZYJppx)D1GMZN+9p|pdnEZA0^S$HjXO6e2omHUDvmi zs{Cz`s+dCdlbrdKSX)t*Tc)%aqGZVqdkS&g5TsO#w0EDqjnu0VfIzm^=q z*Gn|Jv~y;4&K?nH`IN_44L(?+1%M*?c8Pj>t|iyxaq|Qk?&*dBCs9oEYsvLEn=jDG+LlD?#$`!n6TV8KsOV=hlQ>LhOY}}=I-e-f zFMSSYX7e43jg;l`|9GL(0hFVTk=&)4Eb8~l*bU2vheyBGTZWD z5)H2RS7v*@oY3R!e1?+MiTgb+v@|JA$?D9f5n9Tg>ho<_7rtFbN>*16Q{NI@4eQ3! z2`vHSm(`vBvfL=GJ@_R;OPMu0G^+>yb%j7XvLmy4@wzJo>f?&a>di}53H0f#n5@41 zrmEqX%Ht911e%`lVvYOwql8W=PxZ;p8q8M_+5@OV)(}22wZyJ30{Ixe_?8=O+e7tA} zL-9cw3QQupiDu{sV=vUvGm}fRiun6_d~>sk`DX(8spA)A&E$s!Vjtu_ z2}s?np;cKWJV-}tvu5#{I@**qhdXt&E$boPT1R`c=JI}WDw6_I%rg@-iIq&q2K)+9NxK{A`p9r+7O&!-NK24%Y z>5W{^@a;NEaINNkp9+0WN>6dE;kkr%DLxN0cRkDR-zQLw5p7&A@HG;hF7E7lktZJ% z={EO{H=DLYXk3hT%cAX_h!AuPfO&SJi_$`4?HQ*!(;MY zTX@qS1p1^~XV=^Odx>&J%yhlSdz}*K^sITV5BS>>y**}$>qFk}cY(IMmbiBCH4??7 ztZ?n*qy7+R*x;93d-&pW0?iq)$@L%J>WVbsFt2aLZb~VuKlV@8H+-{1 zt;gPQ9p!a>6}`S6}iELAL^B?(IiK3>&upjwr67_(Y{Ga$%iQFS%*iU@BMDxMzXTDdW zjo|h(|5B5-&u)H-eC|Hf-c)M$KtKyecF%ZC|3o-EOX{LTKq^Lr#(F*-K; z4DTq>>!X_j>Lt<8A*tDC`2dNg56J{HTq2(#EwcaM<0Yy!q%EMS68)UqCHovNmgstN zFF+4VbUFXt?DKq)7D~YgK+7cxot&S2fv=Hh|M1=X0$-=`4Ub_L_$G@x_GpDAQ_h%x3B(;pXQvbZfS% zDm0LQC1o+%L2J)Q%EeDLI}Us1A_m+aAZWtEl4%!PT2nB16G#9)OFGg z$6VFa*QFb-s#jCrk#6&0CDftrkZ2{WggVquBzg_jxx!VSDzYR)zdT&6DiG_E`dfCm zI$WaPv*)Bms51$bvhzw|jq2($>GnbHzp;uoQ~eonl)O`@4YGjkHvbrAyH=+!YNMYU8n;!9Tpb<`^-UCpSj< zthD?L~JQb(mZE!AHLo$|*}TB+wG!cbbNmjqHUlvZk=NR97_oHpvXNQ1AP zIyutdYo``Q8hq{4c{<;-IUUs3A`MM+QMXDo3#9F$ekjp9pouQ(#}a)p_EcCG^$R_e zYOITTOh=n@x~hLlpVJ^M-PP+7;Tm6e)lyTW1$$lH)x4S--+MVd)QJN5HJG`Y^-`zR zG*Z?}Eg`hjZ%4+|)L!btI-deQpVU!RK&y51QBH4li;k+XzUodLZO-YZ9wM~Ie{RNV zmZyFv5bX}jQ?qEwT zbH=JG8yG1Yr@q+0NXs~NT>~R60gohUU8_#+PkTE|G5=dox;MO-ke_hwt{NCZ)*ftB=~M>~#8yqqZy0 zldl=?UP|m{Q-#hifH-UVw z(22yYN*(#s6N%fD7S%`R47-#&G@m%1*rhz^u;F~-cBNgrPn@dUp>(M!NSmTJu{)Kw zG@CeMxl6fBKD-?^wJiEB<=rt3-zS;7m5<0L&R-%7cPp33*CQp^TG%~`$2F?$Qf`O& z9wkuqnZM6HCf}Z7-reyx1x z67tuIX{f=QZ-IrAstpWX+H7(+3%F?zgK+6>mh%y1e33YU1p=KzgIF` zY+Xu@W*ce#GkgnOY)6!0&33>%&U!?tb4lS3N|Q^-KPb0oA$#N<@ZF~Q{^|MKiAR;& zHQ$~g$<~*ZUunK#CE0pRc~tXxd!5gGMLFb>!mG-QE-AdK9MeKR&EKB*s`8eL?T^a) znr*|NRVjZ|z93(ZbS>U$Ij;P1g6jMJ+EDo3ouJ!ZQ$9}8ZLcYplXTk&WmKweJE5ed z>b8?gaGGvAsfhezdtJFbL$8T9lwW1& zrF}zrn0zfP!X%}>p**hnB7LOP)5>o&U!A{{`e)^Y=Ho$9>YK_1&Bqk0^^EeV=IimE zVSP*aPVaTU6xWmQ0g?_Brc`?RoSTd#(GGp-O4u2*QV^T z_9#0wUx;y^^>51kns2WE0qX^&L-XC~vDEsZ@}lOu-g~F@Bjpv%mn}bI{k!rf&3B*Y z@2npyZ)?7_Lw2TptehjC_Nkt7L9_jYy1uA<BVn_Jy)ETep3wwC3oxFO?^A9Odh>ex;lw-z!YKAM%Y7IYn~5+3~HijeO0lY|xu& z-z&FIaoqQs^+)A-Eu?twLgF{%>Mfb`Rk?Z%a$ZBe7B*4&z{>f?Ts>z7UNlwDnSn2# zs;@>p_{ypJYShTTn5wTvJ$b`4Jp~`$G)+(4hwtoV+dWNd^Gb)=hqr3JHN3+-m><-9 z7s5KszWjNY`}}y9W_#1rVfN#1YQ7ww4)YNHk>>l%zr*a$ztenKK^^7*?v7UpZ_#XPhIN>O`ExF|5dM;8I~ej(NC^MT#Wsvz z)@%*I9p+(t%5>cp$_vQX!u&%!%%Qy6#TLdJdik2PkRKyt7=O~m7S5m3Y^|_`^9wGv z2>z*N+kzU5;KOFYNTU{)-6zHukmgf}cwh=sSrfwU- zr_I!DBe|taw~gdEWx6enTUO|{I6irW-XcfwnJe_XjNE`Vu%+^YF19q@q1l?z z>eBe%Tx{w56U~;1x=!c8cHMR@kF;w!LtS6Xr@7d!#t#vb{f)=4~C^YwWC%bLl@XujKq zC|OpXsQH$9_-AGDWX(6qdsx1rF}+?(TBXd;0#LE1&L%on$tdUnY~uKKo=h zlM1sayatx4@a`j{tid?TCK!cK&)3fR=cJrT0jIBAx&GB5K8kWU%(>p`rCsv8dN_bz zgX%}Sqe2@hd2x*JAOeOa(d@?X{``!$fU1Pve_K0eRBVjdX??9 z-jwWKGixgiIy}8&)|ve1l#}1~VyID9Zdpb#Y{|iA-GtXe4aIM<-J*C*Ud7w>lQ#4a?Um4;madd*c(gy0;WL!u^qsXO=V_{i|hKJpHRD{hod@tT4R)dVf<)cfs+RlU4QB zhJ+!37?Y3bWmOM1ZZg|jrOR7&z=i7lDE8O4XGx)4SVVJ74%p5qiDcRgA)3s0>kd?U zYrquGp8oc_MaG-2uDzz=GQ+~-iHq!>jIJ>?%CR5h@*m9_ZMvl{ohw2O(~)k{ocSrL zJ6*omtFEpuYP>K0W|+^`a6Z1K^wBD%qZfVnOA%!H`q%FGcO4NwNC=6e;;nGGjzvAL zd8DkKxS*l>%fb|`&E$MHf8_i5O_VPrj({=(Yt*<+G?O;N&$O-B4l6Q!eK9%izhgc$ zcA=JOi`p=s^vsuAi6Hgst`+ITcCU{@%FU`DU#DP#qG;|1Et6!oPnnjs04^yWyW$ zt>wn{<@Vl7+tp%@zoJ<+&s{^GabCRYqp8EHTY0sE|ANb_E;E%nC5PZ1Taje(eMY+` zHl7sg*tnlo#XfG!l16Lnjm=8;KFIEwXC2KaHXI1zuE?#Gi+5Mk60^>Am3Di(!oFJ@& z58Mh1^$Vw`+~l3^m_vW<^nej^lZ?CAD=v*gDwoB-j(U7!i2J^?uAS-{1dnhP0Y)hP zHHl2SzqqhXU9gpWlv~^-rmg*|2?M8<5$2SE`mxWK&#^7)RZJmD+ZY2^0+|J-4_m+w z#vuW5-#Mk+@Swh?a1Xym&BbWjchHYh$$|kolivXRPT_*;mbvMtA4MeLzah_2=SnJ1 z`bVk+Ol^^GDE0BYptYrk#`CP!MZLo4c!ZGzC1Bu9i* zs>IZeoRh5P7iW;h8A>W+C!a*{l9!35<1m`o#K0%##BK!5wNuE1*tZ*E% zlzaQDV$ARVTW{um&TcchLyJaTUNPqO7~lI6@7r~*{))QV%KHJEY^Gp!a0&)0*N03DWu?+z(4h zn3=or2xAp>wo8Tuzt3l4f(5dCaa;LJ&?P(<6X;k%txA?D)q17!=vGqTjdtRzlmPq{o{L(CL zLrHC?*kmg=7RdC-n@UyA-i=7?^&EU82U`^q{yltyTXo|`R_O=a$XSw+@0zl?VWVxS zmtcnN`pJ9s`=Rkk>+;VME2}Z;Q`b`;SHvHZamq0tK`wkv1n~a+2k%^pixGwO=s+g_m=Js{tnWWk+-c{ZN^w00~sn1K?s%O}8-Ye)- zu}=3k_)Pz(d^yovEUoBrjpbUuF8l&_iFbQGhn{3niQ>{g)Ob!`>M8)&YDHL3kCaj_ z#`mc3((-&qN)-k#saAIKqI^!hV^8{St}@%kJ)b@}b0Sw{9a&90-*F$e&6V~}HGmSa zFXx==f8Q|3mh;g;*E#7NOyN}Qr{;N|gtdsC_i{8Qp8d)x7x9v-SlX&O`)2=AeCqr< zSysHH|DNmkhx>IizIiw6KJ|~1tw8mw{7MyGTpP`We;OW3^AWM`YM!;nqKocn`S;cu zvGbB@6=iqZbE|H(dm7bF8Wy}yV#p=9F$+#RbSeu*%9pMLxH_h;Vfh>L-H-Q|)71cO zq4L|B)9Mj1=N=;4=jU0rLz?;P*+y{>y^>mkY}?O2><{4GQ7$Z7Ah0Gb3{V~Vwn?`0 zxAM1*w#5F%1V;toLv!HSA*`{rJmLY-kvXt#G;{{*1s(VuN|rujeda)5fV{wvHYKWO zeW1=7=q==J!99al3;z)UtNb4s>fIN@f_DGx^oKWhU&2%-QSEO^UsZ5@Usa$sqB^uX zVl!6tmujqPq-w%yR6EKwhL+WBzfWL=zP6NX<%GUKT+}$2iP>)ke8CcO!r%-i|J6nJ zJ6&{)bb^9`WF_2fM{9>La+|dd2EhbdGKYRz7tNPh{s#3&yd>Z$SUItuGONJUYxP%4 z>Jn0{p?9HX)Ad+&c>6;D+Dj}>zkr6`cxKT_{q$wtComVG8BKp;{rJV_XGU@#U2i>2|l>VdKu*oGI zxzjN(S>B!CAdXdKx7yom6KT2jfxj#~!hRZq=~@;$L7wfS>krinYGPdNH7Hl`b~|)2 zeqlRvR^n}S#=US?#;19Y^TJo3yO+a$BQ8Flec@)JkgzG)36LDo9jqjE<9-$!As|%( zDl`#IEi|t(1M#ReDj1n7!ezrd#?do5LF3n%GUMd%s8$>A;ByeqsB3c!dnV4*%5F$p z2TNE!=nt=^KfTcMWK4z*JEf9!c_xsD9KI780(E(=JfE0Aa%F^b=-!5Z~Fo z)=l!&mwQ;D_1<_t{?6_;Ez-nd>`f1p?Bo<-q!C5=ggXG2aDja0cPjA?^>P~e)!=MQ z^7TiJmIoh>uQ55ctt-4hZ7?=^&~ACl9L*C+Fap?#HBt|*Tp-bK%T&Cs(ibz<&fObtj>E%(i>G*7 zk2r9LpbXpZ9C|~oq+`M@UZy`a;`Fy|08XStcQOui#nWhT{$|R^ zj<;74;Auj?j82P!^$7Z9uRP&!EUi?HQL#!dA47ihQComLH&wKqn|^Sj!=(Dp&4S`s z7^o+-D2OKhFjEje;ZPgKwqVV!Aln|;;Vi>H3P%@*_^jmF44V4hzU_AkAB2Zk!@$dK zL22|3>C?15DA>M#UdEpj6UxI8=5ay(rZ>|p*gbVCCmO8?L%og!lIr~Q>d;riJ02N7 zJ`#ri;OVC1rY3(CghunBZiQ-%mSx#{zj0Mq`v!`l7Qak zGx&I?sGd|jjmgR~?A zxf;qTRcH*^B}?{r=NXF@+U)^*h*t)Q7f?>rN86brWLer~b|*WzZ77+1aD0Q6Q<~v7 zHIB@UOrpQ8KZ^&zb9QTeP8qNlhj&5XgVM?u4l>ofC<)?`xG2o@)XcliHp1$3O~1tL zHPjoEX2|Qn$))z25PfnfGVNhf zcopq+5q&)uWSSs*+NUmA)a=QstpA%de*5-trCm#yj`#-G?R!IUN+FQt#PvqeEjmJR zsvCb<&wqB<-_Ho)?RX9US5N1aq81ywAPF0LR}uod`|CHcdKrk4gp8*xj9%oI0J?L&jcy51rQV9sS67A*?c>^R>3ywN8hCwiFYFVw-5P9cq!b$nk-*;s>a3@^B~O(3xp; z&v|a}>%=m2*Pj0XH`4Q))5AeEp z^E*|4XI#i}k)6RW#SS04JEA!zO227Y;@YOrW5Q^mYqndrjqO122lp-EShqKJ11Q&& z5+3>KvhcN8y03))lF@8Z;OVk>$<6t?-L1X#DW-j0=d~IfU&wFKjsv^fr8!G!S(^A! zX{Zy!i7{mDf3iBSZ4-KMo22^_;jl*u4Dv*u{C@Be-u+I%m=dcf4g%I!lDrWwh}~0& zsbqUA>ozKO?oW9*#aF^e`p4fDH8@$Q19_4)yiL{$8l-dTjB6hxgj!d~uQ?o@O|H+7 zW|XN+0|_wVat8y*-9Ni1*!U3&u&u#s0zpNrJ~O1B{6=h*2hz_PLb-%UXAFysd+ebu zR77a}LhY-)nYLPPbQf@D9Zly?I8fj5e~c6q9e4g}eATUtjH3;x5Fi=H-ohr|{1W}p zQap{aWC5FlkGB*-`PBbMjzMfuO!ylsW72`?O!l79H-4yU1YYrH=fduvH_+$REby0b zugSeS`ByQammD1!Pf#JCfL@1&+>`(Ul|DV3+isjaQ zIpa}HiuaL0M{=&+^s^F`#nr&GxyaY#xJ+8dMMf;}8%pmA>3MZk(7|RY5mUWAJojj5 z+B*pqmMy0k_b70)O<)wLuN6)i6LMpa$7}K(8J^EsB1t&YXXISdZHGJIIq~^2DDtSf zXlgP=ly)44Mon2$colQC(ZBd@G(XRXpxx%kkT4Qcg}Pr&s!mnG#tP^nVB-OsqV8YVD-D- zzJ0S`hht~j&9WIvH^c&%Apaw`{|M+G`S?F9);yTKoCA}{|8wvEsS@h(iu8quHJquu z?@#QBk3O99%oK#Vg(((T%YumugE7>5qj%)kw&1*4ljzU@`E2Ygw45VPwR2IHL zFlMF*u_;K2Fj?Ysk_tERFuWg&PeU~FL!Gox9Fhd&uyQ_FTMGg0u8G|SzWXs=M+?3N z?%)P_yu5u&xqwWuYY-QCJ|xafJV3Mb`$KsT#YcTXtQD08(`bln)i*UpfF%Y(xJBs( z;2aQd7{!H9h(%JqX|lT!uH=M0-S>MSUlX<;#l<1;j6zC(aE%EO*D-5yak2*OeIpr& zFG~_~&zI+mnf@6K}RyV z;{Y8}qjdYNO&+M$FOV~Ls3P7Xa`Mo%alHTR9>=Ibk)z!EK6R<&oSiVKw0mWIE{#Fro_uoubM_Uu+mB#KC{nzQ4Fjbt;7WAz)j zBylPg;cAE)rUXB_HLWn@Yv-sI$YMhM>5#80e?+cS{JU5ppEo5kV+xnQjF0^NjnOBU z=pK|SVQ%?`6}aXlav-^j1rp0FI$I7%NMv<9SsFq)vrQt7dj8tOu*;GiFPoi->zNwS ztxIIO#9bENOBZT(N~XQ1C*{akv?S)qDM1}s#{m>hj0Q1^M51oNDtXR(ee+>jOv@mz ziRr2gvI5NFZ2Isk4bhABOiB#!Lw3jj%#%ah9)F8nyKC)aXi&T2^>2=PWXzzQuciGi ze6E{n6)#bI?M(5=T<-U)hXZ&#<2E>cNl@dSxF&Y^fyr;-L{QN<^IkwSx+yJ$}4oldw|NX z=qfuwZ6)~-UaW40-x#A?+hc&Li(}dn!(X>3Nz1-O5onpmf(wssJvyynSRK^(!;WPs zbtzhX3}RlwCy?N0aQEBkz5z(q>zyIu!I%Ua z;jCNOp8B#4oD_SZ>nUKmP7J5lL%Rk_ljL|je-Vf1M-gKRRz$#Tn8XAP<2i~{YcU%G z9W^!NM@d3=Z$ibg8-_@7W^dRNMR^6L)>I-fy~qD(BrW~!&k||fk!{fCh|p?G7ug*C zX$rd_ADH57VlBkRmBD%WG(B6#7B=4e>l8$_L3Xif9VnUH?g(|*V zLu;NI=pJeIEan$t>Lk09YH}pH;#WHF!!hjCY>~W!lTFF8OV)_{2e~8-`~N31J(7Lm z$vA&2m-MuM@>|PJl*YU4V3jI|JxL>@S&`Qk!yLbV$_%YrXI+e`S#b;|A@{J59q2|^ z9b=UABv3VI@-0_%+Y>j~XXU$zKwlmHM#Sll>EU0JW0wRJ*YLw&Qq?3k<1X~^^J$c# zF4k+AY(b8)ZV-Vzn>C{KC0cT9dKJT!umkZh`|zmRnc{ji=TK%xTLk-0M1s#1s1LEg z_sViW>qojRRNoTgUkNv4oKZqZ@jCsW>oZ&jNbj!=wde+T-uPn%M1g7#T(>x?iDrcXT=2heJM(&#z(HE;7tV=y%kaqNqo3GH8sCcL$Q z@}Bh;YuEvUo;n~k5Yh{;l|Ho#$Pe!Fc{Jr?hk5_5vP&-Fb~+;wl=*N?fauNXmJkRWU6LOjYm_K_C22BhB}o9Q zkSO8#AHE{D#lQt(}EF6T9Fv?xTHwU-q`Q^tiBW zQpAI7Z(6K<97s|==Om;B5shl^`Yw@sUTYK?==Of{R-}8xRRGJHs4+0H!G)P-L z00k20@|jdY@q>6&9g;t+QTPOR?t%3|B{303jTZR3>6FvCY$kEWd6l@)hE-c^l>{PCVC~*CcoF<{2q(XYHDb28QnzSMST3TlufNQ{01JQV&)!QM)8juQ`P4 z*}?H?wIu72Gsi*aTbl>pKG_co$Sn{Kwcj!((p|q*vTY*RW#K~;ju9co(u_dKV=ecL zc=G)02AvxWzV2@AKw}Gf<}KIe@^v||a(XKgdYC2<*l2e^jcLyy`85@eI{e~`cb@y6 zv+f8rkH)&rg)OPZ``*Jp%Ha*mHM0wm^~1Db(9dmAiFWT^`9?w?0n|_Jc0{Sy9mHBS zCDHoACz5?$cpNy8>J1c5ex^E(OX><^#df^ZuTG1;6Nyg78dd~O7uF?agIBy_V!&n^ zC%gRaNi=*;Mnnwa9Ofg_C(~qB)S@63PvFhmqe}!^G{J_lb=c*X>ppvu8MyCxAZB+W z%N5C4XxY0t(n2n|OgoDMnRDWC(U~8&pPF3DO^WBnRg^4pGVnw*!A%J{8(Lvm-bfge zF3UNw4AYy5KL4}fLqhTIJyJ3vj;Nd&;Tz9-k3j5U8bmZa(|8gPW;%@GvLwsD_UjD^ z)Z)c6jb@g@$)^S}mSE1!V>nn7iZgl}eiG@|2JNZMG?R`knd*Y|ClpQJ3*4RRZm-N@ za+ zgz;AwLf;fX^L+1C1H@In0!z3i@yQ#$)B={tId~+|VKA`}Cbz-%zG2%~_2V=dQnIl$!-JCc!l%ld% z%88u`ITM>UQj&pqC9kf^lB6|bNoeg;XPHx&JiK=YAcgfM{3YTXESngI(jLJl!k&I3 zrV^e2q%uO7mKr0$LbnB?8KKvOEJ>}&pOFxfyP;2_XD}9tMw1PoQ~_;_nCgO;L~Mwg z&>qp-!^I=kfwv+D;@9Y;5lkYqOj#N-bj0ka+Tm5eHz31~q7lb6ZvtZ8)Bi1OLU}}w zLz}F4e4gzDqkWyekl#fZ=8@QtcWVFed+^*>OpHr<=N$&m1ISWQ=Bka1YB@9uo zf4=$8GnZt~hyfN-Q8-0nI6_KyAcam7x)G5+t~Ou;pClCIWa|BlvS|^Lh~3(zPhL- zSrcRGLlN4#bg;{jyP>v6*nA72)Qac_su`tO5y-3k>k|%Fz#W*!W@7%Iw2nG~RU}n} zI6@YvMp7T2^G_6DGJ{@4oh%P_Y}NU~$WEC>SC}PAPhE86TBcc27UWvhE#0##7ur3> z5^QbJ^#5=z#?j~~z`h)zyPW*-t!Ifk|G>E9E0%o8TtpR+!H6Sa{LdO%70?KbnX)7b zHjNLQd;?n4zh?ibH3Ub+J1qr9D0|K*q{Kqc0?&zmQkY5}`6(JQHY82uH*|>+xfNU~QD7(uPKk7>sEDGb1e(**|=+2~~Yt4YXT_ zRI!KGfkP=K3M1@<`9!cC&qx4m zP-EPrXls0ZTH?nGioExMwx=R5lUnki&7a%$g&yIuG|kF3BB!#2#7*ykMo%Fv%~>WL zofA0Tx$6^pCTSUId$b|ai&C?N;)U2nqlq;gBJV;B>Y+E59pRfm|6!uNxZA@gqNm&^ zo>#v<23NXJpbjB&k>9HRZx)l6T{v5&P(_udY8FR&2{@i&60iR zCPR0p-y{h9Q^9M=^WEytF~Px-&{pNOCbp!;EpV5$&S zi0)M5Kc=Sg5`@K(eseYW9QEf3AhJQjz;xqO2A?6c^6Y60-S-jVxfv|k3+cnjB4^<= zaaNL@rPea`sf7rjzNg$IX^g>Q;{i)g`d^t#=*nFY#%lK^Y0rw7%GBk&x-1`rmU|b!BJvK594p`42tR6lU zfxay0?kqAKF+)FjwpSTAKIk3!;XrCKc`be91$z|G2a{;9O74nwe}1$-aq5(F9s0g3 ziOE_y_-{aVI8XTNmGQvl1h%lfOM8s$X34p~6d|>DPolkDN+Mb~A$f2=F&LnDm874jD1=YdC!=KR2pN4t>*jDTMt?pvjaelx> zHu25XAvwu}x>Yl(dlb8YB~I_*bjecxB1u2 z$Xh?JF8|`gQ(5w7CQ*wyzcz0D`37MY0nH(-iWAP3 z-%oUPkx#TcZ;QXt?$to%in%Po2mK@NJ(D=%Zb&qgNu?GIKPWvWZ=?+dZZ7|B?a}6Q%;N!Y!Qq$T{nRNg zWLtghxxvc%;q~h$|~f2NB6Cm>O2V3#cTa9O~G=@TsF$(5;(G3v#EvNn;xy z54+?kimNXsu$OxZHtl-qD%X9xVYv@HsaMWDNYQztM#iPygR`PMLFd4z9&;=7U{^ny zN0mRcIQF~i zPXwYmXQ70`K(r-9m=Sx*k+uUfyrJ1p-%s3J3~wPM7}K%b4FfWxM5aej0O)B>Zr~LQ zc0%ME^Fa%W1N(t)#(0k}vswFgcphx>GVfR?+CeAPwXN}3HyS@D^@jYZOHK*{=Kf#fr3Eum4DC{D;UofeCK8Ej zKAW1Em&L0GF!Phkgz0=5(V*RO7FGK?QVHkW7A#*%DWn(WscXdcC%RDtYmZyO?EdMq zQtt?fwvRiOb64K&C0`-fwW>DB4hS5c9&1Md2=}Zst&sM_UkYj3*N1lRRTmFzXiMldL32u5+>q_JK%V z7Mx20=0KP}kb#jit&*O!VM{4Hh+#)G4B3Jv|Ad+>1hgeA*Oy{u@P$3cFB2)CGxJ1p z$1jgkb&kd6tucE;lcz3MP*se@79=x!Bkm_He@#ZXv2>oR_FM%*3NUeEUd%wvKfzdvK4TYN&%_%r&zmQN#e zDqciRI8^lx*SbnrpNtR^yuOPEGH-n5Mdrdw){MR*-qTPpBQ5F{j)gL1muiEJO@03~ zj-z0($M$E8rs(oJ z*i9=^yTUrKk~L%QNcXf*-gMg_tCPsS`syhCMNIs(Mu*!&pNMOd%G*$>yVH9^e934w^Qlc(=S#$o0RHL zkCMhc?3TPw;mHv1T2hd!MJ88&lHvG?i-P2(7A22lzk4OIqTUdrbV`l{zaoThkeLel zVTsr$0*F7bl9z91Fowbe@2D+lJY+_oKFG!)^wZ$}vM3Svc0iAu*;=wc#j;}a(vCxI zCSm>ZPrwQ|EF|B0nYrImpJ86RXA4)075;jnxqRzXWe6N-%>yq2fCuw5eNX2i6VZ_XGG=EGMRLkWh74$2Xu4aZQ*GoKaUi zK5-2MSe!#h?<<(&5Y&SPC(S>r|J@vqrv-yK!S7k2+=g@zI3a?iyKtQd!XHR4e{~>% zK{mg%eiG46bQj!!0E_v5vP-@UHbW0zAm4=cgs0kF&uJ&-2(mD~>5SL@iEICI7SKT; z;+=FE=ED-6pzjCKq3$QqK;;RJLH;xP{KjwSF~~yqhBTfCf~jdVPS6ilL^^4e_!0`t z!Tf!@LC+5vk`L(a_nx;PzG2xi1ZiHm-`Mxafqp#Yze0M5_@TZAy?ReO?U8QL-Y8zR z_#pVm`eE`C6T!%jP>Mt)$_LmF)dbm(l!%@tZhqcO+(fIA@Dpz!0?|DMykcJ&gM6>7 zK{Z?QPRJgj{K(Av!U~G-NKX4CQic#rdek2fVN|&R?;`?v$PlJjr9NM|V1XmzAUp)M zt^kV9K#f8l_yL;DfP&=99*=!-jln=>{1Tl2Uc%(%&j?@9q#;aGOR3_Mer6O=efgov z6u3xZ=8(Aa)r@AtAe9-1m@)`w97A9T?D9^S{to46u;Z)>W}YJoL$iXFfMk>*7D4-H zVt7pZXu_zJI-4Q@hECBMgc@zXK@30#caojvn6s`0iq1s9utzVv{~BXz(3l42ECELD zD*Y3M7sfA3!eb58*J)$Ar_4c*%6vH?y`J~at=XNQTC?A9Z=~G5+(+I(-9z)rRQb7Xcze zjUG`xylT4C@uwPidtPqzdtRxZS`)?t*M<&$ZVVHKbtDl4cSP}h^~CnZyE#AOh_@eX zpV_VB_CUH}T)K@%27rp|wuELq#^$4l1p+vf292xrkU-RGa3ISj$eURk@;&4w(;=c- zf8lr9mrpnP%kuFBb%5;fX5x~aw?R`4{3@V#`e6}cq4mBGD9tJBHQPt$JOUlQtg^Uu3>J^-u7w2Ny729QJ+CgPajMiVK&=SO;9)P>zl#y;^L#$Chw+e zSG!Lf$f-NePyX5U`S*4Ek$XR*yTp0CtZ-)N8IIFtJV)r~C+*j$H}z+t8~?#g90%LK zbHB16DL!jKnZxK2wXoN6T}}TL4xohmKzs81j@(9kbn#~}h&xaZ(Tnz|;Jc^A&Qx)p zJF>6IQN3_`Xcr4BzlYq_%$9s$H{3hFhl+&dP#-aP7UPg0dZrH0ud`hLGFn7R}W3l$CS4|;dU#Pd|& z3jlA0oD?$?k&TFq$iewdS0Y1|#L&Tq6Bo+g%!Q)j=&LaL7gdKiim zf9ITGWME>TwKLUm)e&A}abyI#4*Gt36kXfrWT&y4D^$F0rlQjY{92Uih%hwYf1-7Z zc8vufVEadjf4Fa!)+g+&Xq%6o)x6Mib3Pm}wD}hJ@#*W-P4wl+zdb&cDle9EUt{~t z`A&dMzs=m#3+8X+=&$Rlw#>JHvI2h?GMJL-zSaOZ%1ujW%UyWc4 z;4wxs>EUR1{3!M?q`U6L*$L^)c)&)ubQvQf7OIT402He-;`n9@Q9aqLJZPS1AV~^4)GF8h=Dt}Wajf3 z9oi2ya)W58zx>pwyUJ(-MPz3bbW23!#*_(xor-X7sMJf?MMf|QBRPXDE;twN4vc?Y zdpltt(bg`v+qPo=zJ0o&S{rp3+|mp1#=MAg7~Iwi;`!u`c7d^$TYKqCK)QkNP_q4w z@JKP*??;W@UZiuDQfyeF^2=B0lba;;5-FxZm`eDYBC(q|hXI0aSe-M$gQ&cL`W;1M zd_NtzP(u`c`Z~$V3L;&~iX2na8p&(_R8*6ejF&#|0z1m-)5 z^ydbA8HL_#ccIy!|9jvHpTXhd|mq@+6lV`mz<qI>FP!6Mbnk}VqNP->rOY@ zy(sD~e6|m)^OZ_nqTYKuHJbAtzx_`-^4s(e?n?}w$P30LOWrq_l`aS~_ag=^4#&ZX z3`N&2mK3>EDMplvkpzQsPnSW~L8rklq`8!xlws1Mp=>i+eQHe$4h3^ak92FOEy@n& z+x)>VGqs{CA*#0w%Mi^_7wj$Vg{p+^yP03H<=%w}y$jQLnYRh!8N7p~i3em_d>y=( zTy`NwcX6s~dOI0pf1DfE%MwYsr_0rq9q?7o_`vN)C%I>!a_s3& z5wMz%=I(MEPa(7#DKzOEX3%r=oZrc$ut|)*YG7a zKSC+BJYuqAUes&^6|$}4#BA{#B0cH(M%jIVO__Vk(?0<^H{?KA?&BwP zihScFQ|3N&&q6!#Z&so?S7(2|RPPFfhg}M6d)$SAe0|FM<={tWK!=R5MhX380m`x5x&AS;FhI+!-x4JjqT0lNkhWyo0j=m^%EII@_ z=sJixOlySvwiekPhDZEehDU@9F!n#6>R$PHNAC;-a?o`UK9pKGK|)vj$3hNJ-GfUI z{+!6j!^uWM4_8W-4ciCt>WU>CKXa{M5rFmhSPay8jsPxJoyf19+RR~Qz2}C*c{TaA z%ZMr5twoKz&^&+IwT)rz$0{69Kj0obN4<<5^Sq4<@R2x zX#m$t56?XqmZqUE4G&4=M)gH`zl$PulMEtmB4vGQA}5>;MH2Hy4*NzafTnqQEm0`w zMR2c=kwT3r8j|$dw#hrR>D3_ae|jzC!g-056y0u8z(g*_tcJjhXCLADE8?`CNo;p> zyDLE1C}yBxiS|aCP;mgWPH{kc`y#|Ts9^dp8Cxu5=OAE^@pqDPVsJ^;l^w zTxItRRhrlCTOH*2HOWYu{0WjYn;+6!vqMut*+6-MqeZUR?nMHA>A07-J%`x9y3IEN zcS+B6dFHN*MY}cBN5-M^fyEt!(t;ifdw1H)ybny#B0PH>Q`QY`sov-UgN?htc#Gkl z12BukEzf<>f1!J!dk{n5L*c`sLhwIvpfMoXVXRqjc2ES(YQyu3H*W1M^bYjIgk?db zL5P1aQ>4&oryAE(RoAkasV`YsC#8|g9M#AYpZj=Mbuv^m)qz*IZ%o?;wlkE~v{mb> zZRD0C0hxf2L}oUVGOKJA*~PQgI^3k0RQifinmX0FL}K4%z@BMDbwZh*V_3_0zg${bUp0=u{hOT){c_n>$re;$YlF)o)TdS$7 z>%)kX)V%H8#1cB1ja?7U1`-e=xN-H_-=)zKV zoYZGkC{8%$isEuSP;=V+NmJKw*@`1MxvMH0#>kFLmAX!{VKd0}v%HKPhLNY{I>53? z%S+A9sWc=Xf9~nDSY@FG)v^@#`#Gn$+c!fI-7&y?Rbe8haV;5_l8BRM3hk)XnX74$ zRXK(d;!oA)O8s5R`3|dVnP-!^3^eHBM)jHcqbk>?JF@2a6B+kF(eTD0V?EvF%oVPt zdzYm03-t^v^L>qm#K|gsy+sXO3a_c?k@EW#(JPbr`T3=^#lBg3=*sL|4<4#-nAfCT{IZEmh%iQvBdRK;{jg za%84*Ma$c>$Rn9yJX*+PG5OdxmZr~EFMFDz_zrK?%F5&&PY_`uJ=uFj?G%q zR^q3|7r!;5SaMj?%yO)2j(C1EEDCLLjrI4H(_xeTVP8(3u03Qgh}9T9@xr9(e1ynJ zzo-mx5x09mh;h+xTaDf6;94(&O>cck`vtkxI$o!mn#P4WaX`0{ro765YffWyr*K<5 zZpNDNKw$c3s0NV2o#|~TTisciuTsA^KT%mzT1#J}aA=Fi0-shxL+cowE!Q}D#*io) zBy7gPi4mJ!Azv7$#QTT;`c8>!Mu=G2>dgAbH!Jx*SB4-RmD%(l7>$DB=%v%f1JzZ^ zo(=lZ`Kf08VsuIk~!s`QVuOK2N`bN zEm~>V92GLRGz26-(9brozgbvAki(tG|e$d`)BvA*WPqPY02_MH`XphWax{6y~^% zqwF%ML$YFg{Og5RK)E~1OB-!-c@Y=Ow)x@M=SSz_ERWyQM%>a*H53Bp{AkaUrWaY6 z{AuK`uQ~@Fa%697ItQ@P86?{$v(W_|zK{=D4rptWu(8bXtXBx%1M{NpF139#EjG8A zd)Dm+*7?WBgX0}i>dMvA7WVWCqPhqO4EFU-@dCvlbx!7`yFLAvgN@w1#^j)m&?6fS zg-xX7smqp_+Q_&dxANxH=cY>&_ueU@ZYiQj*`xu&QZgaQ+WMM-QN~_D=_R%)Dnx1s zv}gPGY^Ft`O)K-7r?wB=<1-Z#6suMtc38d3(h9~qa@wN(Iy@0OYC2OLQzoKl%c_`| zrbznRPBLnzB9)zUDsYbGg1D(?MM(sLPdV%F2`z0rW|;=rc33 ziL*-e#f6k|L%)9*O6??PuYFB&Mnh9hR8n@DO+ufgJ4Od6E6T9zmr{twmz<6M~HzG`OVlRzny92 zyxz4i0` zCDsY zeA%wREG{@VXy(Yv9`$bXtfukdCFfRkXi}Av)Mz#T8f%^C)=1V~LBTPCp;SJf>@#mQ z(@Xw1u7C3ra~B*}q{0VshDS_QFjuuSCAD%<)hV}a29O*-Q#0`mFD&e#mRf7QNWt03 z1HJJdP+_g<=)uDB$r*V=20E=v=6kJJZaPV(L1cTIYk>@LkybOcdey2Qw8OZ+)JNN_ zoJ$=&4SM^}stu*;Ho)cY&~lXdd`uqEnuBEi`N|X$;zoUNoI<3@hPE~-=K*nb+6~@_F6)HpODP(=^=04vXm`?q}_Cy_PxtkW>9q)hBL>Xih81Tq-M+!k0^( zGX1HK)?|Bd#mT!_P*G2gKo+0sbOb1>nb)h&$r&AUl?_W$4=V#^DNFW>3yY1z;&a%E z$+yCcg*xbpxa1YEiUo7s(YW8>xFcl>@BaY6OU52YZA3mm;B7a{=Blz zB^$jIV)tI@8hlPwmBU-3i|PR$_BW2(v{N}pwEF$M&gm$<-kMdlntNY`{UP-_5%6EIMir@sOX;EEB7E64l+jk|?yyz1~s2dsSq_0u|X z+WY46$|~nAnw(dwOOBfy8Z|pPWz{uh;zZDqAs2Y?V&Gh<|Ri zi(+Q|n&o9RdfxG1%U%5HCxuQgt)z9II8vQgS!-K?b24$FSyARxyDHS`)cr*(YpT}g ztw0|sDZ|;VXsqIKmDN&)s@%;XIH;>yU*@(yX@}%k){6%0^6{Y~;koFdNU@Ss>XYoH z%B!VAAu(aQ%qM90nwoYGy)4z<-b9QO4yVJOy~_*|T*+1&-1SF6t#{jGYD3d(A0ZTL*yP05@emAkR!R@ln* z&llW1B%5g9{S8I-I(KSOSa;c6VZ$dQy*?;+AJQ>sxwp~*aX+ovz}(vksKL0miQ&$@ z1s}51l{Gk)sQvBEPaNGgiF$YWK=JLUNSp`{TsyrMxX!08vLGHIeR?L2cL$2#zqmtG zi(3PoLic~F`pS8nzI+&$*Y6`I-ReFf$LnA2tp)bV{Ibe&w|Q`S!}PSyfmcy0v1CLg%h_Z*+ZsMr(Ul4X=Ip-rszce&Zg;iZO7gq_S z1`wm@RRYmCarGeXH<-2VYE7MZU5*b2j4T_+4OMF#)6&)MP}i>bzzGY!UPrk7>s_p+ z^s!0ol&%&WefmGisiW9ePkFtqQC-XFYbbSzdDR@)8vc_UXcMrT5Hx_4s*@Y7G2Av~ ztShb>#HGg%5W<$174`-cu(BdNg(;QTanWfM6RoRK z-PVZ>1a0O>z;2kX!s2G9AB^iE@=(f_)s*2FTfBt1qIOPIeWmN>O?{0=DDYqR z%yoL!SJfc1bSkm}acCP)-9JZ-o2d`8ux7zZ)E@TXq;m0y`<$B~DxU5WX9cR1*KaeV z9j)}$s%I>HwfY*kkHOKMT-t|rfSFfWt9tDY;eW8s{V(p(it}IJSKI5pt9*5XUFB;y z>?+>@U;}))Nd08!|FriuP;wpDd0=(VPxt&aW_kdE5PP7ZNC*QF00DAHku)d~#DKz3 z_#*-SnWTn|nFi3}{IR=-z*u53J@AjXF%v3lCDyJei?*m0ZE#oek#^0q(m9f2?Mk~= zj?A#4_E+$aI`9X8Q&92R0}g*p#*V?EZem5L5f zeCRxfwtMrQG5}l|q*~hpg^kZXIrq3*7mlG>WsHwjqhR34XA8xT-?nH12-RwRey%Rz z6}+>O95l-m6>DHiy{8Tu)f6s-?tvBTGSL20=Q3D6GIF> zTRA1}eIblioMhox+!=@@;#9<5HSF}CmQe;A_b=}+zOqTY|R+2X}oUj zS{4$8K}wV%G(0DKXUZ3gv|DB-3JSfF1xQS-8$nBsVg!W!TreE*8v%2*NdPj4qc&fK z)0>%zV=feWaN1@>i6wEdIZNo!ai3wVG6`J-mY6`SXL!Q{Kta(e6bPxpmp)Xhp1|su zj;11}u_LD9fXR4NxSSs{SF>$3A$mj3_KCD4D{{a&C2;pqu>aYJ#C)vbLy@vYqFgBw zzz*ckQ+D*Kxd;H(Y@rYs>Gn)lK}4EXTd}{sJG&?Kh~e-VV>1GLkT~^fcwvUdDn{&7 z%*kWWQnjScMM1lbm`1sV))JkRs9KW)l2BvG=@q*!nmkLEQP@AXX={N5WAj83xd1$i z^O+qJ@@q2&m}uB>#GV{84}fcXp0o$*hnT1a%~P$6Bh~`Wq)1XL-jkr@@@!)dn7IR5 zF5p0W%JXu!zVlc&38_gyvJ|7nM39=R#glxAF!ji6`SHpghV1-}mFp)fbux^Z%5<2J z3c8O6+!XkJn5P1`3L?UjaOA7og^Wq`>z_#~TtgtAuAE?C_lXlV4IQ4FhXS$@O};g* z@}xi}4x9hZi3#E7mNv;cTs~Sf#ZSf^JPy^^2IB6?24|#}8g&ggjfA>f_*jJF2sR!8 z(;qLAQY$2lEn-W9Q=SLF9EgLab=C9Glazr~Q5FGfEf6jgaNwH5Q;-zN6(KZkB8>Mq z5JRE_AG(hMaRBFH6WKTzTjkioi4$a$K|U*Dhzu8k6T9{96qLsvW)I-1?2D(Q!8AAN zE`mE1VFa(k}a5(?6Bw%`by@;$9#rygs?3HmYxrXIsb z8e-=cA$y#R=d;2_1QX4mY+-3t;LJH2Bv`pu;En3BDj%ha_uXw<5fu2dp*t6uNyywB z)tglqAtanogO$_OI<=-6OUeTZjh#E9x`0<(znp6{3^6>)5iT~r1%=-mq1ZECETMr3?0~KW z6+Bu(Lb1n@q=W<}%5u}=EZ?JZw0wdKh|AB84@dkvt0&yRZ0u6r<6$PMqHbl-%2T>6 z60mo6a!vx_f!j9kcz&^8`_UJs{L z8^93+BXdotJ;L=fieXi`pd9sOOcGVmK!WZ72N@o*@%n*sWAdc2`|g2ieMaKkbFhhM zW1l)tG%;CeL z-C{sUJ8)o8stN&9VISBsLAbAM5~^f4v3(_xyA!Hy)hZp?SN*3cky zHaw^+V}+U+^aX88b*4NWo$PeR_hTQf0X#Q9@c|*;+EHkW4%Os=ZbJ7%f(t>AoOnxd zSkyE0fw`$lkUTSwoov=Z#i7$+zlye(Bk0p~Y_g{icdLVZ#mU+-80=IseBKvo(--nX zrucB7JhIL%BA?>dbL_zk9Aa zYap%8%^I)Q@&`Q?%XJqCl+F$k>7BzoSR~URx$3L~dLM18Rt!C^9Z30U!r2RIh9raz z-pE%u9l&IjCV}A!jV#dyC#l)GKaPe zY=y@i^hrT-->`q))NLThq9A$`z=C&r1cw~$T#$sR#<>vvNG5=}1u+pYgSdzjL0n!U z5X8X}gIIWm4ZstVK^NW7#h+dWKp|(cJl&GwA3}pb2^JPmNMJB>44`a=EDvVNahHfn!K@MTBJ`T6C z2%^%pSKe5uI*JREk}*awCwC;_^6Ii6&brUK{T;kWYd!XH@YKYN|q=j zk|-ja+2^w9a?{;Gt@c#{D4aQ&m6EL!TP1wo?Blet7=43aWEZ0jjiQjX2t_c}&Pz~4 zP3LOrv>-mtR>HVD!%Dh*I`hVU2>LG@_o-y-GEG{*q{sy?quBYq zT%vp`j;bTP$3xtYUIv)}DV_Rg>I)|W2QUvBPdeXw2Z0#SYLZ%WrhD+~s!vZ+jz6SdaO7APcUTC0#-9gv$V8J^L1pO*!u@n(isag~jyM4V<_d+!}%u z^{jxnLLG8lDTZKIS>V|UFM?n@h-AM84eBmYggy^Z6p~aTSbQ^&;KBKc(ZHL`rM5l- z7keK>050o;|B3P!dOR*hGb?7Yr_TV=`g(EC+7mrk>2bT@9TO>ucKxjU_?@#~pC^a6 zQm4FyAZj2r)mNUHO3U~PNh`j%nQs?ap%;l)qy^3&aky3CC%PGjxG~3}fifdWZY|Ii z-w$sl=378c)3*ZEwLa>Y%A;DQuTKd?ybuXu+08Gb5`>3~EnC@n3+D1FD@@CWV-sef&M&M^ zn+yGV#E&mU5gEc&o1~CX+;k5Kn~510B9-VNM%5Quz�UBgqGZRT6FmtJ)|1G!LmR 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
aM9YJ9P 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
    WDL5JupocOR)9VKU&wt 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

    Xav=S#<1~mpYo|dS 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 literal 0 HcmV?d00001 diff --git a/src/libs/NJsonSchema.CodeGeneration.11.0.0-beta-0.nupkg b/src/libs/NJsonSchema.CodeGeneration.11.0.0-beta-0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..cff18ad08ccaf0dc13e76e28cc99ec4149706ccb GIT binary patch literal 42351 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�XhXv2if}-(`XL_vrt8A%y9#(2$>=WdEDd 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 EZ{uj%ZU6uP literal 0 HcmV?d00001 diff --git a/src/libs/NJsonSchema.Yaml.11.0.0-beta-0.nupkg b/src/libs/NJsonSchema.Yaml.11.0.0-beta-0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..8cf233057d363ba29f87079528bc70aa91cb4003 GIT binary patch literal 21559 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�B=aP24WdHyZXOwMdRAF&fmGG&VHRZa)vok1 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 literal 0 HcmV?d00001 From 945f1de658e09f4b4277b9a362ebb2dafdfacd10 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Thu, 18 Nov 2021 18:11:09 +0100 Subject: [PATCH 03/51] Fixes --- .../Middlewares/OpenApiDocumentMiddleware.cs | 2 +- .../JsonExceptionFilterAttribute.cs | 2 +- .../NSwag.AspNet.WebApi.csproj | 1 + .../NSwagServiceCollectionExtensions.cs | 27 ++- .../JsonExceptionFilterAttribute.cs | 1 + src/NSwag.AspNetCore/SwaggerSettings.cs | 6 +- src/NSwag.AspNetCore/SwaggerUi3Settings.cs | 2 +- src/NSwag.AspNetCore/SwaggerUiSettingsBase.cs | 2 +- .../ControllerGenerationFormatTests.cs | 3 +- .../NSwag.CodeGeneration.CSharp.Tests.csproj | 1 + .../CodeGenerationTests.cs | 2 +- .../NSwag.CodeGeneration.Tests.csproj | 1 + ...wag.CodeGeneration.TypeScript.Tests.csproj | 1 + .../OperationParameterTests.cs | 8 +- .../TypeScriptDiscriminatorTests.cs | 2 +- .../AspNetCore/AspNetCoreToOpenApiCommand.cs | 2 +- .../Generation/OpenApiGeneratorCommandBase.cs | 19 +- .../Generation/TypesToOpenApiCommand.cs | 204 +++++++++--------- .../IsolatedSwaggerOutputCommandBase.cs | 9 +- ...wag.Generation.AspNetCore.Tests.Web.csproj | 5 +- .../LanguageParameterTests.cs | 8 +- .../Parameters/DefaultParametersTests.cs | 32 ++- .../Parameters/FormDataTests.cs | 17 +- .../OperationResponseProcessorTest.cs | 6 +- .../Requests/PostBodyTests.cs | 17 +- .../Responses/NullableResponseTests.cs | 42 ++-- .../SystemTextJsonTests.cs | 3 +- .../AspNetCoreOpenApiDocumentGenerator.cs | 21 -- ...NetCoreOpenApiDocumentGeneratorSettings.cs | 2 +- .../Processors/OperationParameterProcessor.cs | 20 +- .../Processors/OperationResponseProcessor.cs | 6 +- .../NSwag.Generation.Tests.csproj | 1 + .../OpenApiDocumentGeneratorTests.cs | 9 +- .../Processors/OperationTagsProcessorTests.cs | 7 +- .../Processors/OperationParameterProcessor.cs | 22 +- .../WebApiOpenApiDocumentGeneratorSettings.cs | 1 + .../OpenApiDocumentGeneratorSettings.cs | 4 +- src/NSwag.Sample.NET50/Startup.cs | 2 +- src/NSwag.Sample.NET60/Startup.cs | 2 +- src/NSwag.Sample.NET60Minimal/Program.cs | 4 +- src/NSwag.Sample.NETCore31/Startup.cs | 2 +- 41 files changed, 300 insertions(+), 228 deletions(-) diff --git a/src/NSwag.AspNet.Owin/Middlewares/OpenApiDocumentMiddleware.cs b/src/NSwag.AspNet.Owin/Middlewares/OpenApiDocumentMiddleware.cs index 317f9975d6..400b5cd062 100644 --- a/src/NSwag.AspNet.Owin/Middlewares/OpenApiDocumentMiddleware.cs +++ b/src/NSwag.AspNet.Owin/Middlewares/OpenApiDocumentMiddleware.cs @@ -93,7 +93,7 @@ protected virtual async Task GetDocumentAsync(IOwinContext context) /// The Swagger specification. protected virtual async Task GenerateDocumentAsync(IOwinContext context) { - var settings = _settings.CreateGeneratorSettings(null, null); + var settings = _settings.CreateGeneratorSettings(null); var generator = new WebApiOpenApiDocumentGenerator(settings); var document = await generator.GenerateForControllersAsync(_controllerTypes); diff --git a/src/NSwag.AspNet.WebApi/JsonExceptionFilterAttribute.cs b/src/NSwag.AspNet.WebApi/JsonExceptionFilterAttribute.cs index 355130e3f4..dee6534b24 100644 --- a/src/NSwag.AspNet.WebApi/JsonExceptionFilterAttribute.cs +++ b/src/NSwag.AspNet.WebApi/JsonExceptionFilterAttribute.cs @@ -16,7 +16,7 @@ using System.Web.Http.Controllers; using System.Web.Http.Filters; using Newtonsoft.Json; -using NJsonSchema.Converters; +using NJsonSchema.NewtonsoftJson.Converters; using NSwag.Annotations; namespace NSwag.AspNet.WebApi diff --git a/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj b/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj index 714491f4da..615464598b 100644 --- a/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj +++ b/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj @@ -27,6 +27,7 @@ + diff --git a/src/NSwag.AspNetCore/Extensions/NSwagServiceCollectionExtensions.cs b/src/NSwag.AspNetCore/Extensions/NSwagServiceCollectionExtensions.cs index 82fb1bc2f1..5704152289 100644 --- a/src/NSwag.AspNetCore/Extensions/NSwagServiceCollectionExtensions.cs +++ b/src/NSwag.AspNetCore/Extensions/NSwagServiceCollectionExtensions.cs @@ -13,6 +13,7 @@ using Microsoft.Extensions.ApiDescriptions; using Microsoft.Extensions.Options; using NJsonSchema; +using NJsonSchema.Generation; using NSwag.AspNetCore; using NSwag.Generation; using NSwag.Generation.AspNetCore; @@ -41,7 +42,7 @@ public static IServiceCollection AddOpenApiDocument(this IServiceCollection serv { return AddSwaggerDocument(serviceCollection, (settings, services) => { - settings.SchemaType = SchemaType.OpenApi3; + settings.SchemaSettings.SchemaType = SchemaType.OpenApi3; configure?.Invoke(settings, services); }); } @@ -64,10 +65,28 @@ public static IServiceCollection AddSwaggerDocument(this IServiceCollection serv { serviceCollection.AddSingleton(services => { - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + + var mvcOptions = services.GetRequiredService>(); + var newtonsoftSettings = AspNetCoreOpenApiDocumentGenerator.GetJsonSerializerSettings(services); + var systemTextJsonOptions = mvcOptions.Value.OutputFormatters + .Any(f => f.GetType().Name == "SystemTextJsonOutputFormatter") ? + AspNetCoreOpenApiDocumentGenerator.GetSystemTextJsonSettings(services) : null; + + if (systemTextJsonOptions != null) + { + settings.ApplySettings(new SystemTextJsonSchemaGeneratorSettings { SerializerOptions = systemTextJsonOptions }, mvcOptions.Value); + } + else if (newtonsoftSettings != null) { - SchemaType = SchemaType.Swagger2, - }; + settings.ApplySettings(new NewtonsoftJsonSchemaGeneratorSettings { SerializerSettings = newtonsoftSettings }, mvcOptions.Value); + } + else + { + settings.ApplySettings(new SystemTextJsonSchemaGeneratorSettings(), mvcOptions.Value); + } + + settings.SchemaSettings.SchemaType = SchemaType.Swagger2; configure?.Invoke(settings, services); diff --git a/src/NSwag.AspNetCore/JsonExceptionFilterAttribute.cs b/src/NSwag.AspNetCore/JsonExceptionFilterAttribute.cs index 78fcf9e3f0..27ac4355ca 100644 --- a/src/NSwag.AspNetCore/JsonExceptionFilterAttribute.cs +++ b/src/NSwag.AspNetCore/JsonExceptionFilterAttribute.cs @@ -15,6 +15,7 @@ using Microsoft.AspNetCore.Mvc.Filters; using Newtonsoft.Json; using NJsonSchema.Converters; +using NJsonSchema.NewtonsoftJson.Converters; using NSwag.Annotations; using NSwag.Generation.AspNetCore; diff --git a/src/NSwag.AspNetCore/SwaggerSettings.cs b/src/NSwag.AspNetCore/SwaggerSettings.cs index 65585171ab..4196ee4162 100644 --- a/src/NSwag.AspNetCore/SwaggerSettings.cs +++ b/src/NSwag.AspNetCore/SwaggerSettings.cs @@ -29,7 +29,7 @@ public class SwaggerSettings public class SwaggerSettings #endif { - ///

    Initializes a new instance of the class. + /// Initializes a new instance of the class. public SwaggerSettings() { #if AspNetOwin @@ -70,9 +70,9 @@ public SwaggerSettings() #pragma warning restore 618 #if AspNetOwin - internal T CreateGeneratorSettings(JsonSerializerSettings serializerSettings, object mvcOptions) + internal T CreateGeneratorSettings(object mvcOptions) { - GeneratorSettings.ApplySettings(serializerSettings, mvcOptions); + GeneratorSettings.ApplySettings(GeneratorSettings.SchemaSettings, mvcOptions); return GeneratorSettings; } #endif diff --git a/src/NSwag.AspNetCore/SwaggerUi3Settings.cs b/src/NSwag.AspNetCore/SwaggerUi3Settings.cs index 8c9e3f8292..9cc2f69447 100644 --- a/src/NSwag.AspNetCore/SwaggerUi3Settings.cs +++ b/src/NSwag.AspNetCore/SwaggerUi3Settings.cs @@ -33,7 +33,7 @@ public class SwaggerUi3Settings : SwaggerUiSettingsBase public class SwaggerUi3Settings : SwaggerUiSettingsBase #endif { - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. public SwaggerUi3Settings() { DocExpansion = "none"; diff --git a/src/NSwag.AspNetCore/SwaggerUiSettingsBase.cs b/src/NSwag.AspNetCore/SwaggerUiSettingsBase.cs index 6a21647af9..f704f10e63 100644 --- a/src/NSwag.AspNetCore/SwaggerUiSettingsBase.cs +++ b/src/NSwag.AspNetCore/SwaggerUiSettingsBase.cs @@ -32,7 +32,7 @@ public abstract class SwaggerUiSettingsBase : SwaggerSettings public abstract class SwaggerUiSettingsBase : SwaggerSettings #endif { - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. public SwaggerUiSettingsBase() { TransformToExternalPath = (internalUiRoute, request) => diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/ControllerGenerationFormatTests.cs b/src/NSwag.CodeGeneration.CSharp.Tests/ControllerGenerationFormatTests.cs index aae9bc9ab2..075d005119 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/ControllerGenerationFormatTests.cs +++ b/src/NSwag.CodeGeneration.CSharp.Tests/ControllerGenerationFormatTests.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Text.RegularExpressions; using NJsonSchema; +using NJsonSchema.NewtonsoftJson.Generation; using NSwag.CodeGeneration.CSharp.Models; using NSwag.CodeGeneration.OperationNameGenerators; using Xunit; @@ -267,7 +268,7 @@ private OpenApiDocument GetOpenApiDocument() complexTypeReponseSchema.Properties["Prop3"] = new JsonSchemaProperty { Type = JsonObjectType.Boolean, IsRequired = true }; complexTypeReponseSchema.Properties["Prop4"] = new JsonSchemaProperty { Type = JsonObjectType.Object, Reference = complexTypeSchema, IsRequired = true }; - var typeString = JsonSchema.FromType(typeof(string)); + var typeString = NewtonsoftJsonSchemaGenerator.FromType(typeof(string)); var document = new OpenApiDocument(); document.Paths["Foo"] = new OpenApiPathItem diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj b/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj index a2127d6e2e..a170adab04 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj +++ b/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj @@ -12,6 +12,7 @@ + diff --git a/src/NSwag.CodeGeneration.Tests/CodeGenerationTests.cs b/src/NSwag.CodeGeneration.Tests/CodeGenerationTests.cs index 6a8114d2ae..87bb0bc504 100644 --- a/src/NSwag.CodeGeneration.Tests/CodeGenerationTests.cs +++ b/src/NSwag.CodeGeneration.Tests/CodeGenerationTests.cs @@ -229,7 +229,7 @@ public void No_Brackets_in_Operation_Name() private static OpenApiDocument CreateDocument() { var document = new OpenApiDocument(); - var settings = new JsonSchemaGeneratorSettings(); + var settings = new NewtonsoftJsonSchemaGeneratorSettings(); var generator = new JsonSchemaGenerator(settings); document.Paths["/Person"] = new OpenApiPathItem(); diff --git a/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj b/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj index cf7ca04b88..5410dfcc50 100644 --- a/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj +++ b/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj @@ -8,6 +8,7 @@ + diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj b/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj index 18f5ff27d1..c85e932b15 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj @@ -12,6 +12,7 @@ + diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/OperationParameterTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/OperationParameterTests.cs index 317ce8c837..f27295ede4 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/OperationParameterTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/OperationParameterTests.cs @@ -8,6 +8,7 @@ using NSwag.Generation.WebApi; using System.Collections.Generic; using Xunit; +using NJsonSchema.Generation; namespace NSwag.CodeGeneration.TypeScript.Tests { @@ -49,8 +50,11 @@ public async Task When_query_parameter_is_enum_array_then_the_enum_is_referenced var settings = new WebApiOpenApiDocumentGeneratorSettings { DefaultUrlTemplate = "api/{controller}/{action}/{id}", - SerializerSettings = serializerSettings, - SchemaType = SchemaType.Swagger2, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SerializerSettings = serializerSettings, + SchemaType = SchemaType.Swagger2 + } }; var generator = new WebApiOpenApiDocumentGenerator(settings); diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptDiscriminatorTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptDiscriminatorTests.cs index c44c079d6e..a109e60bf5 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptDiscriminatorTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptDiscriminatorTests.cs @@ -2,11 +2,11 @@ using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using NJsonSchema.CodeGeneration.TypeScript; -using NJsonSchema.Converters; using NSwag.Generation.WebApi; using System.Collections.Generic; using System.Runtime.Serialization; using Xunit; +using NJsonSchema.NewtonsoftJson.Converters; namespace NSwag.CodeGeneration.TypeScript.Tests { diff --git a/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs b/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs index d53de11918..c3a4d90518 100644 --- a/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs +++ b/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs @@ -233,7 +233,7 @@ public override async Task RunAsync(CommandLineProcessor processor, ICon host?.WriteMessage($"Output written to {outputFile}.{Environment.NewLine}"); - JsonReferenceResolver ReferenceResolverFactory(OpenApiDocument d) => new JsonAndYamlReferenceResolver(new JsonSchemaResolver(d, Settings)); + JsonReferenceResolver ReferenceResolverFactory(OpenApiDocument d) => new JsonAndYamlReferenceResolver(new JsonSchemaResolver(d, Settings.SchemaSettings)); var documentJson = File.ReadAllText(outputFile); var document = await OpenApiDocument.FromJsonAsync(documentJson, null, OutputType, ReferenceResolverFactory).ConfigureAwait(false); diff --git a/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs b/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs index 4c8e151b5a..2ce3cd151f 100644 --- a/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs +++ b/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs @@ -168,9 +168,6 @@ public string InfoVersion [Argument(Name = "SchemaNameGenerator", IsRequired = false, Description = "The custom ISchemaNameGenerator implementation type in the form 'assemblyName:fullTypeName' or 'fullTypeName'.")] public string SchemaNameGeneratorType { get; set; } - [Argument(Name = "ContractResolver", IsRequired = false, Description = "DEPRECATED: The custom IContractResolver implementation type in the form 'assemblyName:fullTypeName' or 'fullTypeName'.")] - public string ContractResolverType { get; set; } - [Argument(Name = "SerializerSettings", IsRequired = false, Description = "The custom JsonSerializerSettings implementation type in the form 'assemblyName:fullTypeName' or 'fullTypeName'.")] public string SerializerSettingsType { get; set; } @@ -314,22 +311,20 @@ protected void InitializeCustomTypes(AssemblyLoader.AssemblyLoader assemblyLoade if (!string.IsNullOrEmpty(TypeNameGeneratorType)) { - Settings.TypeNameGenerator = (ITypeNameGenerator)assemblyLoader.CreateInstance(TypeNameGeneratorType); + Settings.SchemaSettings.TypeNameGenerator = (ITypeNameGenerator)assemblyLoader.CreateInstance(TypeNameGeneratorType); } if (!string.IsNullOrEmpty(SchemaNameGeneratorType)) { - Settings.SchemaNameGenerator = (ISchemaNameGenerator)assemblyLoader.CreateInstance(SchemaNameGeneratorType); - } - - if (!string.IsNullOrEmpty(ContractResolverType)) - { - Settings.ContractResolver = (IContractResolver)assemblyLoader.CreateInstance(ContractResolverType); + Settings.SchemaSettings.SchemaNameGenerator = (ISchemaNameGenerator)assemblyLoader.CreateInstance(SchemaNameGeneratorType); } - if (!string.IsNullOrEmpty(SerializerSettingsType)) + if (Settings.SchemaSettings is NewtonsoftJsonSchemaGeneratorSettings settings) { - Settings.SerializerSettings = (JsonSerializerSettings)assemblyLoader.CreateInstance(SerializerSettingsType); + if (!string.IsNullOrEmpty(SerializerSettingsType)) + { + settings.SerializerSettings = (JsonSerializerSettings)assemblyLoader.CreateInstance(SerializerSettingsType); + } } } diff --git a/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs b/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs index 7b2739f993..7149785159 100644 --- a/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs +++ b/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs @@ -15,6 +15,7 @@ using NJsonSchema.Generation; using NJsonSchema.Infrastructure; using NSwag.AssemblyLoader.Utilities; +using NSwag.Generation; namespace NSwag.Commands.Generation { @@ -26,112 +27,107 @@ public class TypesToOpenApiCommand : TypesToSwaggerCommand /// [Command(Name = "types2swagger")] - public class TypesToSwaggerCommand : IsolatedSwaggerOutputCommandBase + public class TypesToSwaggerCommand : IsolatedSwaggerOutputCommandBase { - /// Initializes a new instance of the class. - public TypesToSwaggerCommand() + // /// Initializes a new instance of the class. + // public TypesToSwaggerCommand() + // { + // Settings = new NewtonsoftJsonSchemaGeneratorSettings + // { + // SchemaType = SchemaType.Swagger2 + // }; + // ClassNames = new string[] { }; + // } + + // [JsonIgnore] + // protected override JsonSchemaGeneratorSettings Settings { get; } + + // [Argument(Name = "ClassNames", Description = "The class names.")] + // public string[] ClassNames { get; set; } + + // [Argument(Name = nameof(DefaultReferenceTypeNullHandling), IsRequired = false, Description = "The default reference type null handling (Null (default) or NotNull).")] + // public ReferenceTypeNullHandling DefaultReferenceTypeNullHandling + // { + // get => Settings.DefaultReferenceTypeNullHandling; + // set => Settings.DefaultReferenceTypeNullHandling = value; + // } + + // [Argument(Name = nameof(DefaultDictionaryValueReferenceTypeNullHandling), IsRequired = false, Description = "The default reference type null handling of dictionary value types (NotNull (default) or Null).")] + // public ReferenceTypeNullHandling DefaultDictionaryValueReferenceTypeNullHandling + // { + // get => Settings.DefaultDictionaryValueReferenceTypeNullHandling; + // set => Settings.DefaultDictionaryValueReferenceTypeNullHandling = value; + // } + + // [Argument(Name = "FlattenInheritanceHierarchy", IsRequired = false, Description = "Flatten the inheritance hierarchy instead of using allOf to describe inheritance (default: false).")] + // public bool FlattenInheritanceHierarchy + // { + // get { return Settings.FlattenInheritanceHierarchy; } + // set { Settings.FlattenInheritanceHierarchy = value; } + // } + + // [Argument(Name = "IgnoreObsoleteProperties", IsRequired = false, Description = "Ignore properties with the ObsoleteAttribute (default: false).")] + // public bool IgnoreObsoleteProperties + // { + // get { return Settings.IgnoreObsoleteProperties; } + // set { Settings.IgnoreObsoleteProperties = value; } + // } + + // [Argument(Name = "AllowReferencesWithProperties", IsRequired = false, Description = "Use $ref references even if additional properties are defined on " + + // "the object (otherwise allOf/oneOf with $ref is used, default: false).")] + // public bool AllowReferencesWithProperties + // { + // get { return Settings.AllowReferencesWithProperties; } + // set { Settings.AllowReferencesWithProperties = value; } + // } + + // [Argument(Name = "GenerateKnownTypes", IsRequired = false, Description = "Generate schemas for types in KnownTypeAttribute attributes (default: true).")] + // public bool GenerateKnownTypes + // { + // get { return Settings.GenerateKnownTypes; } + // set { Settings.GenerateKnownTypes = value; } + // } + + // [Argument(Name = "GenerateXmlObjects", IsRequired = false, Description = "Generate xmlObject representation for definitions (default: false).")] + // public bool GenerateXmlObjects + // { + // get { return Settings.GenerateXmlObjects; } + // set { Settings.GenerateXmlObjects = value; } + // } + + // protected override async Task RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) + // { + // var document = new OpenApiDocument(); + // var generator = new JsonSchemaGenerator(Settings); + // var schemaResolver = new OpenApiSchemaResolver(document, Settings); + + //#if FullNet + // var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) + // .Select(path => Assembly.LoadFrom(path)).ToArray(); + //#else + // var currentDirectory = DynamicApis.DirectoryGetCurrentDirectory(); + // var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) + // .Select(path => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(path, currentDirectory))).ToArray(); + //#endif + + // var allExportedClassNames = assemblies.SelectMany(a => a.ExportedTypes).Select(t => t.FullName).ToList(); + // var matchedClassNames = ClassNames + // .SelectMany(n => PathUtilities.FindWildcardMatches(n, allExportedClassNames, '.')) + // .Distinct(); + + // foreach (var className in matchedClassNames) + // { + // var type = assemblies.Select(a => a.GetType(className)).FirstOrDefault(t => t != null); + // generator.Generate(type, schemaResolver); + // } + + // return document.ToJson(OutputType); + // } + protected override OpenApiDocumentGeneratorSettings Settings => throw new System.NotImplementedException(); + + protected override Task RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { - Settings = new JsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 }; - ClassNames = new string[] { }; - } - - [JsonIgnore] - protected override JsonSchemaGeneratorSettings Settings { get; } - - [Argument(Name = "ClassNames", Description = "The class names.")] - public string[] ClassNames { get; set; } - - [Argument(Name = "DefaultPropertyNameHandling", IsRequired = false, Description = "The default property name handling ('Default' or 'CamelCase').")] - public PropertyNameHandling DefaultPropertyNameHandling - { - get { return Settings.DefaultPropertyNameHandling; } - set { Settings.DefaultPropertyNameHandling = value; } - } - - [Argument(Name = nameof(DefaultReferenceTypeNullHandling), IsRequired = false, Description = "The default reference type null handling (Null (default) or NotNull).")] - public ReferenceTypeNullHandling DefaultReferenceTypeNullHandling - { - get => Settings.DefaultReferenceTypeNullHandling; - set => Settings.DefaultReferenceTypeNullHandling = value; - } - - [Argument(Name = nameof(DefaultDictionaryValueReferenceTypeNullHandling), IsRequired = false, Description = "The default reference type null handling of dictionary value types (NotNull (default) or Null).")] - public ReferenceTypeNullHandling DefaultDictionaryValueReferenceTypeNullHandling - { - get => Settings.DefaultDictionaryValueReferenceTypeNullHandling; - set => Settings.DefaultDictionaryValueReferenceTypeNullHandling = value; - } - - [Argument(Name = "DefaultEnumHandling", IsRequired = false, Description = "The default enum handling ('String' or 'Integer'), default: Integer.")] - public EnumHandling DefaultEnumHandling - { - get { return Settings.DefaultEnumHandling; } - set { Settings.DefaultEnumHandling = value; } - } - - [Argument(Name = "FlattenInheritanceHierarchy", IsRequired = false, Description = "Flatten the inheritance hierarchy instead of using allOf to describe inheritance (default: false).")] - public bool FlattenInheritanceHierarchy - { - get { return Settings.FlattenInheritanceHierarchy; } - set { Settings.FlattenInheritanceHierarchy = value; } - } - - [Argument(Name = "IgnoreObsoleteProperties", IsRequired = false, Description = "Ignore properties with the ObsoleteAttribute (default: false).")] - public bool IgnoreObsoleteProperties - { - get { return Settings.IgnoreObsoleteProperties; } - set { Settings.IgnoreObsoleteProperties = value; } - } - - [Argument(Name = "AllowReferencesWithProperties", IsRequired = false, Description = "Use $ref references even if additional properties are defined on " + - "the object (otherwise allOf/oneOf with $ref is used, default: false).")] - public bool AllowReferencesWithProperties - { - get { return Settings.AllowReferencesWithProperties; } - set { Settings.AllowReferencesWithProperties = value; } - } - - [Argument(Name = "GenerateKnownTypes", IsRequired = false, Description = "Generate schemas for types in KnownTypeAttribute attributes (default: true).")] - public bool GenerateKnownTypes - { - get { return Settings.GenerateKnownTypes; } - set { Settings.GenerateKnownTypes = value; } - } - - [Argument(Name = "GenerateXmlObjects", IsRequired = false, Description = "Generate xmlObject representation for definitions (default: false).")] - public bool GenerateXmlObjects - { - get { return Settings.GenerateXmlObjects; } - set { Settings.GenerateXmlObjects = value; } - } - - protected override async Task RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) - { - var document = new OpenApiDocument(); - var generator = new JsonSchemaGenerator(Settings); - var schemaResolver = new OpenApiSchemaResolver(document, Settings); - -#if FullNet - var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) - .Select(path => Assembly.LoadFrom(path)).ToArray(); -#else - var currentDirectory = DynamicApis.DirectoryGetCurrentDirectory(); - var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) - .Select(path => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(path, currentDirectory))).ToArray(); -#endif - - var allExportedClassNames = assemblies.SelectMany(a => a.ExportedTypes).Select(t => t.FullName).ToList(); - var matchedClassNames = ClassNames - .SelectMany(n => PathUtilities.FindWildcardMatches(n, allExportedClassNames, '.')) - .Distinct(); - - foreach (var className in matchedClassNames) - { - var type = assemblies.Select(a => a.GetType(className)).FirstOrDefault(t => t != null); - generator.Generate(type, schemaResolver); - } - - return document.ToJson(OutputType); + throw new System.NotImplementedException(); } } } \ No newline at end of file diff --git a/src/NSwag.Commands/Commands/IsolatedSwaggerOutputCommandBase.cs b/src/NSwag.Commands/Commands/IsolatedSwaggerOutputCommandBase.cs index 245e0420b3..14aa5d96cf 100644 --- a/src/NSwag.Commands/Commands/IsolatedSwaggerOutputCommandBase.cs +++ b/src/NSwag.Commands/Commands/IsolatedSwaggerOutputCommandBase.cs @@ -18,12 +18,13 @@ using NJsonSchema.Infrastructure; using NJsonSchema.Yaml; using NSwag.AssemblyLoader.Utilities; +using NSwag.Generation; namespace NSwag.Commands { /// A command which is run in isolation. public abstract class IsolatedSwaggerOutputCommandBase : IsolatedCommandBase, IOutputCommand - where T : JsonSchemaGeneratorSettings + where T : OpenApiDocumentGeneratorSettings, new() { [JsonIgnore] protected abstract T Settings { get; } @@ -35,8 +36,8 @@ public abstract class IsolatedSwaggerOutputCommandBase : IsolatedCommandBase< [Argument(Name = "OutputType", IsRequired = false, Description = "Specifies the output schema type, ignored when UseDocumentProvider is enabled (Swagger2|OpenApi3, default: Swagger2).")] public SchemaType OutputType { - get { return Settings.SchemaType; } - set { Settings.SchemaType = value; } + get { return Settings.SchemaSettings.SchemaType; } + set { Settings.SchemaSettings.SchemaType = value; } } [Argument(Name = "NewLineBehavior", IsRequired = false, Description = "The new line behavior (Auto (OS default), CRLF, LF).")] @@ -46,7 +47,7 @@ public SchemaType OutputType public override async Task RunAsync(CommandLineProcessor processor, IConsoleHost host) { JsonReferenceResolver ReferenceResolverFactory(OpenApiDocument d) => - new JsonAndYamlReferenceResolver(new JsonSchemaResolver(d, Settings)); + new JsonAndYamlReferenceResolver(new JsonSchemaResolver(d, Settings.SchemaSettings)); var documentJson = await RunIsolatedAsync((string)null); var document = await OpenApiDocument.FromJsonAsync(documentJson, null, OutputType, ReferenceResolverFactory).ConfigureAwait(false); diff --git a/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj b/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj index f52e0fcabb..8ab234c0e4 100644 --- a/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj +++ b/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj @@ -6,13 +6,16 @@ - + + + + diff --git a/src/NSwag.Generation.AspNetCore.Tests/LanguageParameterTests.cs b/src/NSwag.Generation.AspNetCore.Tests/LanguageParameterTests.cs index 62a6ce6385..f8f546491f 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/LanguageParameterTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/LanguageParameterTests.cs @@ -1,6 +1,7 @@ using System.Linq; using System.Threading.Tasks; using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers; using Xunit; @@ -13,7 +14,10 @@ public async Task When_implicit_language_parameter_is_used_then_it_is_in_spec() { // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); - settings.SchemaType = SchemaType.OpenApi3; + settings.SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + }; // Act var document = await GenerateDocumentAsync(settings, typeof(LanguagesController)); @@ -27,7 +31,7 @@ public async Task When_implicit_language_parameter_is_used_then_it_is_in_spec() var parameter = operation.Operation.ActualParameters.Single(p => p.Name == "language"); Assert.Equal(JsonObjectType.String, parameter.ActualTypeSchema.Type); - Assert.False(parameter.IsNullable(settings.SchemaType)); + Assert.False(parameter.IsNullable(settings.SchemaSettings.SchemaType)); } } } diff --git a/src/NSwag.Generation.AspNetCore.Tests/Parameters/DefaultParametersTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Parameters/DefaultParametersTests.cs index e2718abc31..39315a9877 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Parameters/DefaultParametersTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Parameters/DefaultParametersTests.cs @@ -2,8 +2,8 @@ using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Serialization; using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Parameters; using Xunit; using static NSwag.Generation.AspNetCore.Tests.Web.Controllers.Parameters.DefaultParametersController; @@ -18,8 +18,11 @@ public async Task When_parameter_has_default_and_schema_type_is_OpenApi3_then_sc // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { - SchemaType = SchemaType.OpenApi3, - RequireParametersWithoutDefault = true + RequireParametersWithoutDefault = true, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } }; // Act @@ -38,8 +41,11 @@ public async Task When_parameter_has_default_and_schema_type_is_OpenApi3_then_sc // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { - SchemaType = SchemaType.OpenApi3, - RequireParametersWithoutDefault = true + RequireParametersWithoutDefault = true, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } }; // Act @@ -59,11 +65,14 @@ public async Task When_parameter_has_default_and_schema_type_is_OpenApi3_then_sc // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { - SchemaType = SchemaType.OpenApi3, RequireParametersWithoutDefault = true, - SerializerSettings = new JsonSerializerSettings + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { - Converters = { new StringEnumConverter() } + SchemaType = SchemaType.OpenApi3, + SerializerSettings = new JsonSerializerSettings + { + Converters = { new StringEnumConverter() } + } } }; @@ -83,8 +92,11 @@ public async Task When_parameter_has_default_and_schema_type_is_Swagger2_then_pa // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { - SchemaType = SchemaType.Swagger2, - RequireParametersWithoutDefault = true + RequireParametersWithoutDefault = true, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.Swagger2 + } }; // Act diff --git a/src/NSwag.Generation.AspNetCore.Tests/Parameters/FormDataTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Parameters/FormDataTests.cs index 493255b353..8ffc7478c3 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Parameters/FormDataTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Parameters/FormDataTests.cs @@ -1,6 +1,7 @@ using System.Linq; using System.Threading.Tasks; using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Parameters; using Xunit; @@ -12,7 +13,13 @@ public class FormDataTests : AspNetCoreTestsBase public async Task WhenOperationHasFormDataFile_ThenItIsInRequestBody() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaType = SchemaType.OpenApi3 }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(FileUploadController)); @@ -58,7 +65,13 @@ public async Task WhenOperationHasFormDataFile_ThenItIsInRequestBody() public async Task WhenOperationHasFormDataComplex_ThenItIsInRequestBody() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaType = SchemaType.OpenApi3 }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(FileUploadController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs b/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs index d7543d81dc..c678627105 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs @@ -123,9 +123,9 @@ private AspNetCoreOperationProcessorContext GetContext(ApiDescription apiDescrip var operationDescription = new OpenApiOperationDescription { Operation = new OpenApiOperation() }; var swaggerSettings = new AspNetCoreOpenApiDocumentGeneratorSettings(); var document = new OpenApiDocument(); - var schemaGeneratorSettings = new OpenApiDocumentGeneratorSettings(); - var schemaGenerator = new OpenApiSchemaGenerator(schemaGeneratorSettings); - var schemaResolver = new OpenApiSchemaResolver(document, schemaGeneratorSettings); + var settings = new OpenApiDocumentGeneratorSettings(); + var schemaGenerator = new OpenApiSchemaGenerator(settings); + var schemaResolver = new OpenApiSchemaResolver(document, settings.SchemaSettings); swaggerSettings.SchemaGenerator = schemaGenerator; var context = new AspNetCoreOperationProcessorContext( diff --git a/src/NSwag.Generation.AspNetCore.Tests/Requests/PostBodyTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Requests/PostBodyTests.cs index c30a7c0e64..df24f5ada8 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Requests/PostBodyTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Requests/PostBodyTests.cs @@ -1,4 +1,5 @@ using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Requests; using System.Linq; using System.Threading.Tasks; @@ -12,7 +13,13 @@ public class PostBodyTests : AspNetCoreTestsBase public async Task When_OpenApiBodyParameter_is_applied_with_JSON_then_request_body_is_any_type() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaType = SchemaType.OpenApi3 }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(PostBodyController)); @@ -30,7 +37,13 @@ public async Task When_OpenApiBodyParameter_is_applied_with_JSON_then_request_bo public async Task When_OpenApiBodyParameter_is_applied_with_text_then_request_body_is_file() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaType = SchemaType.OpenApi3 }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(PostBodyController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Responses/NullableResponseTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Responses/NullableResponseTests.cs index def679489f..a1eaf49679 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Responses/NullableResponseTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Responses/NullableResponseTests.cs @@ -16,8 +16,11 @@ public async Task When_handling_is_NotNull_then_response_is_not_nullable() // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { - SchemaType = SchemaType.OpenApi3, - DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull + DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } }; // Act @@ -35,8 +38,11 @@ public async Task When_handling_is_Null_then_response_is_nullable() // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { - SchemaType = SchemaType.OpenApi3, - DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.Null + DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.Null, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } }; // Act @@ -54,8 +60,11 @@ public async Task When_nullable_xml_docs_is_set_to_true_then_response_is_nullabl // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { - SchemaType = SchemaType.OpenApi3, - DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull + DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } }; // Act @@ -73,8 +82,11 @@ public async Task When_nullable_xml_docs_is_set_to_false_then_response_is_not_nu // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { - SchemaType = SchemaType.OpenApi3, - DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.Null + DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.Null, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } }; // Act @@ -92,8 +104,11 @@ public async Task When_nullable_xml_docs_is_not_set_then_default_setting_NotNull // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { - SchemaType = SchemaType.OpenApi3, - DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull + DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } }; // Act @@ -111,8 +126,11 @@ public async Task When_nullable_xml_docs_is_not_set_then_default_setting_Null_is // Arrange var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { - SchemaType = SchemaType.OpenApi3, - DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.Null + DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.Null, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } }; // Act diff --git a/src/NSwag.Generation.AspNetCore.Tests/SystemTextJsonTests.cs b/src/NSwag.Generation.AspNetCore.Tests/SystemTextJsonTests.cs index defe0b14d2..3352562e03 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/SystemTextJsonTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/SystemTextJsonTests.cs @@ -5,6 +5,7 @@ using Newtonsoft.Json.Converters; using NSwag.AspNetCore; using Xunit; +using NJsonSchema.Generation; namespace NSwag.Generation.AspNetCore.Tests { @@ -29,7 +30,7 @@ public async Task WhenSystemTextOptionsIsUsed_ThenOptionsAreConverted() var settings = generator.Generator.Settings; // Assert - Assert.Contains(settings.SerializerSettings.Converters, c => c is StringEnumConverter); + Assert.Contains(((NewtonsoftJsonSchemaGeneratorSettings)settings.SchemaSettings).SerializerSettings.Converters, c => c is StringEnumConverter); } } } diff --git a/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs b/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs index 917a2e8366..fc4d81cd25 100644 --- a/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs +++ b/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs @@ -49,27 +49,6 @@ public AspNetCoreOpenApiDocumentGenerator(AspNetCoreOpenApiDocumentGeneratorSett public Task GenerateAsync(object serviceProvider) { var typedServiceProvider = (IServiceProvider)serviceProvider; - - var mvcOptions = typedServiceProvider.GetRequiredService>(); - - var newtonsoftSettings = GetJsonSerializerSettings(typedServiceProvider); - var systemTextJsonOptions = mvcOptions.Value.OutputFormatters - .Any(f => f.GetType().Name == "SystemTextJsonOutputFormatter") ? - GetSystemTextJsonSettings(typedServiceProvider) : null; - - if (systemTextJsonOptions != null) - { - Settings.ApplySettings(new SystemTextJsonSchemaGeneratorSettings { SerializerOptions = systemTextJsonOptions }, mvcOptions.Value); - } - else if (newtonsoftSettings != null) - { - Settings.ApplySettings(new NewtonsoftJsonSchemaGeneratorSettings { SerializerSettings = newtonsoftSettings }, mvcOptions.Value); - } - else - { - Settings.ApplySettings(new SystemTextJsonSchemaGeneratorSettings(), mvcOptions.Value); - } - var apiDescriptionGroupCollectionProvider = typedServiceProvider.GetRequiredService(); return GenerateAsync(apiDescriptionGroupCollectionProvider.ApiDescriptionGroups); } diff --git a/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGeneratorSettings.cs b/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGeneratorSettings.cs index c8c6ce6037..2822af25af 100644 --- a/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGeneratorSettings.cs +++ b/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGeneratorSettings.cs @@ -40,7 +40,7 @@ public AspNetCoreOpenApiDocumentGeneratorSettings() /// /// Gets or sets a value indicating whether a route name associated with an action is used to generate its operationId. /// - /// If is present, it will be preferred over the route name irrespective of this property. + /// If OpenApiOperationAttribute is present, it will be preferred over the route name irrespective of this property. public bool UseRouteNameAsOperationId { get; set; } } } \ No newline at end of file diff --git a/src/NSwag.Generation.AspNetCore/Processors/OperationParameterProcessor.cs b/src/NSwag.Generation.AspNetCore/Processors/OperationParameterProcessor.cs index 61cae57c14..e36b9eff63 100644 --- a/src/NSwag.Generation.AspNetCore/Processors/OperationParameterProcessor.cs +++ b/src/NSwag.Generation.AspNetCore/Processors/OperationParameterProcessor.cs @@ -159,7 +159,7 @@ public bool Process(OperationProcessorContext operationProcessorContext) } else if (apiParameter.Source == BindingSource.Form) { - if (_settings.SchemaType == SchemaType.Swagger2) + if (_settings.SchemaSettings.SchemaType == SchemaType.Swagger2) { operationParameter = CreatePrimitiveParameter(context, extendedApiParameter); operationParameter.Kind = OpenApiParameterKind.FormData; @@ -187,7 +187,7 @@ public bool Process(OperationProcessorContext operationProcessorContext) operationParameter.Position = position; position++; - if (_settings.SchemaType == SchemaType.OpenApi3) + if (_settings.SchemaSettings.SchemaType == SchemaType.OpenApi3) { operationParameter.IsNullableRaw = null; } @@ -234,8 +234,8 @@ private void ApplyOpenApiBodyParameterAttribute(OpenApiOperationDescription oper { Schema = mimeType == "application/json" ? JsonSchema.CreateAnySchema() : new JsonSchema { - Type = _settings.SchemaType == SchemaType.Swagger2 ? JsonObjectType.File : JsonObjectType.String, - Format = _settings.SchemaType == SchemaType.Swagger2 ? null : JsonFormatStrings.Binary, + Type = _settings.SchemaSettings.SchemaType == SchemaType.Swagger2 ? JsonObjectType.File : JsonObjectType.String, + Format = _settings.SchemaSettings.SchemaType == SchemaType.Swagger2 ? null : JsonFormatStrings.Binary, } }; } @@ -275,7 +275,7 @@ private void RemoveUnusedPathParameters(OpenApiOperationDescription operationDes private bool TryAddFileParameter( OperationProcessorContext context, ExtendedApiParameterDescription extendedApiParameter) { - var typeInfo = _settings.ReflectionService.GetDescription(extendedApiParameter.ParameterType.ToContextualType(extendedApiParameter.Attributes), _settings); + var typeInfo = _settings.SchemaSettings.ReflectionService.GetDescription(extendedApiParameter.ParameterType.ToContextualType(extendedApiParameter.Attributes), _settings.SchemaSettings); var isFileArray = IsFileArray(extendedApiParameter.ApiParameter.Type, typeInfo); @@ -298,7 +298,7 @@ private bool TryAddFileParameter( private void AddFileParameter(OperationProcessorContext context, ExtendedApiParameterDescription extendedApiParameter, bool isFileArray) { - if (_settings.SchemaType == SchemaType.Swagger2) + if (_settings.SchemaSettings.SchemaType == SchemaType.Swagger2) { var operationParameter = CreatePrimitiveParameter(context, extendedApiParameter); operationParameter.Type = JsonObjectType.File; @@ -359,7 +359,7 @@ private bool IsFileArray(Type type, JsonTypeDescription typeInfo) if (typeInfo.Type == JsonObjectType.Array && type.GenericTypeArguments.Any()) { - var description = _settings.ReflectionService.GetDescription(type.GenericTypeArguments[0].ToContextualType(), _settings); + var description = _settings.SchemaSettings.ReflectionService.GetDescription(type.GenericTypeArguments[0].ToContextualType(), _settings.SchemaSettings); if (description.Type == JsonObjectType.File || description.Format == JsonFormatStrings.Binary) { return true; @@ -376,7 +376,7 @@ private OpenApiParameter AddBodyParameter(OperationProcessorContext context, Ext var contextualParameterType = extendedApiParameter.ParameterType .ToContextualType(extendedApiParameter.Attributes); - var typeDescription = _settings.ReflectionService.GetDescription(contextualParameterType, _settings); + var typeDescription = _settings.SchemaSettings.ReflectionService.GetDescription(contextualParameterType, _settings.SchemaSettings); var isNullable = _settings.AllowNullableBodyParameters && typeDescription.IsNullable; var operation = context.OperationDescription.Operation; @@ -456,14 +456,14 @@ private OpenApiParameter CreatePrimitiveParameter( var defaultValue = hasDefaultValue ? context.SchemaGenerator .ConvertDefaultValue(contextualParameterType, extendedApiParameter.ParameterInfo.DefaultValue) : null; - if (_settings.SchemaType == SchemaType.Swagger2) + if (_settings.SchemaSettings.SchemaType == SchemaType.Swagger2) { operationParameter.Default = defaultValue; operationParameter.Example = exampleValue; } else if (operationParameter.Schema.HasReference) { - if (_settings.AllowReferencesWithProperties) + if (_settings.SchemaSettings.AllowReferencesWithProperties) { operationParameter.Schema = new JsonSchema { diff --git a/src/NSwag.Generation.AspNetCore/Processors/OperationResponseProcessor.cs b/src/NSwag.Generation.AspNetCore/Processors/OperationResponseProcessor.cs index abaeccc696..1252c54564 100644 --- a/src/NSwag.Generation.AspNetCore/Processors/OperationResponseProcessor.cs +++ b/src/NSwag.Generation.AspNetCore/Processors/OperationResponseProcessor.cs @@ -84,7 +84,7 @@ public bool Process(OperationProcessorContext operationProcessorContext) var nullableXmlAttribute = GetResponseXmlDocsElement(context.MethodInfo, httpStatusCode)?.Attribute("nullable"); var isResponseNullable = nullableXmlAttribute != null ? nullableXmlAttribute.Value.ToLowerInvariant() == "true" : - _settings.ReflectionService.GetDescription(contextualReturnType, _settings.DefaultResponseReferenceTypeNullHandling, _settings).IsNullable; + _settings.SchemaSettings.ReflectionService.GetDescription(contextualReturnType, _settings.DefaultResponseReferenceTypeNullHandling, _settings.SchemaSettings).IsNullable; response.IsNullableRaw = isResponseNullable; response.Schema = context.SchemaGenerator.GenerateWithReferenceAndNullability( @@ -102,8 +102,8 @@ public bool Process(OperationProcessorContext operationProcessorContext) IsNullableRaw = true, Schema = new JsonSchema { - Type = _settings.SchemaType == SchemaType.Swagger2 ? JsonObjectType.File : JsonObjectType.String, - Format = _settings.SchemaType == SchemaType.Swagger2 ? null : JsonFormatStrings.Binary, + Type = _settings.SchemaSettings.SchemaType == SchemaType.Swagger2 ? JsonObjectType.File : JsonObjectType.String, + Format = _settings.SchemaSettings.SchemaType == SchemaType.Swagger2 ? null : JsonFormatStrings.Binary, } }; } diff --git a/src/NSwag.Generation.Tests/NSwag.Generation.Tests.csproj b/src/NSwag.Generation.Tests/NSwag.Generation.Tests.csproj index 192dc8d0aa..d6f52a1085 100644 --- a/src/NSwag.Generation.Tests/NSwag.Generation.Tests.csproj +++ b/src/NSwag.Generation.Tests/NSwag.Generation.Tests.csproj @@ -18,6 +18,7 @@ + diff --git a/src/NSwag.Generation.Tests/OpenApiDocumentGeneratorTests.cs b/src/NSwag.Generation.Tests/OpenApiDocumentGeneratorTests.cs index 25a4ed12b7..6bbde64d18 100644 --- a/src/NSwag.Generation.Tests/OpenApiDocumentGeneratorTests.cs +++ b/src/NSwag.Generation.Tests/OpenApiDocumentGeneratorTests.cs @@ -21,10 +21,13 @@ private OpenApiParameter GetParameter(SchemaType schemaType) { var generatorSettings = new OpenApiDocumentGeneratorSettings { - SchemaType = schemaType, - ReflectionService = new DefaultReflectionService() + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = schemaType, + } }; - var schemaResolver = new JsonSchemaResolver(new OpenApiDocument(), generatorSettings); + + var schemaResolver = new JsonSchemaResolver(new OpenApiDocument(), generatorSettings.SchemaSettings); var generator = new OpenApiDocumentGenerator(generatorSettings, schemaResolver); var methodInfo = typeof(TestController) .ToContextualType() diff --git a/src/NSwag.Generation.Tests/Processors/OperationTagsProcessorTests.cs b/src/NSwag.Generation.Tests/Processors/OperationTagsProcessorTests.cs index 90bf0dbffc..e2b44ad294 100644 --- a/src/NSwag.Generation.Tests/Processors/OperationTagsProcessorTests.cs +++ b/src/NSwag.Generation.Tests/Processors/OperationTagsProcessorTests.cs @@ -1,5 +1,6 @@ using System; using System.Reflection; +using NJsonSchema.Generation; using NSwag.Annotations; using NSwag.Generation.Processors; using NSwag.Generation.Processors.Contexts; @@ -130,7 +131,11 @@ private OperationProcessorContext GetContext(Type controllerType, MethodInfo met { var document = new OpenApiDocument(); var operationDescription = new OpenApiOperationDescription { Operation = new OpenApiOperation() }; - var settings = new OpenApiDocumentGeneratorSettings { UseControllerSummaryAsTagDescription = true }; + var settings = new OpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings(), + UseControllerSummaryAsTagDescription = true + }; return new OperationProcessorContext(document, operationDescription, controllerType, methodInfo, null, null, null, settings, null); } } diff --git a/src/NSwag.Generation.WebApi/Processors/OperationParameterProcessor.cs b/src/NSwag.Generation.WebApi/Processors/OperationParameterProcessor.cs index 117a0a726c..b83261c218 100644 --- a/src/NSwag.Generation.WebApi/Processors/OperationParameterProcessor.cs +++ b/src/NSwag.Generation.WebApi/Processors/OperationParameterProcessor.cs @@ -72,7 +72,7 @@ public bool Process(OperationProcessorContext context) operationParameter.Kind = OpenApiParameterKind.Path; operationParameter.IsRequired = true; // Path is always required => property not needed - if (_settings.SchemaType == SchemaType.Swagger2) + if (_settings.SchemaSettings.SchemaType == SchemaType.Swagger2) { operationParameter.IsNullableRaw = false; } @@ -81,7 +81,7 @@ public bool Process(OperationProcessorContext context) } else { - var parameterInfo = _settings.ReflectionService.GetDescription(contextualParameter, _settings); + var parameterInfo = _settings.SchemaSettings.ReflectionService.GetDescription(contextualParameter, _settings.SchemaSettings); operationParameter = TryAddFileParameter(context, parameterInfo, contextualParameter); if (operationParameter == null) @@ -185,7 +185,7 @@ public bool Process(OperationProcessorContext context) operationParameter.Position = position; position++; - if (_settings.SchemaType == SchemaType.OpenApi3) + if (_settings.SchemaSettings.SchemaType == SchemaType.OpenApi3) { operationParameter.IsNullableRaw = null; } @@ -216,7 +216,7 @@ public bool Process(OperationProcessorContext context) ApplyOpenApiBodyParameterAttribute(context.OperationDescription, context.MethodInfo); RemoveUnusedPathParameters(context.OperationDescription, httpPath); UpdateConsumedTypes(context.OperationDescription); - UpdateNullableRawOperationParameters(context.OperationDescription, _settings.SchemaType); + UpdateNullableRawOperationParameters(context.OperationDescription, _settings.SchemaSettings.SchemaType); EnsureSingleBodyParameter(context.OperationDescription); @@ -245,8 +245,8 @@ private void ApplyOpenApiBodyParameterAttribute(OpenApiOperationDescription oper { Schema = mimeType == "application/json" ? JsonSchema.CreateAnySchema() : new JsonSchema { - Type = _settings.SchemaType == SchemaType.Swagger2 ? JsonObjectType.File : JsonObjectType.String, - Format = _settings.SchemaType == SchemaType.Swagger2 ? null : JsonFormatStrings.Binary, + Type = _settings.SchemaSettings.SchemaType == SchemaType.Swagger2 ? JsonObjectType.File : JsonObjectType.String, + Format = _settings.SchemaSettings.SchemaType == SchemaType.Swagger2 ? null : JsonFormatStrings.Binary, } }; } @@ -339,7 +339,7 @@ private bool IsFileArray(Type type, JsonTypeDescription typeInfo) if (typeInfo.Type == JsonObjectType.Array && type.GenericTypeArguments.Any()) { - var description = _settings.ReflectionService.GetDescription(type.GenericTypeArguments[0].ToContextualType(), _settings); + var description = _settings.SchemaSettings.ReflectionService.GetDescription(type.GenericTypeArguments[0].ToContextualType(), _settings.SchemaSettings); if (description.Type == JsonObjectType.File || description.Format == JsonFormatStrings.Binary) { @@ -354,7 +354,7 @@ private OpenApiParameter AddBodyParameter(OperationProcessorContext context, str { OpenApiParameter operationParameter; - var typeDescription = _settings.ReflectionService.GetDescription(contextualParameter, _settings); + var typeDescription = _settings.SchemaSettings.ReflectionService.GetDescription(contextualParameter, _settings.SchemaSettings); var isRequired = _settings.AllowNullableBodyParameters == false || contextualParameter.ContextAttributes.FirstAssignableToTypeNameOrDefault("RequiredAttribute", TypeNameStyle.Name) != null; var isNullable = _settings.AllowNullableBodyParameters && (typeDescription.IsNullable && !isRequired); @@ -439,7 +439,7 @@ private OpenApiParameter AddPrimitiveParametersFromUri( { var fromQueryAttribute = contextualProperty.ContextAttributes.SingleOrDefault(a => a.GetType().Name == "FromQueryAttribute"); var propertyName = fromQueryAttribute.TryGetPropertyValue("Name") ?? - context.SchemaGenerator.GetPropertyName(null, contextualProperty); + _settings.SchemaSettings.ReflectionService.GetPropertyName(contextualProperty, _settings.SchemaSettings); dynamic fromRouteAttribute = contextualProperty.ContextAttributes.SingleOrDefault(a => a.GetType().FullName == "Microsoft.AspNetCore.Mvc.FromRouteAttribute"); if (fromRouteAttribute != null && !string.IsNullOrEmpty(fromRouteAttribute?.Name)) @@ -458,7 +458,7 @@ private OpenApiParameter AddPrimitiveParametersFromUri( // TODO: Check if required can be controlled with mechanisms other than RequiredAttribute - var parameterInfo = _settings.ReflectionService.GetDescription(contextualProperty.AccessorType, _settings); + var parameterInfo = _settings.SchemaSettings.ReflectionService.GetDescription(contextualProperty.AccessorType, _settings.SchemaSettings); var isFileArray = IsFileArray(contextualProperty.AccessorType.Type, parameterInfo); if (parameterInfo.Type == JsonObjectType.File || isFileArray) @@ -502,7 +502,7 @@ private OpenApiParameter AddPrimitiveParameter( var defaultValue = context.SchemaGenerator.ConvertDefaultValue( contextualParameter, contextualParameter.ParameterInfo.DefaultValue); - if (_settings.SchemaType == SchemaType.Swagger2) + if (_settings.SchemaSettings.SchemaType == SchemaType.Swagger2) { operationParameter.Default = defaultValue; } diff --git a/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGeneratorSettings.cs b/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGeneratorSettings.cs index 725c68bc27..a451b26600 100644 --- a/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGeneratorSettings.cs +++ b/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGeneratorSettings.cs @@ -6,6 +6,7 @@ // Rico Suter, mail@rsuter.com //----------------------------------------------------------------------- +using NJsonSchema.Generation; using NSwag.Generation.Processors; using NSwag.Generation.WebApi.Processors; diff --git a/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs b/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs index d026b603cd..ab3b47c643 100644 --- a/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs +++ b/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs @@ -8,7 +8,6 @@ using Namotion.Reflection; using Newtonsoft.Json; -using NJsonSchema; using NJsonSchema.Generation; using NSwag.Generation.Processors; using NSwag.Generation.Processors.Collections; @@ -21,9 +20,8 @@ namespace NSwag.Generation public class OpenApiDocumentGeneratorSettings { /// Initializes a new instance of the class. - public OpenApiDocumentGeneratorSettings(JsonSchemaGeneratorSettings settings) + public OpenApiDocumentGeneratorSettings() { - SchemaSettings = settings; SchemaGenerator = new OpenApiSchemaGenerator(this); DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; } diff --git a/src/NSwag.Sample.NET50/Startup.cs b/src/NSwag.Sample.NET50/Startup.cs index 2487a295b1..9943e71809 100644 --- a/src/NSwag.Sample.NET50/Startup.cs +++ b/src/NSwag.Sample.NET50/Startup.cs @@ -32,7 +32,7 @@ public void ConfigureServices(IServiceCollection services) services.AddOpenApiDocument(document => { document.Description = "Hello world!"; - document.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; + document.SchemaSettings.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; }); } diff --git a/src/NSwag.Sample.NET60/Startup.cs b/src/NSwag.Sample.NET60/Startup.cs index f106bd9001..66cc3d1cc6 100644 --- a/src/NSwag.Sample.NET60/Startup.cs +++ b/src/NSwag.Sample.NET60/Startup.cs @@ -32,7 +32,7 @@ public void ConfigureServices(IServiceCollection services) services.AddOpenApiDocument(document => { document.Description = "Hello world!"; - document.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; + document.SchemaSettings.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; }); } diff --git a/src/NSwag.Sample.NET60Minimal/Program.cs b/src/NSwag.Sample.NET60Minimal/Program.cs index bce763d33c..aec6a2aac7 100644 --- a/src/NSwag.Sample.NET60Minimal/Program.cs +++ b/src/NSwag.Sample.NET60Minimal/Program.cs @@ -18,10 +18,10 @@ app.UseOpenApi(); app.UseSwaggerUi3(); -app.MapGet("/", (Func)(() => "Hello World!")) +app.MapGet("/", () => "Hello World!") .WithTags("General"); -app.MapGet("/sum/{a}/{b}", (Func)((a, b) => a + b)) +app.MapGet("/sum/{a}/{b}", (int a, int b) => a + b) .WithName("CalculateSum") .WithTags("Calculator"); diff --git a/src/NSwag.Sample.NETCore31/Startup.cs b/src/NSwag.Sample.NETCore31/Startup.cs index db396e7764..7c5cfbde1d 100644 --- a/src/NSwag.Sample.NETCore31/Startup.cs +++ b/src/NSwag.Sample.NETCore31/Startup.cs @@ -28,7 +28,7 @@ public void ConfigureServices(IServiceCollection services) services.AddOpenApiDocument(document => { document.Description = "Hello world!"; - document.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; + document.SchemaSettings.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; }); } From f233b0646effc26d340fd20d6a0a51e038e34941 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Thu, 18 Nov 2021 18:23:09 +0100 Subject: [PATCH 04/51] Refactoring --- .../AllowNullableBodyParametersTests.cs | 4 +++- .../OperationResponseProcessorTest.cs | 8 +++---- .../AspNetCoreOpenApiDocumentGenerator.cs | 14 ++++++------ .../AspNetCoreOperationProcessorContext.cs | 8 +++---- .../Processors/OperationTagsProcessorTests.cs | 2 +- .../WebApiOpenApiDocumentGenerator.cs | 9 ++++---- .../OpenApiDocumentGenerator.cs | 22 ++++++++++++------- .../OpenApiDocumentGeneratorSettings.cs | 4 ---- .../Contexts/OperationProcessorContext.cs | 10 ++++----- 9 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/AllowNullableBodyParametersTests.cs b/src/NSwag.CodeGeneration.CSharp.Tests/AllowNullableBodyParametersTests.cs index 7bc51941dc..e959a2bcd6 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/AllowNullableBodyParametersTests.cs +++ b/src/NSwag.CodeGeneration.CSharp.Tests/AllowNullableBodyParametersTests.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using NJsonSchema.Generation; using NSwag.CodeGeneration.OperationNameGenerators; using NSwag.Generation.WebApi; using System.ComponentModel.DataAnnotations; @@ -87,7 +88,8 @@ private static async Task GenerateCode(bool allowNullable { var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings { - AllowNullableBodyParameters = allowNullableBodyParameters + AllowNullableBodyParameters = allowNullableBodyParameters, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() }); var document = await swaggerGenerator.GenerateForControllerAsync(); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs b/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs index c678627105..b59c83c6cb 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs @@ -124,17 +124,15 @@ private AspNetCoreOperationProcessorContext GetContext(ApiDescription apiDescrip var swaggerSettings = new AspNetCoreOpenApiDocumentGeneratorSettings(); var document = new OpenApiDocument(); var settings = new OpenApiDocumentGeneratorSettings(); - var schemaGenerator = new OpenApiSchemaGenerator(settings); var schemaResolver = new OpenApiSchemaResolver(document, settings.SchemaSettings); - swaggerSettings.SchemaGenerator = schemaGenerator; - + var generator = new OpenApiDocumentGenerator(swaggerSettings, schemaResolver); + var context = new AspNetCoreOperationProcessorContext( document, operationDescription, GetType(), GetType().GetMethod(nameof(SomeAction), BindingFlags.NonPublic | BindingFlags.Instance), - new OpenApiDocumentGenerator(swaggerSettings, schemaResolver), - schemaGenerator, + generator, schemaResolver, swaggerSettings, new List()) diff --git a/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs b/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs index fc4d81cd25..c54638d600 100644 --- a/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs +++ b/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs @@ -121,7 +121,8 @@ public async Task GenerateAsync(ApiDescriptionGroupCollection a .GroupBy(item => (item.Item2 as ControllerActionDescriptor)?.ControllerTypeInfo.AsType()) .ToArray(); - var usedControllerTypes = GenerateApiGroups(document, apiGroups, schemaResolver); + var generator = new OpenApiDocumentGenerator(Settings, schemaResolver); + var usedControllerTypes = GenerateApiGroups(generator, document, apiGroups, schemaResolver); document.GenerateOperationIds(); @@ -132,7 +133,7 @@ public async Task GenerateAsync(ApiDescriptionGroupCollection a foreach (var processor in Settings.DocumentProcessors) { - processor.Process(new DocumentProcessorContext(document, controllerTypes, usedControllerTypes, schemaResolver, Settings.SchemaGenerator, Settings)); + processor.Process(new DocumentProcessorContext(document, controllerTypes, usedControllerTypes, schemaResolver, generator.SchemaGenerator, Settings)); } Settings.PostProcess?.Invoke(document); @@ -170,13 +171,12 @@ public static JsonSerializerOptions GetSystemTextJsonSettings(IServiceProvider s } private List GenerateApiGroups( + OpenApiDocumentGenerator generator, OpenApiDocument document, IGrouping>[] apiGroups, OpenApiSchemaResolver schemaResolver) { var usedControllerTypes = new List(); - var swaggerGenerator = new OpenApiDocumentGenerator(Settings, schemaResolver); - var allOperations = new List>(); foreach (var apiGroup in apiGroups) { @@ -242,7 +242,7 @@ private List GenerateApiGroups( operations.Add(new Tuple(operationDescription, apiDescription, method)); } - var addedOperations = AddOperationDescriptionsToDocument(document, controllerType, operations, swaggerGenerator, schemaResolver); + var addedOperations = AddOperationDescriptionsToDocument(document, controllerType, operations, generator, schemaResolver); if (addedOperations.Any() && apiGroup.Key != null) { usedControllerTypes.Add(apiGroup.Key); @@ -373,10 +373,10 @@ await OpenApiDocument.FromJsonAsync(Settings.DocumentTemplate).ConfigureAwait(fa return document; } - private bool RunOperationProcessors(OpenApiDocument document, ApiDescription apiDescription, Type controllerType, MethodInfo methodInfo, OpenApiOperationDescription operationDescription, List allOperations, OpenApiDocumentGenerator swaggerGenerator, OpenApiSchemaResolver schemaResolver) + private bool RunOperationProcessors(OpenApiDocument document, ApiDescription apiDescription, Type controllerType, MethodInfo methodInfo, OpenApiOperationDescription operationDescription, List allOperations, OpenApiDocumentGenerator generator, OpenApiSchemaResolver schemaResolver) { // 1. Run from settings - var operationProcessorContext = new AspNetCoreOperationProcessorContext(document, operationDescription, controllerType, methodInfo, swaggerGenerator, Settings.SchemaGenerator, schemaResolver, Settings, allOperations) + var operationProcessorContext = new AspNetCoreOperationProcessorContext(document, operationDescription, controllerType, methodInfo, generator, schemaResolver, Settings, allOperations) { ApiDescription = apiDescription, }; diff --git a/src/NSwag.Generation.AspNetCore/AspNetCoreOperationProcessorContext.cs b/src/NSwag.Generation.AspNetCore/AspNetCoreOperationProcessorContext.cs index 3fd302ff7c..0049fd6540 100644 --- a/src/NSwag.Generation.AspNetCore/AspNetCoreOperationProcessorContext.cs +++ b/src/NSwag.Generation.AspNetCore/AspNetCoreOperationProcessorContext.cs @@ -25,22 +25,20 @@ public class AspNetCoreOperationProcessorContext : OperationProcessorContext /// The operation description. /// Type of the controller. /// The method information. - /// The swagger generator. + /// The OpenAPI generator. /// The schema resolver. /// The sett /// All operation descriptions. - /// The schema generator. public AspNetCoreOperationProcessorContext( OpenApiDocument document, OpenApiOperationDescription operationDescription, Type controllerType, MethodInfo methodInfo, - OpenApiDocumentGenerator swaggerGenerator, - JsonSchemaGenerator schemaGenerator, + OpenApiDocumentGenerator documentGenerator, JsonSchemaResolver schemaResolver, OpenApiDocumentGeneratorSettings settings, IList allOperationDescriptions) - : base(document, operationDescription, controllerType, methodInfo, swaggerGenerator, schemaGenerator, schemaResolver, settings, allOperationDescriptions) + : base(document, operationDescription, controllerType, methodInfo, documentGenerator, schemaResolver, settings, allOperationDescriptions) { } diff --git a/src/NSwag.Generation.Tests/Processors/OperationTagsProcessorTests.cs b/src/NSwag.Generation.Tests/Processors/OperationTagsProcessorTests.cs index e2b44ad294..d6e562530f 100644 --- a/src/NSwag.Generation.Tests/Processors/OperationTagsProcessorTests.cs +++ b/src/NSwag.Generation.Tests/Processors/OperationTagsProcessorTests.cs @@ -136,7 +136,7 @@ private OperationProcessorContext GetContext(Type controllerType, MethodInfo met SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings(), UseControllerSummaryAsTagDescription = true }; - return new OperationProcessorContext(document, operationDescription, controllerType, methodInfo, null, null, null, settings, null); + return new OperationProcessorContext(document, operationDescription, controllerType, methodInfo, null, null, settings, null); } } } diff --git a/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGenerator.cs b/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGenerator.cs index 3e32e40f50..b86389fcbe 100644 --- a/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGenerator.cs +++ b/src/NSwag.Generation.WebApi/WebApiOpenApiDocumentGenerator.cs @@ -81,10 +81,10 @@ public async Task GenerateForControllersAsync(IEnumerable var document = await CreateDocumentAsync().ConfigureAwait(false); var schemaResolver = new OpenApiSchemaResolver(document, Settings.SchemaSettings); + var generator = new OpenApiDocumentGenerator(Settings, schemaResolver); var usedControllerTypes = new List(); foreach (var controllerType in controllerTypes) { - var generator = new OpenApiDocumentGenerator(Settings, schemaResolver); var isIncluded = GenerateForController(document, controllerType, generator, schemaResolver); if (isIncluded) { @@ -97,7 +97,7 @@ public async Task GenerateForControllersAsync(IEnumerable foreach (var processor in Settings.DocumentProcessors) { processor.Process(new DocumentProcessorContext(document, controllerTypes, - usedControllerTypes, schemaResolver, Settings.SchemaGenerator, Settings)); + usedControllerTypes, schemaResolver, generator.SchemaGenerator, Settings)); } return document; @@ -232,10 +232,11 @@ private bool AddOperationDescriptionsToDocument(OpenApiDocument document, Type c return addedOperations > 0; } - private bool RunOperationProcessors(OpenApiDocument document, Type controllerType, MethodInfo methodInfo, OpenApiOperationDescription operationDescription, List allOperations, OpenApiDocumentGenerator swaggerGenerator, OpenApiSchemaResolver schemaResolver) + private bool RunOperationProcessors(OpenApiDocument document, Type controllerType, MethodInfo methodInfo, OpenApiOperationDescription operationDescription, + List allOperations, OpenApiDocumentGenerator generator, OpenApiSchemaResolver schemaResolver) { var context = new OperationProcessorContext(document, operationDescription, controllerType, - methodInfo, swaggerGenerator, Settings.SchemaGenerator, schemaResolver, Settings, allOperations); + methodInfo, generator, schemaResolver, Settings, allOperations); // 1. Run from settings foreach (var operationProcessor in Settings.OperationProcessors) diff --git a/src/NSwag.Generation/OpenApiDocumentGenerator.cs b/src/NSwag.Generation/OpenApiDocumentGenerator.cs index f9f2f89f6c..8c1f7f2dc1 100644 --- a/src/NSwag.Generation/OpenApiDocumentGenerator.cs +++ b/src/NSwag.Generation/OpenApiDocumentGenerator.cs @@ -25,10 +25,16 @@ public class OpenApiDocumentGenerator /// The schema resolver. public OpenApiDocumentGenerator(OpenApiDocumentGeneratorSettings settings, JsonSchemaResolver schemaResolver) { + SchemaGenerator = new OpenApiSchemaGenerator(settings); _schemaResolver = schemaResolver; _settings = settings; } + /// + /// Gets or sets the schema generator. + /// + public OpenApiSchemaGenerator SchemaGenerator { get; private set; } + /// Creates a path parameter for a given type. /// Name of the parameter. /// Type of the parameter. @@ -109,9 +115,9 @@ private OpenApiParameter CreatePrimitiveOpenApiParameter(ContextualType contextu operationParameter = new OpenApiParameter(); operationParameter.Schema = new JsonSchema(); - _settings.SchemaGenerator.ApplyDataAnnotations(operationParameter.Schema, typeDescription); + SchemaGenerator.ApplyDataAnnotations(operationParameter.Schema, typeDescription); - var referencedSchema = _settings.SchemaGenerator.Generate(contextualParameter, _schemaResolver); + var referencedSchema = SchemaGenerator.Generate(contextualParameter, _schemaResolver); var hasSchemaAnnotations = JsonConvert.SerializeObject(operationParameter.Schema) != "{}"; if (hasSchemaAnnotations || typeDescription.IsNullable) @@ -135,10 +141,10 @@ private OpenApiParameter CreatePrimitiveOpenApiParameter(ContextualType contextu else { operationParameter = new OpenApiParameter(); - operationParameter.Schema = _settings.SchemaGenerator.GenerateWithReferenceAndNullability( + operationParameter.Schema = SchemaGenerator.GenerateWithReferenceAndNullability( contextualParameter, typeDescription.IsNullable, _schemaResolver); - _settings.SchemaGenerator.ApplyDataAnnotations(operationParameter.Schema, typeDescription); + SchemaGenerator.ApplyDataAnnotations(operationParameter.Schema, typeDescription); } if (typeDescription.Type.HasFlag(JsonObjectType.Array)) @@ -155,7 +161,7 @@ private OpenApiParameter CreatePrimitiveSwaggerParameter(ContextualType contextu OpenApiParameter operationParameter; if (typeDescription.RequiresSchemaReference(_settings.SchemaSettings.TypeMappers)) { - var referencedSchema = _settings.SchemaGenerator.Generate(contextualParameter, _schemaResolver); + var referencedSchema = SchemaGenerator.Generate(contextualParameter, _schemaResolver); operationParameter = new OpenApiParameter { @@ -174,12 +180,12 @@ private OpenApiParameter CreatePrimitiveSwaggerParameter(ContextualType contextu } } - _settings.SchemaGenerator.ApplyDataAnnotations(operationParameter, typeDescription); + SchemaGenerator.ApplyDataAnnotations(operationParameter, typeDescription); } else { - operationParameter = _settings.SchemaGenerator.Generate(contextualParameter, _schemaResolver); - _settings.SchemaGenerator.ApplyDataAnnotations(operationParameter, typeDescription); + operationParameter = SchemaGenerator.Generate(contextualParameter, _schemaResolver); + SchemaGenerator.ApplyDataAnnotations(operationParameter, typeDescription); } if (typeDescription.Type.HasFlag(JsonObjectType.Array)) diff --git a/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs b/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs index ab3b47c643..bbd634e471 100644 --- a/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs +++ b/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs @@ -22,16 +22,12 @@ public class OpenApiDocumentGeneratorSettings /// Initializes a new instance of the class. public OpenApiDocumentGeneratorSettings() { - SchemaGenerator = new OpenApiSchemaGenerator(this); DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; } /// public JsonSchemaGeneratorSettings SchemaSettings { get; set; } - /// Gets or sets the JSON Schema generator. - public OpenApiSchemaGenerator SchemaGenerator { get; set; } - /// Gets or sets the Swagger specification title. public string Title { get; set; } = "My Title"; diff --git a/src/NSwag.Generation/Processors/Contexts/OperationProcessorContext.cs b/src/NSwag.Generation/Processors/Contexts/OperationProcessorContext.cs index fc9d964a61..1dfdabcaa5 100644 --- a/src/NSwag.Generation/Processors/Contexts/OperationProcessorContext.cs +++ b/src/NSwag.Generation/Processors/Contexts/OperationProcessorContext.cs @@ -21,18 +21,16 @@ public class OperationProcessorContext /// The operation description. /// Type of the controller. /// The method information. - /// The swagger generator. + /// The OpenAPI generator. /// The schema resolver. /// The settings. /// All operation descriptions. - /// The schema generator. public OperationProcessorContext( OpenApiDocument document, OpenApiOperationDescription operationDescription, Type controllerType, MethodInfo methodInfo, - OpenApiDocumentGenerator openApiDocumentGenerator, - JsonSchemaGenerator schemaGenerator, + OpenApiDocumentGenerator documentGenerator, JsonSchemaResolver schemaResolver, OpenApiDocumentGeneratorSettings settings, IList allOperationDescriptions) @@ -43,8 +41,8 @@ public OperationProcessorContext( ControllerType = controllerType; MethodInfo = methodInfo; - DocumentGenerator = openApiDocumentGenerator; - SchemaGenerator = schemaGenerator; + DocumentGenerator = documentGenerator; + SchemaGenerator = documentGenerator.SchemaGenerator; SchemaResolver = schemaResolver; Settings = settings; From b92608eb1f4690e86b29b3b3786f52a1110b789f Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Thu, 18 Nov 2021 22:27:56 +0100 Subject: [PATCH 05/51] Fix tests --- .../CSharpClientSettingsTests.cs | 48 ++++++++++---- .../FileDownloadTests.cs | 7 ++- .../FileTests.cs | 7 ++- .../FormParameterTests.cs | 7 ++- .../HeadRequestTests.cs | 7 ++- .../OptionalParameterTests.cs | 26 ++++++-- .../UseCancellationTokenTests.cs | 29 +++++++-- .../WrapResponsesTests.cs | 14 ++++- .../AngularJSTests.cs | 19 +++++- .../AngularTests.cs | 27 ++++++-- .../AxiosTests.cs | 26 ++++++-- .../FetchTests.cs | 44 ++++++++++--- .../JQueryCallbacksTests.cs | 20 +++++- .../JQueryPromisesTests.cs | 20 +++++- .../TypeScriptDiscriminatorTests.cs | 10 ++- .../TypeScriptOperationParameterTests.cs | 34 +++++++--- .../ApiVersionProcessorWithAspNetCoreTests.cs | 12 ++-- .../AspNetCoreToSwaggerGenerationTests.cs | 62 ++++++++++++------- .../ExtensionDataTests.cs | 6 +- .../Inheritance/InheritanceControllerTests.cs | 4 +- .../Operations/PathTests.cs | 8 ++- .../Parameters/BodyParametersTests.cs | 10 +-- .../Parameters/HeaderParametersTests.cs | 8 ++- .../PathParameterWithModelBinderTests.cs | 8 ++- .../Parameters/QueryParametersTests.cs | 26 ++++++-- .../OperationResponseProcessorTest.cs | 8 +-- .../Requests/ConsumesTests.cs | 15 ++--- .../Responses/ProducesTests.cs | 6 +- .../Responses/ResponseAttributesTests.cs | 4 +- .../Responses/XmlDocsTests.cs | 4 +- .../SystemTextJsonTests.cs | 2 +- .../Contexts/OperationProcessorContext.cs | 2 +- 32 files changed, 407 insertions(+), 123 deletions(-) diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/CSharpClientSettingsTests.cs b/src/NSwag.CodeGeneration.CSharp.Tests/CSharpClientSettingsTests.cs index 139c4acf10..7edeb8ed14 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/CSharpClientSettingsTests.cs +++ b/src/NSwag.CodeGeneration.CSharp.Tests/CSharpClientSettingsTests.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using NJsonSchema.Generation; using NSwag.Generation.WebApi; using Xunit; @@ -19,7 +20,10 @@ public object GetPerson(bool @override = false) public async Task When_ConfigurationClass_is_set_then_correct_ctor_is_generated() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); var document = await swaggerGenerator.GenerateForControllerAsync(); var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings @@ -40,9 +44,12 @@ public async Task When_ConfigurationClass_is_set_then_correct_ctor_is_generated( public async Task When_UseHttpRequestMessageCreationMethod_is_set_then_CreateRequestMessage_is_generated() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGenerator.GenerateForControllerAsync(); - var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings { ConfigurationClass = "MyConfig", @@ -61,9 +68,12 @@ public async Task When_UseHttpRequestMessageCreationMethod_is_set_then_CreateReq public async Task When_parameter_name_is_reserved_keyword_then_it_is_appended_with_at() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGenerator.GenerateForControllerAsync(); - var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings()); //// Act @@ -77,9 +87,12 @@ public async Task When_parameter_name_is_reserved_keyword_then_it_is_appended_wi public async Task When_code_is_generated_then_by_default_the_system_httpclient_is_used() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGenerator.GenerateForControllerAsync(); - var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings { InjectHttpClient = false @@ -96,9 +109,12 @@ public async Task When_code_is_generated_then_by_default_the_system_httpclient_i public async Task When_custom_http_client_type_is_specified_then_an_instance_of_that_type_is_used() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); - var document = await swaggerGenerator.GenerateForControllerAsync(); + var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGenerator.GenerateForControllerAsync(); var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings { HttpClientType = "CustomNamespace.CustomHttpClient", @@ -116,9 +132,12 @@ public async Task When_custom_http_client_type_is_specified_then_an_instance_of_ public async Task When_client_base_interface_is_not_specified_then_client_interface_should_have_no_base_interface() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); - var document = await swaggerGenerator.GenerateForControllerAsync(); + var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGenerator.GenerateForControllerAsync(); var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings { GenerateClientInterfaces = true @@ -135,9 +154,12 @@ public async Task When_client_base_interface_is_not_specified_then_client_interf public async Task When_client_base_interface_is_specified_then_client_interface_extends_it() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); - var document = await swaggerGenerator.GenerateForControllerAsync(); + var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGenerator.GenerateForControllerAsync(); var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings { GenerateClientInterfaces = true, diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/FileDownloadTests.cs b/src/NSwag.CodeGeneration.CSharp.Tests/FileDownloadTests.cs index 515c960455..aa810ccc2b 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/FileDownloadTests.cs +++ b/src/NSwag.CodeGeneration.CSharp.Tests/FileDownloadTests.cs @@ -2,6 +2,7 @@ using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using NJsonSchema.Generation; using NSwag.Generation.WebApi; using Xunit; @@ -22,7 +23,11 @@ public HttpResponseMessage DownloadFile() public async Task When_response_is_file_and_stream_is_not_used_then_byte_array_is_returned() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGenerator.GenerateForControllerAsync(); //// Act diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/FileTests.cs b/src/NSwag.CodeGeneration.CSharp.Tests/FileTests.cs index ad76c356ed..e3ff227e76 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/FileTests.cs +++ b/src/NSwag.CodeGeneration.CSharp.Tests/FileTests.cs @@ -2,6 +2,7 @@ using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using NJsonSchema.Generation; using NSwag.Generation.WebApi; using Xunit; @@ -22,7 +23,11 @@ public HttpResponseMessage DownloadFile() public async Task When_file_is_generated_system_alias_is_there() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGenerator.GenerateForControllerAsync(); //// Act diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/FormParameterTests.cs b/src/NSwag.CodeGeneration.CSharp.Tests/FormParameterTests.cs index 6b7d623b30..592e2525c6 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/FormParameterTests.cs +++ b/src/NSwag.CodeGeneration.CSharp.Tests/FormParameterTests.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.WebApi; using Xunit; @@ -67,7 +68,11 @@ public class HttpPostedFileBase public async Task When_action_has_file_parameter_then_Stream_is_generated_in_CSharp_code() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await generator.GenerateForControllerAsync(); //// Act diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/HeadRequestTests.cs b/src/NSwag.CodeGeneration.CSharp.Tests/HeadRequestTests.cs index ecbca7e828..a002c07c3d 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/HeadRequestTests.cs +++ b/src/NSwag.CodeGeneration.CSharp.Tests/HeadRequestTests.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using NJsonSchema.Generation; using NSwag.Generation.WebApi; using Xunit; @@ -19,7 +20,11 @@ public void Foo() public async Task When_operation_is_HTTP_head_then_no_content_is_not_used() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await generator.GenerateForControllerAsync(); //// Act diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/OptionalParameterTests.cs b/src/NSwag.CodeGeneration.CSharp.Tests/OptionalParameterTests.cs index b6094eb3e6..93197f319e 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/OptionalParameterTests.cs +++ b/src/NSwag.CodeGeneration.CSharp.Tests/OptionalParameterTests.cs @@ -2,6 +2,8 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.WebApi; using Xunit; @@ -48,7 +50,11 @@ public class MyClass public async Task When_setting_is_enabled_with_enum_fromuri_should_make_enum_nullable() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await generator.GenerateForControllerAsync(); //// Act @@ -67,7 +73,11 @@ public async Task When_setting_is_enabled_with_enum_fromuri_should_make_enum_nul public async Task When_setting_is_enabled_with_class_fromuri_should_make_enum_nullable() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await generator.GenerateForControllerAsync(); //// Act @@ -87,7 +97,11 @@ public async Task When_setting_is_enabled_with_class_fromuri_should_make_enum_nu public async Task When_setting_is_enabled_then_optional_parameters_have_null_optional_value() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await generator.GenerateForControllerAsync(); //// Act @@ -105,7 +119,11 @@ public async Task When_setting_is_enabled_then_optional_parameters_have_null_opt [Fact] public async Task When_setting_is_enabled_then_parameters_are_reordered() { - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); //// Act diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/UseCancellationTokenTests.cs b/src/NSwag.CodeGeneration.CSharp.Tests/UseCancellationTokenTests.cs index b81067a646..6da9d91704 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/UseCancellationTokenTests.cs +++ b/src/NSwag.CodeGeneration.CSharp.Tests/UseCancellationTokenTests.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using NJsonSchema.Generation; using NSwag.CodeGeneration.CSharp.Models; using NSwag.Generation.WebApi; using Xunit; @@ -28,7 +29,10 @@ public void Bar() public async Task When_controllerstyleispartial_and_usecancellationtokenistrue_and_requesthasnoparameter_then_cancellationtoken_is_added() { //// Arrange - var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); var document = await swaggerGen.GenerateForControllerAsync(); //// Act @@ -49,7 +53,10 @@ public async Task When_controllerstyleispartial_and_usecancellationtokenistrue_a public async Task When_controllerstyleispartial_and_usecancellationtokenistrue_and_requesthasparameter_then_cancellationtoken_is_added() { //// Arrange - var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); var document = await swaggerGen.GenerateForControllerAsync(); //// Act @@ -71,7 +78,11 @@ public async Task When_controllerstyleispartial_and_usecancellationtokenistrue_a public async Task When_controllerstyleisabstract_and_usecancellationtokenistrue_and_requesthasnoparameter_then_cancellationtoken_is_added() { //// Arrange - var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGen.GenerateForControllerAsync(); //// Act @@ -91,7 +102,11 @@ public async Task When_controllerstyleisabstract_and_usecancellationtokenistrue_ public async Task When_controllerstyleisabstract_and_usecancellationtokenistrue_and_requesthasparameter_then_cancellationtoken_is_added() { //// Arrange - var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGen.GenerateForControllerAsync(); //// Act @@ -111,7 +126,11 @@ public async Task When_controllerstyleisabstract_and_usecancellationtokenistrue_ public async Task When_usecancellationtokenparameter_notsetted_then_cancellationtoken_isnot_added() { //// Arrange - var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); + var document = await swaggerGen.GenerateForControllerAsync(); //// Act diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/WrapResponsesTests.cs b/src/NSwag.CodeGeneration.CSharp.Tests/WrapResponsesTests.cs index ab0e4b21be..4edf2fd415 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/WrapResponsesTests.cs +++ b/src/NSwag.CodeGeneration.CSharp.Tests/WrapResponsesTests.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using NJsonSchema.Generation; using NSwag.Generation.WebApi; using Xunit; @@ -27,7 +28,10 @@ public void Bar() public async Task When_success_responses_are_wrapped_then_SwaggerResponse_is_returned() { //// Arrange - var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); var document = await swaggerGen.GenerateForControllerAsync(); //// Act @@ -46,7 +50,10 @@ public async Task When_success_responses_are_wrapped_then_SwaggerResponse_is_ret public async Task When_success_responses_are_wrapped_then_SwaggerResponse_is_returned_web_api() { //// Arrange - var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }); var document = await swaggerGen.GenerateForControllerAsync(); //// Act @@ -67,7 +74,8 @@ public async Task When_success_responses_are_wrapped_then_SwaggerResponse_is_ret //// Arrange var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings { - IsAspNetCore = true + IsAspNetCore = true, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() }); var document = await swaggerGen.GenerateForControllerAsync(); diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/AngularJSTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/AngularJSTests.cs index 914943d863..6510c943b8 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/AngularJSTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/AngularJSTests.cs @@ -2,6 +2,8 @@ using Xunit; using NSwag.Generation.WebApi; using Microsoft.AspNetCore.Mvc; +using NJsonSchema.Generation; +using NJsonSchema; namespace NSwag.CodeGeneration.TypeScript.Tests { @@ -33,7 +35,11 @@ public void AddMessage([FromForm]Foo message, [FromForm]string messageId) public async Task When_export_types_is_true_then_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -59,7 +65,11 @@ public async Task When_export_types_is_true_then_add_export_before_classes() public async Task When_export_types_is_false_then_dont_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -85,7 +95,10 @@ public async Task When_export_types_is_false_then_dont_add_export_before_classes public async Task When_consumes_is_url_encoded_then_construct_url_encoded_request() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/AngularTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/AngularTests.cs index ea2433cb2d..633a29f552 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/AngularTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/AngularTests.cs @@ -3,6 +3,8 @@ using NSwag.Generation.WebApi; using Microsoft.AspNetCore.Mvc; using System.ComponentModel.DataAnnotations; +using NJsonSchema.Generation; +using NJsonSchema; namespace NSwag.CodeGeneration.TypeScript.Tests { @@ -74,7 +76,10 @@ public void AddMessage([FromForm]Foo message, [FromForm]string messageId) public async Task When_return_value_is_void_then_client_returns_observable_of_void() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -98,7 +103,10 @@ public async Task When_return_value_is_void_then_client_returns_observable_of_vo public async Task When_export_types_is_true_then_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -124,7 +132,10 @@ public async Task When_export_types_is_true_then_add_export_before_classes() public async Task When_export_types_is_false_then_dont_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -150,7 +161,10 @@ public async Task When_export_types_is_false_then_dont_add_export_before_classes public async Task When_generic_request() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -176,7 +190,10 @@ public async Task When_generic_request() public async Task When_consumes_is_url_encoded_then_construct_url_encoded_request() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/AxiosTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/AxiosTests.cs index 642fcd4739..f97bef8c4b 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/AxiosTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/AxiosTests.cs @@ -2,6 +2,8 @@ using Xunit; using NSwag.Generation.WebApi; using Microsoft.AspNetCore.Mvc; +using NJsonSchema.Generation; +using NJsonSchema; namespace NSwag.CodeGeneration.TypeScript.Tests { @@ -33,7 +35,11 @@ public void AddMessage([FromForm]Foo message, [FromForm]string messageId) public async Task When_export_types_is_true_then_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -59,7 +65,11 @@ public async Task When_export_types_is_true_then_add_export_before_classes() public async Task When_export_types_is_false_then_dont_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -85,7 +95,11 @@ public async Task When_export_types_is_false_then_dont_add_export_before_classes public async Task When_consumes_is_url_encoded_then_construct_url_encoded_request() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -110,7 +124,11 @@ public async Task When_consumes_is_url_encoded_then_construct_url_encoded_reques public async Task Add_cancel_token_to_every_call() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/FetchTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/FetchTests.cs index 42d5aff938..11aeb6b1b2 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/FetchTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/FetchTests.cs @@ -2,6 +2,8 @@ using Xunit; using NSwag.Generation.WebApi; using Microsoft.AspNetCore.Mvc; +using NJsonSchema; +using NJsonSchema.Generation; namespace NSwag.CodeGeneration.TypeScript.Tests { @@ -33,7 +35,11 @@ public void AddMessage([FromForm]Foo message, [FromForm]string messageId, [FromF public async Task When_export_types_is_true_then_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -59,7 +65,11 @@ public async Task When_export_types_is_true_then_add_export_before_classes() public async Task When_export_types_is_false_then_dont_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -85,7 +95,11 @@ public async Task When_export_types_is_false_then_dont_add_export_before_classes public async Task When_consumes_is_url_encoded_then_construct_url_encoded_request() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -110,7 +124,11 @@ public async Task When_consumes_is_url_encoded_then_construct_url_encoded_reques public async Task When_abort_signal() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -134,7 +152,11 @@ public async Task When_abort_signal() public async Task When_no_abort_signal() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -158,7 +180,11 @@ public async Task When_no_abort_signal() public async Task When_includeHttpContext() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); //// Act @@ -182,7 +208,11 @@ public async Task When_includeHttpContext() public async Task When_no_includeHttpContext() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/JQueryCallbacksTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/JQueryCallbacksTests.cs index 0365a29001..ba705d3f60 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/JQueryCallbacksTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/JQueryCallbacksTests.cs @@ -2,6 +2,8 @@ using Xunit; using NSwag.Generation.WebApi; using Microsoft.AspNetCore.Mvc; +using NJsonSchema.Generation; +using NJsonSchema; namespace NSwag.CodeGeneration.TypeScript.Tests { @@ -33,7 +35,11 @@ public void AddMessage([FromForm]Foo message, [FromForm]string messageId) public async Task When_export_types_is_true_then_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -59,7 +65,11 @@ public async Task When_export_types_is_true_then_add_export_before_classes() public async Task When_export_types_is_false_then_dont_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -85,7 +95,11 @@ public async Task When_export_types_is_false_then_dont_add_export_before_classes public async Task When_consumes_is_url_encoded_then_construct_url_encoded_request() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/JQueryPromisesTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/JQueryPromisesTests.cs index 3de13c0c6f..c42f3015dd 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/JQueryPromisesTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/JQueryPromisesTests.cs @@ -1,5 +1,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.WebApi; using Xunit; @@ -33,7 +35,11 @@ public void AddMessage([FromForm]Foo message, [FromForm]string messageId) public async Task When_export_types_is_true_then_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -59,7 +65,11 @@ public async Task When_export_types_is_true_then_add_export_before_classes() public async Task When_export_types_is_false_then_dont_add_export_before_classes() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -85,7 +95,11 @@ public async Task When_export_types_is_false_then_dont_add_export_before_classes public async Task When_consumes_is_url_encoded_then_construct_url_encoded_request() { //// Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptDiscriminatorTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptDiscriminatorTests.cs index a109e60bf5..9439f03619 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptDiscriminatorTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptDiscriminatorTests.cs @@ -7,6 +7,8 @@ using System.Runtime.Serialization; using Xunit; using NJsonSchema.NewtonsoftJson.Converters; +using NJsonSchema.Generation; +using NJsonSchema; namespace NSwag.CodeGeneration.TypeScript.Tests { @@ -74,8 +76,12 @@ public string TestNested(Nested param) public async Task When_parameter_is_abstract_then_generate_union() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); - var document = await swaggerGenerator.GenerateForControllerAsync(); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + + var document = await generator.GenerateForControllerAsync(); var clientGenerator = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings { TypeScriptGeneratorSettings = diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptOperationParameterTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptOperationParameterTests.cs index 00b61c7634..5657ed9ef2 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptOperationParameterTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/TypeScriptOperationParameterTests.cs @@ -1,6 +1,8 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using NJsonSchema; using NJsonSchema.CodeGeneration.TypeScript; +using NJsonSchema.Generation; using NSwag.Generation.WebApi; using Xunit; @@ -30,8 +32,12 @@ public string Test(int a, int? b = null) public async Task When_parameter_is_nullable_and_ts20_then_it_is_a_union_type_with_undefined() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); - var document = await swaggerGenerator.GenerateForControllerAsync(); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + + var document = await generator.GenerateForControllerAsync(); var clientGenerator = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings { TypeScriptGeneratorSettings = @@ -54,8 +60,12 @@ public async Task When_parameter_is_nullable_and_ts20_then_it_is_a_union_type_wi public async Task When_parameter_is_nullable_and_ts20_then_it_is_not_included_in_query_string() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); - var document = await swaggerGenerator.GenerateForControllerAsync(); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + + var document = await generator.GenerateForControllerAsync(); var clientGenerator = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings { TypeScriptGeneratorSettings = @@ -78,8 +88,12 @@ public async Task When_parameter_is_nullable_and_ts20_then_it_is_not_included_in public async Task When_parameter_is_nullable_optional_and_ts20_then_it_is_a_union_type_with_undefined() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); - var document = await swaggerGenerator.GenerateForControllerAsync(); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + + var document = await generator.GenerateForControllerAsync(); var clientGenerator = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings { TypeScriptGeneratorSettings = @@ -102,8 +116,12 @@ public async Task When_parameter_is_nullable_optional_and_ts20_then_it_is_a_unio public async Task When_parameter_is_nullable_optional_and_ts20_then_it_is_not_included_in_query_string() { //// Arrange - var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); - var document = await swaggerGenerator.GenerateForControllerAsync(); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + + var document = await generator.GenerateForControllerAsync(); var clientGenerator = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings { TypeScriptGeneratorSettings = diff --git a/src/NSwag.Generation.AspNetCore.Tests/ApiVersionProcessorWithAspNetCoreTests.cs b/src/NSwag.Generation.AspNetCore.Tests/ApiVersionProcessorWithAspNetCoreTests.cs index 0d3cf93bac..86f71509e7 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/ApiVersionProcessorWithAspNetCoreTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/ApiVersionProcessorWithAspNetCoreTests.cs @@ -1,5 +1,7 @@ using System.Linq; using System.Threading.Tasks; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers; using Xunit; @@ -11,7 +13,7 @@ public class ApiVersionProcessorWithAspNetCoreTests : AspNetCoreTestsBase public async Task When_api_version_parameter_should_be_ignored_then_it_is_ignored() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; settings.ApiGroupNames = new[] { "1" }; // Act @@ -27,7 +29,7 @@ public async Task When_api_version_parameter_should_be_ignored_then_it_is_ignore public async Task When_generating_v1_then_only_v1_operations_are_included() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; settings.ApiGroupNames = new[] { "1" }; // Act @@ -48,7 +50,7 @@ public async Task When_generating_v1_then_only_v1_operations_are_included() public async Task When_generating_v2_then_only_v2_operations_are_included() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; settings.ApiGroupNames = new[] { "2" }; // Act @@ -69,7 +71,7 @@ public async Task When_generating_v2_then_only_v2_operations_are_included() public async Task When_generating_v3_then_only_v3_operations_are_included() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; settings.ApiGroupNames = new[] { "3" }; // Act @@ -89,7 +91,7 @@ public async Task When_generating_v3_then_only_v3_operations_are_included() public async Task When_generating_versioned_controllers_then_version_path_parameter_is_not_present() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings{}; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; settings.ApiGroupNames = new[] { "3" }; // Act diff --git a/src/NSwag.Generation.AspNetCore.Tests/AspNetCoreToSwaggerGenerationTests.cs b/src/NSwag.Generation.AspNetCore.Tests/AspNetCoreToSwaggerGenerationTests.cs index d04d6786e2..680e41d532 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/AspNetCoreToSwaggerGenerationTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/AspNetCoreToSwaggerGenerationTests.cs @@ -25,6 +25,8 @@ using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Options; using Moq; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Annotations; using NSwag.Generation.Processors; using NSwag.Generation.Processors.Contexts; @@ -38,7 +40,7 @@ public class AspNetCoreToSwaggerGenerationTests public async Task SwaggerDocumentIsGeneratedForCustomCreatedApiDescriptions() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = new[] { new ApiDescription @@ -183,7 +185,11 @@ public async Task SwaggerDocumentIsGeneratedForCustomCreatedApiDescriptions() public async Task When_generating_swagger_all_apidescriptions_are_discovered() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var apiDescriptions = GetApiDescriptionGroups(typeof(TestController)); //// Act @@ -213,7 +219,11 @@ public async Task When_generating_swagger_all_apidescriptions_are_discovered() public async Task When_generating_swagger_all_apidescriptions_are_discovered_for_2_1_applications() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var apiDescriptions = Get2_1_ApiDescriptionGroups(typeof(TestController)); //// Act @@ -247,7 +257,7 @@ public async Task When_generating_swagger_all_apidescriptions_are_discovered_for public async Task ControllersWithSwaggerIgnoreAttribute_AreIgnored() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithSwaggerIgnoreAttribute)); //// Act @@ -261,7 +271,7 @@ public async Task ControllersWithSwaggerIgnoreAttribute_AreIgnored() public async Task ActionsWithSwaggerIgnoreAttribute_AreIgnored() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ActionWithSwaggerIgnoreAttribute)); //// Act @@ -277,7 +287,7 @@ public async Task ActionsWithSwaggerIgnoreAttribute_AreIgnored() public async Task ParametersWithSwaggerIgnoreAttribute_AreIgnored() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ParameterWithSwaggerIgnoreAttribute)); //// Act @@ -297,7 +307,7 @@ public async Task ParametersWithSwaggerIgnoreAttribute_AreIgnored() public async Task SwaggerOperationMethods_AreParsed() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(HttpMethodsController)); //// Act @@ -332,7 +342,7 @@ public async Task SwaggerOperationMethods_AreParsed() public async Task SwaggerOperationAttribute_AreUsedToCalculateOperationId_IfPresent() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ActionWithSwaggerOperationAttribute)); //// Act @@ -347,7 +357,7 @@ public async Task SwaggerOperationAttribute_AreUsedToCalculateOperationId_IfPres public async Task SwaggerOperationProcessorAttributesOnControllerTypes_AreDiscoveredAndExecuted() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithSwaggerOperationProcessor)); //// Act @@ -361,7 +371,7 @@ public async Task SwaggerOperationProcessorAttributesOnControllerTypes_AreDiscov public async Task SwaggerOperationProcessorAttributesOnActions_AreDiscoveredAndExecuted() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ActionWithSwaggerOperationProcessor)); //// Act @@ -375,7 +385,7 @@ public async Task SwaggerOperationProcessorAttributesOnActions_AreDiscoveredAndE public async Task SwaggerResponseAttributesOnControllersAreDiscovered() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithSwaggerResponseTypeAttribute)); //// Act @@ -393,7 +403,7 @@ public async Task SwaggerResponseAttributesOnControllersAreDiscovered() public async Task SwaggerResponseAttributesOnActionsAreDiscovered() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ActionWithSwaggerResponseAttribute)); //// Act @@ -411,7 +421,7 @@ public async Task SwaggerResponseAttributesOnActionsAreDiscovered() public async Task FromHeaderParametersAreDiscovered() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithParameters)); //// Act @@ -428,7 +438,7 @@ public async Task FromHeaderParametersAreDiscovered() public async Task FromBodyParametersAreDiscovered() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithParameters)); //// Act @@ -446,7 +456,12 @@ public async Task FromBodyParametersAreDiscovered() public async Task FromFormParametersAreDiscovered() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { RequireParametersWithoutDefault = true }); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings + { + RequireParametersWithoutDefault = true, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }); + var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithParameters)); //// Act @@ -464,7 +479,12 @@ public async Task FromFormParametersAreDiscovered() public async Task QueryParametersAreDiscovered() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { RequireParametersWithoutDefault = true }); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings + { + RequireParametersWithoutDefault = true, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } + }); + var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithParameters)); //// Act @@ -489,7 +509,7 @@ public async Task QueryParametersAreDiscovered() public async Task FormFileParametersAreDiscovered() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithParameters)); //// Act @@ -506,7 +526,7 @@ public async Task FormFileParametersAreDiscovered() public async Task ComplexQueryParametersAreProcessed() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithParameters)); //// Act @@ -537,7 +557,7 @@ public async Task ComplexQueryParametersAreProcessed() public async Task BoundPropertiesAreProcessed() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithBoundProperties)); //// Act @@ -568,7 +588,7 @@ public async Task BoundPropertiesAreProcessed() public async Task When_no_IncludedVersions_are_defined_then_all_routes_are_available_and_replaced() { //// Arrange - var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings()); + var generator = new AspNetCoreOpenApiDocumentGenerator(new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }); var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithReCodeAttribute)); //// Act @@ -620,7 +640,7 @@ private class ActionWithSwaggerIgnoreAttribute private class ParameterWithSwaggerIgnoreAttribute { [HttpPost("{id}/{name?}")] - public Task GetModel([FromRoute] int id, [FromRoute] [SwaggerIgnore] string name) => null; + public Task GetModel([FromRoute] int id, [FromRoute][SwaggerIgnore] string name) => null; } [Route("[controller]/[action]")] diff --git a/src/NSwag.Generation.AspNetCore.Tests/ExtensionDataTests.cs b/src/NSwag.Generation.AspNetCore.Tests/ExtensionDataTests.cs index 91b5834175..566d6d042b 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/ExtensionDataTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/ExtensionDataTests.cs @@ -1,5 +1,7 @@ using System.Linq; using System.Threading.Tasks; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers; using Xunit; @@ -11,7 +13,7 @@ public class ExtensionDataTests : AspNetCoreTestsBase public async Task When_controller_has_extension_data_attributes_then_they_are_processed() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(SwaggerExtensionDataController)); @@ -27,7 +29,7 @@ public async Task When_controller_has_extension_data_attributes_then_they_are_pr public async Task When_operation_has_extension_data_attributes_then_they_are_processed() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(SwaggerExtensionDataController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Inheritance/InheritanceControllerTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Inheritance/InheritanceControllerTests.cs index 8a7ec95b42..a94f60ca0d 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Inheritance/InheritanceControllerTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Inheritance/InheritanceControllerTests.cs @@ -1,5 +1,7 @@ using System.Linq; using System.Threading.Tasks; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Inheritance; using Xunit; @@ -11,7 +13,7 @@ public class InheritanceControllerTests : AspNetCoreTestsBase public async Task When_primitive_body_parameter_has_no_default_value_then_it_is_required() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(ActualController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Operations/PathTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Operations/PathTests.cs index 1b472d6628..9340b6bda3 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Operations/PathTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Operations/PathTests.cs @@ -1,4 +1,6 @@ -using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Parameters; +using NJsonSchema; +using NJsonSchema.Generation; +using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Parameters; using System.Linq; using System.Threading.Tasks; using Xunit; @@ -11,7 +13,7 @@ public class PathTests : AspNetCoreTestsBase public async Task When_route_is_empty_then_path_is_slash() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(EmptyPathController)); @@ -27,7 +29,7 @@ public async Task When_route_is_empty_then_path_is_slash() public async Task When_route_is_not_empty_then_path_starts_with_slash() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs index 89c0e245d4..981cac61b8 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs @@ -1,5 +1,7 @@ using System.Linq; using System.Threading.Tasks; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Parameters; using Xunit; @@ -11,7 +13,7 @@ public class BodyParametersTests : AspNetCoreTestsBase public async Task When_primitive_body_parameter_has_no_default_value_then_it_is_required() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController)); @@ -26,7 +28,7 @@ public async Task When_primitive_body_parameter_has_no_default_value_then_it_is_ public async Task When_primitive_body_parameter_has_default_value_then_it_is_optional() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController)); @@ -41,7 +43,7 @@ public async Task When_primitive_body_parameter_has_default_value_then_it_is_opt public async Task When_complex_body_parameter_has_no_default_value_then_it_is_required() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController)); @@ -56,7 +58,7 @@ public async Task When_complex_body_parameter_has_no_default_value_then_it_is_re public async Task When_complex_body_parameter_has_default_value_then_it_is_optional() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Parameters/HeaderParametersTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Parameters/HeaderParametersTests.cs index 11bb0880a8..c05af7cd88 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Parameters/HeaderParametersTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Parameters/HeaderParametersTests.cs @@ -1,5 +1,7 @@ using System.Linq; using System.Threading.Tasks; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Parameters; using Xunit; @@ -11,7 +13,11 @@ public class HeaderParametersTests : AspNetCoreTestsBase public async Task When_complex_query_parameters_are_nullable_and_set_to_null_they_are_optional_in_spec() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { RequireParametersWithoutDefault = true }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + RequireParametersWithoutDefault = true, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(HeaderParametersController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Parameters/PathParameterWithModelBinderTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Parameters/PathParameterWithModelBinderTests.cs index 41cc121095..61e684853a 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Parameters/PathParameterWithModelBinderTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Parameters/PathParameterWithModelBinderTests.cs @@ -1,5 +1,7 @@ using System.Linq; using System.Threading.Tasks; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Parameters; using Xunit; @@ -11,7 +13,11 @@ public class PathParameterWithModelBinderTests : AspNetCoreTestsBase public async Task When_model_binder_parameter_is_used_on_path_parameter_then_parameter_kind_is_path() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { RequireParametersWithoutDefault = true }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + RequireParametersWithoutDefault = true, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(PathParameterWithModelBinderController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Parameters/QueryParametersTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Parameters/QueryParametersTests.cs index eeaafb0b95..57f4529496 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Parameters/QueryParametersTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Parameters/QueryParametersTests.cs @@ -1,6 +1,8 @@ using System.Linq; using System.Threading.Tasks; using Newtonsoft.Json.Linq; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Parameters; using Xunit; @@ -12,7 +14,11 @@ public class QueryParametersTests : AspNetCoreTestsBase public async Task When_complex_query_parameters_are_nullable_and_set_to_null_they_are_optional_in_spec() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { RequireParametersWithoutDefault = true }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + RequireParametersWithoutDefault = true, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(ComplexQueryParametersController)); @@ -36,7 +42,11 @@ public async Task When_complex_query_parameters_are_nullable_and_set_to_null_the public async Task When_simple_query_parameters_are_nullable_and_set_to_null_they_are_optional_in_spec() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { RequireParametersWithoutDefault = true }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + RequireParametersWithoutDefault = true, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(SimpleQueryParametersController)); @@ -54,7 +64,11 @@ public async Task When_simple_query_parameters_are_nullable_and_set_to_null_they public async Task When_simple_query_parameter_has_BindRequiredAttribute_then_it_is_required() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { RequireParametersWithoutDefault = false }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + RequireParametersWithoutDefault = false, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(SimpleQueryParametersController)); @@ -72,7 +86,11 @@ public async Task When_simple_query_parameter_has_BindRequiredAttribute_then_it_ public async Task When_parameter_is_overwritten_then_original_name_is_set() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { RequireParametersWithoutDefault = false }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + RequireParametersWithoutDefault = false, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(RenamedQueryParameterController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs b/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs index b59c83c6cb..c4158b007e 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Processors/OperationResponseProcessorTest.cs @@ -7,6 +7,7 @@ //----------------------------------------------------------------------- using Microsoft.AspNetCore.Mvc.ApiExplorer; +using NJsonSchema; using NJsonSchema.Generation; using System.Collections.Generic; using System.Reflection; @@ -121,11 +122,10 @@ public void ProcessAsync_Adds200StatusCodeForVoidResponse() private AspNetCoreOperationProcessorContext GetContext(ApiDescription apiDescription) { var operationDescription = new OpenApiOperationDescription { Operation = new OpenApiOperation() }; - var swaggerSettings = new AspNetCoreOpenApiDocumentGeneratorSettings(); var document = new OpenApiDocument(); - var settings = new OpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; var schemaResolver = new OpenApiSchemaResolver(document, settings.SchemaSettings); - var generator = new OpenApiDocumentGenerator(swaggerSettings, schemaResolver); + var generator = new OpenApiDocumentGenerator(settings, schemaResolver); var context = new AspNetCoreOperationProcessorContext( document, @@ -134,7 +134,7 @@ private AspNetCoreOperationProcessorContext GetContext(ApiDescription apiDescrip GetType().GetMethod(nameof(SomeAction), BindingFlags.NonPublic | BindingFlags.Instance), generator, schemaResolver, - swaggerSettings, + settings, new List()) { ApiDescription = apiDescription, diff --git a/src/NSwag.Generation.AspNetCore.Tests/Requests/ConsumesTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Requests/ConsumesTests.cs index 35189c8547..c37a572d52 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Requests/ConsumesTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Requests/ConsumesTests.cs @@ -1,4 +1,6 @@ -using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Requests; +using NJsonSchema; +using NJsonSchema.Generation; +using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Requests; using System.Linq; using System.Threading.Tasks; using Xunit; @@ -13,8 +15,7 @@ public class ConsumesTests : AspNetCoreTestsBase public async Task When_consumes_is_defined_on_all_operations_then_it_is_added_to_the_document() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); - + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(ConsumesController)); var json = document.ToJson(); @@ -30,7 +31,7 @@ public async Task When_consumes_is_defined_on_all_operations_then_it_is_added_to public async Task When_consumes_is_defined_on_single_operations_then_it_is_added_to_the_operation() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(ConsumesController)); @@ -48,7 +49,7 @@ public async Task When_consumes_is_defined_on_single_operations_then_it_is_added public async Task When_operation_consumes_is_different_in_several_controllers_then_they_are_added_to_the_operation() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(ConsumesController), typeof(MultipartConsumesController)); @@ -57,7 +58,7 @@ public async Task When_operation_consumes_is_different_in_several_controllers_th // Assert const string expectedTestContentType = "foo/bar"; const string expectedMultipartContentType = "multipart/form-data"; - + var operation = document.Operations .First(o => o.Operation.OperationId == "Consumes_ConsumesOnOperation") .Operation; @@ -65,7 +66,7 @@ public async Task When_operation_consumes_is_different_in_several_controllers_th var multipartOperation = document.Operations .First(o => o.Operation.OperationId == "MultipartConsumes_ConsumesOnOperation") .Operation; - + Assert.DoesNotContain(expectedTestContentType, document.Consumes); Assert.DoesNotContain(expectedMultipartContentType, document.Consumes); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Responses/ProducesTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Responses/ProducesTests.cs index 2e937d9e21..2bfaf0689c 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Responses/ProducesTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Responses/ProducesTests.cs @@ -1,5 +1,7 @@ using System.Linq; using System.Threading.Tasks; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Responses; using Xunit; @@ -11,7 +13,7 @@ public class ProducesTests : AspNetCoreTestsBase public async Task When_produces_is_defined_on_all_operations_then_it_is_added_to_the_document() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(TextProducesController)); @@ -29,7 +31,7 @@ public async Task When_produces_is_defined_on_all_operations_then_it_is_added_to public async Task When_operation_produces_is_different_in_several_controllers_then_they_are_added_to_the_operation() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(TextProducesController), typeof(JsonProducesController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Responses/ResponseAttributesTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Responses/ResponseAttributesTests.cs index a8a18f9443..620837bff2 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Responses/ResponseAttributesTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Responses/ResponseAttributesTests.cs @@ -1,5 +1,7 @@ using System.Linq; using System.Threading.Tasks; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers; using Xunit; @@ -11,7 +13,7 @@ public class ResponseAttributesTests : AspNetCoreTestsBase public async Task When_operation_has_SwaggerResponseAttribute_with_description_it_is_in_the_spec() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(ResponsesController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Responses/XmlDocsTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Responses/XmlDocsTests.cs index 26374f8c45..8ec5a302ce 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Responses/XmlDocsTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Responses/XmlDocsTests.cs @@ -1,4 +1,6 @@ using System.Threading.Tasks; +using NJsonSchema; +using NJsonSchema.Generation; using NSwag.Generation.AspNetCore.Tests.Web.Controllers; using Xunit; @@ -10,7 +12,7 @@ public class XmlDocsTests : AspNetCoreTestsBase public async Task When_operation_has_SwaggerResponseAttribute_with_description_it_is_in_the_spec() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(XmlDocsController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/SystemTextJsonTests.cs b/src/NSwag.Generation.AspNetCore.Tests/SystemTextJsonTests.cs index 3352562e03..34b6df5313 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/SystemTextJsonTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/SystemTextJsonTests.cs @@ -30,7 +30,7 @@ public async Task WhenSystemTextOptionsIsUsed_ThenOptionsAreConverted() var settings = generator.Generator.Settings; // Assert - Assert.Contains(((NewtonsoftJsonSchemaGeneratorSettings)settings.SchemaSettings).SerializerSettings.Converters, c => c is StringEnumConverter); + Assert.Contains(((SystemTextJsonSchemaGeneratorSettings)settings.SchemaSettings).SerializerOptions.Converters, c => c is JsonStringEnumConverter); } } } diff --git a/src/NSwag.Generation/Processors/Contexts/OperationProcessorContext.cs b/src/NSwag.Generation/Processors/Contexts/OperationProcessorContext.cs index 1dfdabcaa5..5254d51eae 100644 --- a/src/NSwag.Generation/Processors/Contexts/OperationProcessorContext.cs +++ b/src/NSwag.Generation/Processors/Contexts/OperationProcessorContext.cs @@ -42,7 +42,7 @@ public OperationProcessorContext( MethodInfo = methodInfo; DocumentGenerator = documentGenerator; - SchemaGenerator = documentGenerator.SchemaGenerator; + SchemaGenerator = documentGenerator?.SchemaGenerator; SchemaResolver = schemaResolver; Settings = settings; From 8cfd01d66d6f352dddadee5557675cde2642d48f Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Thu, 18 Nov 2021 22:31:44 +0100 Subject: [PATCH 06/51] Remove legacy web api --- .../Generation/TypesToOpenApiCommand.cs | 4 +- src/NSwag.sln | 46 +------------------ 2 files changed, 4 insertions(+), 46 deletions(-) diff --git a/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs b/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs index 7149785159..5223f830a5 100644 --- a/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs +++ b/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs @@ -42,8 +42,8 @@ public class TypesToSwaggerCommand : IsolatedSwaggerOutputCommandBase Date: Thu, 18 Nov 2021 22:42:01 +0100 Subject: [PATCH 07/51] Update --- src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec | 8 ++++---- src/NSwag.Demo.Web/NSwag.Demo.Web.csproj | 2 +- .../NSwag.Sample.NetGlobalAsax.csproj | 2 +- src/NSwagStudio/NSwagStudio.csproj | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec b/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec index 563fb5af3c..6fb3b855e9 100644 --- a/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec +++ b/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec @@ -23,7 +23,7 @@ - + @@ -87,8 +87,8 @@ - - + diff --git a/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj b/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj index b1e103908e..9c0ef913bb 100644 --- a/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj +++ b/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj @@ -140,7 +140,7 @@ - + diff --git a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj index aed34581b3..ea4c95d9f8 100644 --- a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj +++ b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj @@ -197,7 +197,7 @@ - + diff --git a/src/NSwagStudio/NSwagStudio.csproj b/src/NSwagStudio/NSwagStudio.csproj index a649f92f7d..f102f102eb 100644 --- a/src/NSwagStudio/NSwagStudio.csproj +++ b/src/NSwagStudio/NSwagStudio.csproj @@ -301,7 +301,7 @@ - + From fd83e9b114a769308f5cc6f5846b58b9e9738709 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Thu, 25 Nov 2021 20:03:39 +0100 Subject: [PATCH 08/51] Fixes --- .../Generation/TypesToOpenApiCommand.cs | 53 +++----- .../Controllers/InheritanceController.cs | 2 +- src/NSwag.Demo.Web/NSwag.Demo.Web.csproj | 9 +- .../NSwag.Generation.AspNetCore.Tests.csproj | 2 +- src/NSwag.sln | 120 ++++++++++++++++++ src/NSwagStudio/NSwagStudio.csproj | 8 +- 6 files changed, 153 insertions(+), 41 deletions(-) diff --git a/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs b/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs index a52f46aac0..fa9243e9fd 100644 --- a/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs +++ b/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs @@ -11,10 +11,10 @@ using System.Threading.Tasks; using NConsole; using Newtonsoft.Json; -using NJsonSchema; using NJsonSchema.Generation; using NJsonSchema.Infrastructure; using NSwag.AssemblyLoader.Utilities; +using NSwag.Generation.AspNetCore; namespace NSwag.Commands.Generation { @@ -26,90 +26,75 @@ public class TypesToOpenApiCommand : TypesToSwaggerCommand /// [Command(Name = "types2swagger")] - public class TypesToSwaggerCommand : IsolatedSwaggerOutputCommandBase + public class TypesToSwaggerCommand : IsolatedSwaggerOutputCommandBase { /// Initializes a new instance of the class. public TypesToSwaggerCommand() { - Settings = new JsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 }; ClassNames = new string[] { }; } [JsonIgnore] - protected override JsonSchemaGeneratorSettings Settings { get; } + protected override AspNetCoreOpenApiDocumentGeneratorSettings Settings { get; } [Argument(Name = "ClassNames", Description = "The class names.")] public string[] ClassNames { get; set; } - [Argument(Name = "DefaultPropertyNameHandling", IsRequired = false, Description = "The default property name handling ('Default' or 'CamelCase').")] - public PropertyNameHandling DefaultPropertyNameHandling - { - get { return Settings.DefaultPropertyNameHandling; } - set { Settings.DefaultPropertyNameHandling = value; } - } - [Argument(Name = nameof(DefaultReferenceTypeNullHandling), IsRequired = false, Description = "The default reference type null handling (Null (default) or NotNull).")] public ReferenceTypeNullHandling DefaultReferenceTypeNullHandling { - get => Settings.DefaultReferenceTypeNullHandling; - set => Settings.DefaultReferenceTypeNullHandling = value; + get => Settings.SchemaSettings.DefaultReferenceTypeNullHandling; + set => Settings.SchemaSettings.DefaultReferenceTypeNullHandling = value; } [Argument(Name = nameof(DefaultDictionaryValueReferenceTypeNullHandling), IsRequired = false, Description = "The default reference type null handling of dictionary value types (NotNull (default) or Null).")] public ReferenceTypeNullHandling DefaultDictionaryValueReferenceTypeNullHandling { - get => Settings.DefaultDictionaryValueReferenceTypeNullHandling; - set => Settings.DefaultDictionaryValueReferenceTypeNullHandling = value; - } - - [Argument(Name = "DefaultEnumHandling", IsRequired = false, Description = "The default enum handling ('String' or 'Integer'), default: Integer.")] - public EnumHandling DefaultEnumHandling - { - get { return Settings.DefaultEnumHandling; } - set { Settings.DefaultEnumHandling = value; } + get => Settings.SchemaSettings.DefaultDictionaryValueReferenceTypeNullHandling; + set => Settings.SchemaSettings.DefaultDictionaryValueReferenceTypeNullHandling = value; } [Argument(Name = "FlattenInheritanceHierarchy", IsRequired = false, Description = "Flatten the inheritance hierarchy instead of using allOf to describe inheritance (default: false).")] public bool FlattenInheritanceHierarchy { - get { return Settings.FlattenInheritanceHierarchy; } - set { Settings.FlattenInheritanceHierarchy = value; } + get { return Settings.SchemaSettings.FlattenInheritanceHierarchy; } + set { Settings.SchemaSettings.FlattenInheritanceHierarchy = value; } } [Argument(Name = "IgnoreObsoleteProperties", IsRequired = false, Description = "Ignore properties with the ObsoleteAttribute (default: false).")] public bool IgnoreObsoleteProperties { - get { return Settings.IgnoreObsoleteProperties; } - set { Settings.IgnoreObsoleteProperties = value; } + get { return Settings.SchemaSettings.IgnoreObsoleteProperties; } + set { Settings.SchemaSettings.IgnoreObsoleteProperties = value; } } [Argument(Name = "AllowReferencesWithProperties", IsRequired = false, Description = "Use $ref references even if additional properties are defined on " + "the object (otherwise allOf/oneOf with $ref is used, default: false).")] public bool AllowReferencesWithProperties { - get { return Settings.AllowReferencesWithProperties; } - set { Settings.AllowReferencesWithProperties = value; } + get { return Settings.SchemaSettings.AllowReferencesWithProperties; } + set { Settings.SchemaSettings.AllowReferencesWithProperties = value; } } [Argument(Name = "GenerateKnownTypes", IsRequired = false, Description = "Generate schemas for types in KnownTypeAttribute attributes (default: true).")] public bool GenerateKnownTypes { - get { return Settings.GenerateKnownTypes; } - set { Settings.GenerateKnownTypes = value; } + get { return Settings.SchemaSettings.GenerateKnownTypes; } + set { Settings.SchemaSettings.GenerateKnownTypes = value; } } [Argument(Name = "GenerateXmlObjects", IsRequired = false, Description = "Generate xmlObject representation for definitions (default: false).")] public bool GenerateXmlObjects { - get { return Settings.GenerateXmlObjects; } - set { Settings.GenerateXmlObjects = value; } + get { return Settings.SchemaSettings.GenerateXmlObjects; } + set { Settings.SchemaSettings.GenerateXmlObjects = value; } } protected override Task RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { var document = new OpenApiDocument(); - var generator = new JsonSchemaGenerator(Settings); - var schemaResolver = new OpenApiSchemaResolver(document, Settings); + var generator = new JsonSchemaGenerator(Settings.SchemaSettings); + var schemaResolver = new OpenApiSchemaResolver(document, Settings.SchemaSettings); #if NETFRAMEWORK var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) diff --git a/src/NSwag.Demo.Web/Controllers/InheritanceController.cs b/src/NSwag.Demo.Web/Controllers/InheritanceController.cs index 94840c0c6e..ed372a1f3d 100644 --- a/src/NSwag.Demo.Web/Controllers/InheritanceController.cs +++ b/src/NSwag.Demo.Web/Controllers/InheritanceController.cs @@ -2,7 +2,7 @@ using System.Runtime.Serialization; using System.Web.Http; using Newtonsoft.Json; -using NJsonSchema.Converters; +using NJsonSchema.NewtonsoftJson.Converters; namespace NSwag.Demo.Web.Controllers { diff --git a/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj b/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj index f183484518..2e09803790 100644 --- a/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj +++ b/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj @@ -107,6 +107,14 @@ + + {CBFA4A70-8C4E-4869-A143-47B41CB904D0} + NJsonSchema.NewtonsoftJson + + + {acc4c14a-0515-468b-8768-412eab512ee5} + NJsonSchema + {ca084154-e758-4a44-938d-7806af2dd886} NSwag.Annotations @@ -144,7 +152,6 @@ - diff --git a/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj b/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj index 3fe3c3ae8f..754f7023ff 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj +++ b/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj @@ -1,6 +1,6 @@  - netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 + netcoreapp3.1;net5.0;net6.0 $(NoWarn),618,1591 diff --git a/src/NSwag.sln b/src/NSwag.sln index 03102490c6..3cfe07bd07 100644 --- a/src/NSwag.sln +++ b/src/NSwag.sln @@ -168,6 +168,18 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NET60", "NSwag EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NET60Minimal", "NSwag.Sample.NET60Minimal\NSwag.Sample.NET60Minimal.csproj", "{24693FBC-445E-4360-A1E8-B6F136C563FB}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema", "..\..\NJsonSchema\src\NJsonSchema\NJsonSchema.csproj", "{ACC4C14A-0515-468B-8768-412EAB512EE5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.CodeGeneration", "..\..\NJsonSchema\src\NJsonSchema.CodeGeneration\NJsonSchema.CodeGeneration.csproj", "{70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.CodeGeneration.CSharp", "..\..\NJsonSchema\src\NJsonSchema.CodeGeneration.CSharp\NJsonSchema.CodeGeneration.CSharp.csproj", "{B0521282-5B8F-4E19-9A9E-405203DC729B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.CodeGeneration.TypeScript", "..\..\NJsonSchema\src\NJsonSchema.CodeGeneration.TypeScript\NJsonSchema.CodeGeneration.TypeScript.csproj", "{0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.NewtonsoftJson", "..\..\NJsonSchema\src\NJsonSchema.NewtonsoftJson\NJsonSchema.NewtonsoftJson.csproj", "{CBFA4A70-8C4E-4869-A143-47B41CB904D0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.Yaml", "..\..\NJsonSchema\src\NJsonSchema.Yaml\NJsonSchema.Yaml.csproj", "{69C0986F-9D83-4163-A271-85BAEA6E19D9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1029,6 +1041,114 @@ Global {24693FBC-445E-4360-A1E8-B6F136C563FB}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU {24693FBC-445E-4360-A1E8-B6F136C563FB}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU {24693FBC-445E-4360-A1E8-B6F136C563FB}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Debug|x64.ActiveCfg = Debug|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Debug|x64.Build.0 = Debug|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Debug|x86.ActiveCfg = Debug|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Debug|x86.Build.0 = Debug|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Release|Any CPU.Build.0 = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Release|x64.ActiveCfg = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Release|x64.Build.0 = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Release|x86.ActiveCfg = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.Release|x86.Build.0 = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU + {ACC4C14A-0515-468B-8768-412EAB512EE5}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Debug|x64.ActiveCfg = Debug|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Debug|x64.Build.0 = Debug|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Debug|x86.ActiveCfg = Debug|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Debug|x86.Build.0 = Debug|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Release|Any CPU.Build.0 = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Release|x64.ActiveCfg = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Release|x64.Build.0 = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Release|x86.ActiveCfg = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.Release|x86.Build.0 = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU + {70A4CC7B-11D7-4394-AA42-FB26CF8CEB2D}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Debug|x64.ActiveCfg = Debug|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Debug|x64.Build.0 = Debug|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Debug|x86.ActiveCfg = Debug|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Debug|x86.Build.0 = Debug|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Release|Any CPU.Build.0 = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Release|x64.ActiveCfg = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Release|x64.Build.0 = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Release|x86.ActiveCfg = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.Release|x86.Build.0 = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU + {B0521282-5B8F-4E19-9A9E-405203DC729B}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Debug|x64.ActiveCfg = Debug|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Debug|x64.Build.0 = Debug|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Debug|x86.ActiveCfg = Debug|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Debug|x86.Build.0 = Debug|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Release|Any CPU.Build.0 = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Release|x64.ActiveCfg = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Release|x64.Build.0 = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Release|x86.ActiveCfg = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.Release|x86.Build.0 = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU + {0CA7D26C-6216-4466-BCF4-5B8FDFB5DA6B}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Debug|x64.ActiveCfg = Debug|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Debug|x64.Build.0 = Debug|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Debug|x86.ActiveCfg = Debug|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Debug|x86.Build.0 = Debug|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Release|Any CPU.Build.0 = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Release|x64.ActiveCfg = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Release|x64.Build.0 = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Release|x86.ActiveCfg = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.Release|x86.Build.0 = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU + {CBFA4A70-8C4E-4869-A143-47B41CB904D0}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Debug|x64.ActiveCfg = Debug|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Debug|x64.Build.0 = Debug|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Debug|x86.ActiveCfg = Debug|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Debug|x86.Build.0 = Debug|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Release|Any CPU.Build.0 = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Release|x64.ActiveCfg = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Release|x64.Build.0 = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Release|x86.ActiveCfg = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.Release|x86.Build.0 = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU + {69C0986F-9D83-4163-A271-85BAEA6E19D9}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/NSwagStudio/NSwagStudio.csproj b/src/NSwagStudio/NSwagStudio.csproj index 73e7ae77f3..c66a99a9cd 100644 --- a/src/NSwagStudio/NSwagStudio.csproj +++ b/src/NSwagStudio/NSwagStudio.csproj @@ -44,6 +44,10 @@ + + + + @@ -66,10 +70,6 @@ - - - - From 62b14df44a9e9f2540d24ba913ef27969159e0b0 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Fri, 3 Dec 2021 10:33:35 +0100 Subject: [PATCH 09/51] Fix --- .../Processors/OperationSummaryAndDescriptionProcessorTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NSwag.Generation.Tests/Processors/OperationSummaryAndDescriptionProcessorTests.cs b/src/NSwag.Generation.Tests/Processors/OperationSummaryAndDescriptionProcessorTests.cs index 299b6353d1..d33a69dac4 100644 --- a/src/NSwag.Generation.Tests/Processors/OperationSummaryAndDescriptionProcessorTests.cs +++ b/src/NSwag.Generation.Tests/Processors/OperationSummaryAndDescriptionProcessorTests.cs @@ -89,7 +89,7 @@ private OperationProcessorContext GetContext(Type controllerType, MethodInfo met var document = new OpenApiDocument(); var operationDescription = new OpenApiOperationDescription { Operation = new OpenApiOperation() }; var settings = new OpenApiDocumentGeneratorSettings(); - return new OperationProcessorContext(document, operationDescription, controllerType, methodInfo, null, null, null, settings, null); + return new OperationProcessorContext(document, operationDescription, controllerType, methodInfo, null, null, settings, null); } } } From 7728ffc63d310cba068c317d2c4cc0e2df7ee196 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Fri, 21 Oct 2022 18:26:22 +0200 Subject: [PATCH 10/51] Fixes --- .../Generation/OpenApiGeneratorCommandBase.cs | 8 ++--- .../Generation/TypesToOpenApiCommand.cs | 12 +++---- .../AspNetCoreOperationTagsProcessor.cs | 3 +- .../Processors/OperationParameterProcessor.cs | 2 +- ...tionSummaryAndDescriptionProcessorTests.cs | 7 +++- .../Processors/OperationParameterProcessor.cs | 12 +++---- .../OpenApiDocumentGenerator.cs | 2 +- .../OperationResponseProcessorBase.cs | 7 ++-- ...OperationSummaryAndDescriptionProcessor.cs | 5 +-- .../Processors/OperationTagsProcessor.cs | 3 +- .../XmlDocsSettingsExtensions.cs | 35 ------------------- src/NSwagStudio/NSwagStudio.csproj | 2 +- 12 files changed, 36 insertions(+), 62 deletions(-) delete mode 100644 src/NSwag.Generation/XmlDocsSettingsExtensions.cs diff --git a/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs b/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs index 0f3247e266..d0ffb868be 100644 --- a/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs +++ b/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs @@ -119,15 +119,15 @@ public bool AllowReferencesWithProperties [Argument(Name = "UseXmlDocumentation", IsRequired = false, Description = "Read XML Docs files (default: true).")] public bool UseXmlDocumentation { - get => Settings.UseXmlDocumentation; - set => Settings.UseXmlDocumentation = value; + get => Settings.SchemaSettings.UseXmlDocumentation; + set => Settings.SchemaSettings.UseXmlDocumentation = value; } [Argument(Name = "ResolveExternalXmlDocumentation", IsRequired = false, Description = "Resolve the XML Docs from the NuGet cache or .NET SDK directory (default: true).")] public bool ResolveExternalXmlDocumentation { - get => Settings.ResolveExternalXmlDocumentation; - set => Settings.ResolveExternalXmlDocumentation = value; + get => Settings.SchemaSettings.ResolveExternalXmlDocumentation; + set => Settings.SchemaSettings.ResolveExternalXmlDocumentation = value; } [Argument(Name = "ExcludedTypeNames", IsRequired = false, Description = "The excluded type names (same as JsonSchemaIgnoreAttribute).")] diff --git a/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs b/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs index 7cd6c44b84..a277fbffb2 100644 --- a/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs +++ b/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs @@ -87,8 +87,8 @@ public bool GenerateKnownTypes Description = "Generate a description with number to enum name mappings (for integer enums only, default: false).")] public bool GenerateEnumMappingDescription { - get => Settings.GenerateEnumMappingDescription; - set => Settings.GenerateEnumMappingDescription = value; + get => Settings.SchemaSettings.GenerateEnumMappingDescription; + set => Settings.SchemaSettings.GenerateEnumMappingDescription = value; } [Argument(Name = "GenerateXmlObjects", IsRequired = false, Description = "Generate xmlObject representation for definitions (default: false).")] @@ -101,15 +101,15 @@ public bool GenerateXmlObjects [Argument(Name = "UseXmlDocumentation", IsRequired = false, Description = "Read XML Docs files (default: true).")] public bool UseXmlDocumentation { - get => Settings.UseXmlDocumentation; - set => Settings.UseXmlDocumentation = value; + get => Settings.SchemaSettings.UseXmlDocumentation; + set => Settings.SchemaSettings.UseXmlDocumentation = value; } [Argument(Name = "ResolveExternalXmlDocumentation", IsRequired = false, Description = "Resolve the XML Docs from the NuGet cache or .NET SDK directory (default: true).")] public bool ResolveExternalXmlDocumentation { - get => Settings.ResolveExternalXmlDocumentation; - set => Settings.ResolveExternalXmlDocumentation = value; + get => Settings.SchemaSettings.ResolveExternalXmlDocumentation; + set => Settings.SchemaSettings.ResolveExternalXmlDocumentation = value; } protected override Task RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) diff --git a/src/NSwag.Generation.AspNetCore/Processors/AspNetCoreOperationTagsProcessor.cs b/src/NSwag.Generation.AspNetCore/Processors/AspNetCoreOperationTagsProcessor.cs index d0ab96792a..9fbf3c0b89 100644 --- a/src/NSwag.Generation.AspNetCore/Processors/AspNetCoreOperationTagsProcessor.cs +++ b/src/NSwag.Generation.AspNetCore/Processors/AspNetCoreOperationTagsProcessor.cs @@ -12,6 +12,7 @@ using NSwag.Generation.Processors; using NSwag.Generation.Processors.Contexts; using System.Linq; +using NJsonSchema.Generation; namespace NSwag.Generation.AspNetCore.Processors { @@ -48,7 +49,7 @@ protected override void AddControllerNameTag(OperationProcessorContext context) var aspNetCoreContext = (AspNetCoreOperationProcessorContext)context; if (aspNetCoreContext.ApiDescription.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor) { - var summary = controllerActionDescriptor.ControllerTypeInfo.GetXmlDocsSummary(context.Settings.GetXmlDocsOptions()); + var summary = controllerActionDescriptor.ControllerTypeInfo.GetXmlDocsSummary(context.Settings.SchemaSettings.GetXmlDocsOptions()); aspNetCoreContext.OperationDescription.Operation.Tags.Add(controllerActionDescriptor.ControllerName); UpdateDocumentTagDescription(context, controllerActionDescriptor.ControllerName, summary); } diff --git a/src/NSwag.Generation.AspNetCore/Processors/OperationParameterProcessor.cs b/src/NSwag.Generation.AspNetCore/Processors/OperationParameterProcessor.cs index 44352a2c8d..42ed727207 100644 --- a/src/NSwag.Generation.AspNetCore/Processors/OperationParameterProcessor.cs +++ b/src/NSwag.Generation.AspNetCore/Processors/OperationParameterProcessor.cs @@ -65,7 +65,7 @@ public bool Process(OperationProcessorContext operationProcessorContext) // value that's different than the parameter name. Additionally, ApiExplorer will recurse in to complex model bound types // and expose properties as top level parameters. Consequently, determining the property or parameter of an Api is best // effort attempt. - var extendedApiParameter = new ExtendedApiParameterDescription(_settings) + var extendedApiParameter = new ExtendedApiParameterDescription(_settings.SchemaSettings) { ApiParameter = apiParameter, Attributes = Enumerable.Empty(), diff --git a/src/NSwag.Generation.Tests/Processors/OperationSummaryAndDescriptionProcessorTests.cs b/src/NSwag.Generation.Tests/Processors/OperationSummaryAndDescriptionProcessorTests.cs index 1b54ed8e45..4067f22848 100644 --- a/src/NSwag.Generation.Tests/Processors/OperationSummaryAndDescriptionProcessorTests.cs +++ b/src/NSwag.Generation.Tests/Processors/OperationSummaryAndDescriptionProcessorTests.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel; using System.Reflection; +using NJsonSchema.Generation; using NSwag.Annotations; using NSwag.Generation.Processors; using NSwag.Generation.Processors.Contexts; @@ -100,7 +101,11 @@ private OperationProcessorContext GetContext(Type controllerType, MethodInfo met { var document = new OpenApiDocument(); var operationDescription = new OpenApiOperationDescription { Operation = new OpenApiOperation() }; - var settings = new OpenApiDocumentGeneratorSettings(); + var settings = new OpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings() + }; + return new OperationProcessorContext(document, operationDescription, controllerType, methodInfo, null, null, settings, null); } } diff --git a/src/NSwag.Generation.WebApi/Processors/OperationParameterProcessor.cs b/src/NSwag.Generation.WebApi/Processors/OperationParameterProcessor.cs index ff69b09ca9..03a0c5e642 100644 --- a/src/NSwag.Generation.WebApi/Processors/OperationParameterProcessor.cs +++ b/src/NSwag.Generation.WebApi/Processors/OperationParameterProcessor.cs @@ -320,7 +320,7 @@ private OpenApiParameter TryAddFileParameter( private OpenApiParameter AddFileParameter(OperationProcessorContext context, ContextualParameterInfo contextualParameter, bool isFileArray) { // TODO: Check if there is a way to control the property name - var parameterDocumentation = contextualParameter.GetDescription(_settings); + var parameterDocumentation = contextualParameter.GetDescription(_settings.SchemaSettings); var operationParameter = context.DocumentGenerator.CreatePrimitiveParameter( contextualParameter.Name, parameterDocumentation, contextualParameter); @@ -373,7 +373,7 @@ private OpenApiParameter AddBodyParameter(OperationProcessorContext context, str }, IsNullableRaw = isNullable, IsRequired = isRequired, - Description = contextualParameter.GetDescription(_settings) + Description = contextualParameter.GetDescription(_settings.SchemaSettings) }; operation.Parameters.Add(operationParameter); } @@ -392,7 +392,7 @@ private OpenApiParameter AddBodyParameter(OperationProcessorContext context, str }, IsNullableRaw = isNullable, IsRequired = isRequired, - Description = contextualParameter.GetDescription(_settings) + Description = contextualParameter.GetDescription(_settings.SchemaSettings) }; operation.Parameters.Add(operationParameter); } @@ -404,7 +404,7 @@ private OpenApiParameter AddBodyParameter(OperationProcessorContext context, str Kind = OpenApiParameterKind.Body, IsRequired = isRequired, IsNullableRaw = isNullable, - Description = contextualParameter.GetDescription(_settings), + Description = contextualParameter.GetDescription(_settings.SchemaSettings), Schema = context.SchemaGenerator.GenerateWithReferenceAndNullability( contextualParameter, isNullable, schemaResolver: context.SchemaResolver) }; @@ -421,7 +421,7 @@ private OpenApiParameter AddPrimitiveParametersFromUri( if (typeDescription.Type.HasFlag(JsonObjectType.Array)) { - var parameterDocumentation = contextualParameter.GetDescription(_settings); + var parameterDocumentation = contextualParameter.GetDescription(_settings.SchemaSettings); var operationParameter = context.DocumentGenerator.CreatePrimitiveParameter( name, parameterDocumentation, contextualParameter); @@ -453,7 +453,7 @@ private OpenApiParameter AddPrimitiveParametersFromUri( propertyName = fromHeaderAttribute?.Name; } - var propertySummary = contextualProperty.PropertyInfo.GetXmlDocsSummary(_settings.GetXmlDocsOptions()); + var propertySummary = contextualProperty.PropertyInfo.GetXmlDocsSummary(_settings.SchemaSettings.GetXmlDocsOptions()); var operationParameter = context.DocumentGenerator.CreatePrimitiveParameter(propertyName, propertySummary, contextualProperty.AccessorType); // TODO: Check if required can be controlled with mechanisms other than RequiredAttribute diff --git a/src/NSwag.Generation/OpenApiDocumentGenerator.cs b/src/NSwag.Generation/OpenApiDocumentGenerator.cs index 258b40c9ed..f56bd1007a 100644 --- a/src/NSwag.Generation/OpenApiDocumentGenerator.cs +++ b/src/NSwag.Generation/OpenApiDocumentGenerator.cs @@ -78,7 +78,7 @@ public OpenApiParameter CreateUntypedPathParameter(string parameterName, string /// The parameter. public OpenApiParameter CreatePrimitiveParameter(string name, ContextualParameterInfo contextualParameter) { - var documentation = contextualParameter.GetDescription(_settings); + var documentation = contextualParameter.GetDescription(_settings.SchemaSettings); return CreatePrimitiveParameter(name, documentation, contextualParameter); } diff --git a/src/NSwag.Generation/Processors/OperationResponseProcessorBase.cs b/src/NSwag.Generation/Processors/OperationResponseProcessorBase.cs index 6d7c09b8ce..b0e989e280 100644 --- a/src/NSwag.Generation/Processors/OperationResponseProcessorBase.cs +++ b/src/NSwag.Generation/Processors/OperationResponseProcessorBase.cs @@ -14,6 +14,7 @@ using System.Xml.Linq; using Namotion.Reflection; using NJsonSchema; +using NJsonSchema.Generation; using NJsonSchema.Infrastructure; using NSwag.Generation.Processors.Contexts; @@ -45,7 +46,7 @@ public void ProcessResponseTypeAttributes(OperationProcessorContext operationPro var successResponseDescription = returnParameter .ToContextualParameter() - .GetDescription(_settings) ?? string.Empty; + .GetDescription(_settings.SchemaSettings) ?? string.Empty; var responseDescriptions = GetOperationResponseDescriptions(responseTypeAttributes, successResponseDescription); ProcessOperationDescriptions(responseDescriptions, returnParameter, operationProcessorContext, successResponseDescription); @@ -63,7 +64,7 @@ protected void UpdateResponseDescription(OperationProcessorContext operationProc var returnParameter = operationProcessorContext.MethodInfo.ReturnParameter.ToContextualParameter(); - var returnParameterXmlDocs = returnParameter.GetDescription(_settings) ?? string.Empty; + var returnParameterXmlDocs = returnParameter.GetDescription(_settings.SchemaSettings) ?? string.Empty; var operationXmlDocsNodes = GetResponseXmlDocsNodes(operationProcessorContext.MethodInfo); if (!string.IsNullOrEmpty(returnParameterXmlDocs) || operationXmlDocsNodes?.Any() == true) @@ -99,7 +100,7 @@ protected XElement GetResponseXmlDocsElement(MethodInfo methodInfo, string respo private IEnumerable GetResponseXmlDocsNodes(MethodInfo methodInfo) { - var operationXmlDocs = methodInfo?.GetXmlDocsElement(_settings.GetXmlDocsOptions()); + var operationXmlDocs = methodInfo?.GetXmlDocsElement(_settings.SchemaSettings.GetXmlDocsOptions()); return operationXmlDocs?.Nodes()?.OfType(); } diff --git a/src/NSwag.Generation/Processors/OperationSummaryAndDescriptionProcessor.cs b/src/NSwag.Generation/Processors/OperationSummaryAndDescriptionProcessor.cs index 997c6c30da..7b69b38ca5 100644 --- a/src/NSwag.Generation/Processors/OperationSummaryAndDescriptionProcessor.cs +++ b/src/NSwag.Generation/Processors/OperationSummaryAndDescriptionProcessor.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Reflection; using Namotion.Reflection; +using NJsonSchema.Generation; using NSwag.Generation.Processors.Contexts; namespace NSwag.Generation.Processors @@ -48,7 +49,7 @@ private void ProcessSummary(OperationProcessorContext context, Attribute[] attri if (string.IsNullOrEmpty(summary)) { - summary = context.MethodInfo?.GetXmlDocsSummary(context.Settings.GetXmlDocsOptions()); + summary = context.MethodInfo?.GetXmlDocsSummary(context.Settings.SchemaSettings.GetXmlDocsOptions()); } if (!string.IsNullOrEmpty(summary)) @@ -66,7 +67,7 @@ private void ProcessDescription(OperationProcessorContext context, Attribute[] a if (string.IsNullOrEmpty(description)) { - description = context.MethodInfo?.GetXmlDocsRemarks(context.Settings.GetXmlDocsOptions()); + description = context.MethodInfo?.GetXmlDocsRemarks(context.Settings.SchemaSettings.GetXmlDocsOptions()); } if (!string.IsNullOrEmpty(description)) diff --git a/src/NSwag.Generation/Processors/OperationTagsProcessor.cs b/src/NSwag.Generation/Processors/OperationTagsProcessor.cs index 0a5b8eb4e5..b652f8a3ad 100644 --- a/src/NSwag.Generation/Processors/OperationTagsProcessor.cs +++ b/src/NSwag.Generation/Processors/OperationTagsProcessor.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Reflection; using Namotion.Reflection; +using NJsonSchema.Generation; using NSwag.Generation.Collections; using NSwag.Generation.Processors.Contexts; @@ -58,7 +59,7 @@ protected virtual void AddControllerNameTag(OperationProcessorContext context) controllerName = controllerName.Substring(0, controllerName.Length - 10); } - var summary = context.ControllerType.GetXmlDocsSummary(context.Settings.GetXmlDocsOptions()); + var summary = context.ControllerType.GetXmlDocsSummary(context.Settings.SchemaSettings.GetXmlDocsOptions()); context.OperationDescription.Operation.Tags.Add(controllerName); UpdateDocumentTagDescription(context, controllerName, summary); } diff --git a/src/NSwag.Generation/XmlDocsSettingsExtensions.cs b/src/NSwag.Generation/XmlDocsSettingsExtensions.cs deleted file mode 100644 index e018e6d8ee..0000000000 --- a/src/NSwag.Generation/XmlDocsSettingsExtensions.cs +++ /dev/null @@ -1,35 +0,0 @@ -//----------------------------------------------------------------------- -// -// Copyright (c) Rico Suter. All rights reserved. -// -// https://github.com/RicoSuter/NJsonSchema/blob/master/LICENSE.md -// Rico Suter, mail@rsuter.com -//----------------------------------------------------------------------- - -using Namotion.Reflection; -using NJsonSchema.Generation; - -namespace NSwag.Generation -{ - /// - /// XML Documentation settings extensions. - /// - public static class XmlDocsSettingsExtensions - { - // TODO: Remove this class and use NJS exentions instead. - - /// - /// Converts a settings to options. - /// - /// The settings. - /// The options. - public static XmlDocsOptions GetXmlDocsOptions(this IXmlDocsSettings settings) - { - return new XmlDocsOptions - { - ResolveExternalXmlDocs = settings.ResolveExternalXmlDocumentation, - FormattingMode = settings.XmlDocumentationFormatting - }; - } - } -} \ No newline at end of file diff --git a/src/NSwagStudio/NSwagStudio.csproj b/src/NSwagStudio/NSwagStudio.csproj index 84e3e6acfd..7664f7deb1 100644 --- a/src/NSwagStudio/NSwagStudio.csproj +++ b/src/NSwagStudio/NSwagStudio.csproj @@ -66,7 +66,7 @@ - + From 76036d6d1c3ea27f2e840572e60777eb80b7eca9 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Sun, 11 Dec 2022 21:05:48 +0100 Subject: [PATCH 11/51] Fix --- src/NSwag.Sample.NET70/Startup.cs | 2 +- src/NSwag.sln | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/NSwag.Sample.NET70/Startup.cs b/src/NSwag.Sample.NET70/Startup.cs index 09c1d2c48e..ad6d8e70ff 100644 --- a/src/NSwag.Sample.NET70/Startup.cs +++ b/src/NSwag.Sample.NET70/Startup.cs @@ -32,7 +32,7 @@ public void ConfigureServices(IServiceCollection services) services.AddOpenApiDocument(document => { document.Description = "Hello world!"; - document.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; + document.SchemaSettings.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; }); } diff --git a/src/NSwag.sln b/src/NSwag.sln index 3cfe07bd07..7bc31acbbd 100644 --- a/src/NSwag.sln +++ b/src/NSwag.sln @@ -180,6 +180,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.NewtonsoftJson" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.Yaml", "..\..\NJsonSchema\src\NJsonSchema.Yaml\NJsonSchema.Yaml.csproj", "{69C0986F-9D83-4163-A271-85BAEA6E19D9}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NET70", "NSwag.Sample.NET70\NSwag.Sample.NET70.csproj", "{15221E25-4D06-42DB-B3F1-CC9EE721FBAA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1149,6 +1151,24 @@ Global {69C0986F-9D83-4163-A271-85BAEA6E19D9}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU {69C0986F-9D83-4163-A271-85BAEA6E19D9}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU {69C0986F-9D83-4163-A271-85BAEA6E19D9}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Debug|x64.ActiveCfg = Debug|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Debug|x64.Build.0 = Debug|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Debug|x86.ActiveCfg = Debug|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Debug|x86.Build.0 = Debug|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Release|Any CPU.Build.0 = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Release|x64.ActiveCfg = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Release|x64.Build.0 = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Release|x86.ActiveCfg = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.Release|x86.Build.0 = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1207,6 +1227,7 @@ Global {AC3D8125-AE21-49FC-A217-D96C7B585FF9} = {6F5E4FDF-0A82-42D5-94AC-A9CD43CC931D} {DE82965A-6935-43E0-A9A1-F3F35B4487EB} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} {24693FBC-445E-4360-A1E8-B6F136C563FB} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} + {15221E25-4D06-42DB-B3F1-CC9EE721FBAA} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {98FCEEE2-A45C-41E7-B2ED-1B14755E9067} From 93620c035772aa01786dd0c94d621ea6837f59e2 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Sun, 11 Dec 2022 21:24:00 +0100 Subject: [PATCH 12/51] Remove .net 2.0 sample --- .../Parameters/BodyParametersTests.cs | 12 +- .../NSwag.Sample.NETCore20.Part.csproj | 8 - .../SampleController.cs | 14 - .../NSwag.Sample.NETCore20.csproj | 21 - .../Output/swagger_new_v2.json | 601 -------------- .../Output/swagger_new_v3.json | 728 ----------------- .../Output/swagger_old_v2.json | 501 ------------ .../Output/swagger_old_v3.json | 619 -------------- src/NSwag.Sample.NETCore20/Program.cs | 18 - .../Properties/launchSettings.json | 29 - src/NSwag.Sample.NETCore20/Startup.cs | 123 --- .../Update-SwaggerSpecs.ps1 | 18 - .../appsettings.Development.json | 10 - src/NSwag.Sample.NETCore20/appsettings.json | 15 - src/NSwag.Sample.NETCore20/nswag.json | 59 -- src/NSwag.Sample.NETCore20/swagger.json | 758 ------------------ src/NSwag.sln | 42 - 17 files changed, 6 insertions(+), 3570 deletions(-) delete mode 100644 src/NSwag.Sample.NETCore20.Part/NSwag.Sample.NETCore20.Part.csproj delete mode 100644 src/NSwag.Sample.NETCore20.Part/SampleController.cs delete mode 100644 src/NSwag.Sample.NETCore20/NSwag.Sample.NETCore20.csproj delete mode 100644 src/NSwag.Sample.NETCore20/Output/swagger_new_v2.json delete mode 100644 src/NSwag.Sample.NETCore20/Output/swagger_new_v3.json delete mode 100644 src/NSwag.Sample.NETCore20/Output/swagger_old_v2.json delete mode 100644 src/NSwag.Sample.NETCore20/Output/swagger_old_v3.json delete mode 100644 src/NSwag.Sample.NETCore20/Program.cs delete mode 100644 src/NSwag.Sample.NETCore20/Properties/launchSettings.json delete mode 100644 src/NSwag.Sample.NETCore20/Startup.cs delete mode 100644 src/NSwag.Sample.NETCore20/Update-SwaggerSpecs.ps1 delete mode 100644 src/NSwag.Sample.NETCore20/appsettings.Development.json delete mode 100644 src/NSwag.Sample.NETCore20/appsettings.json delete mode 100644 src/NSwag.Sample.NETCore20/nswag.json delete mode 100644 src/NSwag.Sample.NETCore20/swagger.json diff --git a/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs index b5e7ed9137..f7361c6d74 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs @@ -25,7 +25,7 @@ public async Task When_primitive_body_parameter_has_no_default_value_then_it_is_ } [Fact( -#if !NET7_0_OR_GREATER +#if !NET6_0_OR_GREATER Skip = "Failing before .Net 6" #endif )] @@ -42,7 +42,7 @@ public async Task When_primitive_body_parameter_has_default_value_then_it_is_opt Assert.False(operation.ActualParameters.First().IsRequired); } - + [Fact( #if NET7_0_OR_GREATER Skip = "Wrong in .Net 7" @@ -51,7 +51,7 @@ public async Task When_primitive_body_parameter_has_default_value_then_it_is_opt public async Task When_primitive_body_parameter_has_default_value_then_it_is_required_before_net7() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController)); @@ -78,7 +78,7 @@ public async Task When_complex_body_parameter_has_no_default_value_then_it_is_re } [Fact( -#if !NET7_0_OR_GREATER +#if !NET6_0_OR_GREATER Skip = "Failing before .Net 6" #endif )] @@ -95,7 +95,7 @@ public async Task When_complex_body_parameter_has_default_value_then_it_is_optio Assert.False(operation.ActualParameters.First().IsRequired); } - + [Fact( #if NET7_0_OR_GREATER Skip = "Wrong in .Net 7" @@ -104,7 +104,7 @@ public async Task When_complex_body_parameter_has_default_value_then_it_is_optio public async Task When_complex_body_parameter_has_default_value_then_it_is_required_before_net7() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; // Act var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController)); diff --git a/src/NSwag.Sample.NETCore20.Part/NSwag.Sample.NETCore20.Part.csproj b/src/NSwag.Sample.NETCore20.Part/NSwag.Sample.NETCore20.Part.csproj deleted file mode 100644 index 2a377ca6d6..0000000000 --- a/src/NSwag.Sample.NETCore20.Part/NSwag.Sample.NETCore20.Part.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - netcoreapp2.0 - - - - - diff --git a/src/NSwag.Sample.NETCore20.Part/SampleController.cs b/src/NSwag.Sample.NETCore20.Part/SampleController.cs deleted file mode 100644 index e399930843..0000000000 --- a/src/NSwag.Sample.NETCore20.Part/SampleController.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace NSwag.Sample.NETCore20.Part -{ - [Route("/sample")] - public class SampleController : Controller - { - [HttpPost] - public string GetSample() - { - return null; - } - } -} diff --git a/src/NSwag.Sample.NETCore20/NSwag.Sample.NETCore20.csproj b/src/NSwag.Sample.NETCore20/NSwag.Sample.NETCore20.csproj deleted file mode 100644 index d648e88b31..0000000000 --- a/src/NSwag.Sample.NETCore20/NSwag.Sample.NETCore20.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - netcoreapp2.0 - false - - - - %(RecursiveDir)\%(FileName)%(Extension) - - - - - - - - - - - - - diff --git a/src/NSwag.Sample.NETCore20/Output/swagger_new_v2.json b/src/NSwag.Sample.NETCore20/Output/swagger_new_v2.json deleted file mode 100644 index b6f2aaa55e..0000000000 --- a/src/NSwag.Sample.NETCore20/Output/swagger_new_v2.json +++ /dev/null @@ -1,601 +0,0 @@ -{ - "x-generator": "NSwag v11.18.3.0 (NJsonSchema v9.10.67.0 (Newtonsoft.Json v10.0.0.0))", - "swagger": "2.0", - "info": { - "title": "My Title", - "version": "1.0.0" - }, - "host": "localhost:65384", - "schemes": [ - "http" - ], - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "text/plain", - "text/json" - ], - "paths": { - "/pet": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_AddPet", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "pet", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - }, - "x-nullable": true - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - } - }, - "put": { - "tags": [ - "Pet" - ], - "operationId": "Pet_EditPet", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "pet", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - }, - "x-nullable": true - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - } - } - }, - "/pet/findByStatus": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByStatus", - "parameters": [ - { - "type": "array", - "name": "status", - "in": "query", - "required": true, - "collectionFormat": "multi", - "x-nullable": true, - "items": { - "type": "string" - } - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - } - } - }, - "/pet/findByCategory": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByCategory", - "parameters": [ - { - "type": "string", - "name": "category", - "in": "query", - "required": true, - "x-nullable": true - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - } - } - }, - "/pet/{petId}": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindById", - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - } - }, - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_EditPetWithFormData", - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "integer", - "name": "Id", - "in": "formData", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "integer", - "name": "Age", - "in": "formData", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "integer", - "name": "Category.Id", - "in": "formData", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "string", - "name": "Category.Name", - "in": "formData", - "required": true, - "x-nullable": true - }, - { - "type": "boolean", - "name": "HasVaccinations", - "in": "formData", - "required": true, - "x-nullable": false - }, - { - "type": "string", - "name": "Name", - "in": "formData", - "required": true, - "x-nullable": true - }, - { - "type": "array", - "name": "Images", - "in": "formData", - "required": true, - "collectionFormat": "multi", - "x-nullable": true, - "items": { - "$ref": "#/definitions/Image" - } - }, - { - "type": "array", - "name": "Tags", - "in": "formData", - "required": true, - "collectionFormat": "multi", - "x-nullable": true, - "items": { - "$ref": "#/definitions/Tag" - } - }, - { - "type": "string", - "name": "Status", - "in": "formData", - "required": true, - "x-nullable": true - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - } - }, - "delete": { - "tags": [ - "Pet" - ], - "operationId": "Pet_DeletePet", - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - } - } - }, - "/pet/{petId}/uploadImage": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_UploadImage", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "file", - "name": "file", - "in": "formData", - "required": true, - "x-nullable": true - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/ApiResponse" - } - }, - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - } - } - }, - "/pet/RequiredAndOptional": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_RequiredAndOptional", - "parameters": [ - { - "type": "integer", - "name": "int_RequiredAndNotNullable", - "in": "query", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "integer", - "name": "int_RequiredAndNullable", - "in": "query", - "required": true, - "format": "int32", - "x-nullable": true - }, - { - "type": "string", - "name": "string_RequiredAndNullable", - "in": "query", - "required": true, - "x-nullable": true - }, - { - "type": "string", - "name": "string_RequiredAndNotNullable", - "in": "query", - "required": true, - "x-nullable": false - }, - { - "type": "number", - "name": "decimalWithDefault_NotRequiredAndNotNullable", - "in": "query", - "format": "decimal", - "default": 1.0, - "x-nullable": false - }, - { - "type": "number", - "name": "decimalWithDefault_NotRequiredAndNullable", - "in": "query", - "format": "decimal", - "default": 1.0, - "x-nullable": true - }, - { - "type": "string", - "name": "stringWithDefault_NotRequiredAndNullable", - "in": "query", - "default": "foo", - "x-nullable": true - }, - { - "type": "string", - "name": "stringWithDefault_NotRequiredAndNotNullable", - "in": "query", - "default": "foo", - "x-nullable": false - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/sample": { - "post": { - "tags": [ - "Sample" - ], - "operationId": "Sample_GetSample", - "responses": { - "200": { - "x-nullable": true, - "description": "", - "schema": { - "type": "string" - } - } - } - } - } - }, - "definitions": { - "Pet": { - "type": "object", - "additionalProperties": false, - "required": [ - "id", - "age", - "hasVaccinations", - "name", - "status" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "age": { - "type": "integer", - "format": "int32", - "maximum": 150.0, - "minimum": 0.0 - }, - "category": { - "$ref": "#/definitions/Category" - }, - "hasVaccinations": { - "type": "boolean" - }, - "name": { - "type": "string", - "maxLength": 50, - "minLength": 2 - }, - "images": { - "type": "array", - "items": { - "$ref": "#/definitions/Image" - } - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - }, - "status": { - "type": "string", - "minLength": 1 - } - } - }, - "Category": { - "type": "object", - "additionalProperties": false, - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "Image": { - "type": "object", - "additionalProperties": false, - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "url": { - "type": "string" - } - } - }, - "Tag": { - "type": "object", - "additionalProperties": false, - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "SerializableError": { - "type": "object", - "additionalProperties": false, - "allOf": [ - { - "type": "object", - "additionalProperties": {} - } - ] - }, - "ApiResponse": { - "type": "object", - "additionalProperties": false, - "required": [ - "code" - ], - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "type": { - "type": "string" - } - } - } - }, - "securityDefinitions": { - "TEST_HEADER": { - "type": "apiKey", - "description": "TEST_HEADER", - "name": "TEST_HEADER", - "in": "header" - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NETCore20/Output/swagger_new_v3.json b/src/NSwag.Sample.NETCore20/Output/swagger_new_v3.json deleted file mode 100644 index 844554e4b2..0000000000 --- a/src/NSwag.Sample.NETCore20/Output/swagger_new_v3.json +++ /dev/null @@ -1,728 +0,0 @@ -{ - "x-generator": "NSwag v11.18.3.0 (NJsonSchema v9.10.67.0 (Newtonsoft.Json v10.0.0.0))", - "openapi": "3.0", - "info": { - "title": "My Title", - "version": "1.0.0" - }, - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "text/plain", - "text/json" - ], - "servers": [ - { - "url": "http://localhost:65384" - } - ], - "paths": { - "/pet": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_AddPet", - "requestBody": { - "x-name": "pet", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "required": true - }, - "responses": { - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - } - } - }, - "put": { - "tags": [ - "Pet" - ], - "operationId": "Pet_EditPet", - "requestBody": { - "x-name": "pet", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "required": true - }, - "responses": { - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - } - } - } - }, - "/pet/findByStatus": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByStatus", - "parameters": [ - { - "name": "status", - "in": "query", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "collectionFormat": "multi", - "nullable": true - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - } - } - } - }, - "/pet/findByCategory": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByCategory", - "parameters": [ - { - "name": "category", - "in": "query", - "required": true, - "schema": { - "type": "string" - }, - "nullable": true - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - } - } - } - }, - "/pet/{petId}": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindById", - "parameters": [ - { - "name": "petId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/Pet" - } - ] - } - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - }, - "404": { - "description": "" - } - } - }, - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_EditPetWithFormData", - "parameters": [ - { - "name": "petId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - }, - { - "name": "Id", - "in": "formData", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - }, - { - "name": "Age", - "in": "formData", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - }, - { - "name": "Category.Id", - "in": "formData", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - }, - { - "name": "Category.Name", - "in": "formData", - "required": true, - "schema": { - "type": "string" - }, - "nullable": true - }, - { - "name": "HasVaccinations", - "in": "formData", - "required": true, - "schema": { - "type": "boolean" - }, - "nullable": false - }, - { - "name": "Name", - "in": "formData", - "required": true, - "schema": { - "type": "string" - }, - "nullable": true - }, - { - "name": "Images", - "in": "formData", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Image" - } - }, - "collectionFormat": "multi", - "nullable": true - }, - { - "name": "Tags", - "in": "formData", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Tag" - } - }, - "collectionFormat": "multi", - "nullable": true - }, - { - "name": "Status", - "in": "formData", - "required": true, - "schema": { - "type": "string" - }, - "nullable": true - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - }, - "404": { - "description": "" - } - } - }, - "delete": { - "tags": [ - "Pet" - ], - "operationId": "Pet_DeletePet", - "parameters": [ - { - "name": "petId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - }, - "404": { - "description": "" - } - } - } - }, - "/pet/{petId}/uploadImage": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_UploadImage", - "parameters": [ - { - "name": "petId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - }, - { - "type": "file", - "name": "file", - "in": "formData", - "required": true, - "schema": { - "type": "file" - }, - "nullable": true - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/ApiResponse" - } - ] - } - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - }, - "404": { - "description": "" - } - } - } - }, - "/pet/RequiredAndOptional": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_RequiredAndOptional", - "parameters": [ - { - "name": "int_RequiredAndNotNullable", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - }, - { - "name": "int_RequiredAndNullable", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": true - }, - { - "name": "string_RequiredAndNullable", - "in": "query", - "required": true, - "schema": { - "type": "string" - }, - "nullable": true - }, - { - "name": "string_RequiredAndNotNullable", - "in": "query", - "required": true, - "schema": { - "type": "string" - }, - "nullable": false - }, - { - "name": "decimalWithDefault_NotRequiredAndNotNullable", - "in": "query", - "schema": { - "type": "number", - "format": "decimal" - }, - "default": 1.0, - "nullable": false - }, - { - "name": "decimalWithDefault_NotRequiredAndNullable", - "in": "query", - "schema": { - "type": "number", - "format": "decimal" - }, - "default": 1.0, - "nullable": true - }, - { - "name": "stringWithDefault_NotRequiredAndNullable", - "in": "query", - "schema": { - "type": "string" - }, - "default": "foo", - "nullable": true - }, - { - "name": "stringWithDefault_NotRequiredAndNotNullable", - "in": "query", - "schema": { - "type": "string" - }, - "default": "foo", - "nullable": false - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/sample": { - "post": { - "tags": [ - "Sample" - ], - "operationId": "Sample_GetSample", - "responses": { - "200": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "type": "string" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "Pet": { - "type": "object", - "additionalProperties": false, - "required": [ - "name", - "status" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "age": { - "type": "integer", - "format": "int32", - "maximum": 150.0, - "minimum": 0.0 - }, - "category": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/Category" - } - ] - }, - "hasVaccinations": { - "type": "boolean" - }, - "name": { - "type": "string", - "maxLength": 50, - "minLength": 2 - }, - "images": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Image" - } - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Tag" - } - }, - "status": { - "type": "string", - "minLength": 1 - } - } - }, - "Category": { - "type": "object", - "additionalProperties": false, - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "Image": { - "type": "object", - "additionalProperties": false, - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "url": { - "type": "string" - } - } - }, - "Tag": { - "type": "object", - "additionalProperties": false, - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "SerializableError": { - "type": "object", - "additionalProperties": false, - "allOf": [ - { - "type": "object", - "additionalProperties": {} - } - ] - }, - "ApiResponse": { - "type": "object", - "additionalProperties": false, - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "type": { - "type": "string" - } - } - } - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NETCore20/Output/swagger_old_v2.json b/src/NSwag.Sample.NETCore20/Output/swagger_old_v2.json deleted file mode 100644 index 0c60237713..0000000000 --- a/src/NSwag.Sample.NETCore20/Output/swagger_old_v2.json +++ /dev/null @@ -1,501 +0,0 @@ -{ - "x-generator": "NSwag v11.18.3.0 (NJsonSchema v9.10.67.0 (Newtonsoft.Json v10.0.0.0))", - "swagger": "2.0", - "info": { - "title": "My Title", - "version": "1.0.0" - }, - "host": "localhost:65384", - "schemes": [ - "http" - ], - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "paths": { - "/pet": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_AddPet", - "parameters": [ - { - "name": "pet", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - }, - "x-nullable": true - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - } - }, - "put": { - "tags": [ - "Pet" - ], - "operationId": "Pet_EditPet", - "parameters": [ - { - "name": "pet", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - }, - "x-nullable": true - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - } - } - }, - "/pet/findByStatus": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByStatus", - "parameters": [ - { - "type": "array", - "name": "status", - "in": "query", - "collectionFormat": "multi", - "x-nullable": true, - "items": { - "type": "string" - } - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - } - } - }, - "/pet/findByCategory": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByCategory", - "parameters": [ - { - "type": "string", - "name": "category", - "in": "query", - "required": true, - "x-nullable": true - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - } - } - }, - "/pet/{petId}": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindById", - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - } - }, - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_EditPetWithFormData", - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "object", - "name": "pet", - "in": "formData", - "x-schema": { - "$ref": "#/definitions/Pet" - }, - "x-nullable": true - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - } - }, - "delete": { - "tags": [ - "Pet" - ], - "operationId": "Pet_DeletePet", - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - } - } - }, - "/pet/{petId}/uploadImage": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_UploadImage", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "file", - "name": "file", - "in": "formData", - "x-nullable": true - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/ApiResponse" - } - }, - "400": { - "x-nullable": true, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - } - } - }, - "/pet/RequiredAndOptional": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_RequiredAndOptional", - "parameters": [ - { - "type": "integer", - "name": "int_RequiredAndNotNullable", - "in": "query", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "integer", - "name": "int_RequiredAndNullable", - "in": "query", - "required": true, - "format": "int32", - "x-nullable": true - }, - { - "type": "string", - "name": "string_RequiredAndNullable", - "in": "query", - "required": true, - "x-nullable": true - }, - { - "type": "string", - "name": "string_RequiredAndNotNullable", - "in": "query", - "required": true, - "x-nullable": false - }, - { - "type": "number", - "name": "decimalWithDefault_NotRequiredAndNotNullable", - "in": "query", - "format": "decimal", - "default": 1.0, - "x-nullable": false - }, - { - "type": "number", - "name": "decimalWithDefault_NotRequiredAndNullable", - "in": "query", - "format": "decimal", - "default": 1.0, - "x-nullable": true - }, - { - "type": "string", - "name": "stringWithDefault_NotRequiredAndNullable", - "in": "query", - "default": "foo", - "x-nullable": true - }, - { - "type": "string", - "name": "stringWithDefault_NotRequiredAndNotNullable", - "in": "query", - "default": "foo", - "x-nullable": false - } - ], - "responses": { - "200": { - "description": "" - } - } - } - } - }, - "definitions": { - "Pet": { - "type": "object", - "additionalProperties": false, - "required": [ - "id", - "age", - "hasVaccinations", - "name", - "status" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "age": { - "type": "integer", - "format": "int32", - "maximum": 150.0, - "minimum": 0.0 - }, - "category": { - "$ref": "#/definitions/Category" - }, - "hasVaccinations": { - "type": "boolean" - }, - "name": { - "type": "string", - "maxLength": 50, - "minLength": 2 - }, - "images": { - "type": "array", - "items": { - "$ref": "#/definitions/Image" - } - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - }, - "status": { - "type": "string", - "minLength": 1 - } - } - }, - "Category": { - "type": "object", - "additionalProperties": false, - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "Image": { - "type": "object", - "additionalProperties": false, - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "url": { - "type": "string" - } - } - }, - "Tag": { - "type": "object", - "additionalProperties": false, - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "SerializableError": { - "type": "object", - "additionalProperties": false, - "allOf": [ - { - "type": "object", - "additionalProperties": {} - } - ] - }, - "ApiResponse": { - "type": "object", - "additionalProperties": false, - "required": [ - "code" - ], - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "type": { - "type": "string" - } - } - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NETCore20/Output/swagger_old_v3.json b/src/NSwag.Sample.NETCore20/Output/swagger_old_v3.json deleted file mode 100644 index 7d3d375314..0000000000 --- a/src/NSwag.Sample.NETCore20/Output/swagger_old_v3.json +++ /dev/null @@ -1,619 +0,0 @@ -{ - "x-generator": "NSwag v11.18.3.0 (NJsonSchema v9.10.67.0 (Newtonsoft.Json v10.0.0.0))", - "openapi": "3.0", - "info": { - "title": "My Title", - "version": "1.0.0" - }, - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "servers": [ - { - "url": "http://localhost:65384" - } - ], - "paths": { - "/pet": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_AddPet", - "requestBody": { - "x-name": "pet", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "required": true - }, - "responses": { - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - } - } - }, - "put": { - "tags": [ - "Pet" - ], - "operationId": "Pet_EditPet", - "requestBody": { - "x-name": "pet", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "required": true - }, - "responses": { - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - } - } - } - }, - "/pet/findByStatus": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByStatus", - "parameters": [ - { - "name": "status", - "in": "query", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "collectionFormat": "multi", - "nullable": true - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - } - } - } - }, - "/pet/findByCategory": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByCategory", - "parameters": [ - { - "name": "category", - "in": "query", - "required": true, - "schema": { - "type": "string" - }, - "nullable": true - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - } - } - } - }, - "/pet/{petId}": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindById", - "parameters": [ - { - "name": "petId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/Pet" - } - ] - } - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - }, - "404": { - "description": "" - } - } - }, - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_EditPetWithFormData", - "parameters": [ - { - "name": "petId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - }, - { - "name": "pet", - "in": "formData", - "schema": { - "$ref": "#/components/schemas/Pet" - }, - "nullable": true - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - }, - "404": { - "description": "" - } - } - }, - "delete": { - "tags": [ - "Pet" - ], - "operationId": "Pet_DeletePet", - "parameters": [ - { - "name": "petId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - } - ], - "responses": { - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - }, - "404": { - "description": "" - } - } - } - }, - "/pet/{petId}/uploadImage": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_UploadImage", - "parameters": [ - { - "name": "petId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - }, - { - "type": "file", - "name": "file", - "in": "formData", - "schema": { - "type": "file" - }, - "nullable": true - } - ], - "responses": { - "200": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/ApiResponse" - } - ] - } - } - } - }, - "400": { - "x-nullable": true, - "description": "", - "content": { - "application/json": { - "schema": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/SerializableError" - } - ] - } - } - } - }, - "404": { - "description": "" - } - } - } - }, - "/pet/RequiredAndOptional": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_RequiredAndOptional", - "parameters": [ - { - "name": "int_RequiredAndNotNullable", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": false - }, - { - "name": "int_RequiredAndNullable", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "nullable": true - }, - { - "name": "string_RequiredAndNullable", - "in": "query", - "required": true, - "schema": { - "type": "string" - }, - "nullable": true - }, - { - "name": "string_RequiredAndNotNullable", - "in": "query", - "required": true, - "schema": { - "type": "string" - }, - "nullable": false - }, - { - "name": "decimalWithDefault_NotRequiredAndNotNullable", - "in": "query", - "schema": { - "type": "number", - "format": "decimal" - }, - "default": 1.0, - "nullable": false - }, - { - "name": "decimalWithDefault_NotRequiredAndNullable", - "in": "query", - "schema": { - "type": "number", - "format": "decimal" - }, - "default": 1.0, - "nullable": true - }, - { - "name": "stringWithDefault_NotRequiredAndNullable", - "in": "query", - "schema": { - "type": "string" - }, - "default": "foo", - "nullable": true - }, - { - "name": "stringWithDefault_NotRequiredAndNotNullable", - "in": "query", - "schema": { - "type": "string" - }, - "default": "foo", - "nullable": false - } - ], - "responses": { - "200": { - "description": "" - } - } - } - } - }, - "components": { - "schemas": { - "Pet": { - "type": "object", - "additionalProperties": false, - "required": [ - "name", - "status" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "age": { - "type": "integer", - "format": "int32", - "maximum": 150.0, - "minimum": 0.0 - }, - "category": { - "nullable": true, - "oneOf": [ - { - "$ref": "#/components/schemas/Category" - } - ] - }, - "hasVaccinations": { - "type": "boolean" - }, - "name": { - "type": "string", - "maxLength": 50, - "minLength": 2 - }, - "images": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Image" - } - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Tag" - } - }, - "status": { - "type": "string", - "minLength": 1 - } - } - }, - "Category": { - "type": "object", - "additionalProperties": false, - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "Image": { - "type": "object", - "additionalProperties": false, - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "url": { - "type": "string" - } - } - }, - "Tag": { - "type": "object", - "additionalProperties": false, - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "SerializableError": { - "type": "object", - "additionalProperties": false, - "allOf": [ - { - "type": "object", - "additionalProperties": {} - } - ] - }, - "ApiResponse": { - "type": "object", - "additionalProperties": false, - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "type": { - "type": "string" - } - } - } - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NETCore20/Program.cs b/src/NSwag.Sample.NETCore20/Program.cs deleted file mode 100644 index 259dc400b9..0000000000 --- a/src/NSwag.Sample.NETCore20/Program.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; - -namespace NSwag.Sample.NETCore20 -{ - public class Program - { - public static void Main(string[] args) - { - BuildWebHost(args).Run(); - } - - public static IWebHost BuildWebHost(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup() - .Build(); - } -} diff --git a/src/NSwag.Sample.NETCore20/Properties/launchSettings.json b/src/NSwag.Sample.NETCore20/Properties/launchSettings.json deleted file mode 100644 index 64a4855280..0000000000 --- a/src/NSwag.Sample.NETCore20/Properties/launchSettings.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:65384/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "swagger", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "NSwag.Sample.NETCore20": { - "commandName": "Project", - "launchBrowser": true, - "launchUrl": "swagger", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:65385/" - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NETCore20/Startup.cs b/src/NSwag.Sample.NETCore20/Startup.cs deleted file mode 100644 index 7999a79832..0000000000 --- a/src/NSwag.Sample.NETCore20/Startup.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System.Reflection; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using NSwag.AspNetCore; -using NSwag.Sample.NETCore20.Part; -using NSwag.Generation.Processors.Security; - -namespace NSwag.Sample.NETCore20 -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - public void ConfigureServices(IServiceCollection services) - { - services.AddMvc(). - AddApplicationPart(typeof(SampleController).GetTypeInfo().Assembly); - - // Add OpenAPI and Swagger DI services and configure documents - - // Adds the NSwag services - services - // Register a Swagger 2.0 document generator - .AddSwaggerDocument(document => - { - document.DocumentName = "swagger"; - // Add operation security scope processor - document.OperationProcessors.Add(new OperationSecurityScopeProcessor("TEST_APIKEY")); - // Add custom document processors, etc. - document.DocumentProcessors.Add(new SecurityDefinitionAppender("TEST_APIKEY", new OpenApiSecurityScheme - { - Type = OpenApiSecuritySchemeType.ApiKey, - Name = "TEST_HEADER", - In = OpenApiSecurityApiKeyLocation.Header, - Description = "TEST_DESCRIPTION" - })); - // Post process the generated document - document.PostProcess = d => d.Info.Title = "Hello world!"; - }) - // Register an OpenAPI 3.0 document generator - .AddOpenApiDocument(document => document.DocumentName = "openapi"); - } - - public void Configure(IApplicationBuilder app, IHostingEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseMvc(); - - //// Add OpenAPI and Swagger middlewares to serve documents and web UIs - - // URLs: - // - http://localhost:65384/swagger/v1/swagger.json - // - http://localhost:65384/swagger - // - http://localhost:65384/redoc - // - http://localhost:65384/openapi - // - http://localhost:65384/openapi_redoc - - // Add Swagger 2.0 document serving middleware - app.UseOpenApi(options => - { - options.DocumentName = "swagger"; - options.Path = "/swagger/v1/swagger.json"; - }); - - // Add web UIs to interact with the document - app.UseSwaggerUi3(options => - { - // Define web UI route - options.Path = "/swagger"; - - // Define OpenAPI/Swagger document route (defined with UseSwaggerWithApiExplorer) - options.DocumentPath = "/swagger/v1/swagger.json"; - }); - app.UseReDoc(options => - { - options.Path = "/redoc"; - options.DocumentPath = "/swagger/v1/swagger.json"; - }); - - //// Add OpenAPI 3.0 document serving middleware - app.UseOpenApi(options => - { - options.DocumentName = "openapi"; - options.Path = "/openapi/v1/openapi.json"; - }); - - // Add web UIs to interact with the document - app.UseSwaggerUi3(options => - { - options.Path = "/openapi"; - options.DocumentPath = "/openapi/v1/openapi.json"; - }); - app.UseReDoc(options => - { - options.Path = "/openapi_redoc"; - options.DocumentPath = "/openapi/v1/openapi.json"; - }); - - // Add Swagger UI with multiple documents - app.UseSwaggerUi3(options => - { - // Add multiple OpenAPI/Swagger documents to the Swagger UI 3 web frontend - options.SwaggerRoutes.Add(new SwaggerUi3Route("Swagger", "/swagger/v1/swagger.json")); - options.SwaggerRoutes.Add(new SwaggerUi3Route("Openapi", "/openapi/v1/openapi.json")); - options.SwaggerRoutes.Add(new SwaggerUi3Route("Petstore", "http://petstore.swagger.io/v2/swagger.json")); - - // Define web UI route - options.Path = "/swagger_all"; - }); - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NETCore20/Update-SwaggerSpecs.ps1 b/src/NSwag.Sample.NETCore20/Update-SwaggerSpecs.ps1 deleted file mode 100644 index 144649d80b..0000000000 --- a/src/NSwag.Sample.NETCore20/Update-SwaggerSpecs.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -Try -{ - New-Item -ItemType directory -Force -Path "$PSScriptRoot/Output" - - Invoke-WebRequest -Uri 'http://localhost:65384/swagger_new_ui/v1/swagger.json' -OutFile "$PSScriptRoot/Output/swagger_new_v2.json" - - Invoke-WebRequest -Uri 'http://localhost:65384/swagger_new_v3/v1/swagger.json' -OutFile "$PSScriptRoot/Output/swagger_new_v3.json" - - Invoke-WebRequest -Uri 'http://localhost:65384/swagger_old_ui/v1/swagger.json' -OutFile "$PSScriptRoot/Output/swagger_old_v2.json" - - Invoke-WebRequest -Uri 'http://localhost:65384/swagger_old_v3/v1/swagger.json' -OutFile "$PSScriptRoot/Output/swagger_old_v3.json" -} -Catch -{ - "Could not download the OpenAPI/Swagger specifications: " - Throw -} - diff --git a/src/NSwag.Sample.NETCore20/appsettings.Development.json b/src/NSwag.Sample.NETCore20/appsettings.Development.json deleted file mode 100644 index fa8ce71a97..0000000000 --- a/src/NSwag.Sample.NETCore20/appsettings.Development.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Logging": { - "IncludeScopes": false, - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" - } - } -} diff --git a/src/NSwag.Sample.NETCore20/appsettings.json b/src/NSwag.Sample.NETCore20/appsettings.json deleted file mode 100644 index 26bb0ac7ac..0000000000 --- a/src/NSwag.Sample.NETCore20/appsettings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "Logging": { - "IncludeScopes": false, - "Debug": { - "LogLevel": { - "Default": "Warning" - } - }, - "Console": { - "LogLevel": { - "Default": "Warning" - } - } - } -} diff --git a/src/NSwag.Sample.NETCore20/nswag.json b/src/NSwag.Sample.NETCore20/nswag.json deleted file mode 100644 index 60ab8fa8b0..0000000000 --- a/src/NSwag.Sample.NETCore20/nswag.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "runtime": "NetCore21", - "defaultVariables": "", - "documentGenerator": { - "aspNetCoreToOpenApi": { - "project": null, - "msBuildProjectExtensionsPath": null, - "configuration": null, - "runtime": null, - "targetFramework": null, - "noBuild": false, - "verbose": true, - "workingDirectory": null, - "requireParametersWithoutDefault": false, - "apiGroupNames": null, - "defaultPropertyNameHandling": "Default", - "defaultReferenceTypeNullHandling": "Null", - "defaultResponseReferenceTypeNullHandling": "NotNull", - "defaultEnumHandling": "Integer", - "flattenInheritanceHierarchy": false, - "generateKnownTypes": true, - "generateEnumMappingDescription": false, - "generateXmlObjects": false, - "generateAbstractProperties": false, - "generateAbstractSchemas": true, - "ignoreObsoleteProperties": false, - "allowReferencesWithProperties": false, - "excludedTypeNames": [], - "serviceHost": null, - "serviceBasePath": null, - "serviceSchemes": [], - "infoTitle": "My Title", - "infoDescription": null, - "infoVersion": "1.0.0", - "documentTemplate": null, - "documentProcessorTypes": [], - "operationProcessorTypes": [], - "typeNameGeneratorType": null, - "schemaNameGeneratorType": null, - "contractResolverType": null, - "serializerSettingsType": null, - "useDocumentProvider": true, - "documentName": "swagger", - "aspNetCoreEnvironment": null, - "createWebHostBuilderMethod": null, - "startupType": null, - "allowNullableBodyParameters": false, - "output": "swagger.json", - "outputType": "Swagger2", - "assemblyPaths": [ - "bin/Debug/netcoreapp2.0/NSwag.Sample.NETCore20.dll" - ], - "assemblyConfig": null, - "referencePaths": [], - "useNuGetCache": false - } - }, - "codeGenerators": {} -} \ No newline at end of file diff --git a/src/NSwag.Sample.NETCore20/swagger.json b/src/NSwag.Sample.NETCore20/swagger.json deleted file mode 100644 index a32d73b7b4..0000000000 --- a/src/NSwag.Sample.NETCore20/swagger.json +++ /dev/null @@ -1,758 +0,0 @@ -{ - "x-generator": "NSwag v13.10.8.0 (NJsonSchema v10.3.11.0 (Newtonsoft.Json v11.0.0.0))", - "swagger": "2.0", - "info": { - "title": "Hello world!", - "version": "1.0.0" - }, - "paths": { - "/pet": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_AddPet", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "pet", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - }, - "x-nullable": false - } - ], - "responses": { - "400": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - }, - "put": { - "tags": [ - "Pet" - ], - "operationId": "Pet_EditPet", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "pet", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - }, - "x-nullable": false - } - ], - "responses": { - "400": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - } - }, - "/pet/findByStatus": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByStatusAll", - "produces": [ - "application/json" - ], - "parameters": [ - { - "type": "array", - "name": "status", - "in": "query", - "collectionFormat": "multi", - "x-nullable": true, - "items": { - "type": "string" - } - } - ], - "responses": { - "200": { - "x-nullable": false, - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - } - }, - "/pet/findByStatus/{skip}/{sortOrder}": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByStatus", - "produces": [ - "application/json" - ], - "parameters": [ - { - "type": "array", - "name": "status", - "in": "query", - "collectionFormat": "multi", - "x-nullable": true, - "items": { - "type": "string" - } - }, - { - "type": "integer", - "name": "skip", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "integer", - "name": "sortOrder", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - } - ], - "responses": { - "200": { - "x-nullable": false, - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - } - }, - "/pet/findByCategory": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindByCategory", - "produces": [ - "application/json" - ], - "parameters": [ - { - "type": "string", - "name": "category", - "in": "query", - "x-nullable": true - } - ], - "responses": { - "200": { - "x-nullable": false, - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - } - }, - "/pet/{petId}": { - "get": { - "tags": [ - "Pet" - ], - "operationId": "Pet_FindById", - "produces": [ - "application/json" - ], - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - } - ], - "responses": { - "200": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "400": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - }, - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_EditPetWithFormData", - "produces": [ - "application/json" - ], - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "integer", - "name": "Id", - "in": "formData", - "format": "int32", - "x-nullable": false - }, - { - "type": "integer", - "name": "Age", - "in": "formData", - "format": "int32", - "maximum": 150.0, - "minimum": 0.0, - "x-nullable": false - }, - { - "type": "integer", - "name": "Category.Id", - "in": "formData", - "format": "int32", - "x-nullable": false - }, - { - "type": "string", - "name": "Category.Name", - "in": "formData", - "x-nullable": true - }, - { - "type": "boolean", - "name": "HasVaccinations", - "in": "formData", - "x-nullable": false - }, - { - "type": "string", - "name": "Name", - "in": "formData", - "maxLength": 50, - "minLength": 2, - "x-nullable": true - }, - { - "type": "array", - "name": "Images", - "in": "formData", - "collectionFormat": "multi", - "x-nullable": true, - "items": { - "$ref": "#/definitions/Image" - } - }, - { - "type": "array", - "name": "Tags", - "in": "formData", - "collectionFormat": "multi", - "x-nullable": true, - "items": { - "$ref": "#/definitions/Tag" - } - }, - { - "type": "string", - "name": "Status", - "in": "formData", - "x-nullable": true - } - ], - "responses": { - "400": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - }, - "delete": { - "tags": [ - "Pet" - ], - "operationId": "Pet_DeletePet", - "produces": [ - "application/json" - ], - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - } - ], - "responses": { - "400": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - } - }, - "/pet/{petId}/uploadImage": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_UploadImage", - "produces": [ - "application/json" - ], - "parameters": [ - { - "type": "integer", - "name": "petId", - "in": "path", - "required": true, - "format": "int32", - "x-nullable": false - }, - { - "type": "string", - "name": "ContentType", - "in": "query", - "x-nullable": true - }, - { - "type": "string", - "name": "ContentDisposition", - "in": "query", - "x-nullable": true - }, - { - "type": "object", - "name": "Headers", - "in": "query", - "x-schema": { - "$ref": "#/definitions/IHeaderDictionary" - }, - "x-nullable": true - }, - { - "type": "integer", - "name": "Length", - "in": "query", - "format": "int64", - "x-nullable": false - }, - { - "type": "string", - "name": "Name", - "in": "query", - "x-nullable": true - }, - { - "type": "string", - "name": "FileName", - "in": "query", - "x-nullable": true - } - ], - "responses": { - "200": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/ApiResponse" - } - }, - "400": { - "x-nullable": false, - "description": "", - "schema": { - "$ref": "#/definitions/SerializableError" - } - }, - "404": { - "description": "" - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - } - }, - "/pet/RequiredAndOptional": { - "post": { - "tags": [ - "Pet" - ], - "operationId": "Pet_RequiredAndOptional", - "parameters": [ - { - "type": "integer", - "name": "int_RequiredAndNotNullable", - "in": "query", - "format": "int32", - "x-nullable": false - }, - { - "type": "integer", - "name": "int_RequiredAndNullable", - "in": "query", - "format": "int32", - "x-nullable": true - }, - { - "type": "string", - "name": "string_RequiredAndNullable", - "in": "query", - "x-nullable": true - }, - { - "type": "string", - "name": "string_RequiredAndNotNullable", - "in": "query", - "x-nullable": false - }, - { - "type": "number", - "name": "decimalWithDefault_NotRequiredAndNotNullable", - "in": "query", - "format": "decimal", - "default": 1.0, - "x-nullable": false - }, - { - "type": "number", - "name": "decimalWithDefault_NotRequiredAndNullable", - "in": "query", - "format": "decimal", - "default": 1.0, - "x-nullable": true - }, - { - "type": "string", - "name": "stringWithDefault_NotRequiredAndNullable", - "in": "query", - "default": "foo", - "x-nullable": true - }, - { - "type": "string", - "name": "stringWithDefault_NotRequiredAndNotNullable", - "in": "query", - "default": "foo", - "x-nullable": false - } - ], - "responses": { - "200": { - "description": "" - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - } - }, - "/sample": { - "post": { - "tags": [ - "Sample" - ], - "operationId": "Sample_GetSample", - "produces": [ - "text/plain", - "application/json", - "text/json" - ], - "responses": { - "200": { - "x-nullable": false, - "description": "", - "schema": { - "type": "string" - } - } - }, - "security": [ - { - "TEST_APIKEY": [] - } - ] - } - } - }, - "definitions": { - "SerializableError": { - "type": "object", - "additionalProperties": {} - }, - "Pet": { - "type": "object", - "required": [ - "id", - "age", - "hasVaccinations", - "name", - "status" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "age": { - "type": "integer", - "format": "int32", - "maximum": 150.0, - "minimum": 0.0 - }, - "category": { - "$ref": "#/definitions/Category" - }, - "hasVaccinations": { - "type": "boolean" - }, - "name": { - "type": "string", - "maxLength": 50, - "minLength": 2 - }, - "images": { - "type": "array", - "items": { - "$ref": "#/definitions/Image" - } - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - }, - "status": { - "type": "string", - "minLength": 1 - } - } - }, - "Category": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "Image": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "url": { - "type": "string" - } - } - }, - "Tag": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "ApiResponse": { - "type": "object", - "required": [ - "code" - ], - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "type": { - "type": "string" - } - } - }, - "IHeaderDictionary": { - "type": "object", - "x-abstract": true, - "required": [ - "Item" - ], - "properties": { - "Item": { - "type": "array", - "items": { - "additionalProperties": {} - } - }, - "ContentLength": { - "type": "integer", - "format": "int64" - } - } - } - }, - "securityDefinitions": { - "TEST_APIKEY": { - "type": "apiKey", - "description": "TEST_DESCRIPTION", - "name": "TEST_HEADER", - "in": "header" - } - } -} \ No newline at end of file diff --git a/src/NSwag.sln b/src/NSwag.sln index 7bc31acbbd..d18ec887b1 100644 --- a/src/NSwag.sln +++ b/src/NSwag.sln @@ -158,10 +158,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "00 Build", "00 Build", "{6F Directory.Build.props = Directory.Build.props EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NETCore20", "NSwag.Sample.NETCore20\NSwag.Sample.NETCore20.csproj", "{37563171-4C09-4BCD-B2FB-08F786198909}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NETCore20.Part", "NSwag.Sample.NETCore20.Part\NSwag.Sample.NETCore20.Part.csproj", "{60438B13-8111-44C3-B5E5-34C3F30FF234}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_build", "..\build\_build.csproj", "{AC3D8125-AE21-49FC-A217-D96C7B585FF9}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NET60", "NSwag.Sample.NET60\NSwag.Sample.NET60.csproj", "{DE82965A-6935-43E0-A9A1-F3F35B4487EB}" @@ -962,42 +958,6 @@ Global {4BCF42CE-A289-4B6D-92DB-ED95F8ED4B19}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU {4BCF42CE-A289-4B6D-92DB-ED95F8ED4B19}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU {4BCF42CE-A289-4B6D-92DB-ED95F8ED4B19}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Debug|Any CPU.Build.0 = Debug|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Debug|x64.ActiveCfg = Debug|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Debug|x64.Build.0 = Debug|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Debug|x86.ActiveCfg = Debug|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Debug|x86.Build.0 = Debug|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Release|Any CPU.ActiveCfg = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Release|Any CPU.Build.0 = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Release|x64.ActiveCfg = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Release|x64.Build.0 = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Release|x86.ActiveCfg = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.Release|x86.Build.0 = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU - {37563171-4C09-4BCD-B2FB-08F786198909}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Debug|Any CPU.Build.0 = Debug|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Debug|x64.ActiveCfg = Debug|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Debug|x64.Build.0 = Debug|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Debug|x86.ActiveCfg = Debug|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Debug|x86.Build.0 = Debug|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Release|Any CPU.ActiveCfg = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Release|Any CPU.Build.0 = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Release|x64.ActiveCfg = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Release|x64.Build.0 = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Release|x86.ActiveCfg = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.Release|x86.Build.0 = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU - {60438B13-8111-44C3-B5E5-34C3F30FF234}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU {AC3D8125-AE21-49FC-A217-D96C7B585FF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AC3D8125-AE21-49FC-A217-D96C7B585FF9}.Debug|x64.ActiveCfg = Debug|Any CPU {AC3D8125-AE21-49FC-A217-D96C7B585FF9}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1222,8 +1182,6 @@ Global {B6467D5A-7B13-4B06-89BE-2BC7B6615956} = {634E4ABD-29EC-4EB2-81EF-7E41D6D6F6E0} {F237A592-2D74-4C38-B222-2C91029B87F8} = {634E4ABD-29EC-4EB2-81EF-7E41D6D6F6E0} {4BCF42CE-A289-4B6D-92DB-ED95F8ED4B19} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} - {37563171-4C09-4BCD-B2FB-08F786198909} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} - {60438B13-8111-44C3-B5E5-34C3F30FF234} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} {AC3D8125-AE21-49FC-A217-D96C7B585FF9} = {6F5E4FDF-0A82-42D5-94AC-A9CD43CC931D} {DE82965A-6935-43E0-A9A1-F3F35B4487EB} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} {24693FBC-445E-4360-A1E8-B6F136C563FB} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} From 0fba21f22443dd1b9325ee0a0c3cf4d90fb5b675 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Sun, 20 Aug 2023 17:27:45 +0200 Subject: [PATCH 13/51] fix tests --- .../AxiosTests.cs | 20 +++++++++++++------ .../OpenApiDocument.Serialization.cs | 2 +- .../Parameters/BodyParametersTests.cs | 12 ++++++++--- .../Parameters/QueryParametersTests.cs | 9 ++++++++- .../Responses/WrappedResponseTests.cs | 9 ++++++++- 5 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/AxiosTests.cs b/src/NSwag.CodeGeneration.TypeScript.Tests/AxiosTests.cs index ee2da49b27..bacc14e9fa 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/AxiosTests.cs +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/AxiosTests.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Mvc; using NJsonSchema.Generation; using NJsonSchema; +using NJsonSchema.NewtonsoftJson.Generation; namespace NSwag.CodeGeneration.TypeScript.Tests { @@ -17,16 +18,16 @@ public class Foo public class DiscussionController : Controller { [HttpPost] - public void AddMessage([FromBody]Foo message) + public void AddMessage([FromBody] Foo message) { } } - public class UrlEncodedRequestConsumingController: Controller + public class UrlEncodedRequestConsumingController : Controller { [HttpPost] [Consumes("application/x-www-form-urlencoded")] - public void AddMessage([FromForm]Foo message, [FromForm]string messageId) + public void AddMessage([FromForm] Foo message, [FromForm] string messageId) { } } @@ -99,7 +100,7 @@ public async Task When_consumes_is_url_encoded_then_construct_url_encoded_reques { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } }); - + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -128,7 +129,7 @@ public async Task Add_cancel_token_to_every_call() { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.Swagger2 } }); - + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); @@ -152,7 +153,14 @@ public async Task Add_cancel_token_to_every_call() public async Task When_abort_signal() { // Arrange - var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); + var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } + }); + var document = await generator.GenerateForControllerAsync(); var json = document.ToJson(); diff --git a/src/NSwag.Core/OpenApiDocument.Serialization.cs b/src/NSwag.Core/OpenApiDocument.Serialization.cs index 9214e061df..58498b2184 100644 --- a/src/NSwag.Core/OpenApiDocument.Serialization.cs +++ b/src/NSwag.Core/OpenApiDocument.Serialization.cs @@ -40,7 +40,7 @@ public static PropertyRenameAndIgnoreSerializerContractResolver GetJsonSerialize return OpenApi3ContractResolver.Value; } - throw new ArgumentException("The given schema type is not supported."); + throw new ArgumentException("The schema type '" + schemaType + "' is not supported."); } private static PropertyRenameAndIgnoreSerializerContractResolver CreateJsonSerializerContractResolver(SchemaType schemaType) diff --git a/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs index f7361c6d74..47f91dd954 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs @@ -25,14 +25,20 @@ public async Task When_primitive_body_parameter_has_no_default_value_then_it_is_ } [Fact( -#if !NET6_0_OR_GREATER +#if !NET7_0_OR_GREATER Skip = "Failing before .Net 6" #endif )] public async Task When_primitive_body_parameter_has_default_value_then_it_is_optional() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 } }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController)); @@ -78,7 +84,7 @@ public async Task When_complex_body_parameter_has_no_default_value_then_it_is_re } [Fact( -#if !NET6_0_OR_GREATER +#if !NET7_0_OR_GREATER Skip = "Failing before .Net 6" #endif )] diff --git a/src/NSwag.Generation.AspNetCore.Tests/Parameters/QueryParametersTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Parameters/QueryParametersTests.cs index b67fc96b00..5593a6a3a8 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Parameters/QueryParametersTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Parameters/QueryParametersTests.cs @@ -106,7 +106,14 @@ public async Task When_parameter_is_overwritten_then_original_name_is_set() public async Task When_parameter_has_bind_never_then_it_is_ignored() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings { RequireParametersWithoutDefault = false }; + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + RequireParametersWithoutDefault = false, + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(BindNeverQueryParameterController)); diff --git a/src/NSwag.Generation.AspNetCore.Tests/Responses/WrappedResponseTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Responses/WrappedResponseTests.cs index d3190b96ef..57c61ec5bc 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Responses/WrappedResponseTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Responses/WrappedResponseTests.cs @@ -8,6 +8,7 @@ using NSwag.Generation.AspNetCore.Tests.Web.Controllers.Responses; using NJsonSchema.NewtonsoftJson.Generation; +using NJsonSchema.Generation; namespace NSwag.Generation.AspNetCore.Tests.Responses { @@ -17,7 +18,13 @@ public class WrappedResponseTests : AspNetCoreTestsBase public async Task When_response_is_wrapped_in_certain_generic_result_types_then_discard_the_wrapper_type() { // Arrange - var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings + { + SchemaSettings = new NewtonsoftJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + } + }; // Act var document = await GenerateDocumentAsync(settings, typeof(WrappedResponseController)); From 16708f186980ff40a9f948b277fd508f15e059f0 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Mon, 21 Aug 2023 00:02:37 +0200 Subject: [PATCH 14/51] Upgrade to net462 --- build/Build.cs | 15 +- src/Directory.Build.props | 2 +- .../NSwag.Annotations.csproj | 2 +- .../NSwag.ApiDescription.Client.nuspec | 2 +- .../NSwag.AspNet.Owin.csproj | 6 +- .../NSwag.AspNet.WebApi.csproj | 4 +- .../NSwag.AspNetCore.Launcher.x86.csproj | 2 +- .../NSwag.AspNetCore.Launcher.csproj | 4 +- src/NSwag.AspNetCore/NSwag.AspNetCore.csproj | 21 +- src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec | 4 +- .../NSwag.AssemblyLoader.Tests.csproj | 6 +- .../AppDomainIsolation.cs | 4 +- .../NSwag.AssemblyLoader.csproj | 6 +- .../NSwag.CodeGeneration.CSharp.Tests.csproj | 3 +- .../NSwag.CodeGeneration.CSharp.csproj | 4 +- .../NSwag.CodeGeneration.Tests.csproj | 2 +- ...wag.CodeGeneration.TypeScript.Tests.csproj | 2 +- .../NSwag.CodeGeneration.TypeScript.csproj | 4 +- .../NSwag.CodeGeneration.csproj | 12 +- .../AspNetCore/AspNetCoreToOpenApiCommand.cs | 4 +- .../Commands/IsolatedCommandBase.cs | 4 +- src/NSwag.Commands/NSwag.Commands.csproj | 31 +-- src/NSwag.Commands/NSwagDocument.cs | 10 +- .../NSwag.Console.x86.csproj | 15 +- src/NSwag.Console/NSwag.Console.csproj | 22 +- .../NSwag.ConsoleCore.csproj | 24 +- src/NSwag.Core.Tests/NSwag.Core.Tests.csproj | 2 +- .../NSwag.Core.Yaml.Tests.csproj | 7 +- src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj | 8 +- src/NSwag.Core/NSwag.Core.csproj | 12 +- src/NSwag.Demo.Web/NSwag.Demo.Web.csproj | 5 +- src/NSwag.Demo.Web/Web.config | 70 +++--- ...wag.Generation.AspNetCore.Tests.Web.csproj | 13 +- .../NSwag.Generation.AspNetCore.Tests.csproj | 11 +- .../NSwag.Generation.AspNetCore.csproj | 6 +- .../NSwag.Generation.Tests.csproj | 2 +- .../NSwag.Generation.WebApi.csproj | 7 +- src/NSwag.Generation/NSwag.Generation.csproj | 7 +- .../OpenApiDocumentGeneratorSettings.cs | 6 +- .../NSwag.Integration.ClientPCL.Tests.csproj | 2 +- .../NSwag.Integration.ClientPCL.csproj | 2 +- .../NSwag.Integration.Console.csproj | 2 +- src/NSwag.MSBuild/NSwag.MSBuild.nuspec | 12 +- src/NSwag.Npm/package-lock.json | 4 +- src/NSwag.Npm/package.json | 2 +- .../Controllers/ValuesController.cs | 66 ------ .../NSwag.Sample.NET50.csproj | 13 -- src/NSwag.Sample.NET50/Program.cs | 20 -- .../Properties/launchSettings.json | 27 --- src/NSwag.Sample.NET50/Startup.cs | 65 ------ .../appsettings.Development.json | 9 - src/NSwag.Sample.NET50/appsettings.json | 9 - src/NSwag.Sample.NET50/nswag.json | 58 ----- src/NSwag.Sample.NET50/openapi.json | 215 ------------------ .../NSwag.Sample.NETCore21.csproj | 2 +- ...NSwag.Sample.NetCoreAngular.Clients.csproj | 2 +- .../NSwag.Sample.NetGlobalAsax.csproj | 8 +- src/NSwag.Sample.NetGlobalAsax/Web.config | 76 ++++--- .../NSwag.VersionMissmatchTest.csproj | 4 +- src/NSwag.sln | 21 -- src/NSwagStudio/NSwagStudio.csproj | 8 +- 61 files changed, 255 insertions(+), 743 deletions(-) delete mode 100644 src/NSwag.Sample.NET50/Controllers/ValuesController.cs delete mode 100644 src/NSwag.Sample.NET50/NSwag.Sample.NET50.csproj delete mode 100644 src/NSwag.Sample.NET50/Program.cs delete mode 100644 src/NSwag.Sample.NET50/Properties/launchSettings.json delete mode 100644 src/NSwag.Sample.NET50/Startup.cs delete mode 100644 src/NSwag.Sample.NET50/appsettings.Development.json delete mode 100644 src/NSwag.Sample.NET50/appsettings.json delete mode 100644 src/NSwag.Sample.NET50/nswag.json delete mode 100644 src/NSwag.Sample.NET50/openapi.json diff --git a/build/Build.cs b/build/Build.cs index ec432dd1bf..10cf4480cf 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -235,7 +235,6 @@ protected override void OnBuildInitialized() { ("NSwag.Sample.NETCore21", "NetCore21"), ("NSwag.Sample.NETCore31", "NetCore31"), - ("NSwag.Sample.NET50", "Net50"), ("NSwag.Sample.NET60", "Net60"), ("NSwag.Sample.NET60Minimal", "Net60"), ("NSwag.Sample.NET70", "Net70"), @@ -336,7 +335,7 @@ void PublishAndCopyConsoleProjects() Serilog.Log.Information("Publish command line projects"); - void PublishConsoleProject(Nuke.Common.ProjectModel.Project project, string[] targetFrameworks) + void PublishConsoleProject(Project project, string[] targetFrameworks) { foreach (var targetFramework in targetFrameworks) { @@ -353,23 +352,21 @@ void PublishConsoleProject(Nuke.Common.ProjectModel.Project project, string[] ta } } - PublishConsoleProject(consoleX86Project, new[] { "net461" }); - PublishConsoleProject(consoleProject, new[] { "net461" }); - PublishConsoleProject(consoleCoreProject, new[] { "netcoreapp2.1", "netcoreapp3.1", "net5.0", "net6.0", "net7.0" }); + PublishConsoleProject(consoleX86Project, new[] { "net462" }); + PublishConsoleProject(consoleProject, new[] { "net462" }); + PublishConsoleProject(consoleCoreProject, new[] { "netcoreapp3.1", "net6.0", "net7.0" }); void CopyConsoleBinaries(AbsolutePath target) { // take just exe from X86 as other files are shared with console project - var consoleX86Directory = consoleX86Project.Directory / "bin" / Configuration / "net461" / "publish"; + var consoleX86Directory = consoleX86Project.Directory / "bin" / Configuration / "net462" / "publish"; CopyFileToDirectory(consoleX86Directory / "NSwag.x86.exe", target / "Win"); CopyFileToDirectory(consoleX86Directory / "NSwag.x86.exe.config", target / "Win"); - CopyDirectoryRecursively(consoleProject.Directory / "bin" / Configuration / "net461" / "publish", target / "Win", DirectoryExistsPolicy.Merge); + CopyDirectoryRecursively(consoleProject.Directory / "bin" / Configuration / "net462" / "publish", target / "Win", DirectoryExistsPolicy.Merge); var consoleCoreDirectory = consoleCoreProject.Directory / "bin" / Configuration; - CopyDirectoryRecursively(consoleCoreDirectory / "netcoreapp2.1" / "publish", target / "NetCore21"); CopyDirectoryRecursively(consoleCoreDirectory / "netcoreapp3.1" / "publish", target / "NetCore31"); - CopyDirectoryRecursively(consoleCoreDirectory / "net5.0" / "publish", target / "Net50"); CopyDirectoryRecursively(consoleCoreDirectory / "net6.0" / "publish", target / "Net60"); CopyDirectoryRecursively(consoleCoreDirectory / "net7.0" / "publish", target / "Net70"); } diff --git a/src/Directory.Build.props b/src/Directory.Build.props index ccf857d2f3..47e547ec47 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,6 +1,6 @@ - 13.20.0 + 14.0.0 Rico Suter Copyright © Rico Suter, 2023 diff --git a/src/NSwag.Annotations/NSwag.Annotations.csproj b/src/NSwag.Annotations/NSwag.Annotations.csproj index ba6bc241a5..f215f33d9a 100644 --- a/src/NSwag.Annotations/NSwag.Annotations.csproj +++ b/src/NSwag.Annotations/NSwag.Annotations.csproj @@ -1,6 +1,6 @@  - netstandard2.0;net461 + netstandard2.0;net462 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml diff --git a/src/NSwag.ApiDescription.Client/NSwag.ApiDescription.Client.nuspec b/src/NSwag.ApiDescription.Client/NSwag.ApiDescription.Client.nuspec index a61ae919fb..76af012c9d 100644 --- a/src/NSwag.ApiDescription.Client/NSwag.ApiDescription.Client.nuspec +++ b/src/NSwag.ApiDescription.Client/NSwag.ApiDescription.Client.nuspec @@ -16,7 +16,7 @@ true - + diff --git a/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj b/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj index 8af5e1aac4..0b3301d085 100644 --- a/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj +++ b/src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj @@ -1,6 +1,6 @@  - net461 + net462 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -17,10 +17,10 @@ - + TRACE;DEBUG;AspNetOwin;NET45 - + TRACE;RELEASE;AspNetOwin;NET45 diff --git a/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj b/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj index 8a6b81c4d3..9b5552f8c1 100644 --- a/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj +++ b/src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj @@ -1,11 +1,11 @@  - net461 + net462 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - + TRACE;DEBUG;NET45 diff --git a/src/NSwag.AspNetCore.Launcher.x86/NSwag.AspNetCore.Launcher.x86.csproj b/src/NSwag.AspNetCore.Launcher.x86/NSwag.AspNetCore.Launcher.x86.csproj index bfe33ec8e8..2909459193 100644 --- a/src/NSwag.AspNetCore.Launcher.x86/NSwag.AspNetCore.Launcher.x86.csproj +++ b/src/NSwag.AspNetCore.Launcher.x86/NSwag.AspNetCore.Launcher.x86.csproj @@ -1,6 +1,6 @@  - net461 + net462 x86 Exe false diff --git a/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj b/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj index b744ad5f09..6e35fa8d45 100644 --- a/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj +++ b/src/NSwag.AspNetCore.Launcher/NSwag.AspNetCore.Launcher.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1;net461 - x64 + netcoreapp3.1;net462 + x64 Exe false diff --git a/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj b/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj index aa142d105f..012715bb38 100644 --- a/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj +++ b/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj @@ -1,6 +1,7 @@  + - net461;netstandard2.0;netcoreapp3.1;net5.0;net6.0;net7.0 + net462;netstandard2.0;netcoreapp3.1;net6.0;net7.0 Swagger Documentation AspNetCore NetCore TypeScript CodeGen $(MSBuildProjectName).nuspec symbols.nupkg @@ -21,44 +22,49 @@ 4.3.0 4.0.1 + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml + - + + + - + + + - - - - + + + @@ -91,4 +97,5 @@ + diff --git a/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec b/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec index 0e597843bd..3e62db527e 100644 --- a/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec +++ b/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec @@ -94,8 +94,8 @@ - - + + diff --git a/src/NSwag.AssemblyLoader.Tests/NSwag.AssemblyLoader.Tests.csproj b/src/NSwag.AssemblyLoader.Tests/NSwag.AssemblyLoader.Tests.csproj index a9bed4490e..daf8f85b4e 100644 --- a/src/NSwag.AssemblyLoader.Tests/NSwag.AssemblyLoader.Tests.csproj +++ b/src/NSwag.AssemblyLoader.Tests/NSwag.AssemblyLoader.Tests.csproj @@ -1,14 +1,18 @@  + - netcoreapp2.1;net461 + net7.0;net462 false + + + diff --git a/src/NSwag.AssemblyLoader/AppDomainIsolation.cs b/src/NSwag.AssemblyLoader/AppDomainIsolation.cs index d153727391..39481cbd75 100644 --- a/src/NSwag.AssemblyLoader/AppDomainIsolation.cs +++ b/src/NSwag.AssemblyLoader/AppDomainIsolation.cs @@ -10,14 +10,14 @@ using System.Collections.Generic; using System.Reflection; -#if NETFRAMEWORK +#if NET462 using System.Diagnostics; using Newtonsoft.Json.Linq; #endif namespace NSwag.AssemblyLoader { -#if NETFRAMEWORK +#if NET462 public sealed class AppDomainIsolation : IDisposable where T : AssemblyLoader { diff --git a/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj b/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj index bba0955024..f1fdc18376 100644 --- a/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj +++ b/src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj @@ -1,6 +1,7 @@  + - net461;netstandard2.0 + net462;netstandard2.0 $(NoWarn),1591 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -9,6 +10,7 @@ + @@ -16,7 +18,9 @@ + + \ No newline at end of file diff --git a/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj b/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj index 0d49e4836d..aad8a1f4cd 100644 --- a/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj +++ b/src/NSwag.CodeGeneration.CSharp.Tests/NSwag.CodeGeneration.CSharp.Tests.csproj @@ -1,6 +1,7 @@  + - netcoreapp2.1 + net7.0 diff --git a/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj b/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj index 955101f0a0..2e71827be3 100644 --- a/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj +++ b/src/NSwag.CodeGeneration.CSharp/NSwag.CodeGeneration.CSharp.csproj @@ -1,6 +1,6 @@  - netstandard2.0;net461 + netstandard2.0;net462 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -8,7 +8,7 @@ - + diff --git a/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj b/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj index 5853136c2b..5cffdb1df4 100644 --- a/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj +++ b/src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj @@ -1,6 +1,6 @@  - netcoreapp2.1 + net7.0 diff --git a/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj b/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj index 6b294a727b..12afea6dea 100644 --- a/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj +++ b/src/NSwag.CodeGeneration.TypeScript.Tests/NSwag.CodeGeneration.TypeScript.Tests.csproj @@ -1,6 +1,6 @@  - netcoreapp2.1 + net7.0 diff --git a/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj b/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj index aaaeccf966..2109e90b5a 100644 --- a/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj +++ b/src/NSwag.CodeGeneration.TypeScript/NSwag.CodeGeneration.TypeScript.csproj @@ -1,6 +1,6 @@  - netstandard2.0;net461 + netstandard2.0;net462 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -8,7 +8,7 @@ - + diff --git a/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj b/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj index 079206ceef..c66cf41637 100644 --- a/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj +++ b/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj @@ -1,19 +1,25 @@  + - netstandard2.0;net461 + netstandard2.0;net462 + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml + - + - + + + + \ No newline at end of file diff --git a/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs b/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs index 8561cdaa65..949f9a4386 100644 --- a/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs +++ b/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs @@ -124,7 +124,7 @@ public override async Task RunAsync(CommandLineProcessor processor, ICon var args = new List(); string executable; -#if NET461 +#if NET462 var toolDirectory = AppDomain.CurrentDomain.BaseDirectory; if (!Directory.Exists(toolDirectory)) { @@ -172,7 +172,7 @@ public override async Task RunAsync(CommandLineProcessor processor, ICon cleanupFiles.Add(copiedAppConfig); } } -#elif NETCOREAPP || NETSTANDARD +#else var toolDirectory = AppContext.BaseDirectory; if (!Directory.Exists(toolDirectory)) { diff --git a/src/NSwag.Commands/Commands/IsolatedCommandBase.cs b/src/NSwag.Commands/Commands/IsolatedCommandBase.cs index bb4f1d661a..4732d3967b 100644 --- a/src/NSwag.Commands/Commands/IsolatedCommandBase.cs +++ b/src/NSwag.Commands/Commands/IsolatedCommandBase.cs @@ -99,7 +99,7 @@ private static string[] LoadDefaultNugetCache() return new[] { Path.GetFullPath(path) }; } -#if NET461 +#if NET462 public IEnumerable GetAssemblies(string assemblyDirectory) { var codeBaseDirectory = Path.GetDirectoryName(new Uri(typeof(IsolatedCommandBase<>).GetTypeInfo().Assembly.CodeBase).LocalPath); @@ -129,7 +129,7 @@ public IEnumerable GetAssemblies(string assemblyDirectory) public IEnumerable GetBindingRedirects() { -#if NET461 +#if NET462 yield return new BindingRedirect("Newtonsoft.Json", typeof(JToken), "30ad4fe6b2a6aeed"); yield return new BindingRedirect("Namotion.Reflection", typeof(ContextualType), "c2f9c3bdfae56102"); yield return new BindingRedirect("NJsonSchema", typeof(JsonSchema), "c2f9c3bdfae56102"); diff --git a/src/NSwag.Commands/NSwag.Commands.csproj b/src/NSwag.Commands/NSwag.Commands.csproj index 7c88aae7ae..4e44f08d9e 100644 --- a/src/NSwag.Commands/NSwag.Commands.csproj +++ b/src/NSwag.Commands/NSwag.Commands.csproj @@ -1,7 +1,7 @@  - net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 + net462;netcoreapp3.1;net6.0;net7.0 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml $(NoWarn),618,1591 @@ -11,44 +11,29 @@ - - - - - - - - - + - - - - - - - - + - + - - + + @@ -57,10 +42,10 @@ - + - + diff --git a/src/NSwag.Commands/NSwagDocument.cs b/src/NSwag.Commands/NSwagDocument.cs index 898401894b..5fbcd6cbae 100644 --- a/src/NSwag.Commands/NSwagDocument.cs +++ b/src/NSwag.Commands/NSwagDocument.cs @@ -25,7 +25,7 @@ namespace NSwag.Commands /// public class NSwagDocument : NSwagDocumentBase { -#if NET461 +#if NET462 /// Gets or sets the root binary directory where the command line executables loaded from. public static string RootBinaryDirectory { get; set; } = @@ -305,9 +305,9 @@ private string GetDocumentDirectory() private string GetArgumentsPrefix() { -#if NET461 +#if NET462 - var runtime = Runtime != Runtime.Default ? Runtime : RuntimeUtilities.CurrentRuntime; + var runtime = Runtime != Runtime.Default ? Runtime : RuntimeUtilities.CurrentRuntime; if (runtime == Runtime.NetCore21) { return "\"" + System.IO.Path.Combine(RootBinaryDirectory, "NetCore21/dotnet-nswag.dll") + "\" "; @@ -335,9 +335,9 @@ private string GetArgumentsPrefix() private string GetProgramName() { -#if NET461 +#if NET462 - var runtime = Runtime != Runtime.Default ? Runtime : RuntimeUtilities.CurrentRuntime; + var runtime = Runtime != Runtime.Default ? Runtime : RuntimeUtilities.CurrentRuntime; if (runtime == Runtime.WinX64 || runtime == Runtime.Debug) { return System.IO.Path.Combine(RootBinaryDirectory, "Win/nswag.exe"); diff --git a/src/NSwag.Console.x86/NSwag.Console.x86.csproj b/src/NSwag.Console.x86/NSwag.Console.x86.csproj index 50a0134a70..678f7c3a1c 100644 --- a/src/NSwag.Console.x86/NSwag.Console.x86.csproj +++ b/src/NSwag.Console.x86/NSwag.Console.x86.csproj @@ -1,6 +1,7 @@  + - net461 + net462 Exe exe @@ -10,16 +11,19 @@ x86 true - + + TRACE;DEBUG;net46 + + - - + + @@ -27,6 +31,7 @@ + @@ -34,6 +39,7 @@ + ..\libs\System.IO.dll @@ -42,4 +48,5 @@ ..\libs\System.Runtime.dll + \ No newline at end of file diff --git a/src/NSwag.Console/NSwag.Console.csproj b/src/NSwag.Console/NSwag.Console.csproj index e0e14afc5a..35d08da937 100644 --- a/src/NSwag.Console/NSwag.Console.csproj +++ b/src/NSwag.Console/NSwag.Console.csproj @@ -1,6 +1,7 @@  + - net461 + net462 Exe exe @@ -9,19 +10,23 @@ NSwag true - - TRACE;DEBUG;net46 + + + TRACE;DEBUG;net462 - + + bin\$(Configuration)\ - + + bin\$(Configuration)\ + - - + + @@ -29,6 +34,7 @@ + @@ -36,6 +42,7 @@ + ..\libs\System.IO.dll @@ -44,4 +51,5 @@ ..\libs\System.Runtime.dll + \ No newline at end of file diff --git a/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj b/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj index 2899db20f1..b698d48631 100644 --- a/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj +++ b/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj @@ -1,11 +1,13 @@  + - netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 + netcoreapp3.1;net6.0;net7.0 Exe dotnet-nswag NSwag.ConsoleCore true nswag + @@ -13,37 +15,26 @@ - - - - - - + - - - - - - - + - + - + @@ -58,4 +49,5 @@ + diff --git a/src/NSwag.Core.Tests/NSwag.Core.Tests.csproj b/src/NSwag.Core.Tests/NSwag.Core.Tests.csproj index b9a45c53e3..a29d4eb50d 100644 --- a/src/NSwag.Core.Tests/NSwag.Core.Tests.csproj +++ b/src/NSwag.Core.Tests/NSwag.Core.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net7.0 false $(NoWarn),618 diff --git a/src/NSwag.Core.Yaml.Tests/NSwag.Core.Yaml.Tests.csproj b/src/NSwag.Core.Yaml.Tests/NSwag.Core.Yaml.Tests.csproj index bb926d4a07..b728c614e4 100644 --- a/src/NSwag.Core.Yaml.Tests/NSwag.Core.Yaml.Tests.csproj +++ b/src/NSwag.Core.Yaml.Tests/NSwag.Core.Yaml.Tests.csproj @@ -1,20 +1,25 @@  + - netcoreapp3.1 + net7.0 false + + + + \ No newline at end of file diff --git a/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj b/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj index 61bcf0fbab..4f28835cd7 100644 --- a/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj +++ b/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj @@ -1,14 +1,18 @@  + - netstandard2.0;net461 + netstandard2.0;net462 NSwag + - + + + \ No newline at end of file diff --git a/src/NSwag.Core/NSwag.Core.csproj b/src/NSwag.Core/NSwag.Core.csproj index 37b9298846..7bebae2f75 100644 --- a/src/NSwag.Core/NSwag.Core.csproj +++ b/src/NSwag.Core/NSwag.Core.csproj @@ -1,15 +1,19 @@  + - netstandard2.0;net461 + netstandard2.0;net462 NSwag + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml + - + - + + @@ -17,7 +21,9 @@ + + \ No newline at end of file diff --git a/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj b/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj index fa22c301d8..ea7f44e01a 100644 --- a/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj +++ b/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj @@ -14,7 +14,7 @@ Properties NSwag.Demo.Web NSwag.Demo.Web - v4.6.1 + v4.6.2 win true @@ -50,7 +50,6 @@ - @@ -60,14 +59,12 @@ - - diff --git a/src/NSwag.Demo.Web/Web.config b/src/NSwag.Demo.Web/Web.config index 8a4adce57a..319e75fb4e 100644 --- a/src/NSwag.Demo.Web/Web.config +++ b/src/NSwag.Demo.Web/Web.config @@ -1,7 +1,7 @@ - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - - - + + + + \ No newline at end of file diff --git a/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj b/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj index de63455123..64cc4e48b8 100644 --- a/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj +++ b/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj @@ -1,23 +1,14 @@  - net5.0;net6.0;net7.0;netcoreapp2.1;netcoreapp3.1 + net6.0;net7.0;netcoreapp3.1 true $(NoWarn),618,1591 - enable + enable - - - - - - - - - diff --git a/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj b/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj index c1f33f2da9..bd13d9dbbd 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj +++ b/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj @@ -1,6 +1,6 @@  - netcoreapp3.1;net5.0;net6.0;net7.0 + netcoreapp3.1;net6.0;net7.0 $(NoWarn),618,1591 @@ -11,15 +11,6 @@ - - - - - - - - - diff --git a/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj b/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj index 88c291eb5c..75e0789b34 100644 --- a/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj +++ b/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj @@ -1,17 +1,17 @@  - net461;netstandard2.0;netcoreapp3.1;net5.0;net6.0;net7.0 + net462;netstandard2.0;netcoreapp3.1;net5.0;net6.0;net7.0 Swagger Documentation AspNetCore $(DefineConstants);ASPNETCORE bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - + - + diff --git a/src/NSwag.Generation.Tests/NSwag.Generation.Tests.csproj b/src/NSwag.Generation.Tests/NSwag.Generation.Tests.csproj index 4f271afac6..ad1d56d3ee 100644 --- a/src/NSwag.Generation.Tests/NSwag.Generation.Tests.csproj +++ b/src/NSwag.Generation.Tests/NSwag.Generation.Tests.csproj @@ -1,7 +1,7 @@ - netcoreapp3.1 + net7.0 false true $(NoWarn);1591 diff --git a/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj b/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj index 1fab1f1236..b6c430e5bf 100644 --- a/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj +++ b/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj @@ -1,14 +1,15 @@  - netstandard2.0;net461 + netstandard2.0;net462 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - + - + + diff --git a/src/NSwag.Generation/NSwag.Generation.csproj b/src/NSwag.Generation/NSwag.Generation.csproj index a85ff4be94..986ed3e9f6 100644 --- a/src/NSwag.Generation/NSwag.Generation.csproj +++ b/src/NSwag.Generation/NSwag.Generation.csproj @@ -1,15 +1,16 @@  - netstandard2.0;net461 + netstandard2.0;net462 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml $(NoWarn),618 - + - + + diff --git a/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs b/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs index bbd634e471..a550c8dcc6 100644 --- a/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs +++ b/src/NSwag.Generation/OpenApiDocumentGeneratorSettings.cs @@ -8,6 +8,7 @@ using Namotion.Reflection; using Newtonsoft.Json; +using NJsonSchema; using NJsonSchema.Generation; using NSwag.Generation.Processors; using NSwag.Generation.Processors.Collections; @@ -26,7 +27,10 @@ public OpenApiDocumentGeneratorSettings() } /// - public JsonSchemaGeneratorSettings SchemaSettings { get; set; } + public JsonSchemaGeneratorSettings SchemaSettings { get; set; } = new SystemTextJsonSchemaGeneratorSettings + { + SchemaType = SchemaType.OpenApi3 + }; /// Gets or sets the Swagger specification title. public string Title { get; set; } = "My Title"; diff --git a/src/NSwag.Integration.ClientPCL.Tests/NSwag.Integration.ClientPCL.Tests.csproj b/src/NSwag.Integration.ClientPCL.Tests/NSwag.Integration.ClientPCL.Tests.csproj index 18b5f4058c..4451793c75 100644 --- a/src/NSwag.Integration.ClientPCL.Tests/NSwag.Integration.ClientPCL.Tests.csproj +++ b/src/NSwag.Integration.ClientPCL.Tests/NSwag.Integration.ClientPCL.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/NSwag.Integration.ClientPCL/NSwag.Integration.ClientPCL.csproj b/src/NSwag.Integration.ClientPCL/NSwag.Integration.ClientPCL.csproj index 518362cb56..06548048a1 100644 --- a/src/NSwag.Integration.ClientPCL/NSwag.Integration.ClientPCL.csproj +++ b/src/NSwag.Integration.ClientPCL/NSwag.Integration.ClientPCL.csproj @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj b/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj index 9b3d33fca5..ec84887f03 100644 --- a/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj +++ b/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj @@ -38,6 +38,6 @@ - + \ No newline at end of file diff --git a/src/NSwag.MSBuild/NSwag.MSBuild.nuspec b/src/NSwag.MSBuild/NSwag.MSBuild.nuspec index b3a5940671..3feb31126e 100644 --- a/src/NSwag.MSBuild/NSwag.MSBuild.nuspec +++ b/src/NSwag.MSBuild/NSwag.MSBuild.nuspec @@ -22,15 +22,13 @@ - - - - - + + + + + - - diff --git a/src/NSwag.Npm/package-lock.json b/src/NSwag.Npm/package-lock.json index 3240e4026c..6fd7fc22ab 100644 --- a/src/NSwag.Npm/package-lock.json +++ b/src/NSwag.Npm/package-lock.json @@ -1,12 +1,12 @@ { "name": "nswag", - "version": "13.18.2", + "version": "13.20.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nswag", - "version": "13.18.2", + "version": "13.20.0", "license": "MIT", "bin": { "nswag": "bin/nswag.js" diff --git a/src/NSwag.Npm/package.json b/src/NSwag.Npm/package.json index d9f2be6657..2893c0fa53 100644 --- a/src/NSwag.Npm/package.json +++ b/src/NSwag.Npm/package.json @@ -1,6 +1,6 @@ { "name": "nswag", - "version": "13.18.2", + "version": "14.0.0", "optionalDependencies": {}, "repository": { "type": "git", diff --git a/src/NSwag.Sample.NET50/Controllers/ValuesController.cs b/src/NSwag.Sample.NET50/Controllers/ValuesController.cs deleted file mode 100644 index 377079e037..0000000000 --- a/src/NSwag.Sample.NET50/Controllers/ValuesController.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.AspNetCore.Mvc; - -namespace NSwag.Sample.NET50.Controllers -{ - [Route("api/[controller]")] - [ApiController] - public class ValuesController : ControllerBase - { - public class Person - { - public string FirstName { get; set; } = ""; - - public string? MiddleName { get; set; } - - public string LastName { get; set; } = ""; - - public DateTime DayOfBirth { get; set; } - } - - public enum TestEnum - { - Foo, - Bar - } - - [HttpGet] - public ActionResult> Get() - { - return new Person[] { }; - } - - // GET api/values/5 - [HttpGet("{id}")] - public ActionResult Get(int id) - { - return TestEnum.Foo; - } - - // GET api/values/5 - [HttpGet("{id}/foo")] - public ActionResult GetFooBar(int id) - { - return "value"; - } - - // POST api/values - [HttpPost] - public void Post([FromBody] string value) - { - } - - // PUT api/values/5 - [HttpPut("{id}")] - public void Put(int id, [FromBody] string value) - { - } - - // DELETE api/values/5 - [HttpDelete("{id}")] - public void Delete(int id) - { - } - } -} diff --git a/src/NSwag.Sample.NET50/NSwag.Sample.NET50.csproj b/src/NSwag.Sample.NET50/NSwag.Sample.NET50.csproj deleted file mode 100644 index 69d950cd98..0000000000 --- a/src/NSwag.Sample.NET50/NSwag.Sample.NET50.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net5.0 - enable - 8.0 - - - - - - - - diff --git a/src/NSwag.Sample.NET50/Program.cs b/src/NSwag.Sample.NET50/Program.cs deleted file mode 100644 index 6e50522ef2..0000000000 --- a/src/NSwag.Sample.NET50/Program.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace NSwag.Sample.NET50 -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} diff --git a/src/NSwag.Sample.NET50/Properties/launchSettings.json b/src/NSwag.Sample.NET50/Properties/launchSettings.json deleted file mode 100644 index 50ee08064c..0000000000 --- a/src/NSwag.Sample.NET50/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:1284/", - "sslPort": 44390 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "NSwag.Sample.NET50": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:5000;https://localhost:5001" - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NET50/Startup.cs b/src/NSwag.Sample.NET50/Startup.cs deleted file mode 100644 index 9943e71809..0000000000 --- a/src/NSwag.Sample.NET50/Startup.cs +++ /dev/null @@ -1,65 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using NJsonSchema.Generation; -using System.Text.Json.Serialization; - -namespace NSwag.Sample.NET50 -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - public void ConfigureServices(IServiceCollection services) - { - services.AddMvc(); - - services - .AddControllers() - .AddJsonOptions(options => - { - options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; - options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); - }); - - services.AddOpenApiDocument(document => - { - document.Description = "Hello world!"; - document.SchemaSettings.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; - }); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseHttpsRedirection(); - app.UseRouting(); - app.UseAuthorization(); - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - - app.UseOpenApi(p => p.Path = "/swagger/{documentName}/swagger.yaml"); - app.UseSwaggerUi3(p => p.DocumentPath = "/swagger/{documentName}/swagger.yaml"); - //app.UseApimundo(); - app.UseApimundo(settings => - { - //settings.CompareTo = "a:a:27:25:15:latest"; - settings.DocumentPath = "/swagger/v1/swagger.yaml"; - settings.ApimundoUrl = "https://localhost:5001"; - }); - } - } -} diff --git a/src/NSwag.Sample.NET50/appsettings.Development.json b/src/NSwag.Sample.NET50/appsettings.Development.json deleted file mode 100644 index e203e9407e..0000000000 --- a/src/NSwag.Sample.NET50/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" - } - } -} diff --git a/src/NSwag.Sample.NET50/appsettings.json b/src/NSwag.Sample.NET50/appsettings.json deleted file mode 100644 index 7cb5ac8193..0000000000 --- a/src/NSwag.Sample.NET50/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "AllowedHosts": "*" -} diff --git a/src/NSwag.Sample.NET50/nswag.json b/src/NSwag.Sample.NET50/nswag.json deleted file mode 100644 index 4bda4cf1ce..0000000000 --- a/src/NSwag.Sample.NET50/nswag.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "runtime": "Net50", - "defaultVariables": null, - "documentGenerator": { - "aspNetCoreToOpenApi": { - "project": "NSwag.Sample.NET50.csproj", - "msBuildProjectExtensionsPath": null, - "configuration": null, - "runtime": null, - "targetFramework": null, - "noBuild": false, - "verbose": true, - "workingDirectory": null, - "requireParametersWithoutDefault": false, - "apiGroupNames": null, - "defaultPropertyNameHandling": "Default", - "defaultReferenceTypeNullHandling": "Null", - "defaultDictionaryValueReferenceTypeNullHandling": "NotNull", - "defaultResponseReferenceTypeNullHandling": "NotNull", - "defaultEnumHandling": "Integer", - "flattenInheritanceHierarchy": false, - "generateKnownTypes": true, - "generateEnumMappingDescription": false, - "generateXmlObjects": false, - "generateAbstractProperties": false, - "generateAbstractSchemas": true, - "ignoreObsoleteProperties": false, - "allowReferencesWithProperties": false, - "excludedTypeNames": [], - "serviceHost": null, - "serviceBasePath": null, - "serviceSchemes": [], - "infoTitle": "My Title", - "infoDescription": null, - "infoVersion": "1.0.0", - "documentTemplate": null, - "documentProcessorTypes": [], - "operationProcessorTypes": [], - "typeNameGeneratorType": null, - "schemaNameGeneratorType": null, - "contractResolverType": null, - "serializerSettingsType": null, - "useDocumentProvider": true, - "documentName": "v1", - "aspNetCoreEnvironment": null, - "createWebHostBuilderMethod": null, - "startupType": null, - "allowNullableBodyParameters": true, - "output": "openapi.json", - "outputType": "Swagger2", - "assemblyPaths": [], - "assemblyConfig": null, - "referencePaths": [], - "useNuGetCache": false - } - }, - "codeGenerators": {} -} \ No newline at end of file diff --git a/src/NSwag.Sample.NET50/openapi.json b/src/NSwag.Sample.NET50/openapi.json deleted file mode 100644 index b056765f37..0000000000 --- a/src/NSwag.Sample.NET50/openapi.json +++ /dev/null @@ -1,215 +0,0 @@ -{ - "x-generator": "NSwag v13.15.5.0 (NJsonSchema v10.6.6.0 (Newtonsoft.Json v12.0.0.0))", - "openapi": "3.0.0", - "info": { - "title": "My Title", - "description": "Hello world!", - "version": "1.0.0" - }, - "paths": { - "/api/Values": { - "get": { - "tags": [ - "Values" - ], - "operationId": "Values_GetAll", - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Person" - } - } - } - } - } - } - }, - "post": { - "tags": [ - "Values" - ], - "operationId": "Values_Post", - "requestBody": { - "x-name": "value", - "content": { - "application/json": { - "schema": { - "type": "string" - } - } - }, - "required": true, - "x-position": 1 - }, - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/Values/{id}": { - "get": { - "tags": [ - "Values" - ], - "operationId": "Values_Get", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "x-position": 1 - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestEnum" - } - } - } - } - } - }, - "put": { - "tags": [ - "Values" - ], - "operationId": "Values_Put", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "x-position": 1 - } - ], - "requestBody": { - "x-name": "value", - "content": { - "application/json": { - "schema": { - "type": "string" - } - } - }, - "required": true, - "x-position": 2 - }, - "responses": { - "200": { - "description": "" - } - } - }, - "delete": { - "tags": [ - "Values" - ], - "operationId": "Values_Delete", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "x-position": 1 - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/Values/{id}/foo": { - "get": { - "tags": [ - "Values" - ], - "operationId": "Values_GetFooBar", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - }, - "x-position": 1 - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "string" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "Person": { - "type": "object", - "additionalProperties": false, - "properties": { - "firstName": { - "type": "string" - }, - "middleName": { - "type": "string", - "nullable": true - }, - "lastName": { - "type": "string" - }, - "dayOfBirth": { - "type": "string", - "format": "date-time" - } - } - }, - "TestEnum": { - "type": "string", - "description": "", - "x-enumNames": [ - "Foo", - "Bar" - ], - "enum": [ - "Foo", - "Bar" - ] - } - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj b/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj index 1674f37258..e3fcaaa4a4 100644 --- a/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj +++ b/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/NSwag.Sample.NetCoreAngular.Clients/NSwag.Sample.NetCoreAngular.Clients.csproj b/src/NSwag.Sample.NetCoreAngular.Clients/NSwag.Sample.NetCoreAngular.Clients.csproj index e416a6758e..c5d4b96a8f 100644 --- a/src/NSwag.Sample.NetCoreAngular.Clients/NSwag.Sample.NetCoreAngular.Clients.csproj +++ b/src/NSwag.Sample.NetCoreAngular.Clients/NSwag.Sample.NetCoreAngular.Clients.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj index 026a029808..e6c731afe9 100644 --- a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj +++ b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj @@ -14,7 +14,7 @@ NSwag.Sample.NetGlobalAsax NSwag.Sample.NetGlobalAsax win - v4.6.1 + v4.6.2 false true @@ -27,6 +27,7 @@ 6 false + true @@ -55,9 +56,6 @@ - - - @@ -199,7 +197,7 @@ - + diff --git a/src/NSwag.Sample.NetGlobalAsax/Web.config b/src/NSwag.Sample.NetGlobalAsax/Web.config index 40ff2ba60b..c5694eb1d3 100644 --- a/src/NSwag.Sample.NetGlobalAsax/Web.config +++ b/src/NSwag.Sample.NetGlobalAsax/Web.config @@ -1,69 +1,77 @@ - + - - - - - + + + + + + - - + + - + - - - - - + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + \ No newline at end of file diff --git a/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj b/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj index 8d79872a0b..cee862737f 100644 --- a/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj +++ b/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj @@ -2,7 +2,7 @@ Exe - net461 + net462 win true @@ -27,7 +27,7 @@ - + \ No newline at end of file diff --git a/src/NSwag.sln b/src/NSwag.sln index d18ec887b1..dbb008524b 100644 --- a/src/NSwag.sln +++ b/src/NSwag.sln @@ -134,8 +134,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Core.Tests", "NSwag.C EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NETCore21", "NSwag.Sample.NETCore21\NSwag.Sample.NETCore21.csproj", "{B60E7723-91F4-412B-9EB3-4050B71B0DAA}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NET50", "NSwag.Sample.NET50\NSwag.Sample.NET50.csproj", "{F109D48B-A2FF-497D-8374-FEA60C5F2365}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Generation.AspNetCore.Tests.Web", "NSwag.Generation.AspNetCore.Tests.Web\NSwag.Generation.AspNetCore.Tests.Web.csproj", "{FDD41017-91E2-4BD8-B827-F851BDEC6B6E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.AssemblyLoader.Tests", "NSwag.AssemblyLoader.Tests\NSwag.AssemblyLoader.Tests.csproj", "{1853262B-6D39-477B-872A-8B5473FE74BB}" @@ -850,24 +848,6 @@ Global {B60E7723-91F4-412B-9EB3-4050B71B0DAA}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU {B60E7723-91F4-412B-9EB3-4050B71B0DAA}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU {B60E7723-91F4-412B-9EB3-4050B71B0DAA}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Debug|x64.ActiveCfg = Debug|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Debug|x64.Build.0 = Debug|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Debug|x86.ActiveCfg = Debug|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Debug|x86.Build.0 = Debug|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Release|Any CPU.Build.0 = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Release|x64.ActiveCfg = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Release|x64.Build.0 = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Release|x86.ActiveCfg = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.Release|x86.Build.0 = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.ReleaseTypeScriptStrict|x64.ActiveCfg = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU - {F109D48B-A2FF-497D-8374-FEA60C5F2365}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU {FDD41017-91E2-4BD8-B827-F851BDEC6B6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FDD41017-91E2-4BD8-B827-F851BDEC6B6E}.Debug|Any CPU.Build.0 = Debug|Any CPU {FDD41017-91E2-4BD8-B827-F851BDEC6B6E}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1175,7 +1155,6 @@ Global {E90E9C77-7983-40D0-AAB3-91D16DC639CE} = {F0F26A35-C4B6-42D0-A1DF-98CA46A5C560} {810AF444-D713-4CEE-BC9F-13D7875AE69B} = {634E4ABD-29EC-4EB2-81EF-7E41D6D6F6E0} {B60E7723-91F4-412B-9EB3-4050B71B0DAA} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} - {F109D48B-A2FF-497D-8374-FEA60C5F2365} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} {FDD41017-91E2-4BD8-B827-F851BDEC6B6E} = {634E4ABD-29EC-4EB2-81EF-7E41D6D6F6E0} {1853262B-6D39-477B-872A-8B5473FE74BB} = {634E4ABD-29EC-4EB2-81EF-7E41D6D6F6E0} {E6E40935-0C79-480B-BF29-8C493AC7E518} = {DDBB05AC-B066-48C4-933C-034F401EBB6A} diff --git a/src/NSwagStudio/NSwagStudio.csproj b/src/NSwagStudio/NSwagStudio.csproj index 9707881eae..43815abd9a 100644 --- a/src/NSwagStudio/NSwagStudio.csproj +++ b/src/NSwagStudio/NSwagStudio.csproj @@ -1,7 +1,7 @@  WinExe - net461 + net462 {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} true true @@ -66,9 +66,9 @@ - - - + + + From f7c735d7bfc8e953143727906aa7f548212b9e34 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Mon, 21 Aug 2023 00:09:46 +0200 Subject: [PATCH 15/51] remove files --- .../HelpPage/ApiDescriptionExtensions.cs | 39 -- .../HelpPage/App_Start/HelpPageConfig.cs | 113 ----- .../HelpPage/Controllers/HelpController.cs | 63 --- .../Areas/HelpPage/HelpPage.css | 134 ----- .../HelpPage/HelpPageAreaRegistration.cs | 26 - .../HelpPageConfigurationExtensions.cs | 467 ------------------ .../CollectionModelDescription.cs | 7 - .../ComplexTypeModelDescription.cs | 14 - .../DictionaryModelDescription.cs | 6 - .../EnumTypeModelDescription.cs | 15 - .../ModelDescriptions/EnumValueDescription.cs | 11 - .../IModelDocumentationProvider.cs | 12 - .../KeyValuePairModelDescription.cs | 9 - .../ModelDescriptions/ModelDescription.cs | 16 - .../ModelDescriptionGenerator.cs | 451 ----------------- .../ModelDescriptions/ModelNameAttribute.cs | 18 - .../ModelDescriptions/ModelNameHelper.cs | 36 -- .../ModelDescriptions/ParameterAnnotation.cs | 11 - .../ModelDescriptions/ParameterDescription.cs | 21 - .../SimpleTypeModelDescription.cs | 6 - .../Areas/HelpPage/Models/HelpPageApiModel.cs | 108 ---- .../HelpPageSampleGenerator.cs | 444 ----------------- .../SampleGeneration/HelpPageSampleKey.cs | 172 ------- .../HelpPage/SampleGeneration/ImageSample.cs | 41 -- .../SampleGeneration/InvalidSample.cs | 37 -- .../SampleGeneration/ObjectGenerator.cs | 456 ----------------- .../SampleGeneration/SampleDirection.cs | 11 - .../HelpPage/SampleGeneration/TextSample.cs | 37 -- .../Areas/HelpPage/Views/Help/Api.cshtml | 22 - .../Help/DisplayTemplates/ApiGroup.cshtml | 41 -- .../CollectionModelDescription.cshtml | 6 - .../ComplexTypeModelDescription.cshtml | 3 - .../DictionaryModelDescription.cshtml | 4 - .../EnumTypeModelDescription.cshtml | 24 - .../DisplayTemplates/HelpPageApiModel.cshtml | 67 --- .../Help/DisplayTemplates/ImageSample.cshtml | 4 - .../DisplayTemplates/InvalidSample.cshtml | 13 - .../KeyValuePairModelDescription.cshtml | 4 - .../ModelDescriptionLink.cshtml | 26 - .../Help/DisplayTemplates/Parameters.cshtml | 48 -- .../Help/DisplayTemplates/Samples.cshtml | 30 -- .../SimpleTypeModelDescription.cshtml | 3 - .../Help/DisplayTemplates/TextSample.cshtml | 6 - .../Areas/HelpPage/Views/Help/Index.cshtml | 38 -- .../HelpPage/Views/Help/ResourceModel.cshtml | 19 - .../HelpPage/Views/Shared/_Layout.cshtml | 12 - .../Areas/HelpPage/Views/Web.config | 41 -- .../Areas/HelpPage/Views/_ViewStart.cshtml | 4 - .../HelpPage/XmlDocumentationProvider.cs | 161 ------ .../NSwag.Sample.NetGlobalAsax.csproj | 45 -- 50 files changed, 3402 deletions(-) delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ApiDescriptionExtensions.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/App_Start/HelpPageConfig.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Controllers/HelpController.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPage.css delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPageAreaRegistration.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPageConfigurationExtensions.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/CollectionModelDescription.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ComplexTypeModelDescription.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/DictionaryModelDescription.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/EnumTypeModelDescription.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/EnumValueDescription.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/IModelDocumentationProvider.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/KeyValuePairModelDescription.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelDescription.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelDescriptionGenerator.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelNameAttribute.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelNameHelper.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ParameterAnnotation.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ParameterDescription.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/SimpleTypeModelDescription.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Models/HelpPageApiModel.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/HelpPageSampleGenerator.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/HelpPageSampleKey.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/ImageSample.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/InvalidSample.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/ObjectGenerator.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/SampleDirection.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/TextSample.cs delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/Api.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ApiGroup.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/CollectionModelDescription.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ComplexTypeModelDescription.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/DictionaryModelDescription.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/EnumTypeModelDescription.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/HelpPageApiModel.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ImageSample.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/InvalidSample.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/KeyValuePairModelDescription.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ModelDescriptionLink.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/Parameters.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/Samples.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/SimpleTypeModelDescription.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/TextSample.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/Index.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/ResourceModel.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Shared/_Layout.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Web.config delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/_ViewStart.cshtml delete mode 100644 src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/XmlDocumentationProvider.cs diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ApiDescriptionExtensions.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ApiDescriptionExtensions.cs deleted file mode 100644 index 8396944192..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ApiDescriptionExtensions.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Text; -using System.Web; -using System.Web.Http.Description; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - public static class ApiDescriptionExtensions - { - /// - /// Generates an URI-friendly ID for the . E.g. "Get-Values-id_name" instead of "GetValues/{id}?name={name}" - /// - /// The . - /// The ID as a string. - public static string GetFriendlyId(this ApiDescription description) - { - string path = description.RelativePath; - string[] urlParts = path.Split('?'); - string localPath = urlParts[0]; - string queryKeyString = null; - if (urlParts.Length > 1) - { - string query = urlParts[1]; - string[] queryKeys = HttpUtility.ParseQueryString(query).AllKeys; - queryKeyString = String.Join("_", queryKeys); - } - - StringBuilder friendlyPath = new StringBuilder(); - friendlyPath.AppendFormat("{0}-{1}", - description.HttpMethod.Method, - localPath.Replace("/", "-").Replace("{", String.Empty).Replace("}", String.Empty)); - if (queryKeyString != null) - { - friendlyPath.AppendFormat("_{0}", queryKeyString.Replace('.', '-')); - } - return friendlyPath.ToString(); - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/App_Start/HelpPageConfig.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/App_Start/HelpPageConfig.cs deleted file mode 100644 index 085b681d48..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/App_Start/HelpPageConfig.cs +++ /dev/null @@ -1,113 +0,0 @@ -// Uncomment the following to provide samples for PageResult. Must also add the Microsoft.AspNet.WebApi.OData -// package to your project. -////#define Handle_PageResultOfT - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Net.Http.Headers; -using System.Reflection; -using System.Web; -using System.Web.Http; -#if Handle_PageResultOfT -using System.Web.Http.OData; -#endif - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - /// - /// Use this class to customize the Help Page. - /// For example you can set a custom to supply the documentation - /// or you can provide the samples for the requests/responses. - /// - public static class HelpPageConfig - { - [SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", - MessageId = "NSwag.Sample.NetOwin.Areas.HelpPage.TextSample.#ctor(System.String)", - Justification = "End users may choose to merge this string with existing localized resources.")] - [SuppressMessage("Microsoft.Naming", "CA2204:Literals should be spelled correctly", - MessageId = "bsonspec", - Justification = "Part of a URI.")] - public static void Register(HttpConfiguration config) - { - //// Uncomment the following to use the documentation from XML documentation file. - //config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml"))); - - //// Uncomment the following to use "sample string" as the sample for all actions that have string as the body parameter or return type. - //// Also, the string arrays will be used for IEnumerable. The sample objects will be serialized into different media type - //// formats by the available formatters. - //config.SetSampleObjects(new Dictionary - //{ - // {typeof(string), "sample string"}, - // {typeof(IEnumerable), new string[]{"sample 1", "sample 2"}} - //}); - - // Extend the following to provide factories for types not handled automatically (those lacking parameterless - // constructors) or for which you prefer to use non-default property values. Line below provides a fallback - // since automatic handling will fail and GeneratePageResult handles only a single type. -#if Handle_PageResultOfT - config.GetHelpPageSampleGenerator().SampleObjectFactories.Add(GeneratePageResult); -#endif - - // Extend the following to use a preset object directly as the sample for all actions that support a media - // type, regardless of the body parameter or return type. The lines below avoid display of binary content. - // The BsonMediaTypeFormatter (if available) is not used to serialize the TextSample object. - config.SetSampleForMediaType( - new TextSample("Binary JSON content. See http://bsonspec.org for details."), - new MediaTypeHeaderValue("application/bson")); - - //// Uncomment the following to use "[0]=foo&[1]=bar" directly as the sample for all actions that support form URL encoded format - //// and have IEnumerable as the body parameter or return type. - //config.SetSampleForType("[0]=foo&[1]=bar", new MediaTypeHeaderValue("application/x-www-form-urlencoded"), typeof(IEnumerable)); - - //// Uncomment the following to use "1234" directly as the request sample for media type "text/plain" on the controller named "Values" - //// and action named "Put". - //config.SetSampleRequest("1234", new MediaTypeHeaderValue("text/plain"), "Values", "Put"); - - //// Uncomment the following to use the image on "../images/aspNetHome.png" directly as the response sample for media type "image/png" - //// on the controller named "Values" and action named "Get" with parameter "id". - //config.SetSampleResponse(new ImageSample("../images/aspNetHome.png"), new MediaTypeHeaderValue("image/png"), "Values", "Get", "id"); - - //// Uncomment the following to correct the sample request when the action expects an HttpRequestMessage with ObjectContent. - //// The sample will be generated as if the controller named "Values" and action named "Get" were having string as the body parameter. - //config.SetActualRequestType(typeof(string), "Values", "Get"); - - //// Uncomment the following to correct the sample response when the action returns an HttpResponseMessage with ObjectContent. - //// The sample will be generated as if the controller named "Values" and action named "Post" were returning a string. - //config.SetActualResponseType(typeof(string), "Values", "Post"); - } - -#if Handle_PageResultOfT - private static object GeneratePageResult(HelpPageSampleGenerator sampleGenerator, Type type) - { - if (type.IsGenericType) - { - Type openGenericType = type.GetGenericTypeDefinition(); - if (openGenericType == typeof(PageResult<>)) - { - // Get the T in PageResult - Type[] typeParameters = type.GetGenericArguments(); - Debug.Assert(typeParameters.Length == 1); - - // Create an enumeration to pass as the first parameter to the PageResult constuctor - Type itemsType = typeof(List<>).MakeGenericType(typeParameters); - object items = sampleGenerator.GetSampleObject(itemsType); - - // Fill in the other information needed to invoke the PageResult constuctor - Type[] parameterTypes = new Type[] { itemsType, typeof(Uri), typeof(long?), }; - object[] parameters = new object[] { items, null, (long)ObjectGenerator.DefaultCollectionSize, }; - - // Call PageResult(IEnumerable items, Uri nextPageLink, long? count) constructor - ConstructorInfo constructor = type.GetConstructor(parameterTypes); - return constructor.Invoke(parameters); - } - } - - return null; - } -#endif - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Controllers/HelpController.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Controllers/HelpController.cs deleted file mode 100644 index d3a777e96f..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Controllers/HelpController.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Web.Http; -using System.Web.Mvc; -using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions; -using NSwag.Sample.NetOwin.Areas.HelpPage.Models; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.Controllers -{ - /// - /// The controller that will handle requests for the help page. - /// - public class HelpController : Controller - { - private const string ErrorViewName = "Error"; - - public HelpController() - : this(GlobalConfiguration.Configuration) - { - } - - public HelpController(HttpConfiguration config) - { - Configuration = config; - } - - public HttpConfiguration Configuration { get; private set; } - - public ActionResult Index() - { - ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider(); - return View(Configuration.Services.GetApiExplorer().ApiDescriptions); - } - - public ActionResult Api(string apiId) - { - if (!String.IsNullOrEmpty(apiId)) - { - HelpPageApiModel apiModel = Configuration.GetHelpPageApiModel(apiId); - if (apiModel != null) - { - return View(apiModel); - } - } - - return View(ErrorViewName); - } - - public ActionResult ResourceModel(string modelName) - { - if (!String.IsNullOrEmpty(modelName)) - { - ModelDescriptionGenerator modelDescriptionGenerator = Configuration.GetModelDescriptionGenerator(); - ModelDescription modelDescription; - if (modelDescriptionGenerator.GeneratedModels.TryGetValue(modelName, out modelDescription)) - { - return View(modelDescription); - } - } - - return View(ErrorViewName); - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPage.css b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPage.css deleted file mode 100644 index aff223033d..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPage.css +++ /dev/null @@ -1,134 +0,0 @@ -.help-page h1, -.help-page .h1, -.help-page h2, -.help-page .h2, -.help-page h3, -.help-page .h3, -#body.help-page, -.help-page-table th, -.help-page-table pre, -.help-page-table p { - font-family: "Segoe UI Light", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif; -} - -.help-page pre.wrapped { - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - white-space: pre-wrap; -} - -.help-page .warning-message-container { - margin-top: 20px; - padding: 0 10px; - color: #525252; - background: #EFDCA9; - border: 1px solid #CCCCCC; -} - -.help-page-table { - width: 100%; - border-collapse: collapse; - text-align: left; - margin: 0px 0px 20px 0px; - border-top: 1px solid #D4D4D4; -} - -.help-page-table th { - text-align: left; - font-weight: bold; - border-bottom: 1px solid #D4D4D4; - padding: 5px 6px 5px 6px; -} - -.help-page-table td { - border-bottom: 1px solid #D4D4D4; - padding: 10px 8px 10px 8px; - vertical-align: top; -} - -.help-page-table pre, -.help-page-table p { - margin: 0px; - padding: 0px; - font-family: inherit; - font-size: 100%; -} - -.help-page-table tbody tr:hover td { - background-color: #F3F3F3; -} - -.help-page a:hover { - background-color: transparent; -} - -.help-page .sample-header { - border: 2px solid #D4D4D4; - background: #00497E; - color: #FFFFFF; - padding: 8px 15px; - border-bottom: none; - display: inline-block; - margin: 10px 0px 0px 0px; -} - -.help-page .sample-content { - display: block; - border-width: 0; - padding: 15px 20px; - background: #FFFFFF; - border: 2px solid #D4D4D4; - margin: 0px 0px 10px 0px; -} - -.help-page .api-name { - width: 40%; -} - -.help-page .api-documentation { - width: 60%; -} - -.help-page .parameter-name { - width: 20%; -} - -.help-page .parameter-documentation { - width: 40%; -} - -.help-page .parameter-type { - width: 20%; -} - -.help-page .parameter-annotations { - width: 20%; -} - -.help-page h1, -.help-page .h1 { - font-size: 36px; - line-height: normal; -} - -.help-page h2, -.help-page .h2 { - font-size: 24px; -} - -.help-page h3, -.help-page .h3 { - font-size: 20px; -} - -#body.help-page { - font-size: 14px; - line-height: 143%; - color: #333; -} - -.help-page a { - color: #0000EE; - text-decoration: none; -} diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPageAreaRegistration.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPageAreaRegistration.cs deleted file mode 100644 index 3052036d5f..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPageAreaRegistration.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Web.Http; -using System.Web.Mvc; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - public class HelpPageAreaRegistration : AreaRegistration - { - public override string AreaName - { - get - { - return "HelpPage"; - } - } - - public override void RegisterArea(AreaRegistrationContext context) - { - context.MapRoute( - "HelpPage_Default", - "Help/{action}/{apiId}", - new { controller = "Help", action = "Index", apiId = UrlParameter.Optional }); - - HelpPageConfig.Register(GlobalConfiguration.Configuration); - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPageConfigurationExtensions.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPageConfigurationExtensions.cs deleted file mode 100644 index d968847a6c..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/HelpPageConfigurationExtensions.cs +++ /dev/null @@ -1,467 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Linq; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Web.Http; -using System.Web.Http.Controllers; -using System.Web.Http.Description; -using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions; -using NSwag.Sample.NetOwin.Areas.HelpPage.Models; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - public static class HelpPageConfigurationExtensions - { - private const string ApiModelPrefix = "MS_HelpPageApiModel_"; - - /// - /// Sets the documentation provider for help page. - /// - /// The . - /// The documentation provider. - public static void SetDocumentationProvider(this HttpConfiguration config, IDocumentationProvider documentationProvider) - { - config.Services.Replace(typeof(IDocumentationProvider), documentationProvider); - } - - /// - /// Sets the objects that will be used by the formatters to produce sample requests/responses. - /// - /// The . - /// The sample objects. - public static void SetSampleObjects(this HttpConfiguration config, IDictionary sampleObjects) - { - config.GetHelpPageSampleGenerator().SampleObjects = sampleObjects; - } - - /// - /// Sets the sample request directly for the specified media type and action. - /// - /// The . - /// The sample request. - /// The media type. - /// Name of the controller. - /// Name of the action. - public static void SetSampleRequest(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType, string controllerName, string actionName) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType, SampleDirection.Request, controllerName, actionName, new[] { "*" }), sample); - } - - /// - /// Sets the sample request directly for the specified media type and action with parameters. - /// - /// The . - /// The sample request. - /// The media type. - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public static void SetSampleRequest(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType, string controllerName, string actionName, params string[] parameterNames) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType, SampleDirection.Request, controllerName, actionName, parameterNames), sample); - } - - /// - /// Sets the sample request directly for the specified media type of the action. - /// - /// The . - /// The sample response. - /// The media type. - /// Name of the controller. - /// Name of the action. - public static void SetSampleResponse(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType, string controllerName, string actionName) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType, SampleDirection.Response, controllerName, actionName, new[] { "*" }), sample); - } - - /// - /// Sets the sample response directly for the specified media type of the action with specific parameters. - /// - /// The . - /// The sample response. - /// The media type. - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public static void SetSampleResponse(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType, string controllerName, string actionName, params string[] parameterNames) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType, SampleDirection.Response, controllerName, actionName, parameterNames), sample); - } - - /// - /// Sets the sample directly for all actions with the specified media type. - /// - /// The . - /// The sample. - /// The media type. - public static void SetSampleForMediaType(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType), sample); - } - - /// - /// Sets the sample directly for all actions with the specified type and media type. - /// - /// The . - /// The sample. - /// The media type. - /// The parameter type or return type of an action. - public static void SetSampleForType(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType, Type type) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType, type), sample); - } - - /// - /// Specifies the actual type of passed to the in an action. - /// The help page will use this information to produce more accurate request samples. - /// - /// The . - /// The type. - /// Name of the controller. - /// Name of the action. - public static void SetActualRequestType(this HttpConfiguration config, Type type, string controllerName, string actionName) - { - config.GetHelpPageSampleGenerator().ActualHttpMessageTypes.Add(new HelpPageSampleKey(SampleDirection.Request, controllerName, actionName, new[] { "*" }), type); - } - - /// - /// Specifies the actual type of passed to the in an action. - /// The help page will use this information to produce more accurate request samples. - /// - /// The . - /// The type. - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public static void SetActualRequestType(this HttpConfiguration config, Type type, string controllerName, string actionName, params string[] parameterNames) - { - config.GetHelpPageSampleGenerator().ActualHttpMessageTypes.Add(new HelpPageSampleKey(SampleDirection.Request, controllerName, actionName, parameterNames), type); - } - - /// - /// Specifies the actual type of returned as part of the in an action. - /// The help page will use this information to produce more accurate response samples. - /// - /// The . - /// The type. - /// Name of the controller. - /// Name of the action. - public static void SetActualResponseType(this HttpConfiguration config, Type type, string controllerName, string actionName) - { - config.GetHelpPageSampleGenerator().ActualHttpMessageTypes.Add(new HelpPageSampleKey(SampleDirection.Response, controllerName, actionName, new[] { "*" }), type); - } - - /// - /// Specifies the actual type of returned as part of the in an action. - /// The help page will use this information to produce more accurate response samples. - /// - /// The . - /// The type. - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public static void SetActualResponseType(this HttpConfiguration config, Type type, string controllerName, string actionName, params string[] parameterNames) - { - config.GetHelpPageSampleGenerator().ActualHttpMessageTypes.Add(new HelpPageSampleKey(SampleDirection.Response, controllerName, actionName, parameterNames), type); - } - - /// - /// Gets the help page sample generator. - /// - /// The . - /// The help page sample generator. - public static HelpPageSampleGenerator GetHelpPageSampleGenerator(this HttpConfiguration config) - { - return (HelpPageSampleGenerator)config.Properties.GetOrAdd( - typeof(HelpPageSampleGenerator), - k => new HelpPageSampleGenerator()); - } - - /// - /// Sets the help page sample generator. - /// - /// The . - /// The help page sample generator. - public static void SetHelpPageSampleGenerator(this HttpConfiguration config, HelpPageSampleGenerator sampleGenerator) - { - config.Properties.AddOrUpdate( - typeof(HelpPageSampleGenerator), - k => sampleGenerator, - (k, o) => sampleGenerator); - } - - /// - /// Gets the model description generator. - /// - /// The configuration. - /// The - public static ModelDescriptionGenerator GetModelDescriptionGenerator(this HttpConfiguration config) - { - return (ModelDescriptionGenerator)config.Properties.GetOrAdd( - typeof(ModelDescriptionGenerator), - k => InitializeModelDescriptionGenerator(config)); - } - - /// - /// Gets the model that represents an API displayed on the help page. The model is initialized on the first call and cached for subsequent calls. - /// - /// The . - /// The ID. - /// - /// An - /// - public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration config, string apiDescriptionId) - { - object model; - string modelId = ApiModelPrefix + apiDescriptionId; - if (!config.Properties.TryGetValue(modelId, out model)) - { - Collection apiDescriptions = config.Services.GetApiExplorer().ApiDescriptions; - ApiDescription apiDescription = apiDescriptions.FirstOrDefault(api => String.Equals(api.GetFriendlyId(), apiDescriptionId, StringComparison.OrdinalIgnoreCase)); - if (apiDescription != null) - { - model = GenerateApiModel(apiDescription, config); - config.Properties.TryAdd(modelId, model); - } - } - - return (HelpPageApiModel)model; - } - - private static HelpPageApiModel GenerateApiModel(ApiDescription apiDescription, HttpConfiguration config) - { - HelpPageApiModel apiModel = new HelpPageApiModel() - { - ApiDescription = apiDescription, - }; - - ModelDescriptionGenerator modelGenerator = config.GetModelDescriptionGenerator(); - HelpPageSampleGenerator sampleGenerator = config.GetHelpPageSampleGenerator(); - GenerateUriParameters(apiModel, modelGenerator); - GenerateRequestModelDescription(apiModel, modelGenerator, sampleGenerator); - GenerateResourceDescription(apiModel, modelGenerator); - GenerateSamples(apiModel, sampleGenerator); - - return apiModel; - } - - private static void GenerateUriParameters(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator) - { - ApiDescription apiDescription = apiModel.ApiDescription; - foreach (ApiParameterDescription apiParameter in apiDescription.ParameterDescriptions) - { - if (apiParameter.Source == ApiParameterSource.FromUri) - { - HttpParameterDescriptor parameterDescriptor = apiParameter.ParameterDescriptor; - Type parameterType = null; - ModelDescription typeDescription = null; - ComplexTypeModelDescription complexTypeDescription = null; - if (parameterDescriptor != null) - { - parameterType = parameterDescriptor.ParameterType; - typeDescription = modelGenerator.GetOrCreateModelDescription(parameterType); - complexTypeDescription = typeDescription as ComplexTypeModelDescription; - } - - // Example: - // [TypeConverter(typeof(PointConverter))] - // public class Point - // { - // public Point(int x, int y) - // { - // X = x; - // Y = y; - // } - // public int X { get; set; } - // public int Y { get; set; } - // } - // Class Point is bindable with a TypeConverter, so Point will be added to UriParameters collection. - // - // public class Point - // { - // public int X { get; set; } - // public int Y { get; set; } - // } - // Regular complex class Point will have properties X and Y added to UriParameters collection. - if (complexTypeDescription != null - && !IsBindableWithTypeConverter(parameterType)) - { - foreach (ParameterDescription uriParameter in complexTypeDescription.Properties) - { - apiModel.UriParameters.Add(uriParameter); - } - } - else if (parameterDescriptor != null) - { - ParameterDescription uriParameter = - AddParameterDescription(apiModel, apiParameter, typeDescription); - - if (!parameterDescriptor.IsOptional) - { - uriParameter.Annotations.Add(new ParameterAnnotation() { Documentation = "Required" }); - } - - object defaultValue = parameterDescriptor.DefaultValue; - if (defaultValue != null) - { - uriParameter.Annotations.Add(new ParameterAnnotation() { Documentation = "Default value is " + Convert.ToString(defaultValue, CultureInfo.InvariantCulture) }); - } - } - else - { - Debug.Assert(parameterDescriptor == null); - - // If parameterDescriptor is null, this is an undeclared route parameter which only occurs - // when source is FromUri. Ignored in request model and among resource parameters but listed - // as a simple string here. - ModelDescription modelDescription = modelGenerator.GetOrCreateModelDescription(typeof(string)); - AddParameterDescription(apiModel, apiParameter, modelDescription); - } - } - } - } - - private static bool IsBindableWithTypeConverter(Type parameterType) - { - if (parameterType == null) - { - return false; - } - - return TypeDescriptor.GetConverter(parameterType).CanConvertFrom(typeof(string)); - } - - private static ParameterDescription AddParameterDescription(HelpPageApiModel apiModel, - ApiParameterDescription apiParameter, ModelDescription typeDescription) - { - ParameterDescription parameterDescription = new ParameterDescription - { - Name = apiParameter.Name, - Documentation = apiParameter.Documentation, - TypeDescription = typeDescription, - }; - - apiModel.UriParameters.Add(parameterDescription); - return parameterDescription; - } - - private static void GenerateRequestModelDescription(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator, HelpPageSampleGenerator sampleGenerator) - { - ApiDescription apiDescription = apiModel.ApiDescription; - foreach (ApiParameterDescription apiParameter in apiDescription.ParameterDescriptions) - { - if (apiParameter.Source == ApiParameterSource.FromBody) - { - Type parameterType = apiParameter.ParameterDescriptor.ParameterType; - apiModel.RequestModelDescription = modelGenerator.GetOrCreateModelDescription(parameterType); - apiModel.RequestDocumentation = apiParameter.Documentation; - } - else if (apiParameter.ParameterDescriptor != null && - apiParameter.ParameterDescriptor.ParameterType == typeof(HttpRequestMessage)) - { - Type parameterType = sampleGenerator.ResolveHttpRequestMessageType(apiDescription); - - if (parameterType != null) - { - apiModel.RequestModelDescription = modelGenerator.GetOrCreateModelDescription(parameterType); - } - } - } - } - - private static void GenerateResourceDescription(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator) - { - ResponseDescription response = apiModel.ApiDescription.ResponseDescription; - Type responseType = response.ResponseType ?? response.DeclaredType; - if (responseType != null && responseType != typeof(void)) - { - apiModel.ResourceDescription = modelGenerator.GetOrCreateModelDescription(responseType); - } - } - - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "The exception is recorded as ErrorMessages.")] - private static void GenerateSamples(HelpPageApiModel apiModel, HelpPageSampleGenerator sampleGenerator) - { - try - { - foreach (var item in sampleGenerator.GetSampleRequests(apiModel.ApiDescription)) - { - apiModel.SampleRequests.Add(item.Key, item.Value); - LogInvalidSampleAsError(apiModel, item.Value); - } - - foreach (var item in sampleGenerator.GetSampleResponses(apiModel.ApiDescription)) - { - apiModel.SampleResponses.Add(item.Key, item.Value); - LogInvalidSampleAsError(apiModel, item.Value); - } - } - catch (Exception e) - { - apiModel.ErrorMessages.Add(String.Format(CultureInfo.CurrentCulture, - "An exception has occurred while generating the sample. Exception message: {0}", - HelpPageSampleGenerator.UnwrapException(e).Message)); - } - } - - private static bool TryGetResourceParameter(ApiDescription apiDescription, HttpConfiguration config, out ApiParameterDescription parameterDescription, out Type resourceType) - { - parameterDescription = apiDescription.ParameterDescriptions.FirstOrDefault( - p => p.Source == ApiParameterSource.FromBody || - (p.ParameterDescriptor != null && p.ParameterDescriptor.ParameterType == typeof(HttpRequestMessage))); - - if (parameterDescription == null) - { - resourceType = null; - return false; - } - - resourceType = parameterDescription.ParameterDescriptor.ParameterType; - - if (resourceType == typeof(HttpRequestMessage)) - { - HelpPageSampleGenerator sampleGenerator = config.GetHelpPageSampleGenerator(); - resourceType = sampleGenerator.ResolveHttpRequestMessageType(apiDescription); - } - - if (resourceType == null) - { - parameterDescription = null; - return false; - } - - return true; - } - - private static ModelDescriptionGenerator InitializeModelDescriptionGenerator(HttpConfiguration config) - { - ModelDescriptionGenerator modelGenerator = new ModelDescriptionGenerator(config); - Collection apis = config.Services.GetApiExplorer().ApiDescriptions; - foreach (ApiDescription api in apis) - { - ApiParameterDescription parameterDescription; - Type parameterType; - if (TryGetResourceParameter(api, config, out parameterDescription, out parameterType)) - { - modelGenerator.GetOrCreateModelDescription(parameterType); - } - } - return modelGenerator; - } - - private static void LogInvalidSampleAsError(HelpPageApiModel apiModel, object sample) - { - InvalidSample invalidSample = sample as InvalidSample; - if (invalidSample != null) - { - apiModel.ErrorMessages.Add(invalidSample.ErrorMessage); - } - } - } -} diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/CollectionModelDescription.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/CollectionModelDescription.cs deleted file mode 100644 index 41ef4488b2..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/CollectionModelDescription.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - public class CollectionModelDescription : ModelDescription - { - public ModelDescription ElementDescription { get; set; } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ComplexTypeModelDescription.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ComplexTypeModelDescription.cs deleted file mode 100644 index 16024db5cf..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ComplexTypeModelDescription.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.ObjectModel; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - public class ComplexTypeModelDescription : ModelDescription - { - public ComplexTypeModelDescription() - { - Properties = new Collection(); - } - - public Collection Properties { get; private set; } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/DictionaryModelDescription.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/DictionaryModelDescription.cs deleted file mode 100644 index 43c99a7cf6..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/DictionaryModelDescription.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - public class DictionaryModelDescription : KeyValuePairModelDescription - { - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/EnumTypeModelDescription.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/EnumTypeModelDescription.cs deleted file mode 100644 index 3026e3013a..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/EnumTypeModelDescription.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - public class EnumTypeModelDescription : ModelDescription - { - public EnumTypeModelDescription() - { - Values = new Collection(); - } - - public Collection Values { get; private set; } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/EnumValueDescription.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/EnumValueDescription.cs deleted file mode 100644 index c6893ecb2a..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/EnumValueDescription.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - public class EnumValueDescription - { - public string Documentation { get; set; } - - public string Name { get; set; } - - public string Value { get; set; } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/IModelDocumentationProvider.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/IModelDocumentationProvider.cs deleted file mode 100644 index 260fc4fb91..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/IModelDocumentationProvider.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Reflection; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - public interface IModelDocumentationProvider - { - string GetDocumentation(MemberInfo member); - - string GetDocumentation(Type type); - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/KeyValuePairModelDescription.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/KeyValuePairModelDescription.cs deleted file mode 100644 index ab72a31596..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/KeyValuePairModelDescription.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - public class KeyValuePairModelDescription : ModelDescription - { - public ModelDescription KeyModelDescription { get; set; } - - public ModelDescription ValueModelDescription { get; set; } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelDescription.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelDescription.cs deleted file mode 100644 index 0231b20d9b..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelDescription.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - /// - /// Describes a type model. - /// - public abstract class ModelDescription - { - public string Documentation { get; set; } - - public Type ModelType { get; set; } - - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelDescriptionGenerator.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelDescriptionGenerator.cs deleted file mode 100644 index c2226dd848..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelDescriptionGenerator.cs +++ /dev/null @@ -1,451 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.ComponentModel.DataAnnotations; -using System.Globalization; -using System.Reflection; -using System.Runtime.Serialization; -using System.Web.Http; -using System.Web.Http.Description; -using System.Xml.Serialization; -using Newtonsoft.Json; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - /// - /// Generates model descriptions for given types. - /// - public class ModelDescriptionGenerator - { - // Modify this to support more data annotation attributes. - private readonly IDictionary> AnnotationTextGenerator = new Dictionary> - { - { typeof(RequiredAttribute), a => "Required" }, - { typeof(RangeAttribute), a => - { - RangeAttribute range = (RangeAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "Range: inclusive between {0} and {1}", range.Minimum, range.Maximum); - } - }, - { typeof(MaxLengthAttribute), a => - { - MaxLengthAttribute maxLength = (MaxLengthAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "Max length: {0}", maxLength.Length); - } - }, - { typeof(MinLengthAttribute), a => - { - MinLengthAttribute minLength = (MinLengthAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "Min length: {0}", minLength.Length); - } - }, - { typeof(StringLengthAttribute), a => - { - StringLengthAttribute strLength = (StringLengthAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "String length: inclusive between {0} and {1}", strLength.MinimumLength, strLength.MaximumLength); - } - }, - { typeof(DataTypeAttribute), a => - { - DataTypeAttribute dataType = (DataTypeAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "Data type: {0}", dataType.CustomDataType ?? dataType.DataType.ToString()); - } - }, - { typeof(RegularExpressionAttribute), a => - { - RegularExpressionAttribute regularExpression = (RegularExpressionAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "Matching regular expression pattern: {0}", regularExpression.Pattern); - } - }, - }; - - // Modify this to add more default documentations. - private readonly IDictionary DefaultTypeDocumentation = new Dictionary - { - { typeof(Int16), "integer" }, - { typeof(Int32), "integer" }, - { typeof(Int64), "integer" }, - { typeof(UInt16), "unsigned integer" }, - { typeof(UInt32), "unsigned integer" }, - { typeof(UInt64), "unsigned integer" }, - { typeof(Byte), "byte" }, - { typeof(Char), "character" }, - { typeof(SByte), "signed byte" }, - { typeof(Uri), "URI" }, - { typeof(Single), "decimal number" }, - { typeof(Double), "decimal number" }, - { typeof(Decimal), "decimal number" }, - { typeof(String), "string" }, - { typeof(Guid), "globally unique identifier" }, - { typeof(TimeSpan), "time interval" }, - { typeof(DateTime), "date" }, - { typeof(DateTimeOffset), "date" }, - { typeof(Boolean), "boolean" }, - }; - - private Lazy _documentationProvider; - - public ModelDescriptionGenerator(HttpConfiguration config) - { - if (config == null) - { - throw new ArgumentNullException("config"); - } - - _documentationProvider = new Lazy(() => config.Services.GetDocumentationProvider() as IModelDocumentationProvider); - GeneratedModels = new Dictionary(StringComparer.OrdinalIgnoreCase); - } - - public Dictionary GeneratedModels { get; private set; } - - private IModelDocumentationProvider DocumentationProvider - { - get - { - return _documentationProvider.Value; - } - } - - public ModelDescription GetOrCreateModelDescription(Type modelType) - { - if (modelType == null) - { - throw new ArgumentNullException("modelType"); - } - - Type underlyingType = Nullable.GetUnderlyingType(modelType); - if (underlyingType != null) - { - modelType = underlyingType; - } - - ModelDescription modelDescription; - string modelName = ModelNameHelper.GetModelName(modelType); - if (GeneratedModels.TryGetValue(modelName, out modelDescription)) - { - if (modelType != modelDescription.ModelType) - { - throw new InvalidOperationException( - String.Format( - CultureInfo.CurrentCulture, - "A model description could not be created. Duplicate model name '{0}' was found for types '{1}' and '{2}'. " + - "Use the [ModelName] attribute to change the model name for at least one of the types so that it has a unique name.", - modelName, - modelDescription.ModelType.FullName, - modelType.FullName)); - } - - return modelDescription; - } - - if (DefaultTypeDocumentation.ContainsKey(modelType)) - { - return GenerateSimpleTypeModelDescription(modelType); - } - - if (modelType.IsEnum) - { - return GenerateEnumTypeModelDescription(modelType); - } - - if (modelType.IsGenericType) - { - Type[] genericArguments = modelType.GetGenericArguments(); - - if (genericArguments.Length == 1) - { - Type enumerableType = typeof(IEnumerable<>).MakeGenericType(genericArguments); - if (enumerableType.IsAssignableFrom(modelType)) - { - return GenerateCollectionModelDescription(modelType, genericArguments[0]); - } - } - if (genericArguments.Length == 2) - { - Type dictionaryType = typeof(IDictionary<,>).MakeGenericType(genericArguments); - if (dictionaryType.IsAssignableFrom(modelType)) - { - return GenerateDictionaryModelDescription(modelType, genericArguments[0], genericArguments[1]); - } - - Type keyValuePairType = typeof(KeyValuePair<,>).MakeGenericType(genericArguments); - if (keyValuePairType.IsAssignableFrom(modelType)) - { - return GenerateKeyValuePairModelDescription(modelType, genericArguments[0], genericArguments[1]); - } - } - } - - if (modelType.IsArray) - { - Type elementType = modelType.GetElementType(); - return GenerateCollectionModelDescription(modelType, elementType); - } - - if (modelType == typeof(NameValueCollection)) - { - return GenerateDictionaryModelDescription(modelType, typeof(string), typeof(string)); - } - - if (typeof(IDictionary).IsAssignableFrom(modelType)) - { - return GenerateDictionaryModelDescription(modelType, typeof(object), typeof(object)); - } - - if (typeof(IEnumerable).IsAssignableFrom(modelType)) - { - return GenerateCollectionModelDescription(modelType, typeof(object)); - } - - return GenerateComplexTypeModelDescription(modelType); - } - - // Change this to provide different name for the member. - private static string GetMemberName(MemberInfo member, bool hasDataContractAttribute) - { - JsonPropertyAttribute jsonProperty = member.GetCustomAttribute(); - if (jsonProperty != null && !String.IsNullOrEmpty(jsonProperty.PropertyName)) - { - return jsonProperty.PropertyName; - } - - if (hasDataContractAttribute) - { - DataMemberAttribute dataMember = member.GetCustomAttribute(); - if (dataMember != null && !String.IsNullOrEmpty(dataMember.Name)) - { - return dataMember.Name; - } - } - - return member.Name; - } - - private static bool ShouldDisplayMember(MemberInfo member, bool hasDataContractAttribute) - { - JsonIgnoreAttribute jsonIgnore = member.GetCustomAttribute(); - XmlIgnoreAttribute xmlIgnore = member.GetCustomAttribute(); - IgnoreDataMemberAttribute ignoreDataMember = member.GetCustomAttribute(); - NonSerializedAttribute nonSerialized = member.GetCustomAttribute(); - ApiExplorerSettingsAttribute apiExplorerSetting = member.GetCustomAttribute(); - - bool hasMemberAttribute = member.DeclaringType.IsEnum ? - member.GetCustomAttribute() != null : - member.GetCustomAttribute() != null; - - // Display member only if all the followings are true: - // no JsonIgnoreAttribute - // no XmlIgnoreAttribute - // no IgnoreDataMemberAttribute - // no NonSerializedAttribute - // no ApiExplorerSettingsAttribute with IgnoreApi set to true - // no DataContractAttribute without DataMemberAttribute or EnumMemberAttribute - return jsonIgnore == null && - xmlIgnore == null && - ignoreDataMember == null && - nonSerialized == null && - (apiExplorerSetting == null || !apiExplorerSetting.IgnoreApi) && - (!hasDataContractAttribute || hasMemberAttribute); - } - - private string CreateDefaultDocumentation(Type type) - { - string documentation; - if (DefaultTypeDocumentation.TryGetValue(type, out documentation)) - { - return documentation; - } - if (DocumentationProvider != null) - { - documentation = DocumentationProvider.GetDocumentation(type); - } - - return documentation; - } - - private void GenerateAnnotations(MemberInfo property, ParameterDescription propertyModel) - { - List annotations = new List(); - - IEnumerable attributes = property.GetCustomAttributes(); - foreach (Attribute attribute in attributes) - { - Func textGenerator; - if (AnnotationTextGenerator.TryGetValue(attribute.GetType(), out textGenerator)) - { - annotations.Add( - new ParameterAnnotation - { - AnnotationAttribute = attribute, - Documentation = textGenerator(attribute) - }); - } - } - - // Rearrange the annotations - annotations.Sort((x, y) => - { - // Special-case RequiredAttribute so that it shows up on top - if (x.AnnotationAttribute is RequiredAttribute) - { - return -1; - } - if (y.AnnotationAttribute is RequiredAttribute) - { - return 1; - } - - // Sort the rest based on alphabetic order of the documentation - return String.Compare(x.Documentation, y.Documentation, StringComparison.OrdinalIgnoreCase); - }); - - foreach (ParameterAnnotation annotation in annotations) - { - propertyModel.Annotations.Add(annotation); - } - } - - private CollectionModelDescription GenerateCollectionModelDescription(Type modelType, Type elementType) - { - ModelDescription collectionModelDescription = GetOrCreateModelDescription(elementType); - if (collectionModelDescription != null) - { - return new CollectionModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - ElementDescription = collectionModelDescription - }; - } - - return null; - } - - private ModelDescription GenerateComplexTypeModelDescription(Type modelType) - { - ComplexTypeModelDescription complexModelDescription = new ComplexTypeModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - Documentation = CreateDefaultDocumentation(modelType) - }; - - GeneratedModels.Add(complexModelDescription.Name, complexModelDescription); - bool hasDataContractAttribute = modelType.GetCustomAttribute() != null; - PropertyInfo[] properties = modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance); - foreach (PropertyInfo property in properties) - { - if (ShouldDisplayMember(property, hasDataContractAttribute)) - { - ParameterDescription propertyModel = new ParameterDescription - { - Name = GetMemberName(property, hasDataContractAttribute) - }; - - if (DocumentationProvider != null) - { - propertyModel.Documentation = DocumentationProvider.GetDocumentation(property); - } - - GenerateAnnotations(property, propertyModel); - complexModelDescription.Properties.Add(propertyModel); - propertyModel.TypeDescription = GetOrCreateModelDescription(property.PropertyType); - } - } - - FieldInfo[] fields = modelType.GetFields(BindingFlags.Public | BindingFlags.Instance); - foreach (FieldInfo field in fields) - { - if (ShouldDisplayMember(field, hasDataContractAttribute)) - { - ParameterDescription propertyModel = new ParameterDescription - { - Name = GetMemberName(field, hasDataContractAttribute) - }; - - if (DocumentationProvider != null) - { - propertyModel.Documentation = DocumentationProvider.GetDocumentation(field); - } - - complexModelDescription.Properties.Add(propertyModel); - propertyModel.TypeDescription = GetOrCreateModelDescription(field.FieldType); - } - } - - return complexModelDescription; - } - - private DictionaryModelDescription GenerateDictionaryModelDescription(Type modelType, Type keyType, Type valueType) - { - ModelDescription keyModelDescription = GetOrCreateModelDescription(keyType); - ModelDescription valueModelDescription = GetOrCreateModelDescription(valueType); - - return new DictionaryModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - KeyModelDescription = keyModelDescription, - ValueModelDescription = valueModelDescription - }; - } - - private EnumTypeModelDescription GenerateEnumTypeModelDescription(Type modelType) - { - EnumTypeModelDescription enumDescription = new EnumTypeModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - Documentation = CreateDefaultDocumentation(modelType) - }; - bool hasDataContractAttribute = modelType.GetCustomAttribute() != null; - foreach (FieldInfo field in modelType.GetFields(BindingFlags.Public | BindingFlags.Static)) - { - if (ShouldDisplayMember(field, hasDataContractAttribute)) - { - EnumValueDescription enumValue = new EnumValueDescription - { - Name = field.Name, - Value = field.GetRawConstantValue().ToString() - }; - if (DocumentationProvider != null) - { - enumValue.Documentation = DocumentationProvider.GetDocumentation(field); - } - enumDescription.Values.Add(enumValue); - } - } - GeneratedModels.Add(enumDescription.Name, enumDescription); - - return enumDescription; - } - - private KeyValuePairModelDescription GenerateKeyValuePairModelDescription(Type modelType, Type keyType, Type valueType) - { - ModelDescription keyModelDescription = GetOrCreateModelDescription(keyType); - ModelDescription valueModelDescription = GetOrCreateModelDescription(valueType); - - return new KeyValuePairModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - KeyModelDescription = keyModelDescription, - ValueModelDescription = valueModelDescription - }; - } - - private ModelDescription GenerateSimpleTypeModelDescription(Type modelType) - { - SimpleTypeModelDescription simpleModelDescription = new SimpleTypeModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - Documentation = CreateDefaultDocumentation(modelType) - }; - GeneratedModels.Add(simpleModelDescription.Name, simpleModelDescription); - - return simpleModelDescription; - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelNameAttribute.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelNameAttribute.cs deleted file mode 100644 index 99e851017d..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelNameAttribute.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - /// - /// Use this attribute to change the name of the generated for a type. - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum, AllowMultiple = false, Inherited = false)] - public sealed class ModelNameAttribute : Attribute - { - public ModelNameAttribute(string name) - { - Name = name; - } - - public string Name { get; private set; } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelNameHelper.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelNameHelper.cs deleted file mode 100644 index afee86fc63..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ModelNameHelper.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Globalization; -using System.Linq; -using System.Reflection; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - internal static class ModelNameHelper - { - // Modify this to provide custom model name mapping. - public static string GetModelName(Type type) - { - ModelNameAttribute modelNameAttribute = type.GetCustomAttribute(); - if (modelNameAttribute != null && !String.IsNullOrEmpty(modelNameAttribute.Name)) - { - return modelNameAttribute.Name; - } - - string modelName = type.Name; - if (type.IsGenericType) - { - // Format the generic type name to something like: GenericOfAgurment1AndArgument2 - Type genericType = type.GetGenericTypeDefinition(); - Type[] genericArguments = type.GetGenericArguments(); - string genericTypeName = genericType.Name; - - // Trim the generic parameter counts from the name - genericTypeName = genericTypeName.Substring(0, genericTypeName.IndexOf('`')); - string[] argumentTypeNames = genericArguments.Select(t => GetModelName(t)).ToArray(); - modelName = String.Format(CultureInfo.InvariantCulture, "{0}Of{1}", genericTypeName, String.Join("And", argumentTypeNames)); - } - - return modelName; - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ParameterAnnotation.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ParameterAnnotation.cs deleted file mode 100644 index 6986f238c9..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ParameterAnnotation.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - public class ParameterAnnotation - { - public Attribute AnnotationAttribute { get; set; } - - public string Documentation { get; set; } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ParameterDescription.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ParameterDescription.cs deleted file mode 100644 index 979bba6bad..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/ParameterDescription.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - public class ParameterDescription - { - public ParameterDescription() - { - Annotations = new Collection(); - } - - public Collection Annotations { get; private set; } - - public string Documentation { get; set; } - - public string Name { get; set; } - - public ModelDescription TypeDescription { get; set; } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/SimpleTypeModelDescription.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/SimpleTypeModelDescription.cs deleted file mode 100644 index 7f054fadd8..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/ModelDescriptions/SimpleTypeModelDescription.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -{ - public class SimpleTypeModelDescription : ModelDescription - { - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Models/HelpPageApiModel.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Models/HelpPageApiModel.cs deleted file mode 100644 index 6c6a1758eb..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Models/HelpPageApiModel.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Net.Http.Headers; -using System.Web.Http.Description; -using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage.Models -{ - /// - /// The model that represents an API displayed on the help page. - /// - public class HelpPageApiModel - { - /// - /// Initializes a new instance of the class. - /// - public HelpPageApiModel() - { - UriParameters = new Collection(); - SampleRequests = new Dictionary(); - SampleResponses = new Dictionary(); - ErrorMessages = new Collection(); - } - - /// - /// Gets or sets the that describes the API. - /// - public ApiDescription ApiDescription { get; set; } - - /// - /// Gets or sets the collection that describes the URI parameters for the API. - /// - public Collection UriParameters { get; private set; } - - /// - /// Gets or sets the documentation for the request. - /// - public string RequestDocumentation { get; set; } - - /// - /// Gets or sets the that describes the request body. - /// - public ModelDescription RequestModelDescription { get; set; } - - /// - /// Gets the request body parameter descriptions. - /// - public IList RequestBodyParameters - { - get - { - return GetParameterDescriptions(RequestModelDescription); - } - } - - /// - /// Gets or sets the that describes the resource. - /// - public ModelDescription ResourceDescription { get; set; } - - /// - /// Gets the resource property descriptions. - /// - public IList ResourceProperties - { - get - { - return GetParameterDescriptions(ResourceDescription); - } - } - - /// - /// Gets the sample requests associated with the API. - /// - public IDictionary SampleRequests { get; private set; } - - /// - /// Gets the sample responses associated with the API. - /// - public IDictionary SampleResponses { get; private set; } - - /// - /// Gets the error messages associated with this model. - /// - public Collection ErrorMessages { get; private set; } - - private static IList GetParameterDescriptions(ModelDescription modelDescription) - { - ComplexTypeModelDescription complexTypeModelDescription = modelDescription as ComplexTypeModelDescription; - if (complexTypeModelDescription != null) - { - return complexTypeModelDescription.Properties; - } - - CollectionModelDescription collectionModelDescription = modelDescription as CollectionModelDescription; - if (collectionModelDescription != null) - { - complexTypeModelDescription = collectionModelDescription.ElementDescription as ComplexTypeModelDescription; - if (complexTypeModelDescription != null) - { - return complexTypeModelDescription.Properties; - } - } - - return null; - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/HelpPageSampleGenerator.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/HelpPageSampleGenerator.cs deleted file mode 100644 index 15712800b4..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/HelpPageSampleGenerator.cs +++ /dev/null @@ -1,444 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Net.Http.Formatting; -using System.Net.Http.Headers; -using System.Web.Http.Description; -using System.Xml.Linq; -using Newtonsoft.Json; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - /// - /// This class will generate the samples for the help page. - /// - public class HelpPageSampleGenerator - { - /// - /// Initializes a new instance of the class. - /// - public HelpPageSampleGenerator() - { - ActualHttpMessageTypes = new Dictionary(); - ActionSamples = new Dictionary(); - SampleObjects = new Dictionary(); - SampleObjectFactories = new List> - { - DefaultSampleObjectFactory, - }; - } - - /// - /// Gets CLR types that are used as the content of or . - /// - public IDictionary ActualHttpMessageTypes { get; internal set; } - - /// - /// Gets the objects that are used directly as samples for certain actions. - /// - public IDictionary ActionSamples { get; internal set; } - - /// - /// Gets the objects that are serialized as samples by the supported formatters. - /// - public IDictionary SampleObjects { get; internal set; } - - /// - /// Gets factories for the objects that the supported formatters will serialize as samples. Processed in order, - /// stopping when the factory successfully returns a non- object. - /// - /// - /// Collection includes just initially. Use - /// SampleObjectFactories.Insert(0, func) to provide an override and - /// SampleObjectFactories.Add(func) to provide a fallback. - [SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", - Justification = "This is an appropriate nesting of generic types")] - public IList> SampleObjectFactories { get; private set; } - - /// - /// Gets the request body samples for a given . - /// - /// The . - /// The samples keyed by media type. - public IDictionary GetSampleRequests(ApiDescription api) - { - return GetSample(api, SampleDirection.Request); - } - - /// - /// Gets the response body samples for a given . - /// - /// The . - /// The samples keyed by media type. - public IDictionary GetSampleResponses(ApiDescription api) - { - return GetSample(api, SampleDirection.Response); - } - - /// - /// Gets the request or response body samples. - /// - /// The . - /// The value indicating whether the sample is for a request or for a response. - /// The samples keyed by media type. - public virtual IDictionary GetSample(ApiDescription api, SampleDirection sampleDirection) - { - if (api == null) - { - throw new ArgumentNullException("api"); - } - string controllerName = api.ActionDescriptor.ControllerDescriptor.ControllerName; - string actionName = api.ActionDescriptor.ActionName; - IEnumerable parameterNames = api.ParameterDescriptions.Select(p => p.Name); - Collection formatters; - Type type = ResolveType(api, controllerName, actionName, parameterNames, sampleDirection, out formatters); - var samples = new Dictionary(); - - // Use the samples provided directly for actions - var actionSamples = GetAllActionSamples(controllerName, actionName, parameterNames, sampleDirection); - foreach (var actionSample in actionSamples) - { - samples.Add(actionSample.Key.MediaType, WrapSampleIfString(actionSample.Value)); - } - - // Do the sample generation based on formatters only if an action doesn't return an HttpResponseMessage. - // Here we cannot rely on formatters because we don't know what's in the HttpResponseMessage, it might not even use formatters. - if (type != null && !typeof(HttpResponseMessage).IsAssignableFrom(type)) - { - object sampleObject = GetSampleObject(type); - foreach (var formatter in formatters) - { - foreach (MediaTypeHeaderValue mediaType in formatter.SupportedMediaTypes) - { - if (!samples.ContainsKey(mediaType)) - { - object sample = GetActionSample(controllerName, actionName, parameterNames, type, formatter, mediaType, sampleDirection); - - // If no sample found, try generate sample using formatter and sample object - if (sample == null && sampleObject != null) - { - sample = WriteSampleObjectUsingFormatter(formatter, sampleObject, type, mediaType); - } - - samples.Add(mediaType, WrapSampleIfString(sample)); - } - } - } - } - - return samples; - } - - /// - /// Search for samples that are provided directly through . - /// - /// Name of the controller. - /// Name of the action. - /// The parameter names. - /// The CLR type. - /// The formatter. - /// The media type. - /// The value indicating whether the sample is for a request or for a response. - /// The sample that matches the parameters. - public virtual object GetActionSample(string controllerName, string actionName, IEnumerable parameterNames, Type type, MediaTypeFormatter formatter, MediaTypeHeaderValue mediaType, SampleDirection sampleDirection) - { - object sample; - - // First, try to get the sample provided for the specified mediaType, sampleDirection, controllerName, actionName and parameterNames. - // If not found, try to get the sample provided for the specified mediaType, sampleDirection, controllerName and actionName regardless of the parameterNames. - // If still not found, try to get the sample provided for the specified mediaType and type. - // Finally, try to get the sample provided for the specified mediaType. - if (ActionSamples.TryGetValue(new HelpPageSampleKey(mediaType, sampleDirection, controllerName, actionName, parameterNames), out sample) || - ActionSamples.TryGetValue(new HelpPageSampleKey(mediaType, sampleDirection, controllerName, actionName, new[] { "*" }), out sample) || - ActionSamples.TryGetValue(new HelpPageSampleKey(mediaType, type), out sample) || - ActionSamples.TryGetValue(new HelpPageSampleKey(mediaType), out sample)) - { - return sample; - } - - return null; - } - - /// - /// Gets the sample object that will be serialized by the formatters. - /// First, it will look at the . If no sample object is found, it will try to create - /// one using (which wraps an ) and other - /// factories in . - /// - /// The type. - /// The sample object. - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", - Justification = "Even if all items in SampleObjectFactories throw, problem will be visible as missing sample.")] - public virtual object GetSampleObject(Type type) - { - object sampleObject; - - if (!SampleObjects.TryGetValue(type, out sampleObject)) - { - // No specific object available, try our factories. - foreach (Func factory in SampleObjectFactories) - { - if (factory == null) - { - continue; - } - - try - { - sampleObject = factory(this, type); - if (sampleObject != null) - { - break; - } - } - catch - { - // Ignore any problems encountered in the factory; go on to the next one (if any). - } - } - } - - return sampleObject; - } - - /// - /// Resolves the actual type of passed to the in an action. - /// - /// The . - /// The type. - public virtual Type ResolveHttpRequestMessageType(ApiDescription api) - { - string controllerName = api.ActionDescriptor.ControllerDescriptor.ControllerName; - string actionName = api.ActionDescriptor.ActionName; - IEnumerable parameterNames = api.ParameterDescriptions.Select(p => p.Name); - Collection formatters; - return ResolveType(api, controllerName, actionName, parameterNames, SampleDirection.Request, out formatters); - } - - /// - /// Resolves the type of the action parameter or return value when or is used. - /// - /// The . - /// Name of the controller. - /// Name of the action. - /// The parameter names. - /// The value indicating whether the sample is for a request or a response. - /// The formatters. - [SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", Justification = "This is only used in advanced scenarios.")] - public virtual Type ResolveType(ApiDescription api, string controllerName, string actionName, IEnumerable parameterNames, SampleDirection sampleDirection, out Collection formatters) - { - if (!Enum.IsDefined(typeof(SampleDirection), sampleDirection)) - { - throw new InvalidEnumArgumentException("sampleDirection", (int)sampleDirection, typeof(SampleDirection)); - } - if (api == null) - { - throw new ArgumentNullException("api"); - } - Type type; - if (ActualHttpMessageTypes.TryGetValue(new HelpPageSampleKey(sampleDirection, controllerName, actionName, parameterNames), out type) || - ActualHttpMessageTypes.TryGetValue(new HelpPageSampleKey(sampleDirection, controllerName, actionName, new[] { "*" }), out type)) - { - // Re-compute the supported formatters based on type - Collection newFormatters = new Collection(); - foreach (var formatter in api.ActionDescriptor.Configuration.Formatters) - { - if (IsFormatSupported(sampleDirection, formatter, type)) - { - newFormatters.Add(formatter); - } - } - formatters = newFormatters; - } - else - { - switch (sampleDirection) - { - case SampleDirection.Request: - ApiParameterDescription requestBodyParameter = api.ParameterDescriptions.FirstOrDefault(p => p.Source == ApiParameterSource.FromBody); - type = requestBodyParameter == null ? null : requestBodyParameter.ParameterDescriptor.ParameterType; - formatters = api.SupportedRequestBodyFormatters; - break; - case SampleDirection.Response: - default: - type = api.ResponseDescription.ResponseType ?? api.ResponseDescription.DeclaredType; - formatters = api.SupportedResponseFormatters; - break; - } - } - - return type; - } - - /// - /// Writes the sample object using formatter. - /// - /// The formatter. - /// The value. - /// The type. - /// Type of the media. - /// - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "The exception is recorded as InvalidSample.")] - public virtual object WriteSampleObjectUsingFormatter(MediaTypeFormatter formatter, object value, Type type, MediaTypeHeaderValue mediaType) - { - if (formatter == null) - { - throw new ArgumentNullException("formatter"); - } - if (mediaType == null) - { - throw new ArgumentNullException("mediaType"); - } - - object sample = String.Empty; - MemoryStream ms = null; - HttpContent content = null; - try - { - if (formatter.CanWriteType(type)) - { - ms = new MemoryStream(); - content = new ObjectContent(type, value, formatter, mediaType); - formatter.WriteToStreamAsync(type, value, ms, content, null).Wait(); - ms.Position = 0; - StreamReader reader = new StreamReader(ms); - string serializedSampleString = reader.ReadToEnd(); - if (mediaType.MediaType.ToUpperInvariant().Contains("XML")) - { - serializedSampleString = TryFormatXml(serializedSampleString); - } - else if (mediaType.MediaType.ToUpperInvariant().Contains("JSON")) - { - serializedSampleString = TryFormatJson(serializedSampleString); - } - - sample = new TextSample(serializedSampleString); - } - else - { - sample = new InvalidSample(String.Format( - CultureInfo.CurrentCulture, - "Failed to generate the sample for media type '{0}'. Cannot use formatter '{1}' to write type '{2}'.", - mediaType, - formatter.GetType().Name, - type.Name)); - } - } - catch (Exception e) - { - sample = new InvalidSample(String.Format( - CultureInfo.CurrentCulture, - "An exception has occurred while using the formatter '{0}' to generate sample for media type '{1}'. Exception message: {2}", - formatter.GetType().Name, - mediaType.MediaType, - UnwrapException(e).Message)); - } - finally - { - if (ms != null) - { - ms.Dispose(); - } - if (content != null) - { - content.Dispose(); - } - } - - return sample; - } - - internal static Exception UnwrapException(Exception exception) - { - AggregateException aggregateException = exception as AggregateException; - if (aggregateException != null) - { - return aggregateException.Flatten().InnerException; - } - return exception; - } - - // Default factory for sample objects - private static object DefaultSampleObjectFactory(HelpPageSampleGenerator sampleGenerator, Type type) - { - // Try to create a default sample object - ObjectGenerator objectGenerator = new ObjectGenerator(); - return objectGenerator.GenerateObject(type); - } - - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Handling the failure by returning the original string.")] - private static string TryFormatJson(string str) - { - try - { - object parsedJson = JsonConvert.DeserializeObject(str); - return JsonConvert.SerializeObject(parsedJson, Formatting.Indented); - } - catch - { - // can't parse JSON, return the original string - return str; - } - } - - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Handling the failure by returning the original string.")] - private static string TryFormatXml(string str) - { - try - { - XDocument xml = XDocument.Parse(str); - return xml.ToString(); - } - catch - { - // can't parse XML, return the original string - return str; - } - } - - private static bool IsFormatSupported(SampleDirection sampleDirection, MediaTypeFormatter formatter, Type type) - { - switch (sampleDirection) - { - case SampleDirection.Request: - return formatter.CanReadType(type); - case SampleDirection.Response: - return formatter.CanWriteType(type); - } - return false; - } - - private IEnumerable> GetAllActionSamples(string controllerName, string actionName, IEnumerable parameterNames, SampleDirection sampleDirection) - { - HashSet parameterNamesSet = new HashSet(parameterNames, StringComparer.OrdinalIgnoreCase); - foreach (var sample in ActionSamples) - { - HelpPageSampleKey sampleKey = sample.Key; - if (String.Equals(controllerName, sampleKey.ControllerName, StringComparison.OrdinalIgnoreCase) && - String.Equals(actionName, sampleKey.ActionName, StringComparison.OrdinalIgnoreCase) && - (sampleKey.ParameterNames.SetEquals(new[] { "*" }) || parameterNamesSet.SetEquals(sampleKey.ParameterNames)) && - sampleDirection == sampleKey.SampleDirection) - { - yield return sample; - } - } - } - - private static object WrapSampleIfString(object sample) - { - string stringSample = sample as string; - if (stringSample != null) - { - return new TextSample(stringSample); - } - - return sample; - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/HelpPageSampleKey.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/HelpPageSampleKey.cs deleted file mode 100644 index 1c8c070e42..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/HelpPageSampleKey.cs +++ /dev/null @@ -1,172 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Net.Http.Headers; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - /// - /// This is used to identify the place where the sample should be applied. - /// - public class HelpPageSampleKey - { - /// - /// Creates a new based on media type. - /// - /// The media type. - public HelpPageSampleKey(MediaTypeHeaderValue mediaType) - { - if (mediaType == null) - { - throw new ArgumentNullException("mediaType"); - } - - ActionName = String.Empty; - ControllerName = String.Empty; - MediaType = mediaType; - ParameterNames = new HashSet(StringComparer.OrdinalIgnoreCase); - } - - /// - /// Creates a new based on media type and CLR type. - /// - /// The media type. - /// The CLR type. - public HelpPageSampleKey(MediaTypeHeaderValue mediaType, Type type) - : this(mediaType) - { - if (type == null) - { - throw new ArgumentNullException("type"); - } - - ParameterType = type; - } - - /// - /// Creates a new based on , controller name, action name and parameter names. - /// - /// The . - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public HelpPageSampleKey(SampleDirection sampleDirection, string controllerName, string actionName, IEnumerable parameterNames) - { - if (!Enum.IsDefined(typeof(SampleDirection), sampleDirection)) - { - throw new InvalidEnumArgumentException("sampleDirection", (int)sampleDirection, typeof(SampleDirection)); - } - if (controllerName == null) - { - throw new ArgumentNullException("controllerName"); - } - if (actionName == null) - { - throw new ArgumentNullException("actionName"); - } - if (parameterNames == null) - { - throw new ArgumentNullException("parameterNames"); - } - - ControllerName = controllerName; - ActionName = actionName; - ParameterNames = new HashSet(parameterNames, StringComparer.OrdinalIgnoreCase); - SampleDirection = sampleDirection; - } - - /// - /// Creates a new based on media type, , controller name, action name and parameter names. - /// - /// The media type. - /// The . - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public HelpPageSampleKey(MediaTypeHeaderValue mediaType, SampleDirection sampleDirection, string controllerName, string actionName, IEnumerable parameterNames) - : this(sampleDirection, controllerName, actionName, parameterNames) - { - if (mediaType == null) - { - throw new ArgumentNullException("mediaType"); - } - - MediaType = mediaType; - } - - /// - /// Gets the name of the controller. - /// - /// - /// The name of the controller. - /// - public string ControllerName { get; private set; } - - /// - /// Gets the name of the action. - /// - /// - /// The name of the action. - /// - public string ActionName { get; private set; } - - /// - /// Gets the media type. - /// - /// - /// The media type. - /// - public MediaTypeHeaderValue MediaType { get; private set; } - - /// - /// Gets the parameter names. - /// - public HashSet ParameterNames { get; private set; } - - public Type ParameterType { get; private set; } - - /// - /// Gets the . - /// - public SampleDirection? SampleDirection { get; private set; } - - public override bool Equals(object obj) - { - HelpPageSampleKey otherKey = obj as HelpPageSampleKey; - if (otherKey == null) - { - return false; - } - - return String.Equals(ControllerName, otherKey.ControllerName, StringComparison.OrdinalIgnoreCase) && - String.Equals(ActionName, otherKey.ActionName, StringComparison.OrdinalIgnoreCase) && - (MediaType == otherKey.MediaType || (MediaType != null && MediaType.Equals(otherKey.MediaType))) && - ParameterType == otherKey.ParameterType && - SampleDirection == otherKey.SampleDirection && - ParameterNames.SetEquals(otherKey.ParameterNames); - } - - public override int GetHashCode() - { - int hashCode = ControllerName.ToUpperInvariant().GetHashCode() ^ ActionName.ToUpperInvariant().GetHashCode(); - if (MediaType != null) - { - hashCode ^= MediaType.GetHashCode(); - } - if (SampleDirection != null) - { - hashCode ^= SampleDirection.GetHashCode(); - } - if (ParameterType != null) - { - hashCode ^= ParameterType.GetHashCode(); - } - foreach (string parameterName in ParameterNames) - { - hashCode ^= parameterName.ToUpperInvariant().GetHashCode(); - } - - return hashCode; - } - } -} diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/ImageSample.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/ImageSample.cs deleted file mode 100644 index 843e768628..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/ImageSample.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - /// - /// This represents an image sample on the help page. There's a display template named ImageSample associated with this class. - /// - public class ImageSample - { - /// - /// Initializes a new instance of the class. - /// - /// The URL of an image. - public ImageSample(string src) - { - if (src == null) - { - throw new ArgumentNullException("src"); - } - Src = src; - } - - public string Src { get; private set; } - - public override bool Equals(object obj) - { - ImageSample other = obj as ImageSample; - return other != null && Src == other.Src; - } - - public override int GetHashCode() - { - return Src.GetHashCode(); - } - - public override string ToString() - { - return Src; - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/InvalidSample.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/InvalidSample.cs deleted file mode 100644 index 735e9b3a3d..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/InvalidSample.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - /// - /// This represents an invalid sample on the help page. There's a display template named InvalidSample associated with this class. - /// - public class InvalidSample - { - public InvalidSample(string errorMessage) - { - if (errorMessage == null) - { - throw new ArgumentNullException("errorMessage"); - } - ErrorMessage = errorMessage; - } - - public string ErrorMessage { get; private set; } - - public override bool Equals(object obj) - { - InvalidSample other = obj as InvalidSample; - return other != null && ErrorMessage == other.ErrorMessage; - } - - public override int GetHashCode() - { - return ErrorMessage.GetHashCode(); - } - - public override string ToString() - { - return ErrorMessage; - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/ObjectGenerator.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/ObjectGenerator.cs deleted file mode 100644 index 6052f25545..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/ObjectGenerator.cs +++ /dev/null @@ -1,456 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Linq; -using System.Reflection; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - /// - /// This class will create an object of a given type and populate it with sample data. - /// - public class ObjectGenerator - { - internal const int DefaultCollectionSize = 2; - private readonly SimpleTypeObjectGenerator SimpleObjectGenerator = new SimpleTypeObjectGenerator(); - - /// - /// Generates an object for a given type. The type needs to be public, have a public default constructor and settable public properties/fields. Currently it supports the following types: - /// Simple types: , , , , , etc. - /// Complex types: POCO types. - /// Nullables: . - /// Arrays: arrays of simple types or complex types. - /// Key value pairs: - /// Tuples: , , etc - /// Dictionaries: or anything deriving from . - /// Collections: , , , , , or anything deriving from or . - /// Queryables: , . - /// - /// The type. - /// An object of the given type. - public object GenerateObject(Type type) - { - return GenerateObject(type, new Dictionary()); - } - - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Here we just want to return null if anything goes wrong.")] - private object GenerateObject(Type type, Dictionary createdObjectReferences) - { - try - { - if (SimpleTypeObjectGenerator.CanGenerateObject(type)) - { - return SimpleObjectGenerator.GenerateObject(type); - } - - if (type.IsArray) - { - return GenerateArray(type, DefaultCollectionSize, createdObjectReferences); - } - - if (type.IsGenericType) - { - return GenerateGenericType(type, DefaultCollectionSize, createdObjectReferences); - } - - if (type == typeof(IDictionary)) - { - return GenerateDictionary(typeof(Hashtable), DefaultCollectionSize, createdObjectReferences); - } - - if (typeof(IDictionary).IsAssignableFrom(type)) - { - return GenerateDictionary(type, DefaultCollectionSize, createdObjectReferences); - } - - if (type == typeof(IList) || - type == typeof(IEnumerable) || - type == typeof(ICollection)) - { - return GenerateCollection(typeof(ArrayList), DefaultCollectionSize, createdObjectReferences); - } - - if (typeof(IList).IsAssignableFrom(type)) - { - return GenerateCollection(type, DefaultCollectionSize, createdObjectReferences); - } - - if (type == typeof(IQueryable)) - { - return GenerateQueryable(type, DefaultCollectionSize, createdObjectReferences); - } - - if (type.IsEnum) - { - return GenerateEnum(type); - } - - if (type.IsPublic || type.IsNestedPublic) - { - return GenerateComplexObject(type, createdObjectReferences); - } - } - catch - { - // Returns null if anything fails - return null; - } - - return null; - } - - private static object GenerateGenericType(Type type, int collectionSize, Dictionary createdObjectReferences) - { - Type genericTypeDefinition = type.GetGenericTypeDefinition(); - if (genericTypeDefinition == typeof(Nullable<>)) - { - return GenerateNullable(type, createdObjectReferences); - } - - if (genericTypeDefinition == typeof(KeyValuePair<,>)) - { - return GenerateKeyValuePair(type, createdObjectReferences); - } - - if (IsTuple(genericTypeDefinition)) - { - return GenerateTuple(type, createdObjectReferences); - } - - Type[] genericArguments = type.GetGenericArguments(); - if (genericArguments.Length == 1) - { - if (genericTypeDefinition == typeof(IList<>) || - genericTypeDefinition == typeof(IEnumerable<>) || - genericTypeDefinition == typeof(ICollection<>)) - { - Type collectionType = typeof(List<>).MakeGenericType(genericArguments); - return GenerateCollection(collectionType, collectionSize, createdObjectReferences); - } - - if (genericTypeDefinition == typeof(IQueryable<>)) - { - return GenerateQueryable(type, collectionSize, createdObjectReferences); - } - - Type closedCollectionType = typeof(ICollection<>).MakeGenericType(genericArguments[0]); - if (closedCollectionType.IsAssignableFrom(type)) - { - return GenerateCollection(type, collectionSize, createdObjectReferences); - } - } - - if (genericArguments.Length == 2) - { - if (genericTypeDefinition == typeof(IDictionary<,>)) - { - Type dictionaryType = typeof(Dictionary<,>).MakeGenericType(genericArguments); - return GenerateDictionary(dictionaryType, collectionSize, createdObjectReferences); - } - - Type closedDictionaryType = typeof(IDictionary<,>).MakeGenericType(genericArguments[0], genericArguments[1]); - if (closedDictionaryType.IsAssignableFrom(type)) - { - return GenerateDictionary(type, collectionSize, createdObjectReferences); - } - } - - if (type.IsPublic || type.IsNestedPublic) - { - return GenerateComplexObject(type, createdObjectReferences); - } - - return null; - } - - private static object GenerateTuple(Type type, Dictionary createdObjectReferences) - { - Type[] genericArgs = type.GetGenericArguments(); - object[] parameterValues = new object[genericArgs.Length]; - bool failedToCreateTuple = true; - ObjectGenerator objectGenerator = new ObjectGenerator(); - for (int i = 0; i < genericArgs.Length; i++) - { - parameterValues[i] = objectGenerator.GenerateObject(genericArgs[i], createdObjectReferences); - failedToCreateTuple &= parameterValues[i] == null; - } - if (failedToCreateTuple) - { - return null; - } - object result = Activator.CreateInstance(type, parameterValues); - return result; - } - - private static bool IsTuple(Type genericTypeDefinition) - { - return genericTypeDefinition == typeof(Tuple<>) || - genericTypeDefinition == typeof(Tuple<,>) || - genericTypeDefinition == typeof(Tuple<,,>) || - genericTypeDefinition == typeof(Tuple<,,,>) || - genericTypeDefinition == typeof(Tuple<,,,,>) || - genericTypeDefinition == typeof(Tuple<,,,,,>) || - genericTypeDefinition == typeof(Tuple<,,,,,,>) || - genericTypeDefinition == typeof(Tuple<,,,,,,,>); - } - - private static object GenerateKeyValuePair(Type keyValuePairType, Dictionary createdObjectReferences) - { - Type[] genericArgs = keyValuePairType.GetGenericArguments(); - Type typeK = genericArgs[0]; - Type typeV = genericArgs[1]; - ObjectGenerator objectGenerator = new ObjectGenerator(); - object keyObject = objectGenerator.GenerateObject(typeK, createdObjectReferences); - object valueObject = objectGenerator.GenerateObject(typeV, createdObjectReferences); - if (keyObject == null && valueObject == null) - { - // Failed to create key and values - return null; - } - object result = Activator.CreateInstance(keyValuePairType, keyObject, valueObject); - return result; - } - - private static object GenerateArray(Type arrayType, int size, Dictionary createdObjectReferences) - { - Type type = arrayType.GetElementType(); - Array result = Array.CreateInstance(type, size); - bool areAllElementsNull = true; - ObjectGenerator objectGenerator = new ObjectGenerator(); - for (int i = 0; i < size; i++) - { - object element = objectGenerator.GenerateObject(type, createdObjectReferences); - result.SetValue(element, i); - areAllElementsNull &= element == null; - } - - if (areAllElementsNull) - { - return null; - } - - return result; - } - - private static object GenerateDictionary(Type dictionaryType, int size, Dictionary createdObjectReferences) - { - Type typeK = typeof(object); - Type typeV = typeof(object); - if (dictionaryType.IsGenericType) - { - Type[] genericArgs = dictionaryType.GetGenericArguments(); - typeK = genericArgs[0]; - typeV = genericArgs[1]; - } - - object result = Activator.CreateInstance(dictionaryType); - MethodInfo addMethod = dictionaryType.GetMethod("Add") ?? dictionaryType.GetMethod("TryAdd"); - MethodInfo containsMethod = dictionaryType.GetMethod("Contains") ?? dictionaryType.GetMethod("ContainsKey"); - ObjectGenerator objectGenerator = new ObjectGenerator(); - for (int i = 0; i < size; i++) - { - object newKey = objectGenerator.GenerateObject(typeK, createdObjectReferences); - if (newKey == null) - { - // Cannot generate a valid key - return null; - } - - bool containsKey = (bool)containsMethod.Invoke(result, new object[] { newKey }); - if (!containsKey) - { - object newValue = objectGenerator.GenerateObject(typeV, createdObjectReferences); - addMethod.Invoke(result, new object[] { newKey, newValue }); - } - } - - return result; - } - - private static object GenerateEnum(Type enumType) - { - Array possibleValues = Enum.GetValues(enumType); - if (possibleValues.Length > 0) - { - return possibleValues.GetValue(0); - } - return null; - } - - private static object GenerateQueryable(Type queryableType, int size, Dictionary createdObjectReferences) - { - bool isGeneric = queryableType.IsGenericType; - object list; - if (isGeneric) - { - Type listType = typeof(List<>).MakeGenericType(queryableType.GetGenericArguments()); - list = GenerateCollection(listType, size, createdObjectReferences); - } - else - { - list = GenerateArray(typeof(object[]), size, createdObjectReferences); - } - if (list == null) - { - return null; - } - if (isGeneric) - { - Type argumentType = typeof(IEnumerable<>).MakeGenericType(queryableType.GetGenericArguments()); - MethodInfo asQueryableMethod = typeof(Queryable).GetMethod("AsQueryable", new[] { argumentType }); - return asQueryableMethod.Invoke(null, new[] { list }); - } - - return Queryable.AsQueryable((IEnumerable)list); - } - - private static object GenerateCollection(Type collectionType, int size, Dictionary createdObjectReferences) - { - Type type = collectionType.IsGenericType ? - collectionType.GetGenericArguments()[0] : - typeof(object); - object result = Activator.CreateInstance(collectionType); - MethodInfo addMethod = collectionType.GetMethod("Add"); - bool areAllElementsNull = true; - ObjectGenerator objectGenerator = new ObjectGenerator(); - for (int i = 0; i < size; i++) - { - object element = objectGenerator.GenerateObject(type, createdObjectReferences); - addMethod.Invoke(result, new object[] { element }); - areAllElementsNull &= element == null; - } - - if (areAllElementsNull) - { - return null; - } - - return result; - } - - private static object GenerateNullable(Type nullableType, Dictionary createdObjectReferences) - { - Type type = nullableType.GetGenericArguments()[0]; - ObjectGenerator objectGenerator = new ObjectGenerator(); - return objectGenerator.GenerateObject(type, createdObjectReferences); - } - - private static object GenerateComplexObject(Type type, Dictionary createdObjectReferences) - { - object result = null; - - if (createdObjectReferences.TryGetValue(type, out result)) - { - // The object has been created already, just return it. This will handle the circular reference case. - return result; - } - - if (type.IsValueType) - { - result = Activator.CreateInstance(type); - } - else - { - ConstructorInfo defaultCtor = type.GetConstructor(Type.EmptyTypes); - if (defaultCtor == null) - { - // Cannot instantiate the type because it doesn't have a default constructor - return null; - } - - result = defaultCtor.Invoke(new object[0]); - } - createdObjectReferences.Add(type, result); - SetPublicProperties(type, result, createdObjectReferences); - SetPublicFields(type, result, createdObjectReferences); - return result; - } - - private static void SetPublicProperties(Type type, object obj, Dictionary createdObjectReferences) - { - PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); - ObjectGenerator objectGenerator = new ObjectGenerator(); - foreach (PropertyInfo property in properties) - { - if (property.CanWrite) - { - object propertyValue = objectGenerator.GenerateObject(property.PropertyType, createdObjectReferences); - property.SetValue(obj, propertyValue, null); - } - } - } - - private static void SetPublicFields(Type type, object obj, Dictionary createdObjectReferences) - { - FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); - ObjectGenerator objectGenerator = new ObjectGenerator(); - foreach (FieldInfo field in fields) - { - object fieldValue = objectGenerator.GenerateObject(field.FieldType, createdObjectReferences); - field.SetValue(obj, fieldValue); - } - } - - private class SimpleTypeObjectGenerator - { - private long _index = 0; - private static readonly Dictionary> DefaultGenerators = InitializeGenerators(); - - [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "These are simple type factories and cannot be split up.")] - private static Dictionary> InitializeGenerators() - { - return new Dictionary> - { - { typeof(Boolean), index => true }, - { typeof(Byte), index => (Byte)64 }, - { typeof(Char), index => (Char)65 }, - { typeof(DateTime), index => DateTime.Now }, - { typeof(DateTimeOffset), index => new DateTimeOffset(DateTime.Now) }, - { typeof(DBNull), index => DBNull.Value }, - { typeof(Decimal), index => (Decimal)index }, - { typeof(Double), index => (Double)(index + 0.1) }, - { typeof(Guid), index => Guid.NewGuid() }, - { typeof(Int16), index => (Int16)(index % Int16.MaxValue) }, - { typeof(Int32), index => (Int32)(index % Int32.MaxValue) }, - { typeof(Int64), index => (Int64)index }, - { typeof(Object), index => new object() }, - { typeof(SByte), index => (SByte)64 }, - { typeof(Single), index => (Single)(index + 0.1) }, - { - typeof(String), index => - { - return String.Format(CultureInfo.CurrentCulture, "sample string {0}", index); - } - }, - { - typeof(TimeSpan), index => - { - return TimeSpan.FromTicks(1234567); - } - }, - { typeof(UInt16), index => (UInt16)(index % UInt16.MaxValue) }, - { typeof(UInt32), index => (UInt32)(index % UInt32.MaxValue) }, - { typeof(UInt64), index => (UInt64)index }, - { - typeof(Uri), index => - { - return new Uri(String.Format(CultureInfo.CurrentCulture, "http://webapihelppage{0}.com", index)); - } - }, - }; - } - - public static bool CanGenerateObject(Type type) - { - return DefaultGenerators.ContainsKey(type); - } - - public object GenerateObject(Type type) - { - return DefaultGenerators[type](++_index); - } - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/SampleDirection.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/SampleDirection.cs deleted file mode 100644 index 9ce6daec20..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/SampleDirection.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - /// - /// Indicates whether the sample is used for request or response - /// - public enum SampleDirection - { - Request = 0, - Response - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/TextSample.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/TextSample.cs deleted file mode 100644 index ccf158fc04..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/SampleGeneration/TextSample.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - /// - /// This represents a preformatted text sample on the help page. There's a display template named TextSample associated with this class. - /// - public class TextSample - { - public TextSample(string text) - { - if (text == null) - { - throw new ArgumentNullException("text"); - } - Text = text; - } - - public string Text { get; private set; } - - public override bool Equals(object obj) - { - TextSample other = obj as TextSample; - return other != null && Text == other.Text; - } - - public override int GetHashCode() - { - return Text.GetHashCode(); - } - - public override string ToString() - { - return Text; - } - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/Api.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/Api.cshtml deleted file mode 100644 index 464a241d49..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/Api.cshtml +++ /dev/null @@ -1,22 +0,0 @@ -@using System.Web.Http -@using NSwag.Sample.NetOwin.Areas.HelpPage.Models -@model HelpPageApiModel - -@{ - var description = Model.ApiDescription; - ViewBag.Title = description.HttpMethod.Method + " " + description.RelativePath; -} - - -
    - -
    - @Html.DisplayForModel() -
    -
    diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ApiGroup.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ApiGroup.cshtml deleted file mode 100644 index 10024e6c31..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ApiGroup.cshtml +++ /dev/null @@ -1,41 +0,0 @@ -@using System.Web.Http -@using System.Web.Http.Controllers -@using System.Web.Http.Description -@using NSwag.Sample.NetOwin.Areas.HelpPage -@using NSwag.Sample.NetOwin.Areas.HelpPage.Models -@model IGrouping - -@{ - var controllerDocumentation = ViewBag.DocumentationProvider != null ? - ViewBag.DocumentationProvider.GetDocumentation(Model.Key) : - null; -} - -

    @Model.Key.ControllerName

    -@if (!String.IsNullOrEmpty(controllerDocumentation)) -{ -

    @controllerDocumentation

    -} - - - - - - @foreach (var api in Model) - { - - - - - } - -
    APIDescription
    @api.HttpMethod.Method @api.RelativePath - @if (api.Documentation != null) - { -

    @api.Documentation

    - } - else - { -

    No documentation available.

    - } -
    \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/CollectionModelDescription.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/CollectionModelDescription.cshtml deleted file mode 100644 index 078fa7fcc2..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/CollectionModelDescription.cshtml +++ /dev/null @@ -1,6 +0,0 @@ -@using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -@model CollectionModelDescription -@if (Model.ElementDescription is ComplexTypeModelDescription) -{ - @Html.DisplayFor(m => m.ElementDescription) -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ComplexTypeModelDescription.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ComplexTypeModelDescription.cshtml deleted file mode 100644 index 8a0bb2a815..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ComplexTypeModelDescription.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -@model ComplexTypeModelDescription -@Html.DisplayFor(m => m.Properties, "Parameters") \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/DictionaryModelDescription.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/DictionaryModelDescription.cshtml deleted file mode 100644 index 178b8ab2a3..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/DictionaryModelDescription.cshtml +++ /dev/null @@ -1,4 +0,0 @@ -@using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -@model DictionaryModelDescription -Dictionary of @Html.DisplayFor(m => Model.KeyModelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.KeyModelDescription }) [key] -and @Html.DisplayFor(m => Model.ValueModelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.ValueModelDescription }) [value] \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/EnumTypeModelDescription.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/EnumTypeModelDescription.cshtml deleted file mode 100644 index 60e41584b4..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/EnumTypeModelDescription.cshtml +++ /dev/null @@ -1,24 +0,0 @@ -@using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -@model EnumTypeModelDescription - -

    Possible enumeration values:

    - - - - - - - @foreach (EnumValueDescription value in Model.Values) - { - - - - - - } - -
    NameValueDescription
    @value.Name -

    @value.Value

    -
    -

    @value.Documentation

    -
    \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/HelpPageApiModel.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/HelpPageApiModel.cshtml deleted file mode 100644 index 8ae3a418b2..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/HelpPageApiModel.cshtml +++ /dev/null @@ -1,67 +0,0 @@ -@using System.Web.Http -@using System.Web.Http.Description -@using NSwag.Sample.NetOwin.Areas.HelpPage.Models -@using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -@model HelpPageApiModel - -@{ - ApiDescription description = Model.ApiDescription; -} -

    @description.HttpMethod.Method @description.RelativePath

    -
    -

    @description.Documentation

    - -

    Request Information

    - -

    URI Parameters

    - @Html.DisplayFor(m => m.UriParameters, "Parameters") - -

    Body Parameters

    - -

    @Model.RequestDocumentation

    - - @if (Model.RequestModelDescription != null) - { - @Html.DisplayFor(m => m.RequestModelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.RequestModelDescription }) - if (Model.RequestBodyParameters != null) - { - @Html.DisplayFor(m => m.RequestBodyParameters, "Parameters") - } - } - else - { -

    None.

    - } - - @if (Model.SampleRequests.Count > 0) - { -

    Request Formats

    - @Html.DisplayFor(m => m.SampleRequests, "Samples") - } - -

    Response Information

    - -

    Resource Description

    - -

    @description.ResponseDescription.Documentation

    - - @if (Model.ResourceDescription != null) - { - @Html.DisplayFor(m => m.ResourceDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.ResourceDescription }) - if (Model.ResourceProperties != null) - { - @Html.DisplayFor(m => m.ResourceProperties, "Parameters") - } - } - else - { -

    None.

    - } - - @if (Model.SampleResponses.Count > 0) - { -

    Response Formats

    - @Html.DisplayFor(m => m.SampleResponses, "Samples") - } - -
    \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ImageSample.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ImageSample.cshtml deleted file mode 100644 index 3729495f15..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ImageSample.cshtml +++ /dev/null @@ -1,4 +0,0 @@ -@using NSwag.Sample.NetOwin.Areas.HelpPage -@model ImageSample - - \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/InvalidSample.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/InvalidSample.cshtml deleted file mode 100644 index 2c8cafc380..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/InvalidSample.cshtml +++ /dev/null @@ -1,13 +0,0 @@ -@using NSwag.Sample.NetOwin.Areas.HelpPage -@model InvalidSample - -@if (HttpContext.Current.IsDebuggingEnabled) -{ -
    -

    @Model.ErrorMessage

    -
    -} -else -{ -

    Sample not available.

    -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/KeyValuePairModelDescription.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/KeyValuePairModelDescription.cshtml deleted file mode 100644 index d68edec4a7..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/KeyValuePairModelDescription.cshtml +++ /dev/null @@ -1,4 +0,0 @@ -@using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -@model KeyValuePairModelDescription -Pair of @Html.DisplayFor(m => Model.KeyModelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.KeyModelDescription }) [key] -and @Html.DisplayFor(m => Model.ValueModelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.ValueModelDescription }) [value] \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ModelDescriptionLink.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ModelDescriptionLink.cshtml deleted file mode 100644 index 038830e899..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/ModelDescriptionLink.cshtml +++ /dev/null @@ -1,26 +0,0 @@ -@using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -@model Type -@{ - ModelDescription modelDescription = ViewBag.modelDescription; - if (modelDescription is ComplexTypeModelDescription || modelDescription is EnumTypeModelDescription) - { - if (Model == typeof(Object)) - { - @:Object - } - else - { - @Html.ActionLink(modelDescription.Name, "ResourceModel", "Help", new { modelName = modelDescription.Name }, null) - } - } - else if (modelDescription is CollectionModelDescription) - { - var collectionDescription = modelDescription as CollectionModelDescription; - var elementDescription = collectionDescription.ElementDescription; - @:Collection of @Html.DisplayFor(m => elementDescription.ModelType, "ModelDescriptionLink", new { modelDescription = elementDescription }) - } - else - { - @Html.DisplayFor(m => modelDescription) - } -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/Parameters.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/Parameters.cshtml deleted file mode 100644 index 202eeeceb1..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/Parameters.cshtml +++ /dev/null @@ -1,48 +0,0 @@ -@using System.Collections.Generic -@using System.Collections.ObjectModel -@using System.Web.Http.Description -@using System.Threading -@using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -@model IList - -@if (Model.Count > 0) -{ - - - - - - @foreach (ParameterDescription parameter in Model) - { - ModelDescription modelDescription = parameter.TypeDescription; - - - - - - - } - -
    NameDescriptionTypeAdditional information
    @parameter.Name -

    @parameter.Documentation

    -
    - @Html.DisplayFor(m => modelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = modelDescription }) - - @if (parameter.Annotations.Count > 0) - { - foreach (var annotation in parameter.Annotations) - { -

    @annotation.Documentation

    - } - } - else - { -

    None.

    - } -
    -} -else -{ -

    None.

    -} - diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/Samples.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/Samples.cshtml deleted file mode 100644 index c19596fb12..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/Samples.cshtml +++ /dev/null @@ -1,30 +0,0 @@ -@using System.Net.Http.Headers -@model Dictionary - -@{ - // Group the samples into a single tab if they are the same. - Dictionary samples = Model.GroupBy(pair => pair.Value).ToDictionary( - pair => String.Join(", ", pair.Select(m => m.Key.ToString()).ToArray()), - pair => pair.Key); - var mediaTypes = samples.Keys; -} -
    - @foreach (var mediaType in mediaTypes) - { -

    @mediaType

    -
    - Sample: - @{ - var sample = samples[mediaType]; - if (sample == null) - { -

    Sample not available.

    - } - else - { - @Html.DisplayFor(s => sample); - } - } -
    - } -
    \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/SimpleTypeModelDescription.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/SimpleTypeModelDescription.cshtml deleted file mode 100644 index fbefb35699..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/SimpleTypeModelDescription.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -@model SimpleTypeModelDescription -@Model.Documentation \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/TextSample.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/TextSample.cshtml deleted file mode 100644 index c1acc41cde..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/DisplayTemplates/TextSample.cshtml +++ /dev/null @@ -1,6 +0,0 @@ -@using NSwag.Sample.NetOwin.Areas.HelpPage -@model TextSample - -
    -@Model.Text
    -
    \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/Index.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/Index.cshtml deleted file mode 100644 index 2d232446f0..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/Index.cshtml +++ /dev/null @@ -1,38 +0,0 @@ -@using System.Web.Http -@using System.Web.Http.Controllers -@using System.Web.Http.Description -@using System.Collections.ObjectModel -@using NSwag.Sample.NetOwin.Areas.HelpPage.Models -@model Collection - -@{ - ViewBag.Title = "ASP.NET Web API Help Page"; - - // Group APIs by controller - ILookup apiGroups = Model.ToLookup(api => api.ActionDescriptor.ControllerDescriptor); -} - - -
    -
    -
    -

    @ViewBag.Title

    -
    -
    -
    -
    - -
    - @foreach (var group in apiGroups) - { - @Html.DisplayFor(m => group, "ApiGroup") - } -
    -
    diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/ResourceModel.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/ResourceModel.cshtml deleted file mode 100644 index ff4d31968a..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Help/ResourceModel.cshtml +++ /dev/null @@ -1,19 +0,0 @@ -@using System.Web.Http -@using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions -@model ModelDescription - - -
    - -

    @Model.Name

    -

    @Model.Documentation

    -
    - @Html.DisplayFor(m => Model) -
    -
    diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Shared/_Layout.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Shared/_Layout.cshtml deleted file mode 100644 index 896c833a03..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Shared/_Layout.cshtml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - @ViewBag.Title - @RenderSection("scripts", required: false) - - - @RenderBody() - - \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Web.config b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Web.config deleted file mode 100644 index 0971732240..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/Web.config +++ /dev/null @@ -1,41 +0,0 @@ - - - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/_ViewStart.cshtml b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/_ViewStart.cshtml deleted file mode 100644 index d735b1cb0b..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/Views/_ViewStart.cshtml +++ /dev/null @@ -1,4 +0,0 @@ -@{ - // Change the Layout path below to blend the look and feel of the help page with your existing web pages - Layout = "~/Views/Shared/_Layout.cshtml"; -} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/XmlDocumentationProvider.cs b/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/XmlDocumentationProvider.cs deleted file mode 100644 index 1d7d5cd0f4..0000000000 --- a/src/NSwag.Sample.NetGlobalAsax/Areas/HelpPage/XmlDocumentationProvider.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System; -using System.Globalization; -using System.Linq; -using System.Reflection; -using System.Web.Http.Controllers; -using System.Web.Http.Description; -using System.Xml.XPath; -using NSwag.Sample.NetOwin.Areas.HelpPage.ModelDescriptions; - -namespace NSwag.Sample.NetOwin.Areas.HelpPage -{ - /// - /// A custom that reads the API documentation from an XML documentation file. - /// - public class XmlDocumentationProvider : IDocumentationProvider, IModelDocumentationProvider - { - private XPathNavigator _documentNavigator; - private const string TypeExpression = "/doc/members/member[@name='T:{0}']"; - private const string MethodExpression = "/doc/members/member[@name='M:{0}']"; - private const string PropertyExpression = "/doc/members/member[@name='P:{0}']"; - private const string FieldExpression = "/doc/members/member[@name='F:{0}']"; - private const string ParameterExpression = "param[@name='{0}']"; - - /// - /// Initializes a new instance of the class. - /// - /// The physical path to XML document. - public XmlDocumentationProvider(string documentPath) - { - if (documentPath == null) - { - throw new ArgumentNullException("documentPath"); - } - XPathDocument xpath = new XPathDocument(documentPath); - _documentNavigator = xpath.CreateNavigator(); - } - - public string GetDocumentation(HttpControllerDescriptor controllerDescriptor) - { - XPathNavigator typeNode = GetTypeNode(controllerDescriptor.ControllerType); - return GetTagValue(typeNode, "summary"); - } - - public virtual string GetDocumentation(HttpActionDescriptor actionDescriptor) - { - XPathNavigator methodNode = GetMethodNode(actionDescriptor); - return GetTagValue(methodNode, "summary"); - } - - public virtual string GetDocumentation(HttpParameterDescriptor parameterDescriptor) - { - ReflectedHttpParameterDescriptor reflectedParameterDescriptor = parameterDescriptor as ReflectedHttpParameterDescriptor; - if (reflectedParameterDescriptor != null) - { - XPathNavigator methodNode = GetMethodNode(reflectedParameterDescriptor.ActionDescriptor); - if (methodNode != null) - { - string parameterName = reflectedParameterDescriptor.ParameterInfo.Name; - XPathNavigator parameterNode = methodNode.SelectSingleNode(String.Format(CultureInfo.InvariantCulture, ParameterExpression, parameterName)); - if (parameterNode != null) - { - return parameterNode.Value.Trim(); - } - } - } - - return null; - } - - public string GetResponseDocumentation(HttpActionDescriptor actionDescriptor) - { - XPathNavigator methodNode = GetMethodNode(actionDescriptor); - return GetTagValue(methodNode, "returns"); - } - - public string GetDocumentation(MemberInfo member) - { - string memberName = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", GetTypeName(member.DeclaringType), member.Name); - string expression = member.MemberType == MemberTypes.Field ? FieldExpression : PropertyExpression; - string selectExpression = String.Format(CultureInfo.InvariantCulture, expression, memberName); - XPathNavigator propertyNode = _documentNavigator.SelectSingleNode(selectExpression); - return GetTagValue(propertyNode, "summary"); - } - - public string GetDocumentation(Type type) - { - XPathNavigator typeNode = GetTypeNode(type); - return GetTagValue(typeNode, "summary"); - } - - private XPathNavigator GetMethodNode(HttpActionDescriptor actionDescriptor) - { - ReflectedHttpActionDescriptor reflectedActionDescriptor = actionDescriptor as ReflectedHttpActionDescriptor; - if (reflectedActionDescriptor != null) - { - string selectExpression = String.Format(CultureInfo.InvariantCulture, MethodExpression, GetMemberName(reflectedActionDescriptor.MethodInfo)); - return _documentNavigator.SelectSingleNode(selectExpression); - } - - return null; - } - - private static string GetMemberName(MethodInfo method) - { - string name = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", GetTypeName(method.DeclaringType), method.Name); - ParameterInfo[] parameters = method.GetParameters(); - if (parameters.Length != 0) - { - string[] parameterTypeNames = parameters.Select(param => GetTypeName(param.ParameterType)).ToArray(); - name += String.Format(CultureInfo.InvariantCulture, "({0})", String.Join(",", parameterTypeNames)); - } - - return name; - } - - private static string GetTagValue(XPathNavigator parentNode, string tagName) - { - if (parentNode != null) - { - XPathNavigator node = parentNode.SelectSingleNode(tagName); - if (node != null) - { - return node.Value.Trim(); - } - } - - return null; - } - - private XPathNavigator GetTypeNode(Type type) - { - string controllerTypeName = GetTypeName(type); - string selectExpression = String.Format(CultureInfo.InvariantCulture, TypeExpression, controllerTypeName); - return _documentNavigator.SelectSingleNode(selectExpression); - } - - private static string GetTypeName(Type type) - { - string name = type.FullName; - if (type.IsGenericType) - { - // Format the generic type name to something like: Generic{System.Int32,System.String} - Type genericType = type.GetGenericTypeDefinition(); - Type[] genericArguments = type.GetGenericArguments(); - string genericTypeName = genericType.FullName; - - // Trim the generic parameter counts from the name - genericTypeName = genericTypeName.Substring(0, genericTypeName.IndexOf('`')); - string[] argumentTypeNames = genericArguments.Select(t => GetTypeName(t)).ToArray(); - name = String.Format(CultureInfo.InvariantCulture, "{0}{{{1}}}", genericTypeName, String.Join(",", argumentTypeNames)); - } - if (type.IsNested) - { - // Changing the nested type name from OuterType+InnerType to OuterType.InnerType to match the XML documentation syntax. - name = name.Replace("+", "."); - } - - return name; - } - } -} diff --git a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj index e6c731afe9..8a8e0fb64e 100644 --- a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj +++ b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj @@ -72,34 +72,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -112,22 +84,6 @@ - - - - - - - - - - - - - - - - PreserveNewest @@ -141,7 +97,6 @@ Web.config - From 0270524e17b6c09fcddf86ca83aa0a233cf93b6e Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Fri, 22 Sep 2023 18:20:16 +0200 Subject: [PATCH 16/51] fix dependencies --- .../NSwag.CodeGeneration.csproj | 2 +- src/NSwag.Commands/NSwag.Commands.csproj | 12 +-- .../NSwag.Console.x86.csproj | 2 +- src/NSwag.Console/NSwag.Console.csproj | 2 +- .../NSwag.ConsoleCore.csproj | 8 +- src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj | 2 +- src/NSwag.Core/NSwag.Core.csproj | 2 +- src/NSwag.Demo.Web/NSwag.Demo.Web.csproj | 4 +- src/NSwag.Demo.Web/Web.config | 70 ++++++++--------- .../NSwag.Generation.WebApi.csproj | 2 +- src/NSwag.Generation/NSwag.Generation.csproj | 2 +- .../NSwag.Integration.ClientPCL.Tests.csproj | 2 +- .../NSwag.Integration.ClientPCL.csproj | 2 +- .../NSwag.Integration.Console.csproj | 2 +- .../NSwag.Sample.NET70.csproj | 2 +- .../NSwag.Sample.NETCore21.csproj | 2 +- ...NSwag.Sample.NetCoreAngular.Clients.csproj | 2 +- .../NSwag.Sample.NetGlobalAsax.csproj | 10 ++- src/NSwag.Sample.NetGlobalAsax/Web.config | 76 ++++++++++--------- .../NSwag.VersionMissmatchTest.csproj | 2 +- src/NSwagStudio/NSwagStudio.csproj | 4 +- src/NSwagStudio/ViewModels/MainWindowModel.cs | 7 +- 22 files changed, 115 insertions(+), 104 deletions(-) diff --git a/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj b/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj index 079206ceef..1a97e815ca 100644 --- a/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj +++ b/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj @@ -6,7 +6,7 @@ bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - + diff --git a/src/NSwag.Commands/NSwag.Commands.csproj b/src/NSwag.Commands/NSwag.Commands.csproj index 7c88aae7ae..9cd652c231 100644 --- a/src/NSwag.Commands/NSwag.Commands.csproj +++ b/src/NSwag.Commands/NSwag.Commands.csproj @@ -12,7 +12,7 @@ - + @@ -20,35 +20,35 @@ - + - + - + - + - + diff --git a/src/NSwag.Console.x86/NSwag.Console.x86.csproj b/src/NSwag.Console.x86/NSwag.Console.x86.csproj index 50a0134a70..d9b072b02d 100644 --- a/src/NSwag.Console.x86/NSwag.Console.x86.csproj +++ b/src/NSwag.Console.x86/NSwag.Console.x86.csproj @@ -19,7 +19,7 @@ - + diff --git a/src/NSwag.Console/NSwag.Console.csproj b/src/NSwag.Console/NSwag.Console.csproj index e0e14afc5a..bb0234aac2 100644 --- a/src/NSwag.Console/NSwag.Console.csproj +++ b/src/NSwag.Console/NSwag.Console.csproj @@ -21,7 +21,7 @@ - + diff --git a/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj b/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj index 2899db20f1..ca26894f78 100644 --- a/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj +++ b/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj @@ -19,25 +19,25 @@ - + - + - + - + diff --git a/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj b/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj index 9ff9efaee5..b05fcb3404 100644 --- a/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj +++ b/src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/NSwag.Core/NSwag.Core.csproj b/src/NSwag.Core/NSwag.Core.csproj index 37b9298846..e945eee8dd 100644 --- a/src/NSwag.Core/NSwag.Core.csproj +++ b/src/NSwag.Core/NSwag.Core.csproj @@ -7,7 +7,7 @@ bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - + diff --git a/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj b/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj index fa22c301d8..dee50554fd 100644 --- a/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj +++ b/src/NSwag.Demo.Web/NSwag.Demo.Web.csproj @@ -14,7 +14,7 @@ Properties NSwag.Demo.Web NSwag.Demo.Web - v4.6.1 + v4.8 win true @@ -60,9 +60,9 @@ - + diff --git a/src/NSwag.Demo.Web/Web.config b/src/NSwag.Demo.Web/Web.config index 8a4adce57a..f8996aecce 100644 --- a/src/NSwag.Demo.Web/Web.config +++ b/src/NSwag.Demo.Web/Web.config @@ -1,7 +1,7 @@ - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - - - + + + + \ No newline at end of file diff --git a/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj b/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj index 1fab1f1236..9c46051166 100644 --- a/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj +++ b/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NSwag.Generation/NSwag.Generation.csproj b/src/NSwag.Generation/NSwag.Generation.csproj index a85ff4be94..4b4164097c 100644 --- a/src/NSwag.Generation/NSwag.Generation.csproj +++ b/src/NSwag.Generation/NSwag.Generation.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/NSwag.Integration.ClientPCL.Tests/NSwag.Integration.ClientPCL.Tests.csproj b/src/NSwag.Integration.ClientPCL.Tests/NSwag.Integration.ClientPCL.Tests.csproj index 18b5f4058c..4451793c75 100644 --- a/src/NSwag.Integration.ClientPCL.Tests/NSwag.Integration.ClientPCL.Tests.csproj +++ b/src/NSwag.Integration.ClientPCL.Tests/NSwag.Integration.ClientPCL.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/NSwag.Integration.ClientPCL/NSwag.Integration.ClientPCL.csproj b/src/NSwag.Integration.ClientPCL/NSwag.Integration.ClientPCL.csproj index 518362cb56..06548048a1 100644 --- a/src/NSwag.Integration.ClientPCL/NSwag.Integration.ClientPCL.csproj +++ b/src/NSwag.Integration.ClientPCL/NSwag.Integration.ClientPCL.csproj @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj b/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj index 9b3d33fca5..ec84887f03 100644 --- a/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj +++ b/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj @@ -38,6 +38,6 @@ - + \ No newline at end of file diff --git a/src/NSwag.Sample.NET70/NSwag.Sample.NET70.csproj b/src/NSwag.Sample.NET70/NSwag.Sample.NET70.csproj index 1123044def..95dd2ac216 100644 --- a/src/NSwag.Sample.NET70/NSwag.Sample.NET70.csproj +++ b/src/NSwag.Sample.NET70/NSwag.Sample.NET70.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj b/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj index 1674f37258..e3fcaaa4a4 100644 --- a/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj +++ b/src/NSwag.Sample.NETCore21/NSwag.Sample.NETCore21.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/NSwag.Sample.NetCoreAngular.Clients/NSwag.Sample.NetCoreAngular.Clients.csproj b/src/NSwag.Sample.NetCoreAngular.Clients/NSwag.Sample.NetCoreAngular.Clients.csproj index e416a6758e..c5d4b96a8f 100644 --- a/src/NSwag.Sample.NetCoreAngular.Clients/NSwag.Sample.NetCoreAngular.Clients.csproj +++ b/src/NSwag.Sample.NetCoreAngular.Clients/NSwag.Sample.NetCoreAngular.Clients.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj index 026a029808..47d8df8b0c 100644 --- a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj +++ b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj @@ -14,7 +14,7 @@ NSwag.Sample.NetGlobalAsax NSwag.Sample.NetGlobalAsax win - v4.6.1 + v4.8 false true @@ -27,6 +27,7 @@ 6 false + true @@ -50,14 +51,14 @@ + + - - - + @@ -68,6 +69,7 @@ + diff --git a/src/NSwag.Sample.NetGlobalAsax/Web.config b/src/NSwag.Sample.NetGlobalAsax/Web.config index 40ff2ba60b..9f1aaf9870 100644 --- a/src/NSwag.Sample.NetGlobalAsax/Web.config +++ b/src/NSwag.Sample.NetGlobalAsax/Web.config @@ -1,69 +1,77 @@ - + - - - - - + + + + + + - - + + - + - - - - - + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + \ No newline at end of file diff --git a/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj b/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj index 8d79872a0b..7d0cad316e 100644 --- a/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj +++ b/src/NSwag.VersionMissmatchTest/NSwag.VersionMissmatchTest.csproj @@ -27,7 +27,7 @@ - + \ No newline at end of file diff --git a/src/NSwagStudio/NSwagStudio.csproj b/src/NSwagStudio/NSwagStudio.csproj index 7664f7deb1..b50ebfd16a 100644 --- a/src/NSwagStudio/NSwagStudio.csproj +++ b/src/NSwagStudio/NSwagStudio.csproj @@ -66,9 +66,9 @@ - + - + diff --git a/src/NSwagStudio/ViewModels/MainWindowModel.cs b/src/NSwagStudio/ViewModels/MainWindowModel.cs index 1b356addbc..b28047bbdb 100644 --- a/src/NSwagStudio/ViewModels/MainWindowModel.cs +++ b/src/NSwagStudio/ViewModels/MainWindowModel.cs @@ -126,9 +126,10 @@ private async Task LoadApplicationSettingsAsync() private void CreateDocument() { - var document = new DocumentModel(NSwagDocument.Create()); - Documents.Add(document); - SelectedDocument = document; + var document = NSwagDocument.Create(); + var documentModel = new DocumentModel(document); + Documents.Add(documentModel); + SelectedDocument = documentModel; } private async Task OpenDocumentAsync() From bdff6ccc930f14877a2e3e0c5e07f7959086efae Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Mon, 25 Sep 2023 19:33:19 +0200 Subject: [PATCH 17/51] update ui --- .../Document/ExecuteDocumentCommand.cs | 10 - .../AspNetCore/AspNetCoreToOpenApiCommand.cs | 53 +-- ...CoreToOpenApiGeneratorCommandEntryPoint.cs | 2 +- .../Commands/Generation/ListTypesCommand.cs | 71 ---- .../ListWebApiControllersCommand.cs | 73 ---- .../Generation/OpenApiGeneratorCommandBase.cs | 305 +---------------- .../Generation/TypesToOpenApiCommand.cs | 144 -------- .../WebApi/WebApiToOpenApiCommand.cs | 167 --------- .../IsolatedSwaggerOutputCommandBase.cs | 19 +- src/NSwag.Commands/NSwagDocument.cs | 54 --- src/NSwag.Commands/NSwagDocumentBase.cs | 43 --- .../OpenApiGeneratorCollection.cs | 11 - src/NSwagStudio/ViewModels/DocumentModel.cs | 2 - .../AspNetCoreToSwaggerGeneratorViewModel.cs | 1 - ...AssemblyTypeToSwaggerGeneratorViewModel.cs | 159 --------- .../WebApiToSwaggerGeneratorViewModel.cs | 173 ---------- .../AspNetCoreToSwaggerGeneratorView.xaml | 129 +------ .../AssemblyTypeToSwaggerGeneratorView.xaml | 174 ---------- ...AssemblyTypeToSwaggerGeneratorView.xaml.cs | 47 --- .../WebApiToSwaggerGeneratorView.xaml | 320 ------------------ .../WebApiToSwaggerGeneratorView.xaml.cs | 47 --- 21 files changed, 14 insertions(+), 1990 deletions(-) delete mode 100644 src/NSwag.Commands/Commands/Generation/ListTypesCommand.cs delete mode 100644 src/NSwag.Commands/Commands/Generation/ListWebApiControllersCommand.cs delete mode 100644 src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs delete mode 100644 src/NSwag.Commands/Commands/Generation/WebApi/WebApiToOpenApiCommand.cs delete mode 100644 src/NSwagStudio/ViewModels/SwaggerGenerators/AssemblyTypeToSwaggerGeneratorViewModel.cs delete mode 100644 src/NSwagStudio/ViewModels/SwaggerGenerators/WebApiToSwaggerGeneratorViewModel.cs delete mode 100644 src/NSwagStudio/Views/SwaggerGenerators/AssemblyTypeToSwaggerGeneratorView.xaml delete mode 100644 src/NSwagStudio/Views/SwaggerGenerators/AssemblyTypeToSwaggerGeneratorView.xaml.cs delete mode 100644 src/NSwagStudio/Views/SwaggerGenerators/WebApiToSwaggerGeneratorView.xaml delete mode 100644 src/NSwagStudio/Views/SwaggerGenerators/WebApiToSwaggerGeneratorView.xaml.cs diff --git a/src/NSwag.Commands/Commands/Document/ExecuteDocumentCommand.cs b/src/NSwag.Commands/Commands/Document/ExecuteDocumentCommand.cs index 6914ceb972..e788af5317 100644 --- a/src/NSwag.Commands/Commands/Document/ExecuteDocumentCommand.cs +++ b/src/NSwag.Commands/Commands/Document/ExecuteDocumentCommand.cs @@ -70,16 +70,6 @@ private async Task ExecuteDocumentAsync(IConsoleHost host, string filePath) "Change the runtime with the '/runtime:" + document.Runtime + "' parameter " + "or run the file with the correct command line binary."); } - - if (document.SelectedSwaggerGenerator == document.SwaggerGenerators.WebApiToOpenApiCommand && - document.SwaggerGenerators.WebApiToOpenApiCommand.IsAspNetCore == false && - document.Runtime != Runtime.Debug && - document.Runtime != Runtime.WinX86 && - document.Runtime != Runtime.WinX64) - { - throw new InvalidOperationException("The runtime " + document.Runtime + " in the document must be used " + - "with ASP.NET Core. Enable /isAspNetCore:true."); - } } await document.ExecuteAsync(); diff --git a/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs b/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs index 949f9a4386..370dd799ee 100644 --- a/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs +++ b/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs @@ -13,17 +13,13 @@ using System.Linq; using System.Reflection; using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.Extensions.DependencyInjection; using NConsole; using Newtonsoft.Json; -using NSwag.Generation.AspNetCore; using NJsonSchema.Yaml; using NJsonSchema; -using Microsoft.AspNetCore.Hosting; using NSwag.Generation; using NJsonSchema.Generation; -using Namotion.Reflection; #if NETCOREAPP || NETSTANDARD using System.Runtime.Loader; @@ -39,7 +35,7 @@ public class AspNetCoreToOpenApiCommand : AspNetCoreToSwaggerCommand /// The generator. [Command(Name = "aspnetcore2swagger", Description = "Generates a Swagger specification ASP.NET Core Mvc application using ApiExplorer (obsolete: use aspnetcore2openapi instead).")] - public class AspNetCoreToSwaggerCommand : OpenApiGeneratorCommandBase + public class AspNetCoreToSwaggerCommand : OpenApiGeneratorCommandBase { private const string LauncherBinaryName = "NSwag.AspNetCore.Launcher"; @@ -70,21 +66,6 @@ public class AspNetCoreToSwaggerCommand : OpenApiGeneratorCommandBase Settings.RequireParametersWithoutDefault; - set => Settings.RequireParametersWithoutDefault = value; - } - - [Argument(Name = "ApiGroupNames", IsRequired = false, Description = "The ASP.NET Core API Explorer group names to include (comma separated, default: empty = all).")] - public string[] ApiGroupNames - { - get => Settings.ApiGroupNames; - set => Settings.ApiGroupNames = value; - } - public override async Task RunAsync(CommandLineProcessor processor, IConsoleHost host) { if (!string.IsNullOrEmpty(Project) && AssemblyPaths.Any()) @@ -233,10 +214,8 @@ public override async Task RunAsync(CommandLineProcessor processor, ICon host?.WriteMessage($"Output written to {outputFile}.{Environment.NewLine}"); - JsonReferenceResolver ReferenceResolverFactory(OpenApiDocument d) => new JsonAndYamlReferenceResolver(new JsonSchemaResolver(d, Settings.SchemaSettings)); - var documentJson = File.ReadAllText(outputFile); - var document = await OpenApiDocument.FromJsonAsync(documentJson, null, OutputType, ReferenceResolverFactory).ConfigureAwait(false); + var document = await OpenApiDocument.FromJsonAsync(documentJson, null).ConfigureAwait(false); await this.TryWriteDocumentOutputAsync(host, NewLineBehavior, () => document).ConfigureAwait(false); return document; } @@ -283,15 +262,7 @@ internal string ChangeWorkingDirectoryAndSetAspNetCoreEnvironment() public async Task GenerateDocumentAsync(AssemblyLoader.AssemblyLoader assemblyLoader, IServiceProvider serviceProvider, string currentWorkingDirectory) { Directory.SetCurrentDirectory(currentWorkingDirectory); - - if (UseDocumentProvider) - { - return await GenerateDocumentWithDocumentProviderAsync(serviceProvider); - } - else - { - return await GenerateDocumentWithApiDescriptionAsync(assemblyLoader, serviceProvider, currentWorkingDirectory); - } + return await GenerateDocumentWithDocumentProviderAsync(serviceProvider); } private async Task GenerateDocumentWithDocumentProviderAsync(IServiceProvider serviceProvider) @@ -301,27 +272,11 @@ private async Task GenerateDocumentWithDocumentProviderAsync(IS return document; } - private async Task GenerateDocumentWithApiDescriptionAsync(AssemblyLoader.AssemblyLoader assemblyLoader, IServiceProvider serviceProvider, string currentWorkingDirectory) - { - InitializeCustomTypes(assemblyLoader); - - // In the case of KeyNotFoundException, see https://github.com/aspnet/Mvc/issues/5690 - var apiDescriptionProvider = serviceProvider.GetRequiredService(); - - var settings = await CreateSettingsAsync(assemblyLoader, serviceProvider, currentWorkingDirectory); - var generator = new AspNetCoreOpenApiDocumentGenerator(settings); - var document = await generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).ConfigureAwait(false); - - PostprocessDocument(document); - - return document; - } - protected override async Task RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { var currentWorkingDirectory = ChangeWorkingDirectoryAndSetAspNetCoreEnvironment(); var document = await GenerateDocumentAsync(assemblyLoader, GetServiceProvider(assemblyLoader), currentWorkingDirectory); - return UseDocumentProvider ? document.ToJson() : document.ToJson(OutputType); + return document.ToJson(); } private static void TryDeleteFiles(List files) diff --git a/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiGeneratorCommandEntryPoint.cs b/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiGeneratorCommandEntryPoint.cs index a456b9cd81..130a931adc 100644 --- a/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiGeneratorCommandEntryPoint.cs +++ b/src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiGeneratorCommandEntryPoint.cs @@ -29,7 +29,7 @@ public static void Process(string commandContent, string outputFile, string appl var assemblyLoader = new AssemblyLoader.AssemblyLoader(); var document = command.GenerateDocumentAsync(assemblyLoader, serviceProvider, previousWorkingDirectory).GetAwaiter().GetResult(); - var json = command.UseDocumentProvider ? document.ToJson() : document.ToJson(command.OutputType); + var json = document.ToJson(); var outputPathDirectory = Path.GetDirectoryName(outputFile); Directory.CreateDirectory(outputPathDirectory); diff --git a/src/NSwag.Commands/Commands/Generation/ListTypesCommand.cs b/src/NSwag.Commands/Commands/Generation/ListTypesCommand.cs deleted file mode 100644 index 2c1b8ff22b..0000000000 --- a/src/NSwag.Commands/Commands/Generation/ListTypesCommand.cs +++ /dev/null @@ -1,71 +0,0 @@ -//----------------------------------------------------------------------- -// -// Copyright (c) Rico Suter. All rights reserved. -// -// https://github.com/RicoSuter/NSwag/blob/master/LICENSE.md -// Rico Suter, mail@rsuter.com -//----------------------------------------------------------------------- - -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using NConsole; -using NJsonSchema.Infrastructure; -using NSwag.AssemblyLoader.Utilities; -using System.IO; - -namespace NSwag.Commands.Generation -{ - [Command(Name = "list-types", Description = "List all types for the given assembly and settings.")] - public class ListTypesCommand : IsolatedCommandBase - { - [Argument(Name = nameof(File), IsRequired = false, Description = "The nswag.json configuration file path.")] - public string File { get; set; } - - [Argument(Name = nameof(Variables), IsRequired = false)] - public string Variables { get; set; } - - public override async Task RunAsync(CommandLineProcessor processor, IConsoleHost host) - { - if (!string.IsNullOrEmpty(File)) - { - var document = await NSwagDocument.LoadWithTransformationsAsync(File, Variables); - var command = (TypesToSwaggerCommand)document.SelectedSwaggerGenerator; - - AssemblyPaths = command.AssemblyPaths; - AssemblyConfig = command.AssemblyConfig; - ReferencePaths = command.ReferencePaths; - } - - var classNames = await RunIsolatedAsync(!string.IsNullOrEmpty(File) ? Path.GetDirectoryName(File) : null); - - host.WriteMessage("\r\n"); - foreach (var className in classNames) - { - host.WriteMessage(className + "\r\n"); - } - - host.WriteMessage("\r\n"); - - return classNames; - } - - protected override Task RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) - { -#if NETFRAMEWORK - var result = PathUtilities.ExpandFileWildcards(AssemblyPaths) - .Select(Assembly.LoadFrom) -#else - var currentDirectory = DynamicApis.DirectoryGetCurrentDirectory(); - var result = PathUtilities.ExpandFileWildcards(AssemblyPaths) - .Select(p => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(p, currentDirectory))) -#endif - .SelectMany(a => a.ExportedTypes) - .Select(t => t.FullName) - .OrderBy(c => c) - .ToArray(); - - return Task.FromResult(result); - } - } -} \ No newline at end of file diff --git a/src/NSwag.Commands/Commands/Generation/ListWebApiControllersCommand.cs b/src/NSwag.Commands/Commands/Generation/ListWebApiControllersCommand.cs deleted file mode 100644 index 80a3c693dc..0000000000 --- a/src/NSwag.Commands/Commands/Generation/ListWebApiControllersCommand.cs +++ /dev/null @@ -1,73 +0,0 @@ -//----------------------------------------------------------------------- -// -// Copyright (c) Rico Suter. All rights reserved. -// -// https://github.com/RicoSuter/NSwag/blob/master/LICENSE.md -// Rico Suter, mail@rsuter.com -//----------------------------------------------------------------------- - -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using NConsole; -using NJsonSchema.Infrastructure; -using NSwag.AssemblyLoader.Utilities; -using NSwag.Generation.WebApi; -using System.IO; -using NSwag.Commands.Generation.WebApi; - -namespace NSwag.Commands.Generation -{ - [Command(Name = "list-controllers", Description = "List all controllers classes for the given assembly and settings.")] - public class ListWebApiControllersCommand : IsolatedCommandBase - { - [Argument(Name = nameof(File), IsRequired = false, Description = "The nswag.json configuration file path.")] - public string File { get; set; } - - [Argument(Name = nameof(Variables), IsRequired = false)] - public string Variables { get; set; } - - public override async Task RunAsync(CommandLineProcessor processor, IConsoleHost host) - { - if (!string.IsNullOrEmpty(File)) - { - var document = await NSwagDocument.LoadWithTransformationsAsync(File, Variables); - var command = (WebApiToSwaggerCommand)document.SelectedSwaggerGenerator; - - AssemblyPaths = command.AssemblyPaths; - AssemblyConfig = command.AssemblyConfig; - ReferencePaths = command.ReferencePaths; - } - - var classNames = await RunIsolatedAsync(!string.IsNullOrEmpty(File) ? Path.GetDirectoryName(File) : null); - - host.WriteMessage("\r\n"); - foreach (var className in classNames) - { - host.WriteMessage(className + "\r\n"); - } - - host.WriteMessage("\r\n"); - - return classNames; - } - - protected override Task RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) - { -#if NETFRAMEWORK - var result = PathUtilities.ExpandFileWildcards(AssemblyPaths) - .Select(Assembly.LoadFrom) -#else - var currentDirectory = DynamicApis.DirectoryGetCurrentDirectory(); - var result = PathUtilities.ExpandFileWildcards(AssemblyPaths) - .Select(p => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(p, currentDirectory))) -#endif - .SelectMany(WebApiOpenApiDocumentGenerator.GetControllerClasses) - .Select(t => t.FullName) - .OrderBy(c => c) - .ToArray(); - - return Task.FromResult(result); - } - } -} \ No newline at end of file diff --git a/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs b/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs index d0ffb868be..b910d9bacb 100644 --- a/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs +++ b/src/NSwag.Commands/Commands/Generation/OpenApiGeneratorCommandBase.cs @@ -7,136 +7,18 @@ //----------------------------------------------------------------------- #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -using System; -using System.Linq; -using System.Reflection; -using System.Text.Json; -using System.Threading.Tasks; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; using NConsole; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; -using NJsonSchema; -using NJsonSchema.Generation; -using NJsonSchema.Infrastructure; -using NSwag.AssemblyLoader.Utilities; -using NSwag.Generation; -using NSwag.Generation.AspNetCore; -using NSwag.Generation.Processors; +using System; +using System.Linq; +using System.Reflection; namespace NSwag.Commands.Generation { /// - public abstract class OpenApiGeneratorCommandBase : IsolatedSwaggerOutputCommandBase - where TSettings : OpenApiDocumentGeneratorSettings, new() + public abstract class OpenApiGeneratorCommandBase : IsolatedSwaggerOutputCommandBase { - /// Initializes a new instance of the class. - protected OpenApiGeneratorCommandBase() - { - Settings = new TSettings(); - } - - [JsonIgnore] - protected override TSettings Settings { get; } - - [Argument(Name = nameof(DefaultResponseReferenceTypeNullHandling), IsRequired = false, Description = "The default response reference type null handling (default: NotNull (default) or Null).")] - public ReferenceTypeNullHandling DefaultResponseReferenceTypeNullHandling - { - get => Settings.DefaultResponseReferenceTypeNullHandling; - set => Settings.DefaultResponseReferenceTypeNullHandling = value; - } - - [Argument(Name = nameof(GenerateOriginalParameterNames), IsRequired = false, Description = "Generate x-originalName properties when parameter name is differnt in .NET and HTTP (default: true).")] - public bool GenerateOriginalParameterNames - { - get => Settings.GenerateOriginalParameterNames; - set => Settings.GenerateOriginalParameterNames = value; - } - - [Argument(Name = "FlattenInheritanceHierarchy", IsRequired = false, Description = "Flatten the inheritance hierarchy instead of using allOf to describe inheritance (default: false).")] - public bool FlattenInheritanceHierarchy - { - get => Settings.SchemaSettings.FlattenInheritanceHierarchy; - set => Settings.SchemaSettings.FlattenInheritanceHierarchy = value; - } - - [Argument(Name = "GenerateKnownTypes", IsRequired = false, Description = "Generate schemas for types in KnownTypeAttribute attributes (default: true).")] - public bool GenerateKnownTypes - { - get => Settings.SchemaSettings.GenerateKnownTypes; - set => Settings.SchemaSettings.GenerateKnownTypes = value; - } - - [Argument(Name = "GenerateEnumMappingDescription", IsRequired = false, - Description = "Generate a description with number to enum name mappings (for integer enums only, default: false).")] - public bool GenerateEnumMappingDescription - { - get => Settings.SchemaSettings.GenerateEnumMappingDescription; - set => Settings.SchemaSettings.GenerateEnumMappingDescription = value; - } - - [Argument(Name = "GenerateXmlObjects", IsRequired = false, Description = "Generate xmlObject representation for definitions (default: false).")] - public bool GenerateXmlObjects - { - get => Settings.SchemaSettings.GenerateXmlObjects; - set => Settings.SchemaSettings.GenerateXmlObjects = value; - } - - [Argument(Name = "GenerateAbstractProperties", IsRequired = false, Description = "Generate abstract properties (i.e. interface and abstract properties. " + - "Properties may defined multiple times in a inheritance hierarchy, default: false).")] - public bool GenerateAbstractProperties - { - get => Settings.SchemaSettings.GenerateAbstractProperties; - set => Settings.SchemaSettings.GenerateAbstractProperties = value; - } - - [Argument(Name = "GenerateAbstractSchemas", IsRequired = false, Description = "Generate the x-abstract flag on schemas (default: true).")] - public bool GenerateAbstractSchemas - { - get => Settings.SchemaSettings.GenerateAbstractSchemas; - set => Settings.SchemaSettings.GenerateAbstractSchemas = value; - } - - [Argument(Name = "IgnoreObsoleteProperties", IsRequired = false, Description = "Ignore properties with the ObsoleteAttribute (default: false).")] - public bool IgnoreObsoleteProperties - { - get => Settings.SchemaSettings.IgnoreObsoleteProperties; - set => Settings.SchemaSettings.IgnoreObsoleteProperties = value; - } - - [Argument(Name = "AllowReferencesWithProperties", IsRequired = false, Description = "Use $ref references even if additional properties are defined on " + - "the object (otherwise allOf/oneOf with $ref is used, default: false).")] - public bool AllowReferencesWithProperties - { - get => Settings.SchemaSettings.AllowReferencesWithProperties; - set => Settings.SchemaSettings.AllowReferencesWithProperties = value; - } - - [Argument(Name = "UseXmlDocumentation", IsRequired = false, Description = "Read XML Docs files (default: true).")] - public bool UseXmlDocumentation - { - get => Settings.SchemaSettings.UseXmlDocumentation; - set => Settings.SchemaSettings.UseXmlDocumentation = value; - } - - [Argument(Name = "ResolveExternalXmlDocumentation", IsRequired = false, Description = "Resolve the XML Docs from the NuGet cache or .NET SDK directory (default: true).")] - public bool ResolveExternalXmlDocumentation - { - get => Settings.SchemaSettings.ResolveExternalXmlDocumentation; - set => Settings.SchemaSettings.ResolveExternalXmlDocumentation = value; - } - - [Argument(Name = "ExcludedTypeNames", IsRequired = false, Description = "The excluded type names (same as JsonSchemaIgnoreAttribute).")] - public string[] ExcludedTypeNames - { - get => Settings.SchemaSettings.ExcludedTypeNames; - set => Settings.SchemaSettings.ExcludedTypeNames = value; - } - [Argument(Name = "ServiceHost", IsRequired = false, Description = "Overrides the service host of the web service (optional, use '.' to remove the hostname).")] public string ServiceHost { get; set; } @@ -146,27 +28,6 @@ public string[] ExcludedTypeNames [Argument(Name = "ServiceSchemes", IsRequired = false, Description = "Overrides the allowed schemes of the web service (optional, comma separated, 'http', 'https', 'ws', 'wss').")] public string[] ServiceSchemes { get; set; } = new string[0]; - [Argument(Name = "InfoTitle", IsRequired = false, Description = "Specify the title of the Swagger specification (ignored when DocumentTemplate is set).")] - public string InfoTitle - { - get => Settings.Title; - set => Settings.Title = value; - } - - [Argument(Name = "InfoDescription", IsRequired = false, Description = "Specify the description of the Swagger specification (ignored when DocumentTemplate is set).")] - public string InfoDescription - { - get => Settings.Description; - set => Settings.Description = value; - } - - [Argument(Name = "InfoVersion", IsRequired = false, Description = "Specify the version of the Swagger specification (default: 1.0.0, ignored when DocumentTemplate is set).")] - public string InfoVersion - { - get => Settings.Version; - set => Settings.Version = value; - } - [Argument(Name = "DocumentTemplate", IsRequired = false, Description = "Specifies the Swagger document template (may be a path or JSON, default: none).")] public string DocumentTemplate { get; set; } @@ -185,9 +46,6 @@ public string InfoVersion [Argument(Name = "SerializerSettings", IsRequired = false, Description = "The custom JsonSerializerSettings implementation type in the form 'assemblyName:fullTypeName' or 'fullTypeName'.")] public string SerializerSettingsType { get; set; } - [Argument(Name = "UseDocumentProvider", IsRequired = false, Description = "Generate document using SwaggerDocumentProvider (configuration from AddOpenApiDocument()/AddSwaggerDocument(), most CLI settings will be ignored).")] - public bool UseDocumentProvider { get; set; } = true; - [Argument(Name = "DocumentName", IsRequired = false, Description = "The document name to use in SwaggerDocumentProvider (default: v1).")] public string DocumentName { get; set; } = "v1"; @@ -200,58 +58,6 @@ public string InfoVersion [Argument(Name = "Startup", IsRequired = false, Description = "The Startup class type in the form 'assemblyName:fullTypeName' or 'fullTypeName'.")] public string StartupType { get; set; } - [Argument(Name = "AllowNullableBodyParameters", IsRequired = false, Description = "Nullable body parameters are allowed (ignored when MvcOptions.AllowEmptyInputInBodyModelBinding is available (ASP.NET Core 2.0+), default: true).")] - public bool AllowNullableBodyParameters - { - get => Settings.AllowNullableBodyParameters; - set => Settings.AllowNullableBodyParameters = value; - } - - [Argument(Name = "UseHttpAttributeNameAsOperationId", IsRequired = false, Description = "Gets or sets a value indicating whether the HttpMethodAttribute Name property shall be used as OperationId.")] - public bool UseHttpAttributeNameAsOperationId - { - get => Settings.UseHttpAttributeNameAsOperationId; - set => Settings.UseHttpAttributeNameAsOperationId = value; - } - - public async Task CreateSettingsAsync(AssemblyLoader.AssemblyLoader assemblyLoader, IServiceProvider serviceProvider, string workingDirectory) - { - var mvcOptions = serviceProvider?.GetRequiredService>().Value; - -#if NETCOREAPP3_0_OR_GREATER - JsonSerializerSettings newtonsoftSettings = null; - JsonSerializerOptions systemTextJsonOptions = null; - - try - { - var mvcJsonOptions = serviceProvider?.GetRequiredService>(); - newtonsoftSettings = mvcJsonOptions?.Value?.SerializerSettings; - } - catch - { - systemTextJsonOptions = AspNetCoreOpenApiDocumentGenerator.GetSystemTextJsonSettings(serviceProvider); - } -#else - JsonSerializerOptions systemTextJsonOptions = null; - var mvcJsonOptions = serviceProvider?.GetRequiredService>(); - var newtonsoftSettings = mvcJsonOptions?.Value?.SerializerSettings; -#endif - - if (systemTextJsonOptions != null) - { - Settings.ApplySettings(new SystemTextJsonSchemaGeneratorSettings { SerializerOptions = systemTextJsonOptions }, mvcOptions); - } - else if (newtonsoftSettings != null) - { - Settings.ApplySettings(new NewtonsoftJsonSchemaGeneratorSettings { SerializerSettings = newtonsoftSettings }, mvcOptions); - } - - Settings.DocumentTemplate = await GetDocumentTemplateAsync(workingDirectory); - InitializeCustomTypes(assemblyLoader); - - return Settings; - } - protected IServiceProvider GetServiceProvider(AssemblyLoader.AssemblyLoader assemblyLoader) { if (!string.IsNullOrEmpty(CreateWebHostBuilderMethod)) @@ -294,108 +100,5 @@ protected IServiceProvider GetServiceProvider(AssemblyLoader.AssemblyLoader asse return ServiceProviderResolver.GetServiceProvider(firstAssembly); } } - - protected void InitializeCustomTypes(AssemblyLoader.AssemblyLoader assemblyLoader) - { - if (DocumentProcessorTypes != null) - { - foreach (var p in DocumentProcessorTypes) - { - var processor = (IDocumentProcessor)assemblyLoader.CreateInstance(p); - Settings.DocumentProcessors.Add(processor); - } - } - - if (OperationProcessorTypes != null) - { - var prependIndex = 0; - foreach (var p in OperationProcessorTypes) - { - var processor = (IOperationProcessor)assemblyLoader.CreateInstance(p[0] == ':' ? p.Substring(1) : p); - if (p[0] == ':') - { - Settings.OperationProcessors.Insert(prependIndex++, processor); - } - else - { - Settings.OperationProcessors.Add(processor); - } - } - } - - if (!string.IsNullOrEmpty(TypeNameGeneratorType)) - { - Settings.SchemaSettings.TypeNameGenerator = (ITypeNameGenerator)assemblyLoader.CreateInstance(TypeNameGeneratorType); - } - - if (!string.IsNullOrEmpty(SchemaNameGeneratorType)) - { - Settings.SchemaSettings.SchemaNameGenerator = (ISchemaNameGenerator)assemblyLoader.CreateInstance(SchemaNameGeneratorType); - } - - if (Settings.SchemaSettings is NewtonsoftJsonSchemaGeneratorSettings settings) - { - if (!string.IsNullOrEmpty(SerializerSettingsType)) - { - settings.SerializerSettings = (JsonSerializerSettings)assemblyLoader.CreateInstance(SerializerSettingsType); - } - } - } - - protected void PostprocessDocument(OpenApiDocument document) - { - if (ServiceHost == ".") - { - document.Host = string.Empty; - } - else if (!string.IsNullOrEmpty(ServiceHost)) - { - document.Host = ServiceHost; - } - - if (ServiceSchemes != null && ServiceSchemes.Any()) - { - document.Schemes = ServiceSchemes - .Select(s => (OpenApiSchema)Enum.Parse(typeof(OpenApiSchema), s, true)) - .ToList(); - } - - if (!string.IsNullOrEmpty(ServiceBasePath)) - { - document.BasePath = ServiceBasePath; - } - } - - private async Task GetDocumentTemplateAsync(string workingDirectory) - { - if (!string.IsNullOrEmpty(DocumentTemplate)) - { - var file = PathUtilities.MakeAbsolutePath(DocumentTemplate, workingDirectory); - if (DynamicApis.FileExists(file)) - { - var json = DynamicApis.FileReadAllText(file); - if (json.StartsWith("{") == false) - { - return (await OpenApiYamlDocument.FromYamlAsync(json)).ToJson(); - } - else - { - return json; - } - } - else if (DocumentTemplate.StartsWith("{") == false) - { - return (await OpenApiYamlDocument.FromYamlAsync(DocumentTemplate)).ToJson(); - } - else - { - return DocumentTemplate; - } - } - else - { - return null; - } - } } } diff --git a/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs b/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs deleted file mode 100644 index a277fbffb2..0000000000 --- a/src/NSwag.Commands/Commands/Generation/TypesToOpenApiCommand.cs +++ /dev/null @@ -1,144 +0,0 @@ -//----------------------------------------------------------------------- -// -// Copyright (c) Rico Suter. All rights reserved. -// -// https://github.com/RicoSuter/NSwag/blob/master/LICENSE.md -// Rico Suter, mail@rsuter.com -//----------------------------------------------------------------------- - -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using NConsole; -using Newtonsoft.Json; -using NJsonSchema.Generation; -using NJsonSchema.Infrastructure; -using NSwag.AssemblyLoader.Utilities; -using NSwag.Generation.AspNetCore; - -namespace NSwag.Commands.Generation -{ - /// - [Command(Name = "types2openapi")] - public class TypesToOpenApiCommand : TypesToSwaggerCommand - { - } - - /// - [Command(Name = "types2swagger")] - public class TypesToSwaggerCommand : IsolatedSwaggerOutputCommandBase - { - /// Initializes a new instance of the class. - public TypesToSwaggerCommand() - { - ClassNames = new string[] { }; - } - - [JsonIgnore] - protected override AspNetCoreOpenApiDocumentGeneratorSettings Settings { get; } - - [Argument(Name = "ClassNames", Description = "The class names.")] - public string[] ClassNames { get; set; } - - [Argument(Name = nameof(DefaultReferenceTypeNullHandling), IsRequired = false, Description = "The default reference type null handling (Null (default) or NotNull).")] - public ReferenceTypeNullHandling DefaultReferenceTypeNullHandling - { - get => Settings.SchemaSettings.DefaultReferenceTypeNullHandling; - set => Settings.SchemaSettings.DefaultReferenceTypeNullHandling = value; - } - - [Argument(Name = nameof(DefaultDictionaryValueReferenceTypeNullHandling), IsRequired = false, Description = "The default reference type null handling of dictionary value types (NotNull (default) or Null).")] - public ReferenceTypeNullHandling DefaultDictionaryValueReferenceTypeNullHandling - { - get => Settings.SchemaSettings.DefaultDictionaryValueReferenceTypeNullHandling; - set => Settings.SchemaSettings.DefaultDictionaryValueReferenceTypeNullHandling = value; - } - - [Argument(Name = "FlattenInheritanceHierarchy", IsRequired = false, Description = "Flatten the inheritance hierarchy instead of using allOf to describe inheritance (default: false).")] - public bool FlattenInheritanceHierarchy - { - get { return Settings.SchemaSettings.FlattenInheritanceHierarchy; } - set { Settings.SchemaSettings.FlattenInheritanceHierarchy = value; } - } - - [Argument(Name = "IgnoreObsoleteProperties", IsRequired = false, Description = "Ignore properties with the ObsoleteAttribute (default: false).")] - public bool IgnoreObsoleteProperties - { - get { return Settings.SchemaSettings.IgnoreObsoleteProperties; } - set { Settings.SchemaSettings.IgnoreObsoleteProperties = value; } - } - - [Argument(Name = "AllowReferencesWithProperties", IsRequired = false, Description = "Use $ref references even if additional properties are defined on " + - "the object (otherwise allOf/oneOf with $ref is used, default: false).")] - public bool AllowReferencesWithProperties - { - get { return Settings.SchemaSettings.AllowReferencesWithProperties; } - set { Settings.SchemaSettings.AllowReferencesWithProperties = value; } - } - - [Argument(Name = "GenerateKnownTypes", IsRequired = false, Description = "Generate schemas for types in KnownTypeAttribute attributes (default: true).")] - public bool GenerateKnownTypes - { - get { return Settings.SchemaSettings.GenerateKnownTypes; } - set { Settings.SchemaSettings.GenerateKnownTypes = value; } - } - - [Argument(Name = "GenerateEnumMappingDescription", IsRequired = false, - Description = "Generate a description with number to enum name mappings (for integer enums only, default: false).")] - public bool GenerateEnumMappingDescription - { - get => Settings.SchemaSettings.GenerateEnumMappingDescription; - set => Settings.SchemaSettings.GenerateEnumMappingDescription = value; - } - - [Argument(Name = "GenerateXmlObjects", IsRequired = false, Description = "Generate xmlObject representation for definitions (default: false).")] - public bool GenerateXmlObjects - { - get { return Settings.SchemaSettings.GenerateXmlObjects; } - set { Settings.SchemaSettings.GenerateXmlObjects = value; } - } - - [Argument(Name = "UseXmlDocumentation", IsRequired = false, Description = "Read XML Docs files (default: true).")] - public bool UseXmlDocumentation - { - get => Settings.SchemaSettings.UseXmlDocumentation; - set => Settings.SchemaSettings.UseXmlDocumentation = value; - } - - [Argument(Name = "ResolveExternalXmlDocumentation", IsRequired = false, Description = "Resolve the XML Docs from the NuGet cache or .NET SDK directory (default: true).")] - public bool ResolveExternalXmlDocumentation - { - get => Settings.SchemaSettings.ResolveExternalXmlDocumentation; - set => Settings.SchemaSettings.ResolveExternalXmlDocumentation = value; - } - - protected override Task RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) - { - var document = new OpenApiDocument(); - var generator = new JsonSchemaGenerator(Settings.SchemaSettings); - var schemaResolver = new OpenApiSchemaResolver(document, Settings.SchemaSettings); - -#if NETFRAMEWORK - var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) - .Select(path => Assembly.LoadFrom(path)).ToArray(); -#else - var currentDirectory = DynamicApis.DirectoryGetCurrentDirectory(); - var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) - .Select(path => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(path, currentDirectory))).ToArray(); -#endif - - var allExportedClassNames = assemblies.SelectMany(a => a.ExportedTypes).Select(t => t.FullName).ToList(); - var matchedClassNames = ClassNames - .SelectMany(n => PathUtilities.FindWildcardMatches(n, allExportedClassNames, '.')) - .Distinct(); - - foreach (var className in matchedClassNames) - { - var type = assemblies.Select(a => a.GetType(className)).FirstOrDefault(t => t != null); - generator.Generate(type, schemaResolver); - } - - return Task.FromResult(document.ToJson(OutputType)); - } - } -} \ No newline at end of file diff --git a/src/NSwag.Commands/Commands/Generation/WebApi/WebApiToOpenApiCommand.cs b/src/NSwag.Commands/Commands/Generation/WebApi/WebApiToOpenApiCommand.cs deleted file mode 100644 index 65f048b364..0000000000 --- a/src/NSwag.Commands/Commands/Generation/WebApi/WebApiToOpenApiCommand.cs +++ /dev/null @@ -1,167 +0,0 @@ -//----------------------------------------------------------------------- -// -// Copyright (c) Rico Suter. All rights reserved. -// -// https://github.com/RicoSuter/NSwag/blob/master/LICENSE.md -// Rico Suter, mail@rsuter.com -//----------------------------------------------------------------------- -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Namotion.Reflection; -using NConsole; -using Newtonsoft.Json; -using NJsonSchema.Infrastructure; -using NSwag.AssemblyLoader.Utilities; -using NSwag.Generation.Processors; -using NSwag.Generation.WebApi; - -namespace NSwag.Commands.Generation.WebApi -{ - /// The generator. - [Command(Name = "webapi2openapi", Description = "Generates a Swagger/OpenAPI specification for a controller or controllers contained in a .NET Web API assembly.")] - public class WebApiToOpenApiCommand : WebApiToSwaggerCommand - { - } - - /// The generator. - [Command(Name = "webapi2swagger", Description = "Generates a Swagger/OpenAPI specification for a controller or controllers contained in a .NET Web API assembly (obsolete: use webapi2openapi instead).")] - public class WebApiToSwaggerCommand : OpenApiGeneratorCommandBase - { - /// Initializes a new instance of the class. - public WebApiToSwaggerCommand() - { - ControllerNames = new string[] { }; - } - - [JsonIgnore] - [Argument(Name = "Controller", IsRequired = false, Description = "The Web API controller full class name or empty to load all controllers from the assembly.")] - public string ControllerName - { - get => ControllerNames.FirstOrDefault(); - set => ControllerNames = new[] { value }; - } - - [Argument(Name = "Controllers", IsRequired = false, Description = "The Web API controller full class names or empty to load all controllers from the assembly (comma separated).")] - public string[] ControllerNames { get; set; } - - [Argument(Name = "AspNetCore", IsRequired = false, Description = "Specifies whether the controllers are hosted by ASP.NET Core.")] - public bool IsAspNetCore - { - get => Settings.IsAspNetCore; - set => Settings.IsAspNetCore = value; - } - - [Argument(Name = "ResolveJsonOptions", IsRequired = false, Description = "Specifies whether to resolve MvcJsonOptions to infer serializer settings (recommended, default: false, only available when IsAspNetCore is set).")] - public bool ResolveJsonOptions { get; set; } - - [Argument(Name = "DefaultUrlTemplate", IsRequired = false, Description = "The Web API default URL template (default for Web API: 'api/{controller}/{id}'; for MVC projects: '{controller}/{action}/{id?}').")] - public string DefaultUrlTemplate - { - get => Settings.DefaultUrlTemplate; - set => Settings.DefaultUrlTemplate = value; - } - - [Argument(Name = "AddMissingPathParameters", IsRequired = false, Description = "Specifies whether to add path parameters which are missing in the action method (default: false).")] - public bool AddMissingPathParameters - { - get => Settings.AddMissingPathParameters; - set => Settings.AddMissingPathParameters = value; - } - - [Argument(Name = "IncludedVersions", IsRequired = false, Description = "The included API versions used by the ApiVersionProcessor (comma separated, default: empty = all).")] - public string[] IncludedVersions - { - get => Settings.OperationProcessors.TryGet().IncludedVersions; - set => Settings.OperationProcessors.TryGet().IncludedVersions = value; - } - - protected override async Task RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) - { - var controllerNames = ControllerNames.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList(); - if (!controllerNames.Any() && AssemblyPaths?.Length > 0) - { - controllerNames = GetControllerNames(assemblyLoader).ToList(); - } - - var controllerTypes = GetControllerTypes(controllerNames, assemblyLoader); - - WebApiOpenApiDocumentGeneratorSettings settings; - var workingDirectory = Directory.GetCurrentDirectory(); - if (IsAspNetCore && ResolveJsonOptions) - { - settings = await CreateSettingsAsync(assemblyLoader, GetServiceProvider(assemblyLoader), workingDirectory); - } - else - { - settings = await CreateSettingsAsync(assemblyLoader, null, workingDirectory); - } - - var generator = new WebApiOpenApiDocumentGenerator(settings); - var document = await generator.GenerateForControllersAsync(controllerTypes).ConfigureAwait(false); - - PostprocessDocument(document); - - return document.ToJson(OutputType); - } - - private string[] GetControllerNames(AssemblyLoader.AssemblyLoader assemblyLoader) - { -#if NETFRAMEWORK - return PathUtilities.ExpandFileWildcards(AssemblyPaths) - .Select(Assembly.LoadFrom) -#else - var currentDirectory = DynamicApis.DirectoryGetCurrentDirectory(); - return PathUtilities.ExpandFileWildcards(AssemblyPaths) - .Select(p => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(p, currentDirectory))) -#endif - .SelectMany(WebApiOpenApiDocumentGenerator.GetControllerClasses) - .Select(t => t.FullName) - .OrderBy(c => c) - .ToArray(); - } - - private List GetControllerTypes(IEnumerable controllerNames, AssemblyLoader.AssemblyLoader assemblyLoader) -#pragma warning restore 1998 - { - if (AssemblyPaths == null || AssemblyPaths.Length == 0) - { - throw new InvalidOperationException("No assembly paths have been provided."); - } - - var assemblies = LoadAssemblies(AssemblyPaths, assemblyLoader); - - var allExportedNames = assemblies.SelectMany(a => a.ExportedTypes).Select(t => t.FullName).ToList(); - var matchedControllerNames = controllerNames - .SelectMany(n => PathUtilities.FindWildcardMatches(n, allExportedNames, '.')) - .Distinct(); - - var controllerNamesWithoutWildcard = controllerNames.Where(n => !n.Contains("*")).ToArray(); - if (controllerNamesWithoutWildcard.Any(n => !matchedControllerNames.Contains(n))) - { - throw new TypeLoadException("Unable to load type for controllers: " + string.Join(", ", controllerNamesWithoutWildcard)); - } - - var controllerTypes = new List(); - foreach (var className in matchedControllerNames) - { - var controllerType = assemblies.Select(a => a.GetType(className)).FirstOrDefault(t => t != null); - if (controllerType != null) - { - controllerTypes.Add(controllerType); - } - else - { - throw new TypeLoadException("Unable to load type for controller: " + className); - } - } - - return controllerTypes; - } - } -} diff --git a/src/NSwag.Commands/Commands/IsolatedSwaggerOutputCommandBase.cs b/src/NSwag.Commands/Commands/IsolatedSwaggerOutputCommandBase.cs index c120b50610..5611b28aea 100644 --- a/src/NSwag.Commands/Commands/IsolatedSwaggerOutputCommandBase.cs +++ b/src/NSwag.Commands/Commands/IsolatedSwaggerOutputCommandBase.cs @@ -5,6 +5,7 @@ // https://github.com/RicoSuter/NSwag/blob/master/LICENSE.md // Rico Suter, mail@rsuter.com //----------------------------------------------------------------------- + #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using System.Collections.Generic; @@ -23,34 +24,20 @@ namespace NSwag.Commands { /// A command which is run in isolation. - public abstract class IsolatedSwaggerOutputCommandBase : IsolatedCommandBase, IOutputCommand - where T : OpenApiDocumentGeneratorSettings, new() + public abstract class IsolatedSwaggerOutputCommandBase : IsolatedCommandBase, IOutputCommand { - [JsonIgnore] - protected abstract T Settings { get; } - [Argument(Name = "Output", IsRequired = false, Description = "The output file path (optional).")] [JsonProperty("output", NullValueHandling = NullValueHandling.Include)] public string OutputFilePath { get; set; } - [Argument(Name = "OutputType", IsRequired = false, Description = "Specifies the output schema type, ignored when UseDocumentProvider is enabled (Swagger2|OpenApi3, default: Swagger2).")] - public SchemaType OutputType - { - get { return Settings.SchemaSettings.SchemaType; } - set { Settings.SchemaSettings.SchemaType = value; } - } - [Argument(Name = "NewLineBehavior", IsRequired = false, Description = "The new line behavior (Auto (OS default), CRLF, LF).")] [JsonProperty("newLineBehavior", NullValueHandling = NullValueHandling.Include)] public NewLineBehavior NewLineBehavior { get; set; } = NewLineBehavior.Auto; public override async Task RunAsync(CommandLineProcessor processor, IConsoleHost host) { - JsonReferenceResolver ReferenceResolverFactory(OpenApiDocument d) => - new JsonAndYamlReferenceResolver(new JsonSchemaResolver(d, Settings.SchemaSettings)); - var documentJson = await RunIsolatedAsync((string)null); - var document = await OpenApiDocument.FromJsonAsync(documentJson, null, OutputType, ReferenceResolverFactory).ConfigureAwait(false); + var document = await OpenApiDocument.FromJsonAsync(documentJson, null).ConfigureAwait(false); await this.TryWriteDocumentOutputAsync(host, NewLineBehavior, () => document).ConfigureAwait(false); return document; } diff --git a/src/NSwag.Commands/NSwagDocument.cs b/src/NSwag.Commands/NSwagDocument.cs index 5fbcd6cbae..fbe3366954 100644 --- a/src/NSwag.Commands/NSwagDocument.cs +++ b/src/NSwag.Commands/NSwagDocument.cs @@ -15,9 +15,7 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using NSwag.AssemblyLoader.Utilities; -using NSwag.Commands.Generation; using NSwag.Commands.Generation.AspNetCore; -using NSwag.Commands.Generation.WebApi; namespace NSwag.Commands { @@ -36,8 +34,6 @@ public class NSwagDocument : NSwagDocumentBase public NSwagDocument() { SwaggerGenerators.AspNetCoreToOpenApiCommand = new AspNetCoreToOpenApiCommand(); - SwaggerGenerators.WebApiToOpenApiCommand = new WebApiToOpenApiCommand(); - SwaggerGenerators.TypesToOpenApiCommand = new TypesToOpenApiCommand(); } /// Creates a new NSwagDocument. @@ -55,8 +51,6 @@ public static Task LoadAsync(string filePath) return LoadAsync(filePath, null, false, new Dictionary { { typeof(AspNetCoreToSwaggerCommand), typeof(AspNetCoreToSwaggerCommand) }, - { typeof(WebApiToSwaggerCommand), typeof(WebApiToSwaggerCommand) }, - { typeof(TypesToSwaggerCommand), typeof(TypesToSwaggerCommand) } }); } @@ -69,8 +63,6 @@ public static Task LoadWithTransformationsAsync(string filePath, return LoadAsync(filePath, variables, true, new Dictionary { { typeof(AspNetCoreToSwaggerCommand), typeof(AspNetCoreToSwaggerCommand) }, - { typeof(WebApiToSwaggerCommand), typeof(WebApiToSwaggerCommand) }, - { typeof(TypesToSwaggerCommand), typeof(TypesToSwaggerCommand) } }); } @@ -151,52 +143,6 @@ public async Task ExecuteCommandLineAsync(bool r } } - /// Gets the available controller types by calling the command line. - /// The controller names. - public async Task GetControllersFromCommandLineAsync() - { - if (SelectedSwaggerGenerator is not WebApiToSwaggerCommand) - { - return Array.Empty(); - } - - var baseFilename = System.IO.Path.GetTempPath() + "nswag_document_" + Guid.NewGuid(); - var configFilename = baseFilename + "_config.json"; - File.WriteAllText(configFilename, ToJson()); - try - { - var command = "list-controllers /file:\"" + configFilename + "\""; - return GetListFromCommandLineOutput(await StartCommandLineProcessAsync(command)); - } - finally - { - DeleteFileIfExists(configFilename); - } - } - - /// Gets the available controller types by calling the command line. - /// The controller names. - public async Task GetTypesFromCommandLineAsync() - { - if (SelectedSwaggerGenerator is not TypesToSwaggerCommand) - { - return Array.Empty(); - } - - var baseFilename = System.IO.Path.GetTempPath() + "nswag_document_" + Guid.NewGuid(); - var configFilename = baseFilename + "_config.json"; - File.WriteAllText(configFilename, ToJson()); - try - { - var command = "list-types /file:\"" + configFilename + "\""; - return GetListFromCommandLineOutput(await StartCommandLineProcessAsync(command)); - } - finally - { - DeleteFileIfExists(configFilename); - } - } - /// Converts to absolute path. /// The path to convert. /// The absolute path. diff --git a/src/NSwag.Commands/NSwagDocumentBase.cs b/src/NSwag.Commands/NSwagDocumentBase.cs index 4948d3e25b..a9f9574728 100644 --- a/src/NSwag.Commands/NSwagDocumentBase.cs +++ b/src/NSwag.Commands/NSwagDocumentBase.cs @@ -325,19 +325,6 @@ private void ConvertToAbsolutePaths() } } - if (SwaggerGenerators.WebApiToOpenApiCommand != null) - { - SwaggerGenerators.WebApiToOpenApiCommand.AssemblyPaths = - SwaggerGenerators.WebApiToOpenApiCommand.AssemblyPaths.Select(ConvertToAbsolutePath).ToArray(); - SwaggerGenerators.WebApiToOpenApiCommand.ReferencePaths = - SwaggerGenerators.WebApiToOpenApiCommand.ReferencePaths.Select(ConvertToAbsolutePath).ToArray(); - - SwaggerGenerators.WebApiToOpenApiCommand.DocumentTemplate = ConvertToAbsolutePath( - SwaggerGenerators.WebApiToOpenApiCommand.DocumentTemplate); - SwaggerGenerators.WebApiToOpenApiCommand.AssemblyConfig = ConvertToAbsolutePath( - SwaggerGenerators.WebApiToOpenApiCommand.AssemblyConfig); - } - if (SwaggerGenerators.AspNetCoreToOpenApiCommand != null) { SwaggerGenerators.AspNetCoreToOpenApiCommand.AssemblyPaths = @@ -359,14 +346,6 @@ private void ConvertToAbsolutePaths() SwaggerGenerators.AspNetCoreToOpenApiCommand.WorkingDirectory); } - if (SwaggerGenerators.TypesToOpenApiCommand != null) - { - SwaggerGenerators.TypesToOpenApiCommand.AssemblyPaths = - SwaggerGenerators.TypesToOpenApiCommand.AssemblyPaths.Select(ConvertToAbsolutePath).ToArray(); - SwaggerGenerators.TypesToOpenApiCommand.AssemblyConfig = ConvertToAbsolutePath( - SwaggerGenerators.TypesToOpenApiCommand.AssemblyConfig); - } - if (CodeGenerators.OpenApiToTypeScriptClientCommand != null) { CodeGenerators.OpenApiToTypeScriptClientCommand.ExtensionCode = ConvertToAbsolutePath( @@ -420,19 +399,6 @@ private void ConvertToRelativePaths() } } - if (SwaggerGenerators.WebApiToOpenApiCommand != null) - { - SwaggerGenerators.WebApiToOpenApiCommand.AssemblyPaths = - SwaggerGenerators.WebApiToOpenApiCommand.AssemblyPaths.Select(ConvertToRelativePath).ToArray(); - SwaggerGenerators.WebApiToOpenApiCommand.ReferencePaths = - SwaggerGenerators.WebApiToOpenApiCommand.ReferencePaths.Select(ConvertToRelativePath).ToArray(); - - SwaggerGenerators.WebApiToOpenApiCommand.DocumentTemplate = ConvertToRelativePath( - SwaggerGenerators.WebApiToOpenApiCommand.DocumentTemplate); - SwaggerGenerators.WebApiToOpenApiCommand.AssemblyConfig = ConvertToRelativePath( - SwaggerGenerators.WebApiToOpenApiCommand.AssemblyConfig); - } - if (SwaggerGenerators.AspNetCoreToOpenApiCommand != null) { SwaggerGenerators.AspNetCoreToOpenApiCommand.AssemblyPaths = @@ -454,15 +420,6 @@ private void ConvertToRelativePaths() SwaggerGenerators.AspNetCoreToOpenApiCommand.WorkingDirectory); } - - if (SwaggerGenerators.TypesToOpenApiCommand != null) - { - SwaggerGenerators.TypesToOpenApiCommand.AssemblyPaths = - SwaggerGenerators.TypesToOpenApiCommand.AssemblyPaths.Select(ConvertToRelativePath).ToArray(); - SwaggerGenerators.TypesToOpenApiCommand.AssemblyConfig = ConvertToRelativePath( - SwaggerGenerators.TypesToOpenApiCommand.AssemblyConfig); - } - if (CodeGenerators.OpenApiToTypeScriptClientCommand != null) { CodeGenerators.OpenApiToTypeScriptClientCommand.ExtensionCode = ConvertToRelativePath( diff --git a/src/NSwag.Commands/OpenApiGeneratorCollection.cs b/src/NSwag.Commands/OpenApiGeneratorCollection.cs index 83b965a4a2..87086be628 100644 --- a/src/NSwag.Commands/OpenApiGeneratorCollection.cs +++ b/src/NSwag.Commands/OpenApiGeneratorCollection.cs @@ -3,7 +3,6 @@ using NSwag.Commands.CodeGeneration; using NSwag.Commands.Generation; using NSwag.Commands.Generation.AspNetCore; -using NSwag.Commands.Generation.WebApi; namespace NSwag.Commands { @@ -18,26 +17,16 @@ public class OpenApiGeneratorCollection [JsonIgnore] public JsonSchemaToOpenApiCommand JsonSchemaToOpenApiCommand { get; set; } - /// Gets or sets the Web API to swagger command. - [JsonIgnore] - public WebApiToOpenApiCommand WebApiToOpenApiCommand { get; set; } - /// Gets or sets the ASP.NET Core to swagger command. [JsonIgnore] public AspNetCoreToOpenApiCommand AspNetCoreToOpenApiCommand { get; set; } - /// Gets or sets the assembly type to swagger command. - [JsonIgnore] - public TypesToOpenApiCommand TypesToOpenApiCommand { get; set; } - /// Gets the items. [JsonIgnore] public IEnumerable Items => new IOutputCommand[] { FromDocumentCommand, JsonSchemaToOpenApiCommand, - WebApiToOpenApiCommand, - TypesToOpenApiCommand, AspNetCoreToOpenApiCommand }; } diff --git a/src/NSwagStudio/ViewModels/DocumentModel.cs b/src/NSwagStudio/ViewModels/DocumentModel.cs index 617aa94260..caaca02933 100644 --- a/src/NSwagStudio/ViewModels/DocumentModel.cs +++ b/src/NSwagStudio/ViewModels/DocumentModel.cs @@ -28,9 +28,7 @@ public DocumentModel(NSwagDocument document) { new SwaggerInputView(Document.SwaggerGenerators.FromDocumentCommand), new AspNetCoreToSwaggerGeneratorView(Document.SwaggerGenerators.AspNetCoreToOpenApiCommand, document), - new WebApiToSwaggerGeneratorView(Document.SwaggerGenerators.WebApiToOpenApiCommand, document), new JsonSchemaInputView(Document.SwaggerGenerators.JsonSchemaToOpenApiCommand), - new AssemblyTypeToSwaggerGeneratorView(Document.SwaggerGenerators.TypesToOpenApiCommand, document), }; CodeGenerators = new CodeGeneratorViewBase[] diff --git a/src/NSwagStudio/ViewModels/SwaggerGenerators/AspNetCoreToSwaggerGeneratorViewModel.cs b/src/NSwagStudio/ViewModels/SwaggerGenerators/AspNetCoreToSwaggerGeneratorViewModel.cs index 33c4844081..fd794bc97f 100644 --- a/src/NSwagStudio/ViewModels/SwaggerGenerators/AspNetCoreToSwaggerGeneratorViewModel.cs +++ b/src/NSwagStudio/ViewModels/SwaggerGenerators/AspNetCoreToSwaggerGeneratorViewModel.cs @@ -21,7 +21,6 @@ namespace NSwagStudio.ViewModels.SwaggerGenerators { public class AspNetCoreToSwaggerGeneratorViewModel : ViewModelBase { - private string[] _allControllerNames = { }; private AspNetCoreToSwaggerCommand _command = new AspNetCoreToSwaggerCommand(); private NSwagDocument _document; diff --git a/src/NSwagStudio/ViewModels/SwaggerGenerators/AssemblyTypeToSwaggerGeneratorViewModel.cs b/src/NSwagStudio/ViewModels/SwaggerGenerators/AssemblyTypeToSwaggerGeneratorViewModel.cs deleted file mode 100644 index c1639c36ba..0000000000 --- a/src/NSwagStudio/ViewModels/SwaggerGenerators/AssemblyTypeToSwaggerGeneratorViewModel.cs +++ /dev/null @@ -1,159 +0,0 @@ -//----------------------------------------------------------------------- -// -// Copyright (c) Rico Suter. All rights reserved. -// -// https://github.com/RicoSuter/NSwag/blob/master/LICENSE.md -// Rico Suter, mail@rsuter.com -//----------------------------------------------------------------------- - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Win32; -using MyToolkit.Command; -using NJsonSchema; -using NJsonSchema.Generation; -using NSwag; -using NSwag.Commands; -using NSwag.Commands.Generation; - -namespace NSwagStudio.ViewModels.SwaggerGenerators -{ - public class AssemblyTypeToSwaggerGeneratorViewModel : ViewModelBase - { - private string[] _allClassNames; - private TypesToSwaggerCommand _command = new TypesToSwaggerCommand(); - private NSwagDocument _document; - - /// Initializes a new instance of the class. - public AssemblyTypeToSwaggerGeneratorViewModel() - { - BrowseAssemblyCommand = new AsyncRelayCommand(BrowseAssembly); - - LoadAssembliesCommand = new AsyncRelayCommand(async () => await LoadAssembliesAsync(), () => AssemblyPaths?.Length > 0); - LoadAssembliesCommand.TryExecute(); - } - - /// Gets or sets the generator settings. - public TypesToSwaggerCommand Command - { - get { return _command; } - set - { - if (Set(ref _command, value)) - RaiseAllPropertiesChanged(); - } - } - - /// Gets or sets the document. - public NSwagDocument Document - { - get { return _document; } - set - { - if (Set(ref _document, value)) - { - LoadAssembliesCommand.RaiseCanExecuteChanged(); - LoadAssembliesAsync(); - } - } - } - - /// Gets the default enum handlings. - public EnumHandling[] EnumHandlings { get; } = Enum.GetNames(typeof(EnumHandling)) - .Select(t => (EnumHandling)Enum.Parse(typeof(EnumHandling), t)) - .ToArray(); - - /// Gets the default property name handlings. - public PropertyNameHandling[] PropertyNameHandlings { get; } = Enum.GetNames(typeof(PropertyNameHandling)) - .Select(t => (PropertyNameHandling)Enum.Parse(typeof(PropertyNameHandling), t)) - .ToArray(); - - /// Gets the reference type null handlings. - public ReferenceTypeNullHandling[] ReferenceTypeNullHandlings { get; } = Enum.GetNames(typeof(ReferenceTypeNullHandling)) - .Select(t => (ReferenceTypeNullHandling)Enum.Parse(typeof(ReferenceTypeNullHandling), t)) - .ToArray(); - - /// Gets new line behaviors. - public NewLineBehavior[] NewLineBehaviors { get; } = Enum.GetNames(typeof(NewLineBehavior)) - .Select(t => (NewLineBehavior)Enum.Parse(typeof(NewLineBehavior), t)) - .ToArray(); - - /// Gets the output types. - public SchemaType[] OutputTypes { get; } = { SchemaType.Swagger2, SchemaType.OpenApi3 }; - - /// Gets or sets the command to browse for an assembly. - public AsyncRelayCommand BrowseAssemblyCommand { get; set; } - - /// Gets or sets the command to load the types from an assembly. - public AsyncRelayCommand LoadAssembliesCommand { get; set; } - - /// Gets or sets the assembly path. - public string[] AssemblyPaths - { - get { return Command.AssemblyPaths; } - set - { - Command.AssemblyPaths = value; - LoadAssembliesCommand.RaiseCanExecuteChanged(); - RaisePropertyChanged(() => AssemblyPaths); - RaisePropertyChanged(() => AssemblyName); - } - } - - /// Gets the name of the selected assembly. - public string AssemblyName => Path.GetFileName(AssemblyPaths.FirstOrDefault()); - - /// Gets or sets the class names. - public IEnumerable ClassNames - { - get { return Command.ClassNames; } - set - { - Command.ClassNames = value.ToArray(); - RaisePropertyChanged(() => ClassNames); - } - } - - /// Gets or sets the all class names. - public string[] AllClassNames - { - get { return _allClassNames; } - set { Set(ref _allClassNames, value); } - } - - private async Task BrowseAssembly() - { - var dlg = new OpenFileDialog(); - dlg.DefaultExt = ".dll"; - dlg.Filter = ".NET Assemblies (*.dll;*.exe)|*.dll;*.exe"; - if (dlg.ShowDialog() == true) - { - AssemblyPaths = new[] { dlg.FileName }; - await LoadAssembliesAsync(); - } - } - - private Task LoadAssembliesAsync() - { - return RunTaskAsync(async () => - { - AllClassNames = await Task.Run(async () => await Document.GetTypesFromCommandLineAsync()); - }); - } - - public async Task GenerateSwaggerAsync() - { - return await RunTaskAsync(async () => - { - return await Task.Run(async () => - { - var document = (OpenApiDocument)await Command.RunAsync(null, null).ConfigureAwait(false); - return document?.ToJson(); - }); - }); - } - } -} \ No newline at end of file diff --git a/src/NSwagStudio/ViewModels/SwaggerGenerators/WebApiToSwaggerGeneratorViewModel.cs b/src/NSwagStudio/ViewModels/SwaggerGenerators/WebApiToSwaggerGeneratorViewModel.cs deleted file mode 100644 index b8aa77652b..0000000000 --- a/src/NSwagStudio/ViewModels/SwaggerGenerators/WebApiToSwaggerGeneratorViewModel.cs +++ /dev/null @@ -1,173 +0,0 @@ -//----------------------------------------------------------------------- -// -// Copyright (c) Rico Suter. All rights reserved. -// -// https://github.com/RicoSuter/NSwag/blob/master/LICENSE.md -// Rico Suter, mail@rsuter.com -//----------------------------------------------------------------------- - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Win32; -using MyToolkit.Command; -using NJsonSchema; -using NJsonSchema.Generation; -using NSwag; -using NSwag.Commands; -using NSwag.Commands.Generation.WebApi; - -namespace NSwagStudio.ViewModels.SwaggerGenerators -{ - public class WebApiToSwaggerGeneratorViewModel : ViewModelBase - { - private string[] _allControllerNames = { }; - private WebApiToSwaggerCommand _command = new WebApiToSwaggerCommand(); - private NSwagDocument _document; - - /// Initializes a new instance of the class. - public WebApiToSwaggerGeneratorViewModel() - { - BrowseAssemblyCommand = new AsyncRelayCommand(BrowseAssembly); - - LoadAssembliesCommand = new AsyncRelayCommand(async () => await LoadAssembliesAsync(), () => AssemblyPaths?.Length > 0); - LoadAssembliesCommand.TryExecute(); - } - - /// Gets the default enum handlings. - public EnumHandling[] EnumHandlings { get; } = Enum.GetNames(typeof(EnumHandling)) - .Select(t => (EnumHandling)Enum.Parse(typeof(EnumHandling), t)) - .ToArray(); - - /// Gets the default property name handlings. - public PropertyNameHandling[] PropertyNameHandlings { get; } = Enum.GetNames(typeof(PropertyNameHandling)) - .Select(t => (PropertyNameHandling)Enum.Parse(typeof(PropertyNameHandling), t)) - .ToArray(); - - /// Gets the reference type null handlings. - public ReferenceTypeNullHandling[] ReferenceTypeNullHandlings { get; } = Enum.GetNames(typeof(ReferenceTypeNullHandling)) - .Select(t => (ReferenceTypeNullHandling)Enum.Parse(typeof(ReferenceTypeNullHandling), t)) - .ToArray(); - - /// Gets new line behaviors. - public NewLineBehavior[] NewLineBehaviors { get; } = Enum.GetNames(typeof(NewLineBehavior)) - .Select(t => (NewLineBehavior)Enum.Parse(typeof(NewLineBehavior), t)) - .ToArray(); - - /// Gets the output types. - public SchemaType[] OutputTypes { get; } = { SchemaType.Swagger2, SchemaType.OpenApi3 }; - - /// Gets or sets the command to browse for an assembly. - public AsyncRelayCommand BrowseAssemblyCommand { get; set; } - - /// Gets or sets the command to load the controller types from an assembly. - public AsyncRelayCommand LoadAssembliesCommand { get; set; } - - /// Gets or sets the generator settings. - public WebApiToSwaggerCommand Command - { - get { return _command; } - set - { - if (Set(ref _command, value)) - RaiseAllPropertiesChanged(); - } - } - - /// Gets or sets the document. - public NSwagDocument Document - { - get { return _document; } - set - { - if (Set(ref _document, value)) - { - LoadAssembliesCommand.RaiseCanExecuteChanged(); - LoadAssembliesAsync(); - } - } - } - - /// Gets or sets the assembly path. - public string[] AssemblyPaths - { - get { return Command.AssemblyPaths; } - set - { - Command.AssemblyPaths = value; - LoadAssembliesCommand.RaiseCanExecuteChanged(); - RaisePropertyChanged(() => AssemblyPaths); - } - } - - /// Gets or sets the class name. - public IEnumerable ControllerNames - { - get { return Command.ControllerNames; } - set - { - Command.ControllerNames = value.ToArray(); - RaisePropertyChanged(() => ControllerNames); - } - } - - /// Gets or sets the all class names. - public string[] AllControllerNames - { - get { return _allControllerNames; } - set { Set(ref _allControllerNames, value); } - } - - public async Task GenerateSwaggerAsync() - { - return await RunTaskAsync(async () => - { - return await Task.Run(async () => - { - var document = (OpenApiDocument)await Command.RunAsync(null, null).ConfigureAwait(false); - return document?.ToJson(); - }); - }); - } - - private async Task BrowseAssembly() - { - var dlg = new OpenFileDialog(); - dlg.DefaultExt = ".dll"; // - dlg.Filter = ".NET Assemblies (*.dll;*.exe)|*.dll;*.exe"; - if (dlg.ShowDialog() == true) - { - AssemblyPaths = new[] { dlg.FileName }; - await LoadAssembliesAsync(); - } - } - - private Task LoadAssembliesAsync() - { - return RunTaskAsync(async () => - { - AllControllerNames = await Task.Run(async () => - { - if (Command.AssemblyPaths?.Length > 0) - return await Document.GetControllersFromCommandLineAsync(); - else - return new string[] { }; - }); - - if (ControllerNames != null) - { - var newControllerNames = ControllerNames.ToList(); - foreach (var controller in newControllerNames.ToArray()) - { - if (!AllControllerNames.Contains(controller)) - newControllerNames.Remove(controller); - } - ControllerNames = newControllerNames.ToArray(); - } - else - ControllerNames = new string[] { }; - }); - } - } -} diff --git a/src/NSwagStudio/Views/SwaggerGenerators/AspNetCoreToSwaggerGeneratorView.xaml b/src/NSwagStudio/Views/SwaggerGenerators/AspNetCoreToSwaggerGeneratorView.xaml index e83a75a82a..f48d4a70e5 100644 --- a/src/NSwagStudio/Views/SwaggerGenerators/AspNetCoreToSwaggerGeneratorView.xaml +++ b/src/NSwagStudio/Views/SwaggerGenerators/AspNetCoreToSwaggerGeneratorView.xaml @@ -125,111 +125,9 @@ ToolTip="WorkingDirectory" Margin="0,0,0,12" /> - - - - - - - - - - - - - - - - Choose 'Integer' if you use the default Json.NET serializer or 'String' if a global StringEnumConverter is registered. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -238,20 +136,6 @@ Filter="OpenAPI Specification JSON (.json)|*.json|Swagger Specification YAML (.yaml)|*.yaml" DefaultExtension=".json"/> - - - - - - - - - - - - - - @@ -314,11 +194,6 @@ Margin="0,0,0,12" FilePath="{Binding Command.OutputFilePath, Mode=TwoWay}" /> - - - - - diff --git a/src/NSwagStudio/Views/SwaggerGenerators/AssemblyTypeToSwaggerGeneratorView.xaml b/src/NSwagStudio/Views/SwaggerGenerators/AssemblyTypeToSwaggerGeneratorView.xaml deleted file mode 100644 index a7b6c163bd..0000000000 --- a/src/NSwagStudio/Views/SwaggerGenerators/AssemblyTypeToSwaggerGeneratorView.xaml +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -