Skip to content

Commit e540df8

Browse files
committed
fix dev and non dev lists
1 parent 288c567 commit e540df8

2 files changed

Lines changed: 50 additions & 7 deletions

File tree

src/Microsoft.ComponentDetection.Detectors/uv/UvLockComponentDetector.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,10 @@ protected override Task OnFileFoundAsync(ProcessRequest processRequest, IDiction
5050

5151
var rootPackage = uvLock.Packages.FirstOrDefault(IsRootPackage);
5252

53-
// Add requires-dist as explicitly referenced component ids and dependencies
53+
var explicitPackages = new HashSet<string>();
5454
foreach (var dep in rootPackage.MetadataRequiresDist)
5555
{
56-
var depComponent = new PipComponent(dep.Name, dep.Specifier);
57-
var detectedDep = new DetectedComponent(depComponent);
58-
singleFileComponentRecorder.RegisterUsage(detectedDep, isExplicitReferencedDependency: true, isDevelopmentDependency: false);
56+
explicitPackages.Add(dep.Name);
5957
}
6058

6159
var devPackages = new HashSet<string>();
@@ -72,17 +70,18 @@ protected override Task OnFileFoundAsync(ProcessRequest processRequest, IDiction
7270
}
7371

7472
var pipComponent = new PipComponent(pkg.Name, pkg.Version);
75-
var isDevelopmentDependency = devPackages.Contains(pkg.Name);
73+
var isExplicit = explicitPackages.Contains(pkg.Name);
74+
var isDev = devPackages.Contains(pkg.Name);
7675
var detectedComponent = new DetectedComponent(pipComponent);
77-
singleFileComponentRecorder.RegisterUsage(detectedComponent, isDevelopmentDependency: isDevelopmentDependency);
76+
singleFileComponentRecorder.RegisterUsage(detectedComponent, isDevelopmentDependency: isDev, isExplicitReferencedDependency: isExplicit);
7877

7978
foreach (var dep in pkg.Dependencies)
8079
{
8180
var depPkg = uvLock.Packages.FirstOrDefault(p => p.Name.Equals(dep.Name, StringComparison.OrdinalIgnoreCase));
8281
if (depPkg != null)
8382
{
8483
var depComponentWithVersion = new PipComponent(depPkg.Name, depPkg.Version);
85-
singleFileComponentRecorder.RegisterUsage(new DetectedComponent(depComponentWithVersion), isExplicitReferencedDependency: false, parentComponentId: pipComponent.Id);
84+
singleFileComponentRecorder.RegisterUsage(new DetectedComponent(depComponentWithVersion), parentComponentId: pipComponent.Id);
8685
}
8786
else
8887
{

test/Microsoft.ComponentDetection.Detectors.Tests/UvLockDetectorTests.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,4 +218,48 @@ public async Task TestUvLockDetector_ExplicitDependencies_AreMarkedExplicit()
218218
var barId = detected.First(d => d.Component.Id.StartsWith("bar")).Component.Id;
219219
graph.IsComponentExplicitlyReferenced(barId).Should().BeTrue();
220220
}
221+
222+
[TestMethod]
223+
public async Task TestUvLockDetector_DevelopmentAndNonDevelopmentDependencies()
224+
{
225+
var uvLock = @"[[package]]
226+
name = 'foo'
227+
version = '1.2.3'
228+
[package.metadata]
229+
requires-dist = [
230+
{ name = 'bar', specifier = '>=2.0.0' },
231+
{ name = 'baz', specifier = '>=3.0.0' }
232+
]
233+
[package.metadata.requires-dev]
234+
dev = [
235+
{ name = 'devonly', specifier = '>=4.0.0' }
236+
]
237+
[[package]]
238+
name = 'bar'
239+
version = '2.0.0'
240+
[[package]]
241+
name = 'baz'
242+
version = '3.0.0'
243+
[[package]]
244+
name = 'devonly'
245+
version = '4.0.0'
246+
";
247+
var (scanResult, componentRecorder) = await this.DetectorTestUtility
248+
.WithFile("uv.lock", uvLock)
249+
.ExecuteDetectorAsync();
250+
251+
scanResult.ResultCode.Should().Be(ProcessingResultCode.Success);
252+
var detected = componentRecorder.GetDetectedComponents().ToList();
253+
var graph = componentRecorder.GetDependencyGraphsByLocation().Values.First();
254+
255+
var fooId = detected.First(d => d.Component.Id.StartsWith("foo ")).Component.Id;
256+
var barId = detected.First(d => d.Component.Id.StartsWith("bar ")).Component.Id;
257+
var bazId = detected.First(d => d.Component.Id.StartsWith("baz ")).Component.Id;
258+
var devonlyId = detected.First(d => d.Component.Id.StartsWith("devonly ")).Component.Id;
259+
260+
// bar and baz are non-dev dependencies, devonly is a dev dependency
261+
graph.IsDevelopmentDependency(barId).Should().BeFalse();
262+
graph.IsDevelopmentDependency(bazId).Should().BeFalse();
263+
graph.IsDevelopmentDependency(devonlyId).Should().BeTrue();
264+
}
221265
}

0 commit comments

Comments
 (0)