11from json import loads as json_loads
22from typing import Any , Dict , Iterable , Iterator , List , Optional , Type , Union
3+ from warnings import warn
34from xml .etree .ElementTree import Element # nosec B405
45
56import serializable
@@ -141,7 +142,7 @@ def __repr__(self) -> str:
141142 return f'<Tool name={ self .name } , version={ self .version } , vendor={ self .vendor } >'
142143
143144
144- class ToolRepository :
145+ class ToolsRepository :
145146 """
146147 The repository of tool formats
147148
@@ -151,8 +152,18 @@ class ToolRepository:
151152 and `services` attributes (which are SortedSets of their respective types).
152153 """
153154
155+ tools : SortedSet [Tool ]
156+ """DEPRECATED tools"""
157+
158+ components : SortedSet [Component ]
159+ """An array of components used to creatd this SBOM"""
160+
161+ services : SortedSet [Service ]
162+ """An array of services used to create this SBOM"""
163+
154164 def __init__ (self , * , components : Optional [Iterable [Component ]] = None ,
155165 services : Optional [Iterable [Service ]] = None ,
166+ # Deprecated in v1.5
156167 tools : Optional [Iterable [Tool ]] = None ) -> None :
157168
158169 if tools and (components or services ):
@@ -162,9 +173,13 @@ def __init__(self, *, components: Optional[Iterable[Component]] = None,
162173 '(CycloneDX >= 1.5) format for tools.'
163174 )
164175
165- self ._components = SortedSet (components ) or SortedSet ()
166- self ._services = SortedSet (services ) or SortedSet ()
167- self ._tools = SortedSet (tools ) or SortedSet ()
176+ if tools :
177+ warn ('Using Tool is deprecated as of CycloneDX v1.5. Components and Services should be used now. '
178+ 'See https://cyclonedx.org/docs/1.5/' , DeprecationWarning )
179+
180+ self ._components = SortedSet (components or ())
181+ self ._services = SortedSet (services or ())
182+ self ._tools = SortedSet (tools or ())
168183
169184 def __len__ (self ) -> int :
170185 return len (self ._tools )
@@ -227,9 +242,9 @@ def __iter__(self) -> Iterator[Tool]:
227242 yield t
228243
229244
230- class ToolRepositoryHelper (BaseHelper ):
245+ class ToolsRepositoryHelper (BaseHelper ):
231246 @classmethod
232- def json_normalize (cls , o : ToolRepository , * ,
247+ def json_normalize (cls , o : ToolsRepository , * ,
233248 view : Optional [Type [ViewType ]],
234249 ** __ : Any ) -> Any :
235250 if not any ([o ._tools , o .components , o .services ]): # pylint: disable=protected-access
@@ -250,7 +265,7 @@ def json_normalize(cls, o: ToolRepository, *,
250265
251266 @classmethod
252267 def json_denormalize (cls , o : Union [List [Dict [str , Any ]], Dict [str , Any ]],
253- ** __ : Any ) -> ToolRepository :
268+ ** __ : Any ) -> ToolsRepository :
254269
255270 components = []
256271 services = []
@@ -271,10 +286,10 @@ def json_denormalize(cls, o: Union[List[Dict[str, Any]], Dict[str, Any]],
271286 else :
272287 raise CycloneDxDeserializationException ('unexpected: {o!r}' )
273288
274- return ToolRepository (components = components , services = services , tools = tools )
289+ return ToolsRepository (components = components , services = services , tools = tools )
275290
276291 @classmethod
277- def xml_normalize (cls , o : ToolRepository , * ,
292+ def xml_normalize (cls , o : ToolsRepository , * ,
278293 element_name : str ,
279294 view : Optional [Type [ViewType ]],
280295 xmlns : Optional [str ],
@@ -314,5 +329,5 @@ def xml_normalize(cls, o: ToolRepository, *,
314329 @classmethod
315330 def xml_denormalize (cls , o : Element ,
316331 default_ns : Optional [str ],
317- ** __ : Any ) -> ToolRepository :
318- return ToolRepository ()
332+ ** __ : Any ) -> ToolsRepository :
333+ return ToolsRepository ()
0 commit comments