Skip to content

Commit fde79e0

Browse files
committed
feat: support for non-PyPi Components - PackageURL type is now definable when creating a Component
Signed-off-by: Paul Horton <[email protected]>
1 parent a655d29 commit fde79e0

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

cyclonedx/model/component.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323

2424
from .vulnerability import Vulnerability
2525

26-
PURL_TYPE_PREFIX = 'pypi'
27-
2826

2927
class ComponentType(Enum):
3028
"""
@@ -51,6 +49,7 @@ class Component:
5149
See the CycloneDX Schema definition: https://cyclonedx.org/docs/1.3/#type_component
5250
"""
5351
_type: ComponentType
52+
_package_url_type: str
5453
_name: str
5554
_version: str
5655
_qualifiers: str
@@ -62,12 +61,13 @@ class Component:
6261
_vulnerabilites: List[Vulnerability] = []
6362

6463
def __init__(self, name: str, version: str, qualifiers: str = None,
65-
component_type: ComponentType = ComponentType.LIBRARY):
64+
component_type: ComponentType = ComponentType.LIBRARY, package_url_type: str = 'pypi'):
6665
self._name = name
6766
self._version = version
6867
self._type = component_type
6968
self._qualifiers = qualifiers
7069
self._vulnerabilites = []
70+
self._package_url_type = package_url_type
7171

7272
def add_vulnerability(self, vulnerability: Vulnerability):
7373
"""
@@ -125,7 +125,7 @@ def get_purl(self) -> str:
125125
Returns:
126126
PackageURL that reflects this Component as `str`.
127127
"""
128-
base_purl = 'pkg:{}/{}@{}'.format(PURL_TYPE_PREFIX, self._name, self._version)
128+
base_purl = 'pkg:{}/{}@{}'.format(self._package_url_type, self._name, self._version)
129129
if self._qualifiers:
130130
base_purl = '{}?{}'.format(base_purl, self._qualifiers)
131131
return base_purl
@@ -213,7 +213,7 @@ def to_package_url(self) -> PackageURL:
213213
`packageurl.PackageURL` instance which represents this Component.
214214
"""""
215215
return PackageURL(
216-
type=PURL_TYPE_PREFIX,
216+
type=self._package_url_type,
217217
name=self._name,
218218
version=self._version,
219219
qualifiers=self._qualifiers

tests/test_component.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ def setUpClass(cls) -> None:
3131
cls._component: Component = Component(name='setuptools', version='50.3.2')
3232
cls._component_with_qualifiers: Component = Component(name='setuptools', version='50.3.2',
3333
qualifiers='extension=tar.gz')
34+
cls._component_generic_file: Component = Component(
35+
name='/test.py', version='UNKNOWN', package_url_type='generic'
36+
)
3437

3538
def test_purl_correct(self):
3639
self.assertEqual(
@@ -95,3 +98,9 @@ def test_as_package_url_3(self):
9598
type='pypi', name='setuptools', version='50.3.2', qualifiers='extension=tar.gz'
9699
)
97100
self.assertEqual(TestComponent._component_with_qualifiers.to_package_url(), purl)
101+
102+
def test_custom_package_url_type(self):
103+
purl = PackageURL(
104+
type='generic', name='/test.py', version='UNKNOWN'
105+
)
106+
self.assertEqual(TestComponent._component_generic_file.to_package_url(), purl)

0 commit comments

Comments
 (0)