Skip to content

Commit ccb0822

Browse files
authored
Update dependencies and enhance OpenAPI schema handling (#309)
2 parents 2a05cf2 + bdfec18 commit ccb0822

11 files changed

Lines changed: 69 additions & 22 deletions

File tree

samples/TinyHelpers.AspNetCore.Sample/Program.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
// Remove Servers list in OpenAPI.
6161
options.RemoveServerList();
6262

63-
// Respect the ignored JsonNumberHandling attribute.
63+
// Respect the JsonNumberHandling attribute.
6464
options.WriteNumberAsString();
6565

6666
// Describe all query string parameters in Camel Case.
@@ -72,6 +72,9 @@
7272
// Uncomment to use full type names (including namespace) for schema IDs.
7373
// This helps avoid naming collisions when multiple types have the same name.
7474
// options.UseFullTypeNameSchemaIds();
75+
76+
// Remove the string fallback from numeric schemas generated for OpenAPI.
77+
options.UseStrictNumericSchemas();
7578
});
7679

7780
// Add default problem details and exception handler.
@@ -102,7 +105,7 @@
102105
return TypedResults.Ok(new { Language = language });
103106
}).WithResponseDescription(StatusCodes.Status200OK, "The language of the server");
104107

105-
app.MapGet("/api/json-number-as-string", () =>
108+
app.MapGet("/api/json-number-as-string", (int a) =>
106109
{
107110
return TypedResults.Ok(new RandomNumber());
108111
});

samples/TinyHelpers.AspNetCore.Sample/TinyHelpers.AspNetCore.Sample.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.6" />
10+
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.8" />
1111
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="10.1.7" />
1212
</ItemGroup>
1313

samples/TinyHelpers.Dapper.Sample/TinyHelpers.Dapper.Sample.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
</PropertyGroup>
77

88
<ItemGroup>
9-
<PackageReference Include="Microsoft.Data.SqlClient" Version="7.0.0" />
9+
<PackageReference Include="Microsoft.Data.SqlClient" Version="7.0.1" />
1010
</ItemGroup>
1111

1212
<ItemGroup>

samples/TinyHelpers.EntityFrameworkCore.Sample/TinyHelpers.EntityFrameworkCore.Sample.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.4" />
10+
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.8" />
1111
</ItemGroup>
1212

1313
<ItemGroup>

src/TinyHelpers.AspNetCore/OpenApi/OpenApiExtensions.cs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
#if NET9_0_OR_GREATER
22

3-
using Microsoft.AspNetCore.Builder;
4-
using Microsoft.AspNetCore.Http;
53
using Microsoft.AspNetCore.OpenApi;
64
using Microsoft.Extensions.DependencyInjection;
7-
using Microsoft.OpenApi;
85
using TinyHelpers.AspNetCore.OpenApi.Transformers;
96

107
namespace TinyHelpers.AspNetCore.OpenApi;
@@ -76,17 +73,33 @@ public OpenApiOptions UseFullTypeNameSchemaIds()
7673
{
7774
ArgumentNullException.ThrowIfNull(options);
7875

79-
options.CreateSchemaReferenceId = (jsonTypeInfo) =>
76+
options.CreateSchemaReferenceId = jsonTypeInfo =>
8077
{
81-
// Get the full type name (including namespace) for the schema ID
82-
var fullName = jsonTypeInfo.Type.FullName;
83-
84-
// Replace + with . for nested types to make the schema ID more readable
85-
return fullName?.Replace('+', '.');
78+
// Create the default ID (handles generics, nested types, etc.)
79+
var defaultId = OpenApiOptions.CreateDefaultSchemaReferenceId(jsonTypeInfo);
80+
if (string.IsNullOrEmpty(defaultId))
81+
{
82+
return defaultId;
83+
}
84+
85+
var @namespace = jsonTypeInfo.Type.Namespace;
86+
if (string.IsNullOrEmpty(@namespace))
87+
{
88+
// If there's no namespace, just keep the default.
89+
return defaultId;
90+
}
91+
92+
// Include namespace in the reference ID.
93+
return $"{@namespace}.{defaultId}";
8694
};
8795

8896
return options;
8997
}
98+
99+
#if NET10_0_OR_GREATER
100+
public OpenApiOptions UseStrictNumericSchemas()
101+
=> options.AddSchemaTransformer<StrictNumericSchemaTransformer>();
102+
#endif
90103
}
91104
}
92105

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#if NET10_0_OR_GREATER
2+
3+
using Microsoft.AspNetCore.OpenApi;
4+
using Microsoft.OpenApi;
5+
6+
namespace TinyHelpers.AspNetCore.OpenApi.Transformers;
7+
8+
internal sealed class StrictNumericSchemaTransformer : IOpenApiSchemaTransformer
9+
{
10+
public Task TransformAsync(OpenApiSchema schema, OpenApiSchemaTransformerContext context, CancellationToken cancellationToken)
11+
{
12+
if (schema.Type is null)
13+
{
14+
return Task.CompletedTask;
15+
}
16+
17+
var type = schema.Type.Value;
18+
var hasNumeric = type.HasFlag(JsonSchemaType.Integer) || type.HasFlag(JsonSchemaType.Number);
19+
var hasString = type.HasFlag(JsonSchemaType.String);
20+
21+
if (hasNumeric && hasString)
22+
{
23+
schema.Type &= ~JsonSchemaType.String;
24+
schema.Pattern = null;
25+
}
26+
27+
return Task.CompletedTask;
28+
}
29+
}
30+
31+
#endif

src/TinyHelpers.AspNetCore/TinyHelpers.AspNetCore.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@
2525
</ItemGroup>
2626

2727
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
28-
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.15" />
28+
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.16" />
2929
</ItemGroup>
3030

3131
<ItemGroup Condition="'$(TargetFramework)' == 'net10.0'">
32-
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.6" />
32+
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.8" />
3333
</ItemGroup>
3434

3535
<ItemGroup>

src/TinyHelpers.AspNetCore/version.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json",
3-
"version": "4.1",
3+
"version": "4.2",
44
"publicReleaseRefSpec": [
55
"^refs/heads/master$" // we release out of master
66
],

src/TinyHelpers/TinyHelpers.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
</ItemGroup>
3131

3232
<ItemGroup>
33-
<PackageReference Include="System.Text.Json" Version="10.0.6" />
33+
<PackageReference Include="System.Text.Json" Version="10.0.8" />
3434
</ItemGroup>
3535

3636
<ItemGroup>

tests/TinyHelpers.EntityFrameworkCore.Tests/TinyHelpers.EntityFrameworkCore.Tests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
11+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.5.1" />
1212
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
1313
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1414
<PrivateAssets>all</PrivateAssets>
1515
</PackageReference>
16-
<PackageReference Include="coverlet.collector" Version="8.0.1">
16+
<PackageReference Include="coverlet.collector" Version="10.0.1">
1717
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1818
<PrivateAssets>all</PrivateAssets>
1919
</PackageReference>

0 commit comments

Comments
 (0)