Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public async Task<HttpResponseData> RenderSwaggerDocument(HttpRequestData req, s
.InitialiseDocument()
.AddMetadata(this._context.OpenApiConfigurationOptions.Info)
.AddServer(request, this._context.HttpSettings.RoutePrefix, this._context.OpenApiConfigurationOptions)
.AddNamingStrategy(this._context.NamingStrategy)
.AddNamingStrategy(this._context.OpenApiConfigurationOptions.NamingStrategy)
.AddVisitors(this._context.GetVisitorCollection())
.Build(this._context.ApplicationAssembly, this._context.OpenApiConfigurationOptions.OpenApiVersion)
.ApplyDocumentFilters(this._context.GetDocumentFilterCollection())
Expand Down Expand Up @@ -121,7 +121,7 @@ public async Task<HttpResponseData> RenderOpenApiDocument(HttpRequestData req, s
.InitialiseDocument()
.AddMetadata(this._context.OpenApiConfigurationOptions.Info)
.AddServer(request, this._context.HttpSettings.RoutePrefix, this._context.OpenApiConfigurationOptions)
.AddNamingStrategy(this._context.NamingStrategy)
.AddNamingStrategy(this._context.OpenApiConfigurationOptions.NamingStrategy)
.AddVisitors(this._context.GetVisitorCollection())
.Build(this._context.ApplicationAssembly, this._context.GetOpenApiVersionType(version))
.ApplyDocumentFilters(this._context.GetDocumentFilterCollection())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
using Microsoft.OpenApi;

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

namespace Microsoft.Azure.Functions.Worker.Extensions.OpenApi
{
Expand Down Expand Up @@ -131,9 +130,6 @@ public virtual IOpenApiHttpTriggerAuthorization OpenApiHttpTriggerAuthorization
/// <inheritdoc />
public virtual ISwaggerUI SwaggerUI { get; }

/// <inheritdoc />
public virtual NamingStrategy NamingStrategy { get; } = new CamelCaseNamingStrategy();

/// <inheritdoc />
public virtual bool IsDevelopment { get; } = Environment.GetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT") == "Development";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Enums;
using Microsoft.OpenApi.Models;

using Newtonsoft.Json.Serialization;

namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Abstractions
{
/// <summary>
Expand Down Expand Up @@ -44,5 +46,10 @@ public interface IOpenApiConfigurationOptions
/// Gets or sets the list of <see cref="IDocumentFilter"/> instances.
/// </summary>
List<IDocumentFilter> DocumentFilters { get; set; }

/// <summary>
/// Gets or sets the <see cref="NamingStrategy"/> used to express the JSON schema for .NET Types.
/// </summary>
NamingStrategy NamingStrategy { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors;
using Microsoft.OpenApi;

using Newtonsoft.Json.Serialization;

namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Abstractions
{
/// <summary>
Expand Down Expand Up @@ -60,11 +58,6 @@ public interface IOpenApiHttpTriggerContext
/// </summary>
ISwaggerUI SwaggerUI { get; }

/// <summary>
/// Gets the <see cref="NamingStrategy"/> instance.
/// </summary>
NamingStrategy NamingStrategy { get; }

/// <summary>
/// Gets the value indicating whether it's in the development environment or not.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Extensions;
using Microsoft.OpenApi.Models;

using Newtonsoft.Json.Serialization;

namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Configurations
{
/// <summary>
Expand All @@ -24,6 +26,7 @@ public class DefaultOpenApiConfigurationOptions : OpenApiConfigurationOptions
private const string FunctionsRuntimeEnvironmentKey = "AZURE_FUNCTIONS_ENVIRONMENT";
private const string ForceHttpKey = "OpenApi__ForceHttp";
private const string ForceHttpsKey = "OpenApi__ForceHttps";
private const string NamingStrategyKey = "OpenApi__NamingStrategy";

/// <inheritdoc />
public override OpenApiInfo Info { get; set; } = new OpenApiInfo()
Expand Down Expand Up @@ -51,6 +54,9 @@ public class DefaultOpenApiConfigurationOptions : OpenApiConfigurationOptions
/// <inheritdoc />
public override List<IDocumentFilter> DocumentFilters { get; set; } = new List<IDocumentFilter>();

/// <inheritdoc />
public override NamingStrategy NamingStrategy { get; set; } = GetNamingStrategy();

/// <summary>
/// Gets the OpenAPI document version.
/// </summary>
Expand Down Expand Up @@ -153,6 +159,40 @@ public static bool IsHttpsForced()
return development;
}

/// <summary>
/// Gets the chosen naming strategy.
/// </summary>
/// <returns>A NewtonSoft serialisation naming strategy</returns>
public static NamingStrategy GetNamingStrategy()
{
var strategyName = Environment.GetEnvironmentVariable(NamingStrategyKey) ?? string.Empty;
var normalisedName = strategyName.ToLowerInvariant().Replace("-", "").Replace("_", "").Replace(" ", "");

NamingStrategy strategy;
switch (normalisedName)
{
case "camelcase":
strategy = new CamelCaseNamingStrategy();
break;
case "snakecase":
strategy = new SnakeCaseNamingStrategy();
break;
case "kebabcase":
strategy = new KebabCaseNamingStrategy();
break;
case "pascalcase":
strategy = new DefaultNamingStrategy();
break;

default:
// for backwards compatibility, default to camelCase if option not present / well-defined
strategy = new CamelCaseNamingStrategy();
break;
}

return strategy;
}

private static OpenApiVersionType DefaultOpenApiVersion()
{
return OpenApiVersionType.V2;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Enums;
using Microsoft.OpenApi.Models;

using Newtonsoft.Json.Serialization;

namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Configurations
{
/// <summary>
Expand Down Expand Up @@ -33,5 +35,8 @@ public class OpenApiConfigurationOptions : IOpenApiConfigurationOptions

/// <inheritdoc />
public virtual List<IDocumentFilter> DocumentFilters { get; set; } = new List<IDocumentFilter>();

/// <inheritdoc />
public virtual NamingStrategy NamingStrategy { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Enums;
using Microsoft.OpenApi.Models;

using Newtonsoft.Json.Serialization;

namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Configurations
{
/// <summary>
Expand Down Expand Up @@ -37,5 +39,8 @@ public sealed class OpenApiSettings : IOpenApiConfigurationOptions

/// <inheritdoc />
public List<IDocumentFilter> DocumentFilters { get; set; } = new List<IDocumentFilter>();

/// <inheritdoc />
public NamingStrategy NamingStrategy { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
using Microsoft.OpenApi;

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

namespace Microsoft.Azure.WebJobs.Extensions.OpenApi
{
Expand Down Expand Up @@ -130,9 +129,6 @@ public virtual IOpenApiCustomUIOptions OpenApiCustomUIOptions
/// <inheritdoc />
public virtual ISwaggerUI SwaggerUI { get; }

/// <inheritdoc />
public virtual NamingStrategy NamingStrategy { get; } = new CamelCaseNamingStrategy();

/// <inheritdoc />
public virtual bool IsDevelopment { get; } = Environment.GetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT") == "Development";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public static async Task<IActionResult> RenderSwaggerDocument(
.InitialiseDocument()
.AddMetadata(openApiContext.OpenApiConfigurationOptions.Info)
.AddServer(request, openApiContext.HttpSettings.RoutePrefix, openApiContext.OpenApiConfigurationOptions)
.AddNamingStrategy(openApiContext.NamingStrategy)
.AddNamingStrategy(openApiContext.OpenApiConfigurationOptions.NamingStrategy)
.AddVisitors(openApiContext.GetVisitorCollection())
.Build(openApiContext.ApplicationAssembly, openApiContext.OpenApiConfigurationOptions.OpenApiVersion)
.ApplyDocumentFilters(openApiContext.GetDocumentFilterCollection())
Expand Down Expand Up @@ -137,7 +137,7 @@ public static async Task<IActionResult> RenderOpenApiDocument(
.InitialiseDocument()
.AddMetadata(openApiContext.OpenApiConfigurationOptions.Info)
.AddServer(new HttpRequestObject(req), openApiContext.HttpSettings.RoutePrefix, openApiContext.OpenApiConfigurationOptions)
.AddNamingStrategy(openApiContext.NamingStrategy)
.AddNamingStrategy(openApiContext.OpenApiConfigurationOptions.NamingStrategy)
.AddVisitors(openApiContext.GetVisitorCollection())
.Build(openApiContext.ApplicationAssembly, openApiContext.GetOpenApiVersionType(version))
.ApplyDocumentFilters(openApiContext.GetDocumentFilterCollection())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@

using NSubstitute;

using Newtonsoft.Json.Serialization;

namespace Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Tests
{
[TestClass]
Expand Down Expand Up @@ -189,19 +187,6 @@ public async Task Given_Type_When_Initiated_Then_It_Should_Return_SwaggerUI()
swaggerUI.Should().NotBeNull();
}

[TestMethod]
public async Task Given_Type_When_Initiated_Then_It_Should_Return_NamingStrategy()
{
var location = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory.FullName;
var context = new OpenApiHttpTriggerContext();

var namingStrategy = (await context.SetApplicationAssemblyAsync(location, false))
.NamingStrategy;

namingStrategy.Should().NotBeNull();
namingStrategy.Should().BeOfType<CamelCaseNamingStrategy>();
}

[DataTestMethod]
[DataRow("Development", true)]
[DataRow("Production", false)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
using Microsoft.OpenApi.Models;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using Newtonsoft.Json.Serialization;

namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests.Configurations
{
[TestClass]
Expand All @@ -25,6 +27,7 @@ public void Cleanup()
Environment.SetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT", "Development");
Environment.SetEnvironmentVariable("OpenApi__ForceHttp", null);
Environment.SetEnvironmentVariable("OpenApi__ForceHttps", null);
Environment.SetEnvironmentVariable("OpenApi__NamingStrategy", null);
}

[TestMethod]
Expand All @@ -45,6 +48,7 @@ public void Given_Type_When_Instantiated_Then_Properties_Should_Return_Value()
options.IncludeRequestingHostName.Should().BeTrue();
options.ForceHttp.Should().BeFalse();
options.ForceHttps.Should().BeFalse();
options.NamingStrategy.Should().BeOfType<CamelCaseNamingStrategy>();
}

[DataTestMethod]
Expand Down Expand Up @@ -269,12 +273,34 @@ public void Given_EnvironmentVariable_When_IsHttpsForced_Invoked_Then_It_Should_
result.Should().Be(expected);
}

[TestMethod]
public void Given_Type_When_Instantiated_Then_It_Should_Return_EmptyListOfDocumentFilters()
{
var options = new DefaultOpenApiConfigurationOptions();

options.DocumentFilters.Should().NotBeNull();
options.DocumentFilters.Should().BeEmpty();
}

[DataTestMethod]
[DataRow(null, typeof(CamelCaseNamingStrategy))]
[DataRow("", typeof(CamelCaseNamingStrategy))]
[DataRow("CamelCase", typeof(CamelCaseNamingStrategy))]
[DataRow("camelCase", typeof(CamelCaseNamingStrategy))]
[DataRow("SnakeCase", typeof(SnakeCaseNamingStrategy))]
[DataRow("snake_case", typeof(SnakeCaseNamingStrategy))]
[DataRow("KebabCase", typeof(KebabCaseNamingStrategy))]
[DataRow("kebab-case", typeof(KebabCaseNamingStrategy))]
[DataRow("PascalCase", typeof(DefaultNamingStrategy))]
[DataRow("Pascal Case", typeof(DefaultNamingStrategy))]
public void Given_EnvironmentVariable_When_GetNamingStrategy_Invoked_Then_It_Should_Return_Result(string namingStrategy, Type expected)
{
Environment.SetEnvironmentVariable("OpenApi__NamingStrategy", namingStrategy);
var options = new DefaultOpenApiConfigurationOptions();

var result = options.NamingStrategy;

result.Should().BeOfType(expected);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@

using NSubstitute;

using Newtonsoft.Json.Serialization;

namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Tests
{
[TestClass]
Expand Down Expand Up @@ -164,19 +162,6 @@ public async Task Given_Type_When_Initiated_Then_It_Should_Return_SwaggerUI()
swaggerUI.Should().NotBeNull();
}

[TestMethod]
public async Task Given_Type_When_Initiated_Then_It_Should_Return_NamingStrategy()
{
var location = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory.FullName;
var context = new OpenApiHttpTriggerContext();

var namingStrategy = (await context.SetApplicationAssemblyAsync(location, false))
.NamingStrategy;

namingStrategy.Should().NotBeNull();
namingStrategy.Should().BeOfType<CamelCaseNamingStrategy>();
}

[DataTestMethod]
[DataRow("Development", true)]
[DataRow("Production", false)]
Expand Down