spdx_tools.spdx3.model.relationship

  1# SPDX-FileCopyrightText: 2023 spdx contributors
  2#
  3# SPDX-License-Identifier: Apache-2.0
  4from dataclasses import field
  5from datetime import datetime
  6from enum import Enum, auto
  7
  8from beartype.typing import List, Optional
  9
 10from spdx_tools.common.typing.dataclass_with_properties import dataclass_with_properties
 11from spdx_tools.common.typing.type_checks import check_types_and_set_values
 12from spdx_tools.spdx3.model import CreationInfo, Element, ExternalIdentifier, ExternalReference, IntegrityMethod
 13
 14
 15class RelationshipType(Enum):
 16    AFFECTS = auto()
 17    AMENDS = auto()
 18    ANCESTOR = auto()
 19    AVAILABLE_FROM = auto()
 20    BUILD_DEPENDENCY = auto()
 21    BUILD_TOOL = auto()
 22    COORDINATED_BY = auto()
 23    CONTAINS = auto()
 24    CONFIG_OF = auto()
 25    COPY = auto()
 26    DATA_FILE = auto()
 27    DEPENDENCY_MANIFEST = auto()
 28    DEPENDS_ON = auto()
 29    DESCENDANT = auto()
 30    DESCRIBES = auto()
 31    DEV_DEPENDENCY = auto()
 32    DEV_TOOL = auto()
 33    DISTRIBUTION_ARTIFACT = auto()
 34    DOCUMENTATION = auto()
 35    DOES_NOT_AFFECT = auto()
 36    DYNAMIC_LINK = auto()
 37    EXAMPLE = auto()
 38    EVIDENCE_FOR = auto()
 39    EXPANDED_FROM_ARCHIVE = auto()
 40    EXPLOIT_CREATED_BY = auto()
 41    FILE_ADDED = auto()
 42    FILE_DELETED = auto()
 43    FILE_MODIFIED = auto()
 44    FIXED_BY = auto()
 45    FIXED_IN = auto()
 46    FOUND_BY = auto()
 47    GENERATES = auto()
 48    HAS_ASSESSMENT_FOR = auto()
 49    HAS_ASSOCIATED_VULNERABILITY = auto()
 50    HOST_OF = auto()
 51    INPUT_OF = auto()
 52    INVOKED_BY = auto()
 53    METAFILE = auto()
 54    ON_BEHALF_OF = auto()
 55    OPTIONAL_COMPONENT = auto()
 56    OPTIONAL_DEPENDENCY = auto()
 57    OTHER = auto()
 58    OUTPUT_OF = auto()
 59    PACKAGES = auto()
 60    PATCH = auto()
 61    PREREQUISITE = auto()
 62    PROVIDED_DEPENDENCY = auto()
 63    PUBLISHED_BY = auto()
 64    REPORTED_BY = auto()
 65    REPUBLISHED_BY = auto()
 66    REQUIREMENT_FOR = auto()
 67    RUNTIME_DEPENDENCY = auto()
 68    SPECIFICATION_FOR = auto()
 69    STATIC_LINK = auto()
 70    TEST = auto()
 71    TEST_CASE = auto()
 72    TEST_DEPENDENCY = auto()
 73    TEST_TOOL = auto()
 74    TESTED_ON = auto()
 75    TRAINED_ON = auto()
 76    UNDER_INVESTIGATION_FOR = auto()
 77    VARIANT = auto()
 78
 79
 80class RelationshipCompleteness(Enum):
 81    INCOMPLETE = auto()
 82    COMPLETE = auto()
 83    NOASSERTION = auto()
 84
 85
 86@dataclass_with_properties
 87class Relationship(Element):
 88    # due to the inheritance we need to make all fields non-default in the __annotation__,
 89    # the __init__ method still raises an error if required fields are not set
 90    from_element: str = None
 91    to: List[str] = field(default_factory=list)
 92    relationship_type: RelationshipType = None
 93    completeness: Optional[RelationshipCompleteness] = None
 94    start_time: Optional[datetime] = None
 95    end_time: Optional[datetime] = None
 96
 97    def __init__(
 98        self,
 99        spdx_id: str,
100        from_element: str,
101        relationship_type: RelationshipType,
102        to: List[str] = None,
103        creation_info: Optional[CreationInfo] = None,
104        name: Optional[str] = None,
105        summary: Optional[str] = None,
106        description: Optional[str] = None,
107        comment: Optional[str] = None,
108        verified_using: List[IntegrityMethod] = None,
109        external_reference: List[ExternalReference] = None,
110        external_identifier: List[ExternalIdentifier] = None,
111        extension: Optional[str] = None,
112        completeness: Optional[RelationshipCompleteness] = None,
113        start_time: Optional[datetime] = None,
114        end_time: Optional[datetime] = None,
115    ):
116        to = [] if to is None else to
117        verified_using = [] if verified_using is None else verified_using
118        external_reference = [] if external_reference is None else external_reference
119        external_identifier = [] if external_identifier is None else external_identifier
120        check_types_and_set_values(self, locals())
class RelationshipType(enum.Enum):
16class RelationshipType(Enum):
17    AFFECTS = auto()
18    AMENDS = auto()
19    ANCESTOR = auto()
20    AVAILABLE_FROM = auto()
21    BUILD_DEPENDENCY = auto()
22    BUILD_TOOL = auto()
23    COORDINATED_BY = auto()
24    CONTAINS = auto()
25    CONFIG_OF = auto()
26    COPY = auto()
27    DATA_FILE = auto()
28    DEPENDENCY_MANIFEST = auto()
29    DEPENDS_ON = auto()
30    DESCENDANT = auto()
31    DESCRIBES = auto()
32    DEV_DEPENDENCY = auto()
33    DEV_TOOL = auto()
34    DISTRIBUTION_ARTIFACT = auto()
35    DOCUMENTATION = auto()
36    DOES_NOT_AFFECT = auto()
37    DYNAMIC_LINK = auto()
38    EXAMPLE = auto()
39    EVIDENCE_FOR = auto()
40    EXPANDED_FROM_ARCHIVE = auto()
41    EXPLOIT_CREATED_BY = auto()
42    FILE_ADDED = auto()
43    FILE_DELETED = auto()
44    FILE_MODIFIED = auto()
45    FIXED_BY = auto()
46    FIXED_IN = auto()
47    FOUND_BY = auto()
48    GENERATES = auto()
49    HAS_ASSESSMENT_FOR = auto()
50    HAS_ASSOCIATED_VULNERABILITY = auto()
51    HOST_OF = auto()
52    INPUT_OF = auto()
53    INVOKED_BY = auto()
54    METAFILE = auto()
55    ON_BEHALF_OF = auto()
56    OPTIONAL_COMPONENT = auto()
57    OPTIONAL_DEPENDENCY = auto()
58    OTHER = auto()
59    OUTPUT_OF = auto()
60    PACKAGES = auto()
61    PATCH = auto()
62    PREREQUISITE = auto()
63    PROVIDED_DEPENDENCY = auto()
64    PUBLISHED_BY = auto()
65    REPORTED_BY = auto()
66    REPUBLISHED_BY = auto()
67    REQUIREMENT_FOR = auto()
68    RUNTIME_DEPENDENCY = auto()
69    SPECIFICATION_FOR = auto()
70    STATIC_LINK = auto()
71    TEST = auto()
72    TEST_CASE = auto()
73    TEST_DEPENDENCY = auto()
74    TEST_TOOL = auto()
75    TESTED_ON = auto()
76    TRAINED_ON = auto()
77    UNDER_INVESTIGATION_FOR = auto()
78    VARIANT = auto()

