@@ -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
108138class Dependable (ABC ):
0 commit comments