Skip to content

Commit f2ad0ed

Browse files
committed
feat: add cyclonedx.model.dependency.Dependency.provides
1 parent 5788bc1 commit f2ad0ed

File tree

1 file changed

+36
-6
lines changed

1 file changed

+36
-6
lines changed

cyclonedx/model/dependency.py

+36-6
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,20 @@ class Dependency:
5353
Models a Dependency within a BOM.
5454
5555
.. note::
56-
See https://cyclonedx.org/docs/1.4/xml/#type_dependencyType
56+
See:
57+
1. https://cyclonedx.org/docs/1.6/xml/#type_dependencyType
58+
2. https://cyclonedx.org/docs/1.6/json/#dependencies
5759
"""
5860

59-
def __init__(self, ref: BomRef, dependencies: Optional[Iterable['Dependency']] = None) -> None:
61+
def __init__(
62+
self,
63+
ref: BomRef,
64+
dependencies: Optional[Iterable['Dependency']] = None,
65+
provides: Optional[Iterable['Dependency']] = None
66+
) -> None:
6067
self.ref = ref
6168
self.dependencies = dependencies or [] # type:ignore[assignment]
69+
self.provides = provides or [] # type:ignore[assignment]
6270

6371
@property
6472
@serializable.type_mapping(BomRefHelper)
@@ -81,9 +89,23 @@ def dependencies(self) -> 'SortedSet[Dependency]':
8189
def dependencies(self, dependencies: Iterable['Dependency']) -> None:
8290
self._dependencies = SortedSet(dependencies)
8391

92+
@property
93+
@serializable.json_name('provides')
94+
@serializable.type_mapping(_DependencyRepositorySerializationHelper)
95+
@serializable.xml_array(serializable.XmlArraySerializationType.FLAT, 'provides')
96+
def provides(self) -> 'SortedSet[Dependency]':
97+
return self._provides
98+
99+
@provides.setter
100+
def provides(self, provides: Iterable['Dependency']) -> None:
101+
self._provides = SortedSet(provides)
102+
84103
def dependencies_as_bom_refs(self) -> Set[BomRef]:
85104
return set(map(lambda d: d.ref, self.dependencies))
86105

106+
def provides_as_bom_refs(self) -> Set[BomRef]:
107+
return set(map(lambda d: d.ref, self.provides))
108+
87109
def __eq__(self, other: object) -> bool:
88110
if isinstance(other, Dependency):
89111
return hash(other) == hash(self)
@@ -92,17 +114,25 @@ def __eq__(self, other: object) -> bool:
92114
def __lt__(self, other: Any) -> bool:
93115
if isinstance(other, Dependency):
94116
return _ComparableTuple((
95-
self.ref, _ComparableTuple(self.dependencies)
117+
self.ref,
118+
_ComparableTuple(self.dependencies),
119+
_ComparableTuple(self.provides)
96120
)) < _ComparableTuple((
97-
other.ref, _ComparableTuple(other.dependencies)
121+
other.ref,
122+
_ComparableTuple(other.dependencies),
123+
_ComparableTuple(other.provides)
98124
))
99125
return NotImplemented
100126

101127
def __hash__(self) -> int:
102-
return hash((self.ref, tuple(self.dependencies)))
128+
return hash((self.ref, tuple(self.dependencies), tuple(self.provides)))
103129

104130
def __repr__(self) -> str:
105-
return f'<Dependency ref={self.ref!r}, targets={len(self.dependencies)}>'
131+
return (
132+
f'<Dependency ref={self.ref!r}'
133+
f', targets={len(self.dependencies)}'
134+
f', provides={len(self.provides)}>'
135+
)
106136

107137

108138
class Dependable(ABC):

0 commit comments

Comments
 (0)