Create a collection of name/value pairs.

Example enumeration:

>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3

Access them by:

  • attribute access::
>>> Color.RED
<Color.RED: 1>
  • value lookup:
>>> Color(1)
<Color.RED: 1>
  • name lookup:
>>> Color['RED']
<Color.RED: 1>

Enumerations can be iterated over, and know how many members they have:

>>> len(Color)
3
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

Methods can be added to enumerations, and members can have their own attributes -- see the documentation for details.

AFFECTS = <RelationshipType.AFFECTS: 1>
AMENDS = <RelationshipType.AMENDS: 2>
ANCESTOR = <RelationshipType.ANCESTOR: 3>
AVAILABLE_FROM = <RelationshipType.AVAILABLE_FROM: 4>
BUILD_DEPENDENCY = <RelationshipType.BUILD_DEPENDENCY: 5>
BUILD_TOOL = <RelationshipType.BUILD_TOOL: 6>
COORDINATED_BY = <RelationshipType.COORDINATED_BY: 7>
CONTAINS = <RelationshipType.CONTAINS: 8>
CONFIG_OF = <RelationshipType.CONFIG_OF: 9>
COPY = <RelationshipType.COPY: 10>
DATA_FILE = <RelationshipType.DATA_FILE: 11>
DEPENDENCY_MANIFEST = <RelationshipType.DEPENDENCY_MANIFEST: 12>
DEPENDS_ON = <RelationshipType.DEPENDS_ON: 13>
DESCENDANT = <RelationshipType.DESCENDANT: 14>
DESCRIBES = <RelationshipType.DESCRIBES: 15>
DEV_DEPENDENCY = <RelationshipType.DEV_DEPENDENCY: 16>
DEV_TOOL = <RelationshipType.DEV_TOOL: 17>
DISTRIBUTION_ARTIFACT = <RelationshipType.DISTRIBUTION_ARTIFACT: 18>
DOCUMENTATION = <RelationshipType.DOCUMENTATION: 19>
DOES_NOT_AFFECT = <RelationshipType.DOES_NOT_AFFECT: 20>
EXAMPLE = <RelationshipType.EXAMPLE: 22>
EVIDENCE_FOR = <RelationshipType.EVIDENCE_FOR: 23>
EXPANDED_FROM_ARCHIVE = <RelationshipType.EXPANDED_FROM_ARCHIVE: 24>
EXPLOIT_CREATED_BY = <RelationshipType.EXPLOIT_CREATED_BY: 25>
FILE_ADDED = <RelationshipType.FILE_ADDED: 26>
FILE_DELETED = <RelationshipType.FILE_DELETED: 27>
FILE_MODIFIED = <RelationshipType.FILE_MODIFIED: 28>
FIXED_BY = <RelationshipType.FIXED_BY: 29>
FIXED_IN = <RelationshipType.FIXED_IN: 30>
FOUND_BY = <RelationshipType.FOUND_BY: 31>
GENERATES = <RelationshipType.GENERATES: 32>
HAS_ASSESSMENT_FOR = <RelationshipType.HAS_ASSESSMENT_FOR: 33>
HAS_ASSOCIATED_VULNERABILITY = <RelationshipType.HAS_ASSOCIATED_VULNERABILITY: 34>
HOST_OF = <RelationshipType.HOST_OF: 35>
INPUT_OF = <RelationshipType.INPUT_OF: 36>
INVOKED_BY = <RelationshipType.INVOKED_BY: 37>
METAFILE = <RelationshipType.METAFILE: 38>
ON_BEHALF_OF = <RelationshipType.ON_BEHALF_OF: 39>
OPTIONAL_COMPONENT = <RelationshipType.OPTIONAL_COMPONENT: 40>
OPTIONAL_DEPENDENCY = <RelationshipType.OPTIONAL_DEPENDENCY: 41>
OTHER = <RelationshipType.OTHER: 42>
OUTPUT_OF = <RelationshipType.OUTPUT_OF: 43>
PACKAGES = <RelationshipType.PACKAGES: 44>
PATCH = <RelationshipType.PATCH: 45>
PREREQUISITE = <RelationshipType.PREREQUISITE: 46>
PROVIDED_DEPENDENCY = <RelationshipType.PROVIDED_DEPENDENCY: 47>
PUBLISHED_BY = <RelationshipType.PUBLISHED_BY: 48>
REPORTED_BY = <RelationshipType.REPORTED_BY: 49>
REPUBLISHED_BY = <RelationshipType.REPUBLISHED_BY: 50>
REQUIREMENT_FOR = <RelationshipType.REQUIREMENT_FOR: 51>
RUNTIME_DEPENDENCY = <RelationshipType.RUNTIME_DEPENDENCY: 52>
SPECIFICATION_FOR = <RelationshipType.SPECIFICATION_FOR: 53>
TEST = <RelationshipType.TEST: 55>
TEST_CASE = <RelationshipType.TEST_CASE: 56>
TEST_DEPENDENCY = <RelationshipType.TEST_DEPENDENCY: 57>
TEST_TOOL = <RelationshipType.TEST_TOOL: 58>
TESTED_ON = <RelationshipType.TESTED_ON: 59>
TRAINED_ON = <RelationshipType.TRAINED_ON: 60>
UNDER_INVESTIGATION_FOR = <RelationshipType.UNDER_INVESTIGATION_FOR: 61>
VARIANT = <RelationshipType.VARIANT: 62>
Inherited Members
enum.Enum
name
value
class RelationshipCompleteness(enum.Enum):
81class RelationshipCompleteness(Enum):
82    INCOMPLETE = auto()
83    COMPLETE = auto()
84    NOASSERTION = auto()

Create a collection of name/value pairs.

Example enumeration:

>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3

Access them by:

  • attribute access::
>>> Color.RED
<Color.RED: 1>
  • value lookup:
>>> Color(1)
<Color.RED: 1>
  • name lookup:
>>> Color['RED']
<Color.RED: 1>

Enumerations can be iterated over, and know how many members they have:

>>> len(Color)
3
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

Methods can be added to enumerations, and members can have their own attributes -- see the documentation for details.

Inherited Members
enum.Enum
name
value
@dataclass_with_properties
class Relationship(spdx_tools.spdx3.model.element.Element):
 87@dataclass_with_properties
 88class Relationship(Element):
 89    # due to the inheritance we need to make all fields non-default in the __annotation__,
 90    # the __init__ method still raises an error if required fields are not set
 91    from_element: str = None
 92    to: List[str] = field(default_factory=list)
 93    relationship_type: RelationshipType = None
 94    completeness: Optional[RelationshipCompleteness] = None
 95    start_time: Optional[datetime] = None
 96    end_time: Optional[datetime] = None
 97
 98    def __init__(
 99        self,
100        spdx_id: str,
101        from_element: str,
102        relationship_type: RelationshipType,
103        to: List[str] = None,
104        creation_info: Optional[CreationInfo] = None,
105        name: Optional[str] = None,
106        summary: Optional[str] = None,
107        description: Optional[str] = None,
108        comment: Optional[str] = None,
109        verified_using: List[IntegrityMethod] = None,
110        external_reference: List[ExternalReference] = None,
111        external_identifier: List[ExternalIdentifier] = None,
112        extension: Optional[str] = None,
113        completeness: Optional[RelationshipCompleteness] = None,
114        start_time: Optional[datetime] = None,
115        end_time: Optional[datetime] = None,
116    ):
117        to = [] if to is None else to
118        verified_using = [] if verified_using is None else verified_using
119        external_reference = [] if external_reference is None else external_reference
120        external_identifier = [] if external_identifier is None else external_identifier
121        check_types_and_set_values(self, locals())
Relationship( spdx_id: str, from_element: str, relationship_type: RelationshipType, to: list[str] = None, creation_info: Optional[spdx_tools.spdx3.model.creation_info.CreationInfo] = None, name: Optional[str] = None, summary: Optional[str] = None, description: Optional[str] = None, comment: Optional[str] = None, verified_using: list[spdx_tools.spdx3.model.integrity_method.IntegrityMethod] = None, external_reference: list[spdx_tools.spdx3.model.external_reference.ExternalReference] = None, external_identifier: list[spdx_tools.spdx3.model.external_identifier.ExternalIdentifier] = None, extension: Optional[str] = None, completeness: Optional[RelationshipCompleteness] = None, start_time: Optional[datetime.datetime] = None, end_time: Optional[datetime.datetime] = None)
 98    def __init__(
 99        self,
100        spdx_id: str,
101        from_element: str,
102        relationship_type: RelationshipType,
103        to: List[str] = None,
104        creation_info: Optional[CreationInfo] = None,
105        name: Optional[str] = None,
106        summary: Optional[str] = None,
107        description: Optional[str] = None,
108        comment: Optional[str] = None,
109        verified_using: List[IntegrityMethod] = None,
110        external_reference: List[ExternalReference] = None,
111        external_identifier: List[ExternalIdentifier] = None,
112        extension: Optional[str] = None,
113        completeness: Optional[RelationshipCompleteness] = None,
114        start_time: Optional[datetime] = None,
115        end_time: Optional[datetime] = None,
116    ):
117        to = [] if to is None else to
118        verified_using = [] if verified_using is None else verified_using
119        external_reference = [] if external_reference is None else external_reference
120        external_identifier = [] if external_identifier is None else external_identifier
121        check_types_and_set_values(self, locals())
from_element: str
47    def get_field(self) -> field_type:
48        return getattr(self, f"_{field_name}")
to: list[str]
47    def get_field(self) -> field_type:
48        return getattr(self, f"_{field_name}")
relationship_type: RelationshipType
47    def get_field(self) -> field_type:
48        return getattr(self, f"_{field_name}")
completeness: Optional[RelationshipCompleteness]
47    def get_field(self) -> field_type:
48        return getattr(self, f"_{field_name}")
start_time: Optional[datetime.datetime]
47    def get_field(self) -> field_type:
48        return getattr(self, f"_{field_name}")
end_time: Optional[datetime.datetime]
47    def get_field(self) -> field_type:
48        return getattr(self, f"_{field_name}")