2626
2727import string
2828from collections import namedtuple
29+ from collections .abc import Mapping
2930from typing import TYPE_CHECKING
3031from typing import Any
3132from typing import Union
@@ -226,9 +227,12 @@ def normalize_qualifiers(
226227
227228 if not encode :
228229 return qualifiers_map
230+ return _qualifier_map_to_string (qualifiers_map ) or None
229231
230- qualifiers_list = [f"{ key } ={ value } " for key , value in qualifiers_map .items ()]
231- return "&" .join (qualifiers_list ) or None
232+
233+ def _qualifier_map_to_string (qualifiers : dict [str , str ]) -> str :
234+ qualifiers_list = [f"{ key } ={ value } " for key , value in qualifiers .items ()]
235+ return "&" .join (qualifiers_list )
232236
233237
234238def 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
398402
399403 return data
400404
401- def to_string (self ) -> str :
405+ def to_string (self , encode : bool | None = True ) -> str :
402406 """
403407 Return a purl string built from components.
404408 """
@@ -409,7 +413,7 @@ def to_string(self) -> str:
409413 self .version ,
410414 self .qualifiers ,
411415 self .subpath ,
412- encode = True ,
416+ encode = encode ,
413417 )
414418
415419 purl = [self .SCHEME , ":" , type , "/" ]
@@ -425,6 +429,8 @@ def to_string(self) -> str:
425429
426430 if qualifiers :
427431 purl .append ("?" )
432+ if isinstance (qualifiers , Mapping ):
433+ qualifiers = _qualifier_map_to_string (qualifiers )
428434 purl .append (qualifiers )
429435
430436 if subpath :
0 commit comments