< Summary - Kestrun — Combined Coverage

Information
Class: Kestrun.OpenApi.OpenApiSchemaDiscovery
Assembly: Kestrun
File(s): /home/runner/work/Kestrun/Kestrun/src/CSharp/Kestrun/OpenApi/OpenApiSchemaDiscovery.cs
Tag: Kestrun/Kestrun@eeafbe813231ed23417e7b339e170e307b2c86f9
Line coverage
100%
Covered lines: 28
Uncovered lines: 0
Coverable lines: 28
Total lines: 79
Line coverage: 100%
Branch coverage
93%
Covered branches: 15
Total branches: 16
Branch coverage: 93.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 12/12/2025 - 17:27:19 Line coverage: 0% (0/26) Branch coverage: 0% (0/14) Total lines: 67 Tag: Kestrun/Kestrun@826bf9dcf9db118c5de4c78a3259bce9549f0dcd12/25/2025 - 19:20:44 Line coverage: 0% (0/24) Branch coverage: 0% (0/14) Total lines: 65 Tag: Kestrun/Kestrun@5251f12f253e29f8a1dfb77edc2ef50b90a4f26f01/02/2026 - 21:56:10 Line coverage: 0% (0/27) Branch coverage: 0% (0/16) Total lines: 69 Tag: Kestrun/Kestrun@f60326065ebb24cf70b241e459b37baf142e6ed601/12/2026 - 18:03:06 Line coverage: 100% (27/27) Branch coverage: 87.5% (14/16) Total lines: 69 Tag: Kestrun/Kestrun@956332ccc921363590dccd99d5707fb20b50966b01/18/2026 - 21:37:07 Line coverage: 100% (25/25) Branch coverage: 83.3% (10/12) Total lines: 69 Tag: Kestrun/Kestrun@99c4ae445e8e5afc8b7080e01d5d9cdf39f972b802/05/2026 - 00:28:18 Line coverage: 100% (28/28) Branch coverage: 93.7% (15/16) Total lines: 79 Tag: Kestrun/Kestrun@d9261bd752e45afa789d10bc0c82b7d5724d9589 12/12/2025 - 17:27:19 Line coverage: 0% (0/26) Branch coverage: 0% (0/14) Total lines: 67 Tag: Kestrun/Kestrun@826bf9dcf9db118c5de4c78a3259bce9549f0dcd12/25/2025 - 19:20:44 Line coverage: 0% (0/24) Branch coverage: 0% (0/14) Total lines: 65 Tag: Kestrun/Kestrun@5251f12f253e29f8a1dfb77edc2ef50b90a4f26f01/02/2026 - 21:56:10 Line coverage: 0% (0/27) Branch coverage: 0% (0/16) Total lines: 69 Tag: Kestrun/Kestrun@f60326065ebb24cf70b241e459b37baf142e6ed601/12/2026 - 18:03:06 Line coverage: 100% (27/27) Branch coverage: 87.5% (14/16) Total lines: 69 Tag: Kestrun/Kestrun@956332ccc921363590dccd99d5707fb20b50966b01/18/2026 - 21:37:07 Line coverage: 100% (25/25) Branch coverage: 83.3% (10/12) Total lines: 69 Tag: Kestrun/Kestrun@99c4ae445e8e5afc8b7080e01d5d9cdf39f972b802/05/2026 - 00:28:18 Line coverage: 100% (28/28) Branch coverage: 93.7% (15/16) Total lines: 79 Tag: Kestrun/Kestrun@d9261bd752e45afa789d10bc0c82b7d5724d9589

Coverage delta

Coverage delta 100 -100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
GetOpenApiTypesAuto()100%11100%
GetRelevantAssemblies()75%44100%
GetSchemaTypes(...)100%1010100%
IsFormPayloadBaseType(...)100%22100%

File(s)

/home/runner/work/Kestrun/Kestrun/src/CSharp/Kestrun/OpenApi/OpenApiSchemaDiscovery.cs

#LineLine coverage
 1// OpenApiSchemaDiscovery.cs
 2using Kestrun.Forms;
 3
 4namespace Kestrun.OpenApi;
 5
 6/// <summary>
 7/// Helper to discover OpenAPI schema types in loaded assemblies.
 8/// </summary>
 9public static class OpenApiSchemaDiscovery
 10{
 11    /// <summary>
 12    /// Discover all OpenAPI component types from dynamic PowerShell classes.
 13    /// Scans all loaded assemblies for classes decorated with OpenApiModelKindAttribute
 14    /// or having any OpenApi* attributes.
 15    /// </summary>
 16    /// <returns> The discovered OpenAPI component types.</returns>
 17    public static OpenApiComponentSet GetOpenApiTypesAuto()
 18    {
 419        var assemblies = GetRelevantAssemblies();
 420        return new OpenApiComponentSet
 421        {
 422            SchemaTypes = GetSchemaTypes(assemblies),
 423#if EXTENDED_OPENAPI
 424            RequestBodyTypes = GetTypesWithAttribute(assemblies, typeof(OpenApiRequestBodyComponentAttribute)),
 425            ResponseTypes = GetTypesWithAttribute(assemblies, typeof(OpenApiResponseComponentAttribute)),
 426            ParameterTypes = GetTypesWithAttribute(assemblies, typeof(OpenApiParameterComponentAttribute)),
 427            HeaderTypes = GetTypesWithAttribute(assemblies, typeof(OpenApiHeaderAttribute)),
 428            SecuritySchemeTypes = GetTypesWithAttribute(assemblies, typeof(OpenApiSecuritySchemeComponent)),
 429            CallbackTypes = GetTypesWithKind(assemblies, OpenApiModelKind.Callback),
 430            PathItemTypes = GetTypesWithKind(assemblies, OpenApiModelKind.PathItem)
 431#endif
 432        };
 33    }
 34
 35    private static System.Reflection.Assembly[] GetRelevantAssemblies()
 36    {
 437        return [.. AppDomain.CurrentDomain.GetAssemblies()
 127938            .Where(a => a.FullName is not null &&
 127939                    (a.FullName.Contains("PowerShell Class Assembly") ||
 127940                        a.FullName.StartsWith("Kestrun")))];
 41    }
 42
 43    private static Type[] GetSchemaTypes(System.Reflection.Assembly[] assemblies)
 44    {
 445        var primitivesAssembly = typeof(OpenApiString).Assembly;
 46
 2047        return [.. assemblies.SelectMany(asm => asm.GetTypes())
 801648            .Where(t => t.IsClass && !t.IsAbstract &&
 801649                    t.IsDefined(typeof(OpenApiSchemaComponent), true) &&
 801650                    !IsFormPayloadBaseType(t) &&
 801651                    // Exclude built-in OpenApi* primitives from auto-discovered components,
 801652                    // but keep user-defined schema components that inherit those primitives.
 801653                    !(t.Assembly == primitivesAssembly && typeof(IOpenApiScalar).IsAssignableFrom(t)))];
 54    }
 55
 56    private static bool IsFormPayloadBaseType(Type t)
 57    {
 58        // Avoid emitting base form payload schemas unless explicitly referenced.
 12859        return t == typeof(KrFormData)
 12860            || t == typeof(KrMultipart);
 61    }
 62
 63#if EXTENDED_OPENAPI
 64
 65   private static Type[] GetTypesWithAttribute(System.Reflection.Assembly[] assemblies, Type attributeType)
 66    {
 67        return [.. assemblies.SelectMany(asm => asm.GetTypes())
 68            .Where(t => t.IsClass && !t.IsAbstract && t.IsDefined(attributeType, true))];
 69    }
 70    private static Type[] GetTypesWithKind(System.Reflection.Assembly[] assemblies, OpenApiModelKind kind)
 71    {
 72        return [.. assemblies.SelectMany(asm => asm.GetTypes())
 73            .Where(t => t.IsClass && !t.IsAbstract &&
 74                t.GetCustomAttributes(typeof(OpenApiModelKindAttribute), true)
 75                 .OfType<OpenApiModelKindAttribute>()
 76                 .Any(a => a.Kind == kind))];
 77    }
 78#endif
 79}