3333from . import AttachedText , XsUri
3434
3535
36+ @serializable .serializable_enum
37+ class LicenseAcknowledgement (str , Enum ):
38+ """
39+ This is our internal representation of the `type_licenseAcknowledgementEnumerationType` ENUM type
40+ within the CycloneDX standard.
41+
42+ .. note::
43+ Introduced in CycloneDX v1.6
44+
45+ .. note::
46+ See the CycloneDX Schema for hashType:
47+ https://cyclonedx.org/docs/1.6/#type_licenseAcknowledgementEnumerationType
48+ """
49+
50+ CONCLUDED = 'concluded'
51+ DECLARED = 'declared'
52+
53+
54+ # In an error, the name of the enum was `LicenseExpressionAcknowledgement`.
55+ # Even though this was changed, there might be some downstream usage of this symbol, so we keep it around ...
56+ LicenseExpressionAcknowledgement = LicenseAcknowledgement
57+ """Deprecated alias for :class:`LicenseAcknowledgement`"""
58+
59+
3660@serializable .serializable_class (name = 'license' )
3761class DisjunctiveLicense :
3862 """
@@ -43,8 +67,12 @@ class DisjunctiveLicense:
4367 See the CycloneDX Schema definition: https://cyclonedx.org/docs/1.4/json/#components_items_licenses
4468 """
4569
46- def __init__ (self , * , id : Optional [str ] = None , name : Optional [str ] = None ,
47- text : Optional [AttachedText ] = None , url : Optional [XsUri ] = None ) -> None :
70+ def __init__ (
71+ self , * ,
72+ id : Optional [str ] = None , name : Optional [str ] = None ,
73+ text : Optional [AttachedText ] = None , url : Optional [XsUri ] = None ,
74+ acknowledgement : Optional [LicenseAcknowledgement ] = None
75+ ) -> None :
4876 if not id and not name :
4977 raise MutuallyExclusivePropertiesException ('Either `id` or `name` MUST be supplied' )
5078 if id and name :
@@ -56,6 +84,7 @@ def __init__(self, *, id: Optional[str] = None, name: Optional[str] = None,
5684 self ._name = name if not id else None
5785 self ._text = text
5886 self ._url = url
87+ self ._acknowledgement = acknowledgement
5988
6089 @property
6190 @serializable .xml_sequence (1 )
@@ -129,14 +158,62 @@ def url(self, url: Optional[XsUri]) -> None:
129158 # @property
130159 # ...
131160 # @serializable.view(SchemaVersion1Dot5)
132- # @serializable.xml_sequence(4)
161+ # @serializable.view(SchemaVersion1Dot6)
162+ # @serializable.xml_sequence(5)
133163 # def licensing(self) -> ...:
134164 # ... # TODO since CDX1.5
135165 #
136166 # @licensing.setter
137167 # def licensing(self, ...) -> None:
138168 # ... # TODO since CDX1.5
139169
170+ # @property
171+ # ...
172+ # @serializable.view(SchemaVersion1Dot5)
173+ # @serializable.view(SchemaVersion1Dot6)
174+ # @serializable.xml_sequence(6)
175+ # def properties(self) -> ...:
176+ # ... # TODO since CDX1.5
177+ #
178+ # @licensing.setter
179+ # def properties(self, ...) -> None:
180+ # ... # TODO since CDX1.5
181+
182+ # @property
183+ # @serializable.json_name('bom-ref')
184+ # @serializable.type_mapping(BomRefHelper)
185+ # @serializable.view(SchemaVersion1Dot5)
186+ # @serializable.view(SchemaVersion1Dot6)
187+ # @serializable.xml_attribute()
188+ # @serializable.xml_name('bom-ref')
189+ # def bom_ref(self) -> BomRef:
190+ # ... # TODO since CDX1.5
191+
192+ @property
193+ @serializable .view (SchemaVersion1Dot6 )
194+ @serializable .xml_attribute ()
195+ def acknowledgement (self ) -> Optional [LicenseAcknowledgement ]:
196+ """
197+ Declared licenses and concluded licenses represent two different stages in the licensing process within
198+ software development.
199+
200+ Declared licenses refer to the initial intention of the software authors regarding the
201+ licensing terms under which their code is released. On the other hand, concluded licenses are the result of a
202+ comprehensive analysis of the project's codebase to identify and confirm the actual licenses of the components
203+ used, which may differ from the initially declared licenses. While declared licenses provide an upfront
204+ indication of the licensing intentions, concluded licenses offer a more thorough understanding of the actual
205+ licensing within a project, facilitating proper compliance and risk management. Observed licenses are defined
206+ in evidence.licenses. Observed licenses form the evidence necessary to substantiate a concluded license.
207+
208+ Returns:
209+ `LicenseAcknowledgement` or `None`
210+ """
211+ return self ._acknowledgement
212+
213+ @acknowledgement .setter
214+ def acknowledgement (self , acknowledgement : Optional [LicenseAcknowledgement ]) -> None :
215+ self ._acknowledgement = acknowledgement
216+
140217 def __eq__ (self , other : object ) -> bool :
141218 if isinstance (other , DisjunctiveLicense ):
142219 return hash (other ) == hash (self )
@@ -154,30 +231,12 @@ def __lt__(self, other: Any) -> bool:
154231 return NotImplemented
155232
156233 def __hash__ (self ) -> int :
157- return hash ((self ._id , self ._name , self ._text , self ._url ))
234+ return hash ((self ._id , self ._name , self ._text , self ._url , self . _acknowledgement ))
158235
159236 def __repr__ (self ) -> str :
160237 return f'<License id={ self ._id !r} , name={ self ._name !r} >'
161238
162239
163- @serializable .serializable_enum
164- class LicenseExpressionAcknowledgement (str , Enum ):
165- """
166- This is our internal representation of the `type_licenseAcknowledgementEnumerationType` ENUM type
167- within the CycloneDX standard.
168-
169- .. note::
170- Introduced in CycloneDX v1.6
171-
172- .. note::
173- See the CycloneDX Schema for hashType:
174- https://cyclonedx.org/docs/1.6/#type_licenseAcknowledgementEnumerationType
175- """
176-
177- CONCLUDED = 'concluded'
178- DECLARED = 'declared'
179-
180-
181240@serializable .serializable_class (name = 'expression' )
182241class LicenseExpression :
183242 """
@@ -189,15 +248,43 @@ class LicenseExpression:
189248 https://cyclonedx.org/docs/1.4/json/#components_items_licenses_items_expression
190249 """
191250
192- def __init__ (self , value : str ,
193- acknowledgement : Optional [LicenseExpressionAcknowledgement ] = None ) -> None :
251+ def __init__ (
252+ self , value : str ,
253+ acknowledgement : Optional [LicenseAcknowledgement ] = None
254+ ) -> None :
255+ self ._value = value
256+ self ._acknowledgement = acknowledgement
257+
258+ @property
259+ @serializable .xml_name ('.' )
260+ @serializable .json_name ('expression' )
261+ def value (self ) -> str :
262+ """
263+ Value of this LicenseExpression.
264+
265+ Returns:
266+ `str`
267+ """
268+ return self ._value
269+
270+ @value .setter
271+ def value (self , value : str ) -> None :
194272 self ._value = value
195- self .acknowledgement = acknowledgement
273+
274+ # @property
275+ # @serializable.json_name('bom-ref')
276+ # @serializable.type_mapping(BomRefHelper)
277+ # @serializable.view(SchemaVersion1Dot5)
278+ # @serializable.view(SchemaVersion1Dot6)
279+ # @serializable.xml_attribute()
280+ # @serializable.xml_name('bom-ref')
281+ # def bom_ref(self) -> BomRef:
282+ # ... # TODO since CDX1.5
196283
197284 @property
198285 @serializable .view (SchemaVersion1Dot6 )
199286 @serializable .xml_attribute ()
200- def acknowledgement (self ) -> Optional [LicenseExpressionAcknowledgement ]:
287+ def acknowledgement (self ) -> Optional [LicenseAcknowledgement ]:
201288 """
202289 Declared licenses and concluded licenses represent two different stages in the licensing process within
203290 software development.
@@ -211,36 +298,20 @@ def acknowledgement(self) -> Optional[LicenseExpressionAcknowledgement]:
211298 in evidence.licenses. Observed licenses form the evidence necessary to substantiate a concluded license.
212299
213300 Returns:
214- `LicenseExpressionAcknowledgement ` or `None`
301+ `LicenseAcknowledgement ` or `None`
215302 """
216303 return self ._acknowledgement
217304
218305 @acknowledgement .setter
219- def acknowledgement (self , acknowledgement : Optional [LicenseExpressionAcknowledgement ]) -> None :
306+ def acknowledgement (self , acknowledgement : Optional [LicenseAcknowledgement ]) -> None :
220307 self ._acknowledgement = acknowledgement
221308
222- @property
223- @serializable .xml_name ('.' )
224- @serializable .json_name ('expression' )
225- def value (self ) -> str :
226- """
227- Value of this LicenseExpression.
228-
229- Returns:
230- `str`
231- """
232- return self ._value
233-
234- @value .setter
235- def value (self , value : str ) -> None :
236- self ._value = value
237-
238309 def __hash__ (self ) -> int :
239- return hash (self ._value )
310+ return hash (( self ._value , self . _acknowledgement ) )
240311
241312 def __eq__ (self , other : object ) -> bool :
242313 if isinstance (other , LicenseExpression ):
243- return self . _value == other . _value
314+ return hash ( other ) == hash ( self )
244315 return False
245316
246317 def __lt__ (self , other : Any ) -> bool :
0 commit comments