Skip to content
Merged
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
34 changes: 16 additions & 18 deletions docs/creating-a-new-service.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,12 @@ Component Detection uses standard .NET dependency injection for service registra
1. **Create your service interface** in `src/Microsoft.ComponentDetection.Contracts/IMyNewService.cs`

```c#
namespace Microsoft.ComponentDetection.Contracts
namespace Microsoft.ComponentDetection.Contracts;

public interface IMyNewService
{
public interface IMyNewService
{
// Define your service methods
string DoSomething();
}
// Define your service methods
string DoSomething();
}
```

Expand All @@ -22,20 +21,19 @@ namespace Microsoft.ComponentDetection.Contracts
```c#
using Microsoft.ComponentDetection.Contracts;

namespace Microsoft.ComponentDetection.Common
namespace Microsoft.ComponentDetection.Common;

public class MyNewService : IMyNewService
{
public class MyNewService : IMyNewService
// Inject any dependencies your service needs
public MyNewService(ILogger<MyNewService> logger)
{
// Constructor injection
}

public string DoSomething()
{
// Inject any dependencies your service needs
public MyNewService(ILogger<MyNewService> logger)
{
// Constructor injection
}

public string DoSomething()
{
// Implementation
}
// Implementation
}
}
```
Expand Down
11 changes: 5 additions & 6 deletions src/Microsoft.ComponentDetection.Detectors/uv/UvDependency.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
namespace Microsoft.ComponentDetection.Detectors.Uv
namespace Microsoft.ComponentDetection.Detectors.Uv;

public class UvDependency
{
public class UvDependency
{
public required string Name { get; init; }
public required string Name { get; init; }

public string? Specifier { get; set; }
}
public string? Specifier { get; set; }
}
203 changes: 101 additions & 102 deletions src/Microsoft.ComponentDetection.Detectors/uv/UvLock.cs
Original file line number Diff line number Diff line change
@@ -1,142 +1,141 @@
namespace Microsoft.ComponentDetection.Detectors.Uv
namespace Microsoft.ComponentDetection.Detectors.Uv;

using System;
using System.Collections.Generic;
using System.IO;
using Tomlyn;
using Tomlyn.Model;

