Skip to content

Commit 8648074

Browse files
authored
fix: Requires-Dist variants & optional deps (#473)
1 parent 17a1fb2 commit 8648074

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

src/Microsoft.ComponentDetection.Detectors/pip/PipDependencySpecification.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class PipDependencySpecification
1212
{
1313
// Extracts name and version from a Requires-Dist string that is found in a metadata file
1414
public static readonly Regex RequiresDistRegex = new Regex(
15-
@"Requires-Dist:\s*(?:(.*?)\s*\((.*?)\)|([^\s;]*))",
15+
@"Requires-Dist:\s*([^\s;\[<>=!~]+)(?:\[[^\]]+\])?(?:\s*\(([^)]+)\))?([^;]*)",
1616
RegexOptions.Compiled);
1717

1818
/// <summary>
@@ -31,7 +31,7 @@ public class PipDependencySpecification
3131

3232
// Extracts abcd from a string like abcd==1.*,!=1.3
3333
private static readonly Regex PipNameExtractionRegex = new Regex(
34-
@"^.+?((?=<)|(?=>)|(?=>=)|(?=<=)|(?===)|(?=!=)|(?=~=)|(?====))",
34+
@"^.+?((?=<)|(?=>)|(?=>=)|(?=<=)|(?===)|(?=!=)|(?=~=)|(?====)|(?=\[))",
3535
RegexOptions.Compiled);
3636

3737
// Extracts ==1.*,!=1.3 from a string like abcd==1.*,!=1.3
Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,31 @@
11
namespace Microsoft.ComponentDetection.Detectors.Tests;
2+
23
using System.Collections.Generic;
34
using Microsoft.ComponentDetection.Detectors.Pip;
45
using Microsoft.VisualStudio.TestTools.UnitTesting;
56

67
[TestClass]
78
public class PipDependencySpecifierTests
89
{
10+
private static void VerifyPipDependencyParsing(
11+
List<(string SpecString, PipDependencySpecification ReferenceDependencySpecification)> testCases,
12+
bool requiresDist = false)
13+
{
14+
foreach (var (specString, referenceDependencySpecification) in testCases)
15+
{
16+
var dependencySpecifier = new PipDependencySpecification(specString, requiresDist);
17+
18+
Assert.AreEqual(referenceDependencySpecification.Name, dependencySpecifier.Name);
19+
20+
for (var i = 0; i < referenceDependencySpecification.DependencySpecifiers.Count; i++)
21+
{
22+
Assert.AreEqual(
23+
referenceDependencySpecification.DependencySpecifiers[i],
24+
dependencySpecifier.DependencySpecifiers[i]);
25+
}
26+
}
27+
}
28+
929
[TestMethod]
1030
public void TestPipDependencySpecifierConstruction()
1131
{
@@ -14,19 +34,24 @@ public void TestPipDependencySpecifierConstruction()
1434
("TestPackage==1.0", new PipDependencySpecification { Name = "TestPackage", DependencySpecifiers = new List<string> { "==1.0" } }),
1535
("TestPackage>=1.0,!=1.1", new PipDependencySpecification { Name = "TestPackage", DependencySpecifiers = new List<string> { ">=1.0", "!=1.1" } }),
1636
("OtherPackage!=1.2,>=1.0,<=1.9,~=1.4", new PipDependencySpecification { Name = "OtherPackage", DependencySpecifiers = new List<string> { "!=1.2", ">=1.0", "<=1.9", "~=1.4" } }),
37+
("TestPackage[Optional]<3,>=1.0.0", new PipDependencySpecification { Name = "TestPackage", DependencySpecifiers = new List<string> { "<3", ">=1.0.0" } }),
1738
};
1839

19-
foreach (var spec in specs)
20-
{
21-
var (specString, referenceDependencySpecification) = spec;
22-
var dependencySpecifier = new PipDependencySpecification(specString);
40+
VerifyPipDependencyParsing(specs);
41+
}
2342

24-
Assert.AreEqual(referenceDependencySpecification.Name, dependencySpecifier.Name);
43+
[TestMethod]
44+
public void TestPipDependencyRequireDist()
45+
{
46+
var specs = new List<(string, PipDependencySpecification)>
47+
{
48+
("Requires-Dist: TestPackage<1.27.0,>=1.19.5", new PipDependencySpecification { Name = "TestPackage", DependencySpecifiers = new List<string> { "<1.27.0", ">=1.19.5" } }),
49+
("Requires-Dist: TestPackage (>=1.0.0) ; sys_platform == \"win32\"", new PipDependencySpecification { Name = "TestPackage", DependencySpecifiers = new List<string> { ">=1.0.0" } }),
50+
("Requires-Dist: OtherPackage[Optional] (<3,>=1.0.0)", new PipDependencySpecification { Name = "OtherPackage", DependencySpecifiers = new List<string> { "<3", ">=1.0.0" } }),
51+
("Requires-Dist: TestPackage (>=3.7.4.3) ; python_version < \"3.8\"", new PipDependencySpecification { Name = "TestPackage", DependencySpecifiers = new List<string> { ">=3.7.4.3" } }),
52+
("Requires-Dist: TestPackage ; python_version < \"3.8\"", new PipDependencySpecification { Name = "TestPackage", DependencySpecifiers = new List<string>() }),
53+
};
2554

26-
for (var i = 0; i < referenceDependencySpecification.DependencySpecifiers.Count; i++)
27-
{
28-
Assert.AreEqual(referenceDependencySpecification.DependencySpecifiers[i], dependencySpecifier.DependencySpecifiers[i]);
29-
}
30-
}
55+
VerifyPipDependencyParsing(specs, true);
3156
}
3257
}

0 commit comments

Comments
 (0)