diff --git a/setup.cfg b/setup.cfg index 1391450..f1c6227 100644 --- a/setup.cfg +++ b/setup.cfg @@ -41,6 +41,7 @@ package_dir = =src include_package_data = true zip_safe = false install_requires = + univers>=30.12.1 [options.packages.find] where = src diff --git a/src/packageurl/__init__.py b/src/packageurl/__init__.py index d1e6837..d4f242d 100644 --- a/src/packageurl/__init__.py +++ b/src/packageurl/__init__.py @@ -45,6 +45,8 @@ AnyStr = Union[str, bytes] +from univers.version_range import VersionRange + # Python 3 basestring = (bytes, str) @@ -223,6 +225,9 @@ def normalize_qualifiers( if key[0] in string.digits: raise ValueError(f"A qualifier key cannot start with a number: {key!r}") + if vers := qualifiers_map.get("vers"): + VersionRange.from_string(vers, validate=True) + qualifiers_map = dict(sorted(qualifiers_map.items())) if not encode: diff --git a/tests/test_packageurl.py b/tests/test_packageurl.py index 2c36549..1a860db 100644 --- a/tests/test_packageurl.py +++ b/tests/test_packageurl.py @@ -29,6 +29,8 @@ import re import unittest +import pytest + from packageurl import PackageURL from packageurl import normalize from packageurl import normalize_qualifiers @@ -376,6 +378,16 @@ def test_encoding_stuff_with_colons_correctly() -> None: ) +def test_vers_validation_ok(): + url = PackageURL.from_string("pkg:pypi/requests?vers=vers:pypi/>=2.0") + assert url.qualifiers["vers"] == "vers:pypi/>=2.0" + + +def test_vers_validation_fails(): + with pytest.raises(ValueError, match="must start with the 'vers:' URI scheme."): + PackageURL.from_string("pkg:pypi/requests?vers=>=2.0") + + def test_no_encoding_to_string(): p = PackageURL( type="nuget",