public class UvLock
{
using System;
using System.Collections.Generic;
using System.IO;
using Tomlyn;
using Tomlyn.Model;
// a list of packages with their dependencies
public List<UvPackage> Packages { get; set; } = [];

public class UvLock
// static method to parse the TOML stream into a UvLock model
public static UvLock Parse(Stream tomlStream)
{
// a list of packages with their dependencies
public List<UvPackage> Packages { get; set; } = [];
using var reader = new StreamReader(tomlStream);
var tomlContent = reader.ReadToEnd();
var model = Toml.ToModel(tomlContent);
return new UvLock
{
Packages = ParsePackagesFromModel(model),
};
}

// static method to parse the TOML stream into a UvLock model
public static UvLock Parse(Stream tomlStream)
internal static List<UvPackage> ParsePackagesFromModel(object? model)
{
if (model is not TomlTable table)
{
using var reader = new StreamReader(tomlStream);
var tomlContent = reader.ReadToEnd();
var model = Toml.ToModel(tomlContent);
return new UvLock
{
Packages = ParsePackagesFromModel(model),
};
throw new InvalidOperationException("TOML root is not a table");
}

internal static List<UvPackage> ParsePackagesFromModel(object? model)
if (!table.TryGetValue("package", out var packagesObj) || packagesObj is not TomlTableArray packages)
{
if (model is not TomlTable table)
{
throw new InvalidOperationException("TOML root is not a table");
}
return [];
}

if (!table.TryGetValue("package", out var packagesObj) || packagesObj is not TomlTableArray packages)
var result = new List<UvPackage>();
foreach (var pkg in packages)
{
var parsed = ParsePackage(pkg);
if (parsed is not null)
{
return [];
result.Add(parsed);
}
}

var result = new List<UvPackage>();
foreach (var pkg in packages)
{
var parsed = ParsePackage(pkg);
if (parsed is not null)
{
result.Add(parsed);
}
}
return result;
}

return result;
internal static UvPackage? ParsePackage(object? pkg)
{
if (pkg is not TomlTable pkgTable)
{
return null;
}

internal static UvPackage? ParsePackage(object? pkg)
if (pkgTable.TryGetValue("name", out var nameObj) && nameObj is string name &&
pkgTable.TryGetValue("version", out var versionObj) && versionObj is string version)
{
if (pkg is not TomlTable pkgTable)
var uvPackage = new UvPackage
{
return null;
}
Name = name,
Version = version,
Dependencies = [],
MetadataRequiresDist = [],
MetadataRequiresDev = [],
};

if (pkgTable.TryGetValue("name", out var nameObj) && nameObj is string name &&
pkgTable.TryGetValue("version", out var versionObj) && versionObj is string version)
if (pkgTable.TryGetValue("dependencies", out var depsObj) && depsObj is TomlArray depsArray)
{
var uvPackage = new UvPackage
{
Name = name,
Version = version,
Dependencies = [],
MetadataRequiresDist = [],
MetadataRequiresDev = [],
};

if (pkgTable.TryGetValue("dependencies", out var depsObj) && depsObj is TomlArray depsArray)
{
uvPackage.Dependencies = ParseDependenciesArray(depsArray);
}

if (pkgTable.TryGetValue("metadata", out var metadataObj) && metadataObj is TomlTable metadataTable)
{
ParseMetadata(metadataTable, uvPackage);
}

// Parse source
if (pkgTable.TryGetValue("source", out var sourceObj) && sourceObj is TomlTable sourceTable)
{
var source = new UvSource
{
Registry = sourceTable.TryGetValue("registry", out var regObj) && regObj is string reg ? reg : null,
Virtual = sourceTable.TryGetValue("virtual", out var virtObj) && virtObj is string virt ? virt : null,
};
uvPackage.Source = source;
}

return uvPackage;
uvPackage.Dependencies = ParseDependenciesArray(depsArray);
}

return null;
}

internal static List<UvDependency> ParseDependenciesArray(TomlArray? depsArray)
{
var deps = new List<UvDependency>();
if (depsArray is null)
if (pkgTable.TryGetValue("metadata", out var metadataObj) && metadataObj is TomlTable metadataTable)
{
return deps;
ParseMetadata(metadataTable, uvPackage);
}

foreach (var dep in depsArray)
// Parse source
if (pkgTable.TryGetValue("source", out var sourceObj) && sourceObj is TomlTable sourceTable)
{
if (dep is TomlTable depTable &&
depTable.TryGetValue("name", out var depNameObj) && depNameObj is string depName)
var source = new UvSource
{
var depSpec = depTable.TryGetValue("specifier", out var specObj) && specObj is string s ? s : null;
deps.Add(new UvDependency
{
Name = depName,
Specifier = depSpec,
});
}
Registry = sourceTable.TryGetValue("registry", out var regObj) && regObj is string reg ? reg : null,
Virtual = sourceTable.TryGetValue("virtual", out var virtObj) && virtObj is string virt ? virt : null,
};
uvPackage.Source = source;
}

return uvPackage;
}

return null;
}

internal static List<UvDependency> ParseDependenciesArray(TomlArray? depsArray)
{
var deps = new List<UvDependency>();
if (depsArray is null)
{
return deps;
}

internal static void ParseMetadata(TomlTable? metadataTable, UvPackage uvPackage)
foreach (var dep in depsArray)
{
if (metadataTable is null)
if (dep is TomlTable depTable &&
depTable.TryGetValue("name", out var depNameObj) && depNameObj is string depName)
{
return;
var depSpec = depTable.TryGetValue("specifier", out var specObj) && specObj is string s ? s : null;
deps.Add(new UvDependency
{
Name = depName,
Specifier = depSpec,
});
}
}

if (metadataTable.TryGetValue("requires-dist", out var requiresDistObj) && requiresDistObj is TomlArray requiresDistArr)
{
uvPackage.MetadataRequiresDist = ParseDependenciesArray(requiresDistArr);
}
return deps;
}

if (metadataTable.TryGetValue("requires-dev", out var requiresDevObj) && requiresDevObj is TomlTable requiresDevTable)
internal static void ParseMetadata(TomlTable? metadataTable, UvPackage uvPackage)
{
if (metadataTable is null)
{
return;
}

if (metadataTable.TryGetValue("requires-dist", out var requiresDistObj) && requiresDistObj is TomlArray requiresDistArr)
{
uvPackage.MetadataRequiresDist = ParseDependenciesArray(requiresDistArr);
}

if (metadataTable.TryGetValue("requires-dev", out var requiresDevObj) && requiresDevObj is TomlTable requiresDevTable)
{
if (requiresDevTable.TryGetValue("dev", out var devObj) && devObj is TomlArray devArr)
{
if (requiresDevTable.TryGetValue("dev", out var devObj) && devObj is TomlArray devArr)
{
uvPackage.MetadataRequiresDev = ParseDependenciesArray(devArr);
}
uvPackage.MetadataRequiresDev = ParseDependenciesArray(devArr);
}
}
}
Expand Down
Loading
Loading