Skip to content

Commit 726d2f1

Browse files
HongGeonUiSeungWoonSonghhiyeon
authored
Add : Set NamingStrategy Type (#613)
* Feat : NamingStrategy 인터페이스 작성 * Feat : NamingStrategy 인스턴스 생성 * FEAT: Case 1 ~ 3 except for Enum option * FEAT: NamingStrategy get method * FEAT: get api namingstrategy in startup * FEAT: NamingStrategy in Worker Extensions * FEAT: Enum Case added * Refactor : Get 메소드 수정 * feat: create enum type for naming strategy * feat: add requirements 1~4 for new naming strategy * feat: add NamingStrategy new instance by case * feat: add OpenApiNamingStrategy setting * refactor: rename methods * refactor: add comments to resolve warning messages * FEAT: Override Resolve function(NamingStrategy) * FEAT: Apply FactoryMethod in NamingStrategy * FEAT: Test case for Resolver(Naming Strategy) * CHORE: override to overload(Resolve method) * Refactor : 코드 병합 * Test : OpenApiHttpTriggerContextTests 수정 * Test : UnvalidType Test 추가 * test: add OpenApiConfigurationOptionsTests * test: add DefaultOpenApiConfigurationOptionsTests * refactor: Rename NamingStrategyType to OpenApiNamingStrategy * Refactor : 오류제거 * Add : missing tests * Fix : test typo --------- Co-authored-by: songseungwoon <[email protected]> Co-authored-by: hhiyeon <[email protected]> Co-authored-by: SeungWoonSong <[email protected]>
1 parent 3df8ef9 commit 726d2f1

File tree

14 files changed

+698
-447
lines changed

14 files changed

+698
-447
lines changed

samples/Microsoft.Azure.Functions.Worker.Extensions.OpenApi.FunctionApp.OutOfProc/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public static void Main()
4646
},
4747
Servers = DefaultOpenApiConfigurationOptions.GetHostNames(),
4848
OpenApiVersion = DefaultOpenApiConfigurationOptions.GetOpenApiVersion(),
49+
OpenApiNamingStrategy = DefaultOpenApiConfigurationOptions.GetOpenApiNamingStrategy(),
4950
ExcludeRequestingHost = DefaultOpenApiConfigurationOptions.IsRequestingHostExcluded(),
5051
ForceHttps = DefaultOpenApiConfigurationOptions.IsHttpsForced(),
5152
ForceHttp = DefaultOpenApiConfigurationOptions.IsHttpForced(),

samples/Microsoft.Azure.WebJobs.Extensions.OpenApi.FunctionApp.InProc/Startup.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public override void Configure(IFunctionsHostBuilder builder)
4343
},
4444
Servers = DefaultOpenApiConfigurationOptions.GetHostNames(),
4545
OpenApiVersion = DefaultOpenApiConfigurationOptions.GetOpenApiVersion(),
46+
OpenApiNamingStrategy = DefaultOpenApiConfigurationOptions.GetOpenApiNamingStrategy(),
4647
ExcludeRequestingHost = DefaultOpenApiConfigurationOptions.IsRequestingHostExcluded(),
4748
ForceHttps = DefaultOpenApiConfigurationOptions.IsHttpsForced(),
4849
ForceHttp = DefaultOpenApiConfigurationOptions.IsHttpForced(),

src/Microsoft.Azure.Functions.Worker.Extensions.OpenApi/OpenApiHttpTriggerContext.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,12 @@ public virtual IOpenApiHttpTriggerAuthorization OpenApiHttpTriggerAuthorization
129129
public virtual ISwaggerUI SwaggerUI { get; }
130130

131131
/// <inheritdoc />
132-
public virtual NamingStrategy NamingStrategy { get; } = new CamelCaseNamingStrategy();
133-
132+
public virtual NamingStrategy NamingStrategy {
133+
get
134+
{
135+
return OpenApiConfigurationResolver.Resolve(this._configOptions.OpenApiNamingStrategy);
136+
}
137+
}
134138
/// <inheritdoc />
135139
public virtual bool IsDevelopment { get; } = Environment.GetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT") == "Development";
136140

src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Abstractions/IOpenApiConfigurationOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,10 @@ public interface IOpenApiConfigurationOptions
5454
/// Gets or sets the <see cref="IOpenApiHttpTriggerAuthorization"/> instance for Swagger endpoints.
5555
/// </summary>
5656
IOpenApiHttpTriggerAuthorization Security { get; set; }
57+
58+
/// <summary>
59+
/// Gets or sets the value indicating OpenApiNamingStrategy.
60+
/// </summary>
61+
OpenApiNamingStrategy OpenApiNamingStrategy { get; set; }
5762
}
5863
}

src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Configurations/DefaultOpenApiConfigurationOptions.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class DefaultOpenApiConfigurationOptions : OpenApiConfigurationOptions
2121
private const string OpenApiDocDescriptionKey = "OpenApi__DocDescription";
2222
private const string OpenApiHostNamesKey = "OpenApi__HostNames";
2323
private const string OpenApiVersionKey = "OpenApi__Version";
24+
private const string OpenApiNamingStrategyKey = "OpenApi__NamingStrategy";
2425
private const string FunctionsRuntimeEnvironmentKey = "AZURE_FUNCTIONS_ENVIRONMENT";
2526
private const string ExcludeRequestingHostKey = "OpenApi__ExcludeRequestingHost";
2627
private const string ForceHttpKey = "OpenApi__ForceHttp";
@@ -59,6 +60,9 @@ public class DefaultOpenApiConfigurationOptions : OpenApiConfigurationOptions
5960
/// <inheritdoc />
6061
public override IOpenApiHttpTriggerAuthorization Security { get; set; } = new DefaultOpenApiHttpTriggerAuthorization();
6162

