From b2b8cfb167757e23cd26e1966507b7beeb7286c2 Mon Sep 17 00:00:00 2001 From: Arpit Jain Date: Wed, 22 Jul 2026 03:31:11 +0900 Subject: [PATCH 1/2] Fix substring matching on cpan and mlflow type checks The cpan and mlflow branches used `ptype in ("cpan")` and `ptype in ("mlflow")`. The missing trailing comma makes each a plain string rather than a one-element tuple, so `in` is a substring test instead of an equality test. Any type that is a substring of the literal took the branch. For example pkg:pan/Some-Namespace/x had its namespace uppercased to SOME-NAMESPACE, and a name normalized under type "flow" took the mlflow path and was lowercased when a databricks repository_url qualifier was present. Use == to match the neighbouring pypi, hackage and pub checks. Signed-off-by: Arpit Jain --- src/packageurl/__init__.py | 4 ++-- tests/test_packageurl.py | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/packageurl/__init__.py b/src/packageurl/__init__.py index 3bfae87..390e238 100644 --- a/src/packageurl/__init__.py +++ b/src/packageurl/__init__.py @@ -149,7 +149,7 @@ def normalize_namespace( "hex", ): namespace_str = namespace_str.lower() - if ptype and ptype in ("cpan"): + if ptype == "cpan": namespace_str = namespace_str.upper() segments = [seg for seg in namespace_str.split("/") if seg.strip()] segments_quoted = map(get_quoter(encode), segments) @@ -189,7 +189,7 @@ def normalize_name( quoter = get_quoter(encode) name_str = quoter(name_str) name_str = name_str.strip().strip("/") - if ptype and ptype in ("mlflow"): + if ptype == "mlflow": return normalize_mlflow_name(name_str, qualifiers) if ptype in ( "bitbucket", diff --git a/tests/test_packageurl.py b/tests/test_packageurl.py index 2c36549..eb3b403 100644 --- a/tests/test_packageurl.py +++ b/tests/test_packageurl.py @@ -31,6 +31,8 @@ from packageurl import PackageURL from packageurl import normalize +from packageurl import normalize_name +from packageurl import normalize_namespace from packageurl import normalize_qualifiers @@ -388,3 +390,23 @@ def test_no_encoding_to_string(): p.to_string(encode=False) == "pkg:nuget/an:odd:space/libiconv: character set conversion library@1.9?package-id=e11a609df352e292" ) + + +def test_cpan_namespace_uppercasing_is_not_applied_to_substring_types() -> None: + assert normalize_namespace("Some-Namespace", "cpan") == "SOME-NAMESPACE" + + for ptype in ("pan", "cpa", "c", "a", "cp", "an"): + assert normalize_namespace("Some-Namespace", ptype) == "Some-Namespace" + + assert PackageURL(type="pan", namespace="Some-Namespace", name="x").to_string() == ( + "pkg:pan/Some-Namespace/x" + ) + + +def test_mlflow_name_handling_is_not_applied_to_substring_types() -> None: + databricks = {"repository_url": "https://community.cloud.databricks.com"} + + assert normalize_name("MyModel", databricks, "mlflow") == "mymodel" + + for ptype in ("ml", "flow", "low", "m", "w"): + assert normalize_name("MyModel", databricks, ptype) == "MyModel" From 625d61b0814e69dc5a40297316921348e3d7994d Mon Sep 17 00:00:00 2001 From: Arpit Jain Date: Wed, 22 Jul 2026 03:31:58 +0900 Subject: [PATCH 2/2] Add changelog entry for the cpan and mlflow type check fix Signed-off-by: Arpit Jain --- CHANGELOG.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 3f73e73..ada01e0 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,6 +11,9 @@ Changelog - Fix type hint for ``BasePurlType.allowed_qualifiers`` https://github.com/package-url/packageurl-python/pull/213 +- Fix substring matching on the ``cpan`` and ``mlflow`` type checks + https://github.com/package-url/packageurl-python/pull/232 + 0.17.6 (2025-11-24) -------------------