From 1b8911cbe5c937d686d3971519e9827970a5b0fd Mon Sep 17 00:00:00 2001 From: Andrew Stein Date: Thu, 28 Apr 2022 12:40:03 -0400 Subject: [PATCH] Update the pypi specific name transformations to match https://peps.python.org/pep-0503/#normalized-names --- .../goodies/packageurl/PackageUrlBuilder.java | 6 ++++- .../packageurl/PackageUrlBuilderTest.groovy | 4 ++-- .../packageurl/PackageUrlParserTest.groovy | 22 +++++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/sonatype/goodies/packageurl/PackageUrlBuilder.java b/src/main/java/org/sonatype/goodies/packageurl/PackageUrlBuilder.java index 611dbc7..5af3a84 100644 --- a/src/main/java/org/sonatype/goodies/packageurl/PackageUrlBuilder.java +++ b/src/main/java/org/sonatype/goodies/packageurl/PackageUrlBuilder.java @@ -19,6 +19,7 @@ import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; +import java.util.regex.Pattern; import static java.util.Objects.requireNonNull; import static org.sonatype.goodies.packageurl.PackageUrlParser.parseNamespace; @@ -38,6 +39,8 @@ */ public class PackageUrlBuilder { + private static final Pattern PYPI_NORMALIZED_NAME_PATTERN = Pattern.compile("[-_.]+"); + private boolean typeSpecificTransformations = true; private String type; @@ -188,7 +191,8 @@ PackageUrl buildAndValidate(final boolean validate) { break; case "pypi": - correctedName = name.replace('_', '-'); + // Equivalent of: https://peps.python.org/pep-0503/#normalized-names + correctedName = PYPI_NORMALIZED_NAME_PATTERN.matcher(name).replaceAll("-"); correctedName = MoreStrings.lowerCase(correctedName); break; } diff --git a/src/test/java/org/sonatype/goodies/packageurl/PackageUrlBuilderTest.groovy b/src/test/java/org/sonatype/goodies/packageurl/PackageUrlBuilderTest.groovy index 276c89b..798d803 100644 --- a/src/test/java/org/sonatype/goodies/packageurl/PackageUrlBuilderTest.groovy +++ b/src/test/java/org/sonatype/goodies/packageurl/PackageUrlBuilderTest.groovy @@ -189,12 +189,12 @@ class PackageUrlBuilderTest @Test void 'pypi name'() { - PackageUrlBuilder builder = new PackageUrlBuilder().type('pypi').name('fOo-BaR_baZ') + PackageUrlBuilder builder = new PackageUrlBuilder().type('pypi').name('fOo--BaR_.baZ') builder.build().with { assert name == 'foo-bar-baz' } builder.typeSpecificTransformations(false).build().with { - assert name == 'fOo-BaR_baZ' + assert name == 'fOo--BaR_.baZ' } } diff --git a/src/test/java/org/sonatype/goodies/packageurl/PackageUrlParserTest.groovy b/src/test/java/org/sonatype/goodies/packageurl/PackageUrlParserTest.groovy index 9b18790..11b1ab2 100644 --- a/src/test/java/org/sonatype/goodies/packageurl/PackageUrlParserTest.groovy +++ b/src/test/java/org/sonatype/goodies/packageurl/PackageUrlParserTest.groovy @@ -256,6 +256,28 @@ class PackageUrlParserTest assert version == '1.11.1' } + parse('pkg:pypi/p2.Loader@0.1.0').with { + assert type == 'pypi' + assert name == 'p2-loader' + assert version == '0.1.0' + } + parseAsIs('pkg:pypi/p2.Loader@0.1.0').with { + assert type == 'pypi' + assert name == 'p2.Loader' + assert version == '0.1.0' + } + + parse('pkg:pypi/cmc-csci046-.data-structures@1.0.7').with { + assert type == 'pypi' + assert name == 'cmc-csci046-data-structures' + assert version == '1.0.7' + } + parseAsIs('pkg:pypi/cmc-csci046-.data-structures@1.0.7').with { + assert type == 'pypi' + assert name == 'cmc-csci046-.data-structures' + assert version == '1.0.7' + } + parse('pkg:rpm/fedora/curl@7.50.3-1.fc25?arch=i386&distro=fedora-25').with { assert type == 'rpm' assert namespace == ['fedora']