63+
/// <inheritdoc />
64+
public override OpenApiNamingStrategy OpenApiNamingStrategy { get; set; } = GetOpenApiNamingStrategy();
65+
6266
/// <summary>
6367
/// Gets the OpenAPI document version.
6468
/// </summary>
@@ -128,6 +132,20 @@ public static OpenApiVersionType GetOpenApiVersion()
128132
return version;
129133
}
130134

135+
/// <summary>
136+
/// Gets the OpenAPI NamingStrategy.
137+
/// </summary>
138+
/// <returns>Returns the OpenAPI NamingStrategy.</returns>
139+
public static OpenApiNamingStrategy GetOpenApiNamingStrategy()
140+
{
141+
var strategy = Enum.TryParse<OpenApiNamingStrategy>(
142+
Environment.GetEnvironmentVariable(OpenApiNamingStrategyKey), ignoreCase: true, out var result)
143+
? result
144+
: DefaultOpenApiNamingStrategy();
145+
146+
return strategy;
147+
}
148+
131149
/// <summary>
132150
/// Checks whether to exclude the requesting host as the server URL or not.
133151
/// </summary>
@@ -177,6 +195,11 @@ private static string DefaultOpenApiDocVersion()
177195
return "1.0.0";
178196
}
179197

198+
private static OpenApiNamingStrategy DefaultOpenApiNamingStrategy()
199+
{
200+
return OpenApiNamingStrategy.CamelCase;
201+
}
202+
180203
private static string DefaultOpenApiDocTitle()
181204
{
182205
return "OpenAPI Document on Azure Functions";

src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Configurations/OpenApiConfigurationOptions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ public class OpenApiConfigurationOptions : IOpenApiConfigurationOptions
2222
/// <inheritdoc />
2323
public virtual OpenApiVersionType OpenApiVersion { get; set; }
2424

25+
/// <inheritdoc />
26+
public virtual OpenApiNamingStrategy OpenApiNamingStrategy { get; set; }
27+
2528
/// <inheritdoc />
2629
public virtual bool ExcludeRequestingHost { get; set; }
2730

@@ -38,5 +41,6 @@ public class OpenApiConfigurationOptions : IOpenApiConfigurationOptions
3841
public virtual bool UseFullName {get; set;}
3942
/// <inheritdoc />
4043
public virtual IOpenApiHttpTriggerAuthorization Security { get; set; } = new OpenApiHttpTriggerAuthorization();
44+
4145
}
4246
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Enums
2+
{
3+
/// <summary>
4+
/// This specifies the naming strategy for OpenAPI.
5+
/// </summary>
6+
public enum OpenApiNamingStrategy
7+
{
8+
/// <summary>
9+
/// Identifies the default naming strategy.
10+
/// </summary>
11+
CamelCase = 0,
12+
13+
/// <summary>
14+
/// Identifies the PascalCase naming strategy.
15+
/// </summary>
16+
PascalCase = 1,
17+
18+
/// <summary>
19+
/// Identifies the snake_case naming strategy.
20+
/// </summary>
21+
SnakeCase = 2,
22+
23+
/// <summary>
24+
/// Identifies the kebab-case naming strategy.
25+
/// </summary>
26+
KebabCase = 3
27+
}
28+
}

src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Resolvers/OpenApiConfigurationResolver.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Abstractions;
66
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Attributes;
77
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Configurations;
8+
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Enums;
89
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Extensions;
910
using Microsoft.OpenApi.Models;
11+
using Newtonsoft.Json.Serialization;
1012

1113
namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Resolvers
1214
{
@@ -36,5 +38,27 @@ public static IOpenApiConfigurationOptions Resolve(Assembly assembly)
3638

3739
return options as IOpenApiConfigurationOptions;
3840
}
41+
42+
/// <summary>
43+
/// Gets the <see cref="IOpenApiConfigurationOptions"/> instance from the given strategyType.
44+
/// </summary>
45+
/// <param name="strategyType">The naming strategy type.</param>
46+
/// <returns>Returns the NamingStrategy instance resolved.(Override)</returns>
47+
public static NamingStrategy Resolve(OpenApiNamingStrategy strategyType)
48+
{
49+
switch (strategyType)
50+
{
51+
case OpenApiNamingStrategy.CamelCase:
52+
return new CamelCaseNamingStrategy();
53+
case OpenApiNamingStrategy.PascalCase:
54+
return new DefaultNamingStrategy();
55+
case OpenApiNamingStrategy.SnakeCase:
56+
return new SnakeCaseNamingStrategy();
57+
case OpenApiNamingStrategy.KebabCase:
58+
return new KebabCaseNamingStrategy();
59+
default:
60+
return new CamelCaseNamingStrategy();
61+
}
62+
}
3963
}
4064
}

src/Microsoft.Azure.WebJobs.Extensions.OpenApi/OpenApiHttpTriggerContext.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,12 @@ public virtual IOpenApiCustomUIOptions OpenApiCustomUIOptions
129129
public virtual ISwaggerUI SwaggerUI { get; }
130130

131131
/// <inheritdoc />
132-
public virtual NamingStrategy NamingStrategy { get; } = new CamelCaseNamingStrategy();
133-
132+
public virtual NamingStrategy NamingStrategy {
133+
get
134+
{
135+
return OpenApiConfigurationResolver.Resolve(this._configOptions.OpenApiNamingStrategy);
136+
}
137+
}
134138
/// <inheritdoc />
135139
public virtual bool IsDevelopment { get; } = Environment.GetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT") == "Development";
136140

0 commit comments

Comments
 (0)