Skip to content

Commit

Permalink
impov
Browse files Browse the repository at this point in the history
Signed-off-by: Jan Kowalleck <[email protected]>
  • Loading branch information
jkowalleck committed Jan 15, 2025
1 parent 604e278 commit 62ad85c
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 67 deletions.
90 changes: 57 additions & 33 deletions cyclonedx/model/definition.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import serializable
from sortedcontainers import SortedSet

from .._internal.bom_ref import bom_ref_from_str
from .._internal.bom_ref import bom_ref_from_str as _bom_ref_from_str
from .._internal.compare import ComparableTuple as _ComparableTuple
from ..exception.model import InvalidCreIdException
from ..exception.serialization import SerializationOfUnexpectedValueException
Expand Down Expand Up @@ -69,7 +69,7 @@ def deserialize(cls, o: Any) -> 'CreId':

def __eq__(self, other: Any) -> bool:
if isinstance(other, CreId):
return hash(other) == hash(self)
return self._id == other._id
return False

def __lt__(self, other: Any) -> bool:
Expand Down Expand Up @@ -105,20 +105,28 @@ def __init__(
properties: Optional[Iterable[Property]] = None,
external_references: Optional[Iterable[ExternalReference]] = None,
) -> None:
self._bom_ref = bom_ref_from_str(bom_ref)
self._bom_ref = _bom_ref_from_str(bom_ref)
self.identifier = identifier
self.title = title
self.text = text
self.descriptions = descriptions or [] # type:ignore[assignment]
self.open_cre = open_cre or [] # type:ignore[assignment]
self.parent = bom_ref_from_str(parent)
self.properties = properties or [] # type:ignore[assignment]
self.external_references = external_references or [] # type:ignore[assignment]
self.descriptions = descriptions or () # type:ignore[assignment]
self.open_cre = open_cre or () # type:ignore[assignment]
self.parent = parent
self.properties = properties or () # type:ignore[assignment]
self.external_references = external_references or () # type:ignore[assignment]

def __lt__(self, other: Any) -> bool:
if isinstance(other, Requirement):
return (_ComparableTuple((self.bom_ref, self.identifier))
< _ComparableTuple((other.bom_ref, other.title)))
# all properties are optional - so need to compare all, in hope that one is unique
return _ComparableTuple((
self.bom_ref, self.identifier, self.title, self.text, _ComparableTuple(self.descriptions),
_ComparableTuple(self.open_cre), self.parent, _ComparableTuple(self.properties),
_ComparableTuple(self.external_references)
)) < _ComparableTuple((
other.bom_ref, other.identifier, other.title, other.text, _ComparableTuple(other.descriptions),
_ComparableTuple(other.open_cre), other.parent, _ComparableTuple(other.properties),
_ComparableTuple(other.external_references)
))
return NotImplemented

def __eq__(self, other: object) -> bool:
Expand All @@ -127,14 +135,15 @@ def __eq__(self, other: object) -> bool:
return False

def __hash__(self) -> int:
# all properties are optional - so need to apply all, in hope that one is unique
return hash((
self.bom_ref, self.identifier, self.title, self.text, tuple(self.descriptions),
tuple(self.open_cre), self.parent, tuple(self.properties), tuple(self.external_references)
))

def __repr__(self) -> str:
return f'<Requirement bom-ref={self.bom_ref}, identifier={self.identifier}, title={self.title}, ' \
f'text={self.text}, parent={self.parent}>'
return f'<Requirement bom-ref={self._bom_ref}, identifier={self._identifier}, title={self._title}, ' \
f'text={self._text}, parent={self._parent}>'

@property
@serializable.json_name('bom-ref')
Expand Down Expand Up @@ -237,7 +246,7 @@ def parent(self) -> Optional[BomRef]:

@parent.setter
def parent(self, parent: Optional[Union[str, BomRef]]) -> None:
self._parent = bom_ref_from_str(parent)
self._parent = _bom_ref_from_str(parent)

@property
@serializable.xml_array(serializable.XmlArraySerializationType.NESTED, 'property')
Expand Down Expand Up @@ -288,16 +297,20 @@ def __init__(
description: Optional[str] = None,
requirements: Optional[Iterable[Union[str, BomRef]]] = None,
) -> None:
self._bom_ref = bom_ref_from_str(bom_ref)
self._bom_ref = _bom_ref_from_str(bom_ref)
self.identifier = identifier
self.title = title
self.description = description
self.requirements = requirements or [] # type:ignore[assignment]
self.requirements = requirements or () # type:ignore[assignment]

def __lt__(self, other: Any) -> bool:
if isinstance(other, Level):
return (_ComparableTuple((self.bom_ref, self.identifier))
< _ComparableTuple((other.bom_ref, other.identifier)))
# all properties are optional - so need to compare all, in hope that one is unique
return _ComparableTuple((
self.bom_ref, self.identifier, self.title, self.description, _ComparableTuple(self.requirements)
)) < _ComparableTuple((
other.bom_ref, other.identifier, other.title, other.description, _ComparableTuple(other.requirements)
))
return NotImplemented

def __eq__(self, other: object) -> bool:
Expand All @@ -306,6 +319,7 @@ def __eq__(self, other: object) -> bool:
return False

def __hash__(self) -> int:
# all properties are optional - so need to compare all, in hope that one is unique
return hash((
self.bom_ref, self.identifier, self.title, self.description, tuple(self.requirements)
))
Expand Down Expand Up @@ -380,7 +394,7 @@ def requirements(self) -> 'SortedSet[BomRef]':

@requirements.setter
def requirements(self, requirements: Iterable[Union[str, BomRef]]) -> None:
self._requirements = SortedSet(map(lambda x: bom_ref_from_str(x), requirements))
self._requirements = SortedSet(map(_bom_ref_from_str, requirements))


@serializable.serializable_class
Expand All @@ -401,19 +415,27 @@ def __init__(
levels: Optional[Iterable[Level]] = None,
external_references: Optional[Iterable['ExternalReference']] = None
) -> None:
self._bom_ref = bom_ref_from_str(bom_ref)
self._bom_ref = _bom_ref_from_str(bom_ref)
self.name = name
self.version = version
self.description = description
self.owner = owner
self.requirements = requirements or [] # type:ignore[assignment]
self.levels = levels or [] # type:ignore[assignment]
self.external_references = external_references or [] # type:ignore[assignment]
self.requirements = requirements or () # type:ignore[assignment]
self.levels = levels or () # type:ignore[assignment]
self.external_references = external_references or () # type:ignore[assignment]

def __lt__(self, other: Any) -> bool:
if isinstance(other, Standard):
return (_ComparableTuple((self.bom_ref, self.name, self.version))
< _ComparableTuple((other.bom_ref, other.name, other.version)))
# all properties are optional - so need to apply all, in hope that one is unique
return _ComparableTuple((
self.bom_ref, self.name, self.version, self.description, self.owner,
_ComparableTuple(self.requirements), _ComparableTuple(self.levels),
_ComparableTuple(self.external_references)
)) < _ComparableTuple((
self.bom_ref, self.name, self.version, self.description, self.owner,
_ComparableTuple(self.requirements), _ComparableTuple(self.levels),
_ComparableTuple(self.external_references)
))
return NotImplemented

def __eq__(self, other: object) -> bool:
Expand All @@ -422,8 +444,10 @@ def __eq__(self, other: object) -> bool:
return False

def __hash__(self) -> int:
# all properties are optional - so need to apply all, in hope that one is unique
return hash((
self.bom_ref, self.name, self.version, self.description, self.owner, tuple(self.external_references)
self.bom_ref, self.name, self.version, self.description, self.owner,
tuple(self.requirements), tuple(self.levels), tuple(self.external_references)
))

def __repr__(self) -> str:
Expand Down Expand Up @@ -570,19 +594,19 @@ def __bool__(self) -> bool:
return len(self._standards) > 0

def __eq__(self, other: object) -> bool:
if not isinstance(other, Definitions):
return False

return self._standards == other._standards
if isinstance(other, Definitions):
return hash(self) == hash(other)
return False

def __hash__(self) -> int:
return hash((tuple(self._standards)))
# all properties are optional - so need to apply all, in hope that one is unique
return hash(tuple(self._standards))

def __lt__(self, other: Any) -> bool:
if isinstance(other, Definitions):
return (_ComparableTuple(self._standards)
< _ComparableTuple(other.standards))
# all properties are optional - so need to apply all, in hope that one is unique
return _ComparableTuple(self._standards) < _ComparableTuple(other._standards)
return NotImplemented

def __repr__(self) -> str:
return '<Definitions>'
return f'<Definitions hash={hash(self)}>'
Original file line number Diff line number Diff line change
Expand Up @@ -9,40 +9,6 @@
</properties>
<definitions>
<standards>
<standard bom-ref="other-standard">
<name>Other Standard</name>
<version>1.0.0</version>
<description>Other description</description>
<owner>Other Owner</owner>
<requirements>
<requirement bom-ref="req-3">
<identifier>REQ-3</identifier>
<title>Requirement 3</title>
<text>some requirement text</text>
<descriptions>
<description>Requirement 3 described here</description>
<description>and here</description>
</descriptions>
<openCre>CRE:5-6</openCre>
<openCre>CRE:7-8</openCre>
<properties>
<property name="key3">val3</property>
</properties>
</requirement>
</requirements>
<levels>
<level bom-ref="lvl-3">
<identifier>LVL-3</identifier>
<title>Level 3</title>
<description>Level 3 description</description>
</level>
</levels>
<externalReferences>
<reference type="website">
<url>https://cyclonedx.org</url>
</reference>
</externalReferences>
</standard>
<standard bom-ref="some-standard">
<name>Some Standard</name>
<version>1.2.3</version>
Expand Down Expand Up @@ -99,6 +65,40 @@
</reference>
</externalReferences>
</standard>
<standard bom-ref="other-standard">
<name>Other Standard</name>
<version>1.0.0</version>
<description>Other description</description>
<owner>Other Owner</owner>
<requirements>
<requirement bom-ref="req-3">
<identifier>REQ-3</identifier>
<title>Requirement 3</title>
<text>some requirement text</text>
<descriptions>
<description>Requirement 3 described here</description>
<description>and here</description>
</descriptions>
<openCre>CRE:5-6</openCre>
<openCre>CRE:7-8</openCre>
<properties>
<property name="key3">val3</property>
</properties>
</requirement>
</requirements>
<levels>
<level bom-ref="lvl-3">
<identifier>LVL-3</identifier>
<title>Level 3</title>
<description>Level 3 description</description>
</level>
</levels>
<externalReferences>
<reference type="website">
<url>https://cyclonedx.org</url>
</reference>
</externalReferences>
</standard>
</standards>
</definitions>
</bom>

0 comments on commit 62ad85c

Please sign in to comment.