Skip to content

Commit d356f73

Browse files
committed
feat: bom-refs for known models
Signed-off-by: Jan Kowalleck <[email protected]>
1 parent 5621705 commit d356f73

File tree

2 files changed

+90
-28
lines changed

2 files changed

+90
-28
lines changed

cyclonedx/model/contact.py

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
from .._internal.bom_ref import bom_ref_from_str as _bom_ref_from_str
2626
from .._internal.compare import ComparableTuple as _ComparableTuple
27-
from ..schema.schema import SchemaVersion1Dot6
27+
from ..schema.schema import SchemaVersion1Dot5, SchemaVersion1Dot6
2828
from . import XsUri
2929
from .bom_ref import BomRef
3030

@@ -49,7 +49,7 @@ def __init__(
4949
postal_code: Optional[str] = None,
5050
street_address: Optional[str] = None,
5151
) -> None:
52-
self._bom_ref = _bom_ref_from_str(bom_ref, optional=True)
52+
self._bom_ref = _bom_ref_from_str(bom_ref)
5353
self.country = country
5454
self.region = region
5555
self.locality = locality
@@ -58,11 +58,11 @@ def __init__(
5858
self.street_address = street_address
5959

6060
@property
61-
@serializable.json_name('bom-ref')
6261
@serializable.type_mapping(BomRef)
6362
@serializable.xml_attribute()
6463
@serializable.xml_name('bom-ref')
65-
def bom_ref(self) -> Optional[BomRef]:
64+
@serializable.json_name('bom-ref')
65+
def bom_ref(self) -> BomRef:
6666
"""
6767
An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref MUST be
6868
unique within the BOM.
@@ -167,7 +167,7 @@ def __comparable_tuple(self) -> _ComparableTuple:
167167
self.country, self.region, self.locality, self.postal_code,
168168
self.post_office_box_number,
169169
self.street_address,
170-
None if self.bom_ref is None else self.bom_ref.value,
170+
self._bom_ref.value,
171171
))
172172

173173
def __eq__(self, other: object) -> bool:
@@ -199,14 +199,33 @@ class OrganizationalContact:
199199

200200
def __init__(
201201
self, *,
202+
bom_ref: Optional[Union[str, BomRef]] = None,
202203
name: Optional[str] = None,
203204
phone: Optional[str] = None,
204205
email: Optional[str] = None,
205206
) -> None:
207+
self._bom_ref = _bom_ref_from_str(bom_ref)
206208
self.name = name
207209
self.email = email
208210
self.phone = phone
209211

212+
@property
213+
@serializable.view(SchemaVersion1Dot5)
214+
@serializable.view(SchemaVersion1Dot6)
215+
@serializable.type_mapping(BomRef)
216+
@serializable.xml_attribute()
217+
@serializable.xml_name('bom-ref')
218+
@serializable.json_name('bom-ref')
219+
def bom_ref(self) -> BomRef:
220+
"""
221+
An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref MUST be
222+
unique within the BOM.
223+
224+
Returns:
225+
`BomRef`
226+
"""
227+
return self._bom_ref
228+
210229
@property
211230
@serializable.xml_sequence(1)
212231
@serializable.xml_string(serializable.XmlStringSerializationType.NORMALIZED_STRING)
@@ -257,7 +276,8 @@ def phone(self, phone: Optional[str]) -> None:
257276

258277
def __comparable_tuple(self) -> _ComparableTuple:
259278
return _ComparableTuple((
260-
self.name, self.email, self.phone
279+
self.name, self.email, self.phone,
280+
self._bom_ref.value,
261281
))
262282

263283
def __eq__(self, other: object) -> bool:
@@ -289,16 +309,35 @@ class OrganizationalEntity:
289309

290310
def __init__(
291311
self, *,
312+
bom_ref: Optional[Union[str, BomRef]] = None,
292313
name: Optional[str] = None,
293314
urls: Optional[Iterable[XsUri]] = None,
294315
contacts: Optional[Iterable[OrganizationalContact]] = None,
295316
address: Optional[PostalAddress] = None,
296317
) -> None:
318+
self._bom_ref = _bom_ref_from_str(bom_ref)
297319
self.name = name
298320
self.address = address
299321
self.urls = urls or []
300322
self.contacts = contacts or []
301323

324+
@property
325+
@serializable.view(SchemaVersion1Dot5)
326+
@serializable.view(SchemaVersion1Dot6)
327+
@serializable.type_mapping(BomRef)
328+
@serializable.xml_attribute()
329+
@serializable.xml_name('bom-ref')
330+
@serializable.json_name('bom-ref')
331+
def bom_ref(self) -> BomRef:
332+
"""
333+
An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref MUST be
334+
unique within the BOM.
335+
336+
Returns:
337+
`BomRef`
338+
"""
339+
return self._bom_ref
340+
302341
@property
303342
@serializable.xml_sequence(10)
304343
@serializable.xml_string(serializable.XmlStringSerializationType.NORMALIZED_STRING)
@@ -367,7 +406,8 @@ def contacts(self, contacts: Iterable[OrganizationalContact]) -> None:
367406

368407
def __comparable_tuple(self) -> _ComparableTuple:
369408
return _ComparableTuple((
370-
self.name, _ComparableTuple(self.urls), _ComparableTuple(self.contacts)
409+
self.name, _ComparableTuple(self.urls), _ComparableTuple(self.contacts),
410+
self._bom_ref.value,
371411
))
372412

373413
def __eq__(self, other: object) -> bool:

cyclonedx/model/license.py

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@
2929
import py_serializable as serializable
3030
from sortedcontainers import SortedSet
3131

32+
from .._internal.bom_ref import bom_ref_from_str as _bom_ref_from_str
3233
from .._internal.compare import ComparableTuple as _ComparableTuple
3334
from ..exception.model import MutuallyExclusivePropertiesException
3435
from ..exception.serialization import CycloneDxDeserializationException
35-
from ..schema.schema import SchemaVersion1Dot6
36+
from ..schema.schema import SchemaVersion1Dot5, SchemaVersion1Dot6
3637
from . import AttachedText, XsUri
38+
from .bom_ref import BomRef
3739

3840

3941
@serializable.serializable_enum
@@ -75,6 +77,7 @@ class DisjunctiveLicense:
7577

7678
def __init__(
7779
self, *,
80+
bom_ref: Optional[Union[str, BomRef]] = None,
7881
id: Optional[str] = None, name: Optional[str] = None,
7982
text: Optional[AttachedText] = None, url: Optional[XsUri] = None,
8083
acknowledgement: Optional[LicenseAcknowledgement] = None,
@@ -86,12 +89,30 @@ def __init__(
8689
'Both `id` and `name` have been supplied - `name` will be ignored!',
8790
category=RuntimeWarning, stacklevel=1
8891
)
92+
self._bom_ref = _bom_ref_from_str(bom_ref)
8993
self._id = id
9094
self._name = name if not id else None
9195
self._text = text
9296
self._url = url
9397
self._acknowledgement = acknowledgement
9498

99+
@property
100+
@serializable.view(SchemaVersion1Dot5)
101+
@serializable.view(SchemaVersion1Dot6)
102+
@serializable.type_mapping(BomRef)
103+
@serializable.xml_attribute()
104+
@serializable.xml_name('bom-ref')
105+
@serializable.json_name('bom-ref')
106+
def bom_ref(self) -> BomRef:
107+
"""
108+
An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref MUST be
109+
unique within the BOM.
110+
111+
Returns:
112+
`BomRef`
113+
"""
114+
return self._bom_ref
115+
95116
@property
96117
@serializable.xml_sequence(1)
97118
def id(self) -> Optional[str]:
@@ -186,16 +207,6 @@ def url(self, url: Optional[XsUri]) -> None:
186207
# def properties(self, ...) -> None:
187208
# ... # TODO since CDX1.5
188209

189-
# @property
190-
# @serializable.json_name('bom-ref')
191-
# @serializable.type_mapping(BomRefHelper)
192-
# @serializable.view(SchemaVersion1Dot5)
193-
# @serializable.view(SchemaVersion1Dot6)
194-
# @serializable.xml_attribute()
195-
# @serializable.xml_name('bom-ref')
196-
# def bom_ref(self) -> BomRef:
197-
# ... # TODO since CDX1.5
198-
199210
@property
200211
@serializable.view(SchemaVersion1Dot6)
201212
@serializable.xml_attribute()
@@ -227,6 +238,7 @@ def __comparable_tuple(self) -> _ComparableTuple:
227238
self._id, self._name,
228239
self._url,
229240
self._text,
241+
self._bom_ref.value,
230242
))
231243

232244
def __eq__(self, other: object) -> bool:
@@ -264,11 +276,30 @@ class LicenseExpression:
264276

265277
def __init__(
266278
self, value: str, *,
279+
bom_ref: Optional[Union[str, BomRef]] = None,
267280
acknowledgement: Optional[LicenseAcknowledgement] = None,
268281
) -> None:
282+
self._bom_ref = _bom_ref_from_str(bom_ref)
269283
self._value = value
270284
self._acknowledgement = acknowledgement
271285

286+
@property
287+
@serializable.view(SchemaVersion1Dot5)
288+
@serializable.view(SchemaVersion1Dot6)
289+
@serializable.type_mapping(BomRef)
290+
@serializable.xml_attribute()
291+
@serializable.xml_name('bom-ref')
292+
@serializable.json_name('bom-ref')
293+
def bom_ref(self) -> BomRef:
294+
"""
295+
An optional identifier which can be used to reference the component elsewhere in the BOM. Every bom-ref MUST be
296+
unique within the BOM.
297+
298+
Returns:
299+
`BomRef`
300+
"""
301+
return self._bom_ref
302+
272303
@property
273304
@serializable.xml_name('.')
274305
@serializable.xml_string(serializable.XmlStringSerializationType.NORMALIZED_STRING)
@@ -286,16 +317,6 @@ def value(self) -> str:
286317
def value(self, value: str) -> None:
287318
self._value = value
288319

289-
# @property
290-
# @serializable.json_name('bom-ref')
291-
# @serializable.type_mapping(BomRefHelper)
292-
# @serializable.view(SchemaVersion1Dot5)
293-
# @serializable.view(SchemaVersion1Dot6)
294-
# @serializable.xml_attribute()
295-
# @serializable.xml_name('bom-ref')
296-
# def bom_ref(self) -> BomRef:
297-
# ... # TODO since CDX1.5
298-
299320
@property
300321
@serializable.view(SchemaVersion1Dot6)
301322
@serializable.xml_attribute()
@@ -325,6 +346,7 @@ def __comparable_tuple(self) -> _ComparableTuple:
325346
return _ComparableTuple((
326347
self._acknowledgement,
327348
self._value,
349+
self._bom_ref.value,
328350
))
329351

330352
def __hash__(self) -> int:

0 commit comments

Comments
 (0)