diff --git a/src/packageurl/__init__.py b/src/packageurl/__init__.py index b47902d..d1e6837 100644 --- a/src/packageurl/__init__.py +++ b/src/packageurl/__init__.py @@ -26,6 +26,7 @@ import string from collections import namedtuple +from collections.abc import Mapping from typing import TYPE_CHECKING from typing import Any from typing import Union @@ -226,9 +227,12 @@ def normalize_qualifiers( if not encode: return qualifiers_map + return _qualifier_map_to_string(qualifiers_map) or None - qualifiers_list = [f"{key}={value}" for key, value in qualifiers_map.items()] - return "&".join(qualifiers_list) or None + +def _qualifier_map_to_string(qualifiers: dict[str, str]) -> str: + qualifiers_list = [f"{key}={value}" for key, value in qualifiers.items()] + return "&".join(qualifiers_list) def normalize_subpath(subpath: AnyStr | None, encode: bool | None = True) -> str | None: @@ -398,7 +402,7 @@ def to_dict(self, encode: bool | None = False, empty: Any = None) -> dict[str, A return data - def to_string(self) -> str: + def to_string(self, encode: bool | None = True) -> str: """ Return a purl string built from components. """ @@ -409,7 +413,7 @@ def to_string(self) -> str: self.version, self.qualifiers, self.subpath, - encode=True, + encode=encode, ) purl = [self.SCHEME, ":", type, "/"] @@ -425,6 +429,8 @@ def to_string(self) -> str: if qualifiers: purl.append("?") + if isinstance(qualifiers, Mapping): + qualifiers = _qualifier_map_to_string(qualifiers) purl.append(qualifiers) if subpath: diff --git a/tests/test_packageurl.py b/tests/test_packageurl.py index 5d14220..2c36549 100644 --- a/tests/test_packageurl.py +++ b/tests/test_packageurl.py @@ -374,3 +374,17 @@ def test_encoding_stuff_with_colons_correctly() -> None: p.to_string() == "pkg:nuget/an:odd:space/libiconv:%20character%20set%20conversion%20library@1.9?package-id=e11a609df352e292" ) + + +def test_no_encoding_to_string(): + p = PackageURL( + type="nuget", + namespace="an:odd:space", + name="libiconv: character set conversion library", + version="1.9", + qualifiers={"package-id": "e11a609df352e292"}, + ) + assert ( + p.to_string(encode=False) + == "pkg:nuget/an:odd:space/libiconv: character set conversion library@1.9?package-id=e11a609df352e292" + )