< 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@5f1d2b981c9d7292c11fd448428c6ab6c811c5de
Line coverage
91%
Covered lines: 21
Uncovered lines: 2
Coverable lines: 23
Total lines: 70
Line coverage: 91.3%
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@d9261bd752e45afa789d10bc0c82b7d5724d958903/26/2026 - 03:54:59 Line coverage: 91.3% (21/23) Branch coverage: 93.7% (15/16) Total lines: 70 Tag: Kestrun/Kestrun@844b5179fb0492dc6b1182bae3ff65fa7365521d 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@d9261bd752e45afa789d10bc0c82b7d5724d958903/26/2026 - 03:54:59 Line coverage: 91.3% (21/23) Branch coverage: 93.7% (15/16) Total lines: 70 Tag: Kestrun/Kestrun@844b5179fb0492dc6b1182bae3ff65fa7365521d

Coverage delta

Coverage delta 100 -100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
GetOpenApiTypesAuto()100%11100%
GetRelevantAssemblies()75%44100%
GetSchemaTypes(...)100%1010100%
GetLoadableTypes(...)100%1150%
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    {
 519        var assemblies = GetRelevantAssemblies();
 520        return new OpenApiComponentSet
 521        {
 522            SchemaTypes = GetSchemaTypes(assemblies)
 523        };
 24    }
 25
 26    private static System.Reflection.Assembly[] GetRelevantAssemblies()
 27    {
 528        return [.. AppDomain.CurrentDomain.GetAssemblies()
 189829            .Where(a => a.FullName is not null &&
 189830                    (a.FullName.Contains("PowerShell Class Assembly") ||
 189831                        a.FullName.StartsWith("Kestrun")))];
 32    }
 33
 34    private static Type[] GetSchemaTypes(System.Reflection.Assembly[] assemblies)
 35    {
 536        var primitivesAssembly = typeof(OpenApiString).Assembly;
 37
 538        return [.. assemblies.SelectMany(GetLoadableTypes)
 1099539            .Where(t => t.IsClass && !t.IsAbstract &&
 1099540                    t.IsDefined(typeof(OpenApiSchemaComponent), true) &&
 1099541                    !IsFormPayloadBaseType(t) &&
 1099542                    // Exclude built-in OpenApi* primitives from auto-discovered components,
 1099543                    // but keep user-defined schema components that inherit those primitives.
 1099544                    !(t.Assembly == primitivesAssembly && typeof(IOpenApiScalar).IsAssignableFrom(t)))];
 45    }
 46
 47    /// <summary>
 48    /// Returns all loadable types from an assembly, even when some types fail to load.
 49    /// </summary>
 50    /// <param name="assembly">Assembly to enumerate types from.</param>
 51    /// <returns>Loadable types discovered in the assembly.</returns>
 52    private static IEnumerable<Type> GetLoadableTypes(System.Reflection.Assembly assembly)
 53    {
 54        try
 55        {
 2056            return assembly.GetTypes();
 57        }
 058        catch (System.Reflection.ReflectionTypeLoadException ex)
 59        {
 060            return ex.Types.Where(t => t is not null).Cast<Type>();
 61        }
 2062    }
 63
 64    private static bool IsFormPayloadBaseType(Type t)
 65    {
 66        // Avoid emitting base form payload schemas unless explicitly referenced.
 16067        return t == typeof(KrFormData)
 16068            || t == typeof(KrMultipart);
 69    }
 70}