|
19 | 19 | import sys |
20 | 20 | from collections.abc import Iterable |
21 | 21 | from enum import Enum |
22 | | -from typing import Any, Optional, Union |
| 22 | +from typing import Any, Optional, Protocol, Union |
23 | 23 | from warnings import warn |
24 | 24 |
|
25 | 25 | if sys.version_info >= (3, 13): |
|
33 | 33 | from sortedcontainers import SortedSet |
34 | 34 |
|
35 | 35 | from .._internal.bom_ref import bom_ref_from_str as _bom_ref_from_str |
36 | | -from .._internal.compare import ComparablePackageURL as _ComparablePackageURL, ComparableTuple as _ComparableTuple |
| 36 | +from .._internal.compare import ComparableTuple as _ComparableTuple |
37 | 37 | from ..exception.model import InvalidOmniBorIdException, InvalidSwhidException |
38 | 38 | from ..exception.serialization import ( |
39 | 39 | CycloneDxDeserializationException, |
|
50 | 50 | SchemaVersion1Dot6, |
51 | 51 | SchemaVersion1Dot7, |
52 | 52 | ) |
53 | | -from ..serialization import PackageUrl as PackageUrlSH |
54 | 53 | from . import ( |
55 | 54 | AttachedText, |
56 | 55 | ExternalReference, |
@@ -949,6 +948,13 @@ def __str__(self) -> str: |
949 | 948 | return self._id |
950 | 949 |
|
951 | 950 |
|
| 951 | + |
| 952 | + |
| 953 | +class _StringCastable(Protocol): |
| 954 | + |
| 955 | + def __str__(self) -> str: ... |
| 956 | + |
| 957 | + |
952 | 958 | @serializable.serializable_class(ignore_unknown_during_deserialization=True) |
953 | 959 | class Component(Dependable): |
954 | 960 | """ |
@@ -995,7 +1001,7 @@ def __init__( |
995 | 1001 | hashes: Optional[Iterable[HashType]] = None, |
996 | 1002 | licenses: Optional[Iterable[License]] = None, |
997 | 1003 | copyright: Optional[str] = None, |
998 | | - purl: Optional[PackageURL] = None, |
| 1004 | + purl: Optional[_StringCastable] = None, |
999 | 1005 | external_references: Optional[Iterable[ExternalReference]] = None, |
1000 | 1006 | properties: Optional[Iterable[Property]] = None, |
1001 | 1007 | release_notes: Optional[ReleaseNotes] = None, |
@@ -1377,23 +1383,23 @@ def cpe(self, cpe: Optional[str]) -> None: |
1377 | 1383 | self._cpe = cpe |
1378 | 1384 |
|
1379 | 1385 | @property |
1380 | | - @serializable.type_mapping(PackageUrlSH) |
1381 | 1386 | @serializable.xml_sequence(15) |
1382 | | - def purl(self) -> Optional[PackageURL]: |
| 1387 | + @serializable.xml_string(serializable.XmlStringSerializationType.NORMALIZED_STRING) |
| 1388 | + def purl(self) -> Optional[str]: |
1383 | 1389 | """ |
1384 | 1390 | Specifies the package-url (PURL). |
1385 | 1391 |
|
1386 | 1392 | The purl, if specified, must be valid and conform to the specification defined at: |
1387 | 1393 | https://github.com/package-url/purl-spec |
1388 | 1394 |
|
1389 | 1395 | Returns: |
1390 | | - `PackageURL` or `None` |
| 1396 | + `str` or `None` |
1391 | 1397 | """ |
1392 | 1398 | return self._purl |
1393 | 1399 |
|
1394 | 1400 | @purl.setter |
1395 | | - def purl(self, purl: Optional[PackageURL]) -> None: |
1396 | | - self._purl = purl |
| 1401 | + def purl(self, purl: Optional[_StringCastable]) -> None: |
| 1402 | + self._purl = None if purl is None else str(purl) |
1397 | 1403 |
|
1398 | 1404 | @property |
1399 | 1405 | @serializable.json_name('omniborId') |
@@ -1680,7 +1686,7 @@ def __comparable_tuple(self) -> _ComparableTuple: |
1680 | 1686 | return _ComparableTuple(( |
1681 | 1687 | self.type, self.group, self.name, self.version, |
1682 | 1688 | self.bom_ref.value, |
1683 | | - None if self.purl is None else _ComparablePackageURL(self.purl), |
| 1689 | + self.purl, |
1684 | 1690 | self.swid, self.cpe, _ComparableTuple(self.swhids), |
1685 | 1691 | self.supplier, self.author, self.publisher, |
1686 | 1692 | self.description, |
|
0 commit comments