Skip to content

Commit 06037b9

Browse files
authored
Merge pull request #310 from gruebel/fix-method-type-hint
fix: type hint for `get_component_by_purl` is incorrect
2 parents 6c0c174 + 4c8a3ab commit 06037b9

File tree

3 files changed

+31
-14
lines changed

3 files changed

+31
-14
lines changed

cyclonedx/model/bom.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
# Copyright (c) OWASP Foundation. All Rights Reserved.
1919
import warnings
2020
from datetime import datetime, timezone
21-
from typing import Iterable, Optional, Set
21+
from typing import TYPE_CHECKING, Iterable, Optional, Set
2222
from uuid import UUID, uuid4
2323

2424
from sortedcontainers import SortedSet
@@ -29,6 +29,9 @@
2929
from .component import Component
3030
from .service import Service
3131

32+
if TYPE_CHECKING:
33+
from packageurl import PackageURL # type:ignore[import]
34+
3235

3336
class BomMetaData:
3437
"""
@@ -288,19 +291,19 @@ def components(self) -> "SortedSet[Component]":
288291
def components(self, components: Iterable[Component]) -> None:
289292
self._components = SortedSet(components)
290293

291-
def get_component_by_purl(self, purl: Optional[str]) -> Optional[Component]:
294+
def get_component_by_purl(self, purl: Optional["PackageURL"]) -> Optional[Component]:
292295
"""
293296
Get a Component already in the Bom by its PURL
294297
295298
Args:
296299
purl:
297-
Package URL as a `str` to look and find `Component`
300+
An instance of `packageurl.PackageURL` to look and find `Component`.
298301
299302
Returns:
300303
`Component` or `None`
301304
"""
302305
if purl:
303-
found = list(filter(lambda x: x.purl == purl, self.components))
306+
found = [x for x in self.components if x.purl == purl]
304307
if len(found) == 1:
305308
return found[0]
306309

tests/test_component.py

+1-9
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@
2424
from packageurl import PackageURL # type: ignore
2525

2626
from cyclonedx.model import sha1sum
27-
from cyclonedx.model.bom import Bom
2827
from cyclonedx.model.component import Component
29-
from data import get_component_setuptools_simple, get_component_setuptools_simple_no_version
28+
from data import get_component_setuptools_simple
3029

3130
FIXTURES_DIRECTORY = 'fixtures/xml/1.4'
3231

@@ -78,10 +77,3 @@ def test_from_file_with_path_for_bom(self) -> None:
7877
)
7978
self.assertEqual(c.purl, purl)
8079
self.assertEqual(len(c.hashes), 1)
81-
82-
def test_has_component_1(self) -> None:
83-
bom = Bom()
84-
bom.components.update([get_component_setuptools_simple(), get_component_setuptools_simple_no_version()])
85-
self.assertEqual(len(bom.components), 2)
86-
self.assertTrue(bom.has_component(component=get_component_setuptools_simple_no_version()))
87-
self.assertIsNot(get_component_setuptools_simple(), get_component_setuptools_simple_no_version())

tests/test_model_bom.py

+23-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@
2222
from cyclonedx.model import License, LicenseChoice, OrganizationalContact, OrganizationalEntity, Property
2323
from cyclonedx.model.bom import Bom, BomMetaData, ThisTool, Tool
2424
from cyclonedx.model.component import Component, ComponentType
25-
from data import get_bom_for_issue_275_components, get_bom_with_component_setuptools_with_vulnerability
25+
from data import (
26+
get_bom_for_issue_275_components,
27+
get_bom_with_component_setuptools_with_vulnerability,
28+
get_component_setuptools_simple,
29+
get_component_setuptools_simple_no_version,
30+
)
2631

2732

2833
class TestBomMetaData(TestCase):
@@ -127,3 +132,20 @@ def test_bom_nested_components_issue_275(self) -> None:
127132
# self.assertIsInstance(bom.metadata.component, Component)
128133
# self.assertEqual(2, len(bom.services))
129134
# bom.validate()
135+
136+
def test_has_component_1(self) -> None:
137+
bom = Bom()
138+
bom.components.update([get_component_setuptools_simple(), get_component_setuptools_simple_no_version()])
139+
self.assertEqual(len(bom.components), 2)
140+
self.assertTrue(bom.has_component(component=get_component_setuptools_simple_no_version()))
141+
self.assertIsNot(get_component_setuptools_simple(), get_component_setuptools_simple_no_version())
142+
143+
def test_get_component_by_purl(self) -> None:
144+
bom = Bom()
145+
setuptools_simple = get_component_setuptools_simple()
146+
bom.components.add(setuptools_simple)
147+
148+
result = bom.get_component_by_purl(get_component_setuptools_simple().purl)
149+
150+
self.assertIs(result, setuptools_simple)
151+
self.assertIsNone(bom.get_component_by_purl(get_component_setuptools_simple_no_version().purl))

0 commit comments

Comments
 (0)