Skip to content

Commit 51a4198

Browse files
committed
further testing and unit tests for JSON BOM deserialization
Signed-off-by: Paul Horton <[email protected]>
1 parent 418bf56 commit 51a4198

17 files changed

+136
-46
lines changed

cyclonedx/model/bom.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,13 +520,15 @@ def register_dependency(self, target: Dependable, depends_on: Optional[Iterable[
520520
_d = next(filter(lambda _d: _d.ref == target.bom_ref, self.dependencies), None)
521521

522522
if _d and depends_on:
523+
# Dependency Target already registered - but it might have new dependencies to add
523524
_d.dependencies = _d.dependencies.union( # type: ignore
524525
set(map(lambda _d: Dependency(ref=_d.bom_ref), depends_on)) if depends_on else []
525526
)
526527
elif not _d:
528+
# First time we are seeing this target as a Dependency
527529
self._dependencies.add(Dependency(
528530
ref=target.bom_ref,
529-
dependencies=list(map(lambda _d: Dependency(ref=_d.bom_ref), depends_on)) if depends_on else []
531+
dependencies=list(map(lambda _dep: Dependency(ref=_dep.bom_ref), depends_on)) if depends_on else []
530532
))
531533

532534
# Ensure dependents are registered with no further dependents in the Dependency Graph as per CDX specification

cyclonedx/model/component.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import warnings
2121
from enum import Enum
2222
from os.path import exists
23-
from typing import Any, Iterable, Optional, Set
23+
from typing import Any, Iterable, Optional, Set, Union
2424

2525
# See https://github.com/package-url/packageurl-python/issues/65
2626
import serializable
@@ -751,7 +751,7 @@ def for_file(absolute_file_path: str, path_for_bom: Optional[str]) -> 'Component
751751
)
752752

753753
def __init__(self, *, name: str, type_: ComponentType = ComponentType.LIBRARY,
754-
mime_type: Optional[str] = None, bom_ref: Optional[str] = None,
754+
mime_type: Optional[str] = None, bom_ref: Optional[Union[str, BomRef]] = None,
755755
supplier: Optional[OrganizationalEntity] = None, author: Optional[str] = None,
756756
publisher: Optional[str] = None, group: Optional[str] = None, version: Optional[str] = None,
757757
description: Optional[str] = None, scope: Optional[ComponentScope] = None,
@@ -767,7 +767,7 @@ def __init__(self, *, name: str, type_: ComponentType = ComponentType.LIBRARY,
767767
) -> None:
768768
self.type_ = type_
769769
self.mime_type = mime_type
770-
self._bom_ref = BomRef(value=bom_ref)
770+
self._bom_ref = BomRef(value=bom_ref) if type(bom_ref) == str else bom_ref
771771
self.supplier = supplier
772772
self.author = author
773773
self.publisher = publisher

cyclonedx/model/dependency.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def __hash__(self) -> int:
8080
return hash((self.ref, tuple(self.dependencies)))
8181

8282
def __repr__(self) -> str:
83-
return f'<Dependency ref={self.ref.value}, targets={len(self.dependencies)}>'
83+
return f'<Dependency ref={self.ref}, targets={len(self.dependencies)}>'
8484

8585

8686
class Dependable(ABC):

cyclonedx/model/service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# SPDX-License-Identifier: Apache-2.0
1616
# Copyright (c) OWASP Foundation. All Rights Reserved.
1717

18-
from typing import Any, Iterable, Optional
18+
from typing import Any, Iterable, Optional, Union
1919

2020
import serializable
2121
from sortedcontainers import SortedSet
@@ -53,7 +53,7 @@ class Service(Dependable):
5353
See the CycloneDX schema: https://cyclonedx.org/docs/1.4/xml/#type_service
5454
"""
5555

56-
def __init__(self, *, name: str, bom_ref: Optional[str] = None, provider: Optional[OrganizationalEntity] = None,
56+
def __init__(self, *, name: str, bom_ref: Optional[Union[str, BomRef]] = None, provider: Optional[OrganizationalEntity] = None,
5757
group: Optional[str] = None, version: Optional[str] = None, description: Optional[str] = None,
5858
endpoints: Optional[Iterable[XsUri]] = None, authenticated: Optional[bool] = None,
5959
x_trust_boundary: Optional[bool] = None, data: Optional[Iterable[DataClassification]] = None,
@@ -63,7 +63,7 @@ def __init__(self, *, name: str, bom_ref: Optional[str] = None, provider: Option
6363
services: Optional[Iterable['Service']] = None,
6464
release_notes: Optional[ReleaseNotes] = None,
6565
) -> None:
66-
self._bom_ref = BomRef(value=bom_ref)
66+
self._bom_ref = BomRef(value=bom_ref) if type(bom_ref) == str else bom_ref
6767
self.provider = provider
6868
self.group = group
6969
self.name = name

cyclonedx/model/vulnerability.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ class Vulnerability:
821821
See the CycloneDX schema: https://cyclonedx.org/docs/1.4/#type_vulnerabilityType
822822
"""
823823

824-
def __init__(self, *, bom_ref: Optional[str] = None, id_: Optional[str] = None,
824+
def __init__(self, *, bom_ref: Optional[Union[str, BomRef]] = None, id_: Optional[str] = None,
825825
source: Optional[VulnerabilitySource] = None,
826826
references: Optional[Iterable[VulnerabilityReference]] = None,
827827
ratings: Optional[Iterable[VulnerabilityRating]] = None, cwes: Optional[Iterable[int]] = None,
@@ -835,7 +835,7 @@ def __init__(self, *, bom_ref: Optional[str] = None, id_: Optional[str] = None,
835835
# Deprecated Parameters kept for backwards compatibility
836836
source_name: Optional[str] = None, source_url: Optional[str] = None,
837837
recommendations: Optional[Iterable[str]] = None) -> None:
838-
self._bom_ref = BomRef(value=bom_ref)
838+
self._bom_ref = BomRef(value=bom_ref) if type(bom_ref) == str else bom_ref
839839
self.id_ = id_
840840
self.source = source
841841
self.references = references or [] # type: ignore

tests/fixtures/json/1.2/bom_external_references.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
"$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
33
"bomFormat": "CycloneDX",
44
"specVersion": "1.2",
5-
"serialNumber": "urn:uuid:b254c902-deb4-4298-9969-027541ee365c",
5+
"serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
66
"version": 1,
77
"metadata": {
8-
"timestamp": "2023-01-07T13:45:57.467119+00:00",
8+
"timestamp": "2023-01-07T13:44:32.312678+00:00",
99
"tools": [
1010
{
1111
"vendor": "CycloneDX",

tests/fixtures/json/1.2/bom_setuptools.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
"$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
33
"bomFormat": "CycloneDX",
44
"specVersion": "1.2",
5-
"serialNumber": "urn:uuid:21a3711c-be49-4007-b4df-c90af6eb8725",
5+
"serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
66
"version": 1,
77
"metadata": {
8-
"timestamp": "2023-01-07T13:45:59.330881+00:00",
8+
"timestamp": "2023-01-07T13:44:32.312678+00:00",
99
"tools": [
1010
{
1111
"vendor": "CycloneDX",

tests/fixtures/json/1.2/bom_setuptools_with_cpe.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
"$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
33
"bomFormat": "CycloneDX",
44
"specVersion": "1.2",
5-
"serialNumber": "urn:uuid:65baf289-d8ad-4128-800d-b5292c938c3a",
5+
"serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
66
"version": 1,
77
"metadata": {
8-
"timestamp": "2023-01-07T13:45:59.351895+00:00",
8+
"timestamp": "2023-01-07T13:44:32.312678+00:00",
99
"tools": [
1010
{
1111
"vendor": "CycloneDX",

tests/fixtures/json/1.3/bom_external_references.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
"$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
33
"bomFormat": "CycloneDX",
44
"specVersion": "1.3",
5-
"serialNumber": "urn:uuid:00236b4e-8837-423e-8789-734863b0f78a",
5+
"serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
66
"version": 1,
77
"metadata": {
8-
"timestamp": "2023-01-07T13:45:57.491496+00:00",
8+
"timestamp": "2023-01-07T13:44:32.312678+00:00",
99
"tools": [
1010
{
1111
"vendor": "CycloneDX",

tests/fixtures/json/1.3/bom_setuptools.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
"$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
33
"bomFormat": "CycloneDX",
44
"specVersion": "1.3",
5-
"serialNumber": "urn:uuid:8d1060a2-afd0-4540-b145-9d936fe333e6",
5+
"serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
66
"version": 1,
77
"metadata": {
8-
"timestamp": "2023-01-07T13:45:59.372749+00:00",
8+
"timestamp": "2023-01-07T13:44:32.312678+00:00",
99
"tools": [
1010
{
1111
"vendor": "CycloneDX",

0 commit comments

Comments
 (0)