From 47b8a1d040f0c8984f7902ebf83045a199a8c103 Mon Sep 17 00:00:00 2001 From: jaimergp Date: Tue, 10 Jun 2025 20:46:57 +0200 Subject: [PATCH 1/4] add encode kwarg to .to_string() --- src/packageurl/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/packageurl/__init__.py b/src/packageurl/__init__.py index b47902d..1daf809 100644 --- a/src/packageurl/__init__.py +++ b/src/packageurl/__init__.py @@ -398,7 +398,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 +409,7 @@ def to_string(self) -> str: self.version, self.qualifiers, self.subpath, - encode=True, + encode=encode, ) purl = [self.SCHEME, ":", type, "/"] From e71474f766dda971898855590961592240bdd421 Mon Sep 17 00:00:00 2001 From: jaimergp Date: Tue, 10 Jun 2025 20:47:11 +0200 Subject: [PATCH 2/4] stringify unencoded qualifiers --- src/packageurl/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/packageurl/__init__.py b/src/packageurl/__init__.py index 1daf809..51ef00b 100644 --- a/src/packageurl/__init__.py +++ b/src/packageurl/__init__.py @@ -226,8 +226,11 @@ def normalize_qualifiers( if not encode: return qualifiers_map + return _qualifier_map_to_string(qualifiers_map) - qualifiers_list = [f"{key}={value}" for key, value in qualifiers_map.items()] + +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) or None @@ -425,12 +428,15 @@ def to_string(self, encode: bool | None = True) -> str: if qualifiers: purl.append("?") + if not encode: + qualifiers = _qualifier_map_to_string(qualifiers) purl.append(qualifiers) if subpath: purl.append("#") purl.append(subpath) + print(purl) return "".join(purl) @classmethod From fd10930dbc8108385eaab99512d28690e99469c6 Mon Sep 17 00:00:00 2001 From: jaimergp Date: Tue, 10 Jun 2025 20:47:36 +0200 Subject: [PATCH 3/4] add test --- tests/test_packageurl.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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" + ) From 84dcc3b9a9acf7ab6555ed32ee1e6031605debd2 Mon Sep 17 00:00:00 2001 From: jaimergp Date: Sun, 15 Jun 2025 14:33:11 +0200 Subject: [PATCH 4/4] fix mypy --- src/packageurl/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/packageurl/__init__.py b/src/packageurl/__init__.py index 51ef00b..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,12 +227,12 @@ def normalize_qualifiers( if not encode: return qualifiers_map - return _qualifier_map_to_string(qualifiers_map) + return _qualifier_map_to_string(qualifiers_map) 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) or None + return "&".join(qualifiers_list) def normalize_subpath(subpath: AnyStr | None, encode: bool | None = True) -> str | None: @@ -428,7 +429,7 @@ def to_string(self, encode: bool | None = True) -> str: if qualifiers: purl.append("?") - if not encode: + if isinstance(qualifiers, Mapping): qualifiers = _qualifier_map_to_string(qualifiers) purl.append(qualifiers) @@ -436,7 +437,6 @@ def to_string(self, encode: bool | None = True) -> str: purl.append("#") purl.append(subpath) - print(purl) return "".join(purl) @classmethod