diff mbox series

lib: spdx: Upgrade to final 3.0.1 release

Message ID 20250116160733.2452799-1-JPEWhacker@gmail.com
State Accepted, archived
Commit 54233a7d6fe414d22449fb02fac26b66a820b17a
Headers show
Series lib: spdx: Upgrade to final 3.0.1 release | expand

Commit Message

Joshua Watt Jan. 16, 2025, 4:07 p.m. UTC
The 3.0.1 release of SPDX has been officially released with a few minor
modifications. Regenerate the bindings to use this version.

Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
---
 meta/lib/oe/sbom30.py |   2 +-
 meta/lib/oe/spdx30.py | 146 ++++++++++++++++++++++++------------------
 2 files changed, 85 insertions(+), 63 deletions(-)
diff mbox series

Patch

diff --git a/meta/lib/oe/sbom30.py b/meta/lib/oe/sbom30.py
index 7993e1fbefd..f7c4b323d56 100644
--- a/meta/lib/oe/sbom30.py
+++ b/meta/lib/oe/sbom30.py
@@ -495,7 +495,7 @@  class ObjectSet(oe.spdx30.SHACLObjectSet):
             return []
 
         if not to:
-            to = [oe.spdx30.Element.NoneElement]
+            to = [oe.spdx30.IndividualElement.NoneElement]
 
         ret = []
 
diff --git a/meta/lib/oe/spdx30.py b/meta/lib/oe/spdx30.py
index 5cd2eb45c36..cd97eebd186 100644
--- a/meta/lib/oe/spdx30.py
+++ b/meta/lib/oe/spdx30.py
@@ -133,8 +133,9 @@  class DateTimeProp(Property):
         if value.utcoffset() is None:
             value = value.astimezone()
         offset = value.utcoffset()
-        if offset % timedelta(minutes=1):
-            offset = offset - (offset % timedelta(minutes=1))
+        seconds = offset % timedelta(minutes=-1 if offset.total_seconds() < 0 else 1)
+        if seconds:
+            offset = offset - seconds
             value = value.replace(tzinfo=timezone(offset))
         value = value.replace(microsecond=0)
         return value
@@ -922,6 +923,12 @@  class SHACLExtensibleObject(object):
         return obj
 
     def _decode_properties(self, decoder, objectset=None):
+        def decode_value(d):
+            if not d.is_list():
+                return d.read_value()
+
+            return [decode_value(val_d) for val_d in d.read_list()]
+
         if self.CLOSED:
             super()._decode_properties(decoder, objectset=objectset)
             return
@@ -936,7 +943,7 @@  class SHACLExtensibleObject(object):
                 )
 
             with decoder.read_property(key) as prop_d:
-                self.__dict__["_obj_data"][key] = prop_d.read_value()
+                self.__dict__["_obj_data"][key] = decode_value(prop_d)
 
     def _encode_properties(self, encoder, state):
         def encode_value(encoder, v):
@@ -948,6 +955,11 @@  class SHACLExtensibleObject(object):
                 encoder.write_integer(v)
             elif isinstance(v, float):
                 encoder.write_float(v)
+            elif isinstance(v, list):
+                with encoder.write_list() as list_s:
+                    for i in v:
+                        with list_s.write_list_item() as item_s:
+                            encode_value(item_s, i)
             else:
                 raise TypeError(
                     f"Unsupported serialized type {type(v)} with value '{v}'"
@@ -1197,7 +1209,7 @@  class SHACLObjectSet(object):
 
         return SHACLObjectSet(new_objects, link=True)
 
-    def encode(self, encoder, force_list=False):
+    def encode(self, encoder, force_list=False, *, key=None):
         """
         Serialize a list of objects to a serialization encoder
 
@@ -1244,7 +1256,7 @@  class SHACLObjectSet(object):
         else:
             objects = list(self.objects)
 
-        objects.sort()
+        objects.sort(key=key)
 
         if use_list:
             # Ensure top level objects are only written in the top level graph
@@ -1265,7 +1277,7 @@  class SHACLObjectSet(object):
                     with list_s.write_list_item() as item_s:
                         o.encode(item_s, state)
 
-        else:
+        elif objects:
             objects[0].encode(encoder, state)
 
     def decode(self, decoder):
@@ -1409,6 +1421,15 @@  class Decoder(ABC):
         """
         pass
 
+    @abstractmethod
+    def is_list(self):
+        """
+        Checks if the next item is a list
+
+        Returns True if the next item is a list, or False if it is a scalar
+        """
+        pass
+
     @abstractmethod
     def read_object(self):
         """
@@ -1507,12 +1528,15 @@  class JSONLDDecoder(Decoder):
         return None
 
     def read_list(self):
-        if isinstance(self.data, (list, tuple, set)):
+        if self.is_list():
             for v in self.data:
                 yield self.__class__(v)
         else:
             yield self
 
+    def is_list(self):
+        return isinstance(self.data, (list, tuple, set))
+
     def __get_value(self, *keys):
         for k in keys:
             if k and k in self.data:
@@ -1962,18 +1986,11 @@  CONTEXT_URLS = [
 
 
 # CLASSES
-@register("http://spdx.invalid./AbstractClass", abstract=False)
-class http_spdx_invalid_AbstractClass(SHACLObject):
-    NODE_KIND = NodeKind.BlankNodeOrIRI
-    NAMED_INDIVIDUALS = {
-    }
-
-
 # A class for describing the energy consumption incurred by an AI model in
 # different stages of its lifecycle.
 @register("https://spdx.org/rdf/3.0.1/terms/AI/EnergyConsumption", compact_type="ai_EnergyConsumption", abstract=False)
 class ai_EnergyConsumption(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2010,7 +2027,7 @@  class ai_EnergyConsumption(SHACLObject):
 # used for measurement.
 @register("https://spdx.org/rdf/3.0.1/terms/AI/EnergyConsumptionDescription", compact_type="ai_EnergyConsumptionDescription", abstract=False)
 class ai_EnergyConsumptionDescription(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2093,7 +2110,7 @@  class AnnotationType(SHACLObject):
 # Provides information about the creation of the Element.
 @register("https://spdx.org/rdf/3.0.1/terms/Core/CreationInfo", compact_type="CreationInfo", abstract=False)
 class CreationInfo(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2147,7 +2164,7 @@  class CreationInfo(SHACLObject):
 # A key with an associated value.
 @register("https://spdx.org/rdf/3.0.1/terms/Core/DictionaryEntry", compact_type="DictionaryEntry", abstract=False)
 class DictionaryEntry(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2177,15 +2194,7 @@  class Element(SHACLObject):
     NODE_KIND = NodeKind.IRI
     ID_ALIAS = "spdxId"
     NAMED_INDIVIDUALS = {
-        "NoAssertionElement": "https://spdx.org/rdf/3.0.1/terms/Core/NoAssertionElement",
-        "NoneElement": "https://spdx.org/rdf/3.0.1/terms/Core/NoneElement",
     }
-    # An Individual Value for Element representing a set of Elements of unknown
-    # identify or cardinality (number).
-    NoAssertionElement = "https://spdx.org/rdf/3.0.1/terms/Core/NoAssertionElement"
-    # An Individual Value for Element representing a set of Elements with
-    # cardinality (number/count) of zero.
-    NoneElement = "https://spdx.org/rdf/3.0.1/terms/Core/NoneElement"
 
     @classmethod
     def _register_props(cls):
@@ -2276,10 +2285,10 @@  class ElementCollection(Element):
             "element",
             ListProp(ObjectProp(Element, False, context=[
                     ("https://spdx.org/rdf/3.0.1/terms/Core/NoneElement", "NoneElement"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                     ("https://spdx.org/rdf/3.0.1/terms/Core/SpdxOrganization", "SpdxOrganization"),
                     ("https://spdx.org/rdf/3.0.1/terms/Core/NoAssertionElement", "NoAssertionElement"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
                 ],)),
             iri="https://spdx.org/rdf/3.0.1/terms/Core/element",
             compact="element",
@@ -2308,10 +2317,10 @@  class ElementCollection(Element):
             "rootElement",
             ListProp(ObjectProp(Element, False, context=[
                     ("https://spdx.org/rdf/3.0.1/terms/Core/NoneElement", "NoneElement"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                     ("https://spdx.org/rdf/3.0.1/terms/Core/SpdxOrganization", "SpdxOrganization"),
                     ("https://spdx.org/rdf/3.0.1/terms/Core/NoAssertionElement", "NoAssertionElement"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
                 ],)),
             iri="https://spdx.org/rdf/3.0.1/terms/Core/rootElement",
             compact="rootElement",
@@ -2321,7 +2330,7 @@  class ElementCollection(Element):
 # A reference to a resource identifier defined outside the scope of SPDX-3.0 content that uniquely identifies an Element.
 @register("https://spdx.org/rdf/3.0.1/terms/Core/ExternalIdentifier", compact_type="ExternalIdentifier", abstract=False)
 class ExternalIdentifier(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2425,7 +2434,7 @@  class ExternalIdentifierType(SHACLObject):
 # external to that SpdxDocument.
 @register("https://spdx.org/rdf/3.0.1/terms/Core/ExternalMap", compact_type="ExternalMap", abstract=False)
 class ExternalMap(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2469,7 +2478,7 @@  class ExternalMap(SHACLObject):
 # A reference to a resource outside the scope of SPDX-3.0 content related to an Element.
 @register("https://spdx.org/rdf/3.0.1/terms/Core/ExternalRef", compact_type="ExternalRef", abstract=False)
 class ExternalRef(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2774,10 +2783,28 @@  class HashAlgorithm(SHACLObject):
     sha512 = "https://spdx.org/rdf/3.0.1/terms/Core/HashAlgorithm/sha512"
 
 
+# A concrete subclass of Element used by Individuals in the
+# Core profile.
+@register("https://spdx.org/rdf/3.0.1/terms/Core/IndividualElement", compact_type="IndividualElement", abstract=False)
+class IndividualElement(Element):
+    NODE_KIND = NodeKind.IRI
+    ID_ALIAS = "spdxId"
+    NAMED_INDIVIDUALS = {
+        "NoAssertionElement": "https://spdx.org/rdf/3.0.1/terms/Core/NoAssertionElement",
+        "NoneElement": "https://spdx.org/rdf/3.0.1/terms/Core/NoneElement",
+    }
+    # An Individual Value for Element representing a set of Elements of unknown
+    # identify or cardinality (number).
+    NoAssertionElement = "https://spdx.org/rdf/3.0.1/terms/Core/NoAssertionElement"
+    # An Individual Value for Element representing a set of Elements with
+    # cardinality (number/count) of zero.
+    NoneElement = "https://spdx.org/rdf/3.0.1/terms/Core/NoneElement"
+
+
 # Provides an independently reproducible mechanism that permits verification of a specific Element.
 @register("https://spdx.org/rdf/3.0.1/terms/Core/IntegrityMethod", compact_type="IntegrityMethod", abstract=True)
 class IntegrityMethod(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2823,7 +2850,7 @@  class LifecycleScopeType(SHACLObject):
 # A mapping between prefixes and namespace partial URIs.
 @register("https://spdx.org/rdf/3.0.1/terms/Core/NamespaceMap", compact_type="NamespaceMap", abstract=False)
 class NamespaceMap(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2852,7 +2879,7 @@  class NamespaceMap(SHACLObject):
 # An SPDX version 2.X compatible verification method for software packages.
 @register("https://spdx.org/rdf/3.0.1/terms/Core/PackageVerificationCode", compact_type="PackageVerificationCode", abstract=False)
 class PackageVerificationCode(IntegrityMethod):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2911,7 +2938,7 @@  class PackageVerificationCode(IntegrityMethod):
 # A tuple of two positive integers that define a range.
 @register("https://spdx.org/rdf/3.0.1/terms/Core/PositiveIntegerRange", compact_type="PositiveIntegerRange", abstract=False)
 class PositiveIntegerRange(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -2977,7 +3004,7 @@  class ProfileIdentifierType(SHACLObject):
     core = "https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/core"
     # the element follows the Dataset profile specification
     dataset = "https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/dataset"
-    # the element follows the expanded Licensing profile specification
+    # the element follows the ExpandedLicensing profile specification
     expandedLicensing = "https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/expandedLicensing"
     # the element follows the Extension profile specification
     extension = "https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/extension"
@@ -2985,7 +3012,7 @@  class ProfileIdentifierType(SHACLObject):
     lite = "https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/lite"
     # the element follows the Security profile specification
     security = "https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/security"
-    # the element follows the simple Licensing profile specification
+    # the element follows the SimpleLicensing profile specification
     simpleLicensing = "https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/simpleLicensing"
     # the element follows the Software profile specification
     software = "https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/software"
@@ -3025,10 +3052,10 @@  class Relationship(Element):
             "from_",
             ObjectProp(Element, True, context=[
                     ("https://spdx.org/rdf/3.0.1/terms/Core/NoneElement", "NoneElement"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                     ("https://spdx.org/rdf/3.0.1/terms/Core/SpdxOrganization", "SpdxOrganization"),
                     ("https://spdx.org/rdf/3.0.1/terms/Core/NoAssertionElement", "NoAssertionElement"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
                 ],),
             iri="https://spdx.org/rdf/3.0.1/terms/Core/from",
             min_count=1,
@@ -3114,10 +3141,10 @@  class Relationship(Element):
             "to",
             ListProp(ObjectProp(Element, False, context=[
                     ("https://spdx.org/rdf/3.0.1/terms/Core/NoneElement", "NoneElement"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                     ("https://spdx.org/rdf/3.0.1/terms/Core/SpdxOrganization", "SpdxOrganization"),
                     ("https://spdx.org/rdf/3.0.1/terms/Core/NoAssertionElement", "NoAssertionElement"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
                 ],)),
             iri="https://spdx.org/rdf/3.0.1/terms/Core/to",
             min_count=1,
@@ -3343,8 +3370,8 @@  class SpdxDocument(ElementCollection):
         cls._add_property(
             "dataLicense",
             ObjectProp(simplelicensing_AnyLicenseInfo, False, context=[
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                     ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                 ],),
             iri="https://spdx.org/rdf/3.0.1/terms/Core/dataLicense",
             compact="dataLicense",
@@ -3587,7 +3614,7 @@  class expandedlicensing_ListedLicenseException(expandedlicensing_LicenseAddition
 # A property name with an associated value.
 @register("https://spdx.org/rdf/3.0.1/terms/Extension/CdxPropertyEntry", compact_type="extension_CdxPropertyEntry", abstract=False)
 class extension_CdxPropertyEntry(SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -3614,7 +3641,7 @@  class extension_CdxPropertyEntry(SHACLObject):
 # A characterization of some aspect of an Element that is associated with the Element in a generalized fashion.
 @register("https://spdx.org/rdf/3.0.1/terms/Extension/Extension", compact_type="extension_Extension", abstract=True)
 class extension_Extension(SHACLExtensibleObject, SHACLObject):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -3724,13 +3751,7 @@  class security_VulnAssessmentRelationship(Relationship):
         # found.
         cls._add_property(
             "security_assessedElement",
-            ObjectProp(Element, False, context=[
-                    ("https://spdx.org/rdf/3.0.1/terms/Core/NoneElement", "NoneElement"),
-                    ("https://spdx.org/rdf/3.0.1/terms/Core/SpdxOrganization", "SpdxOrganization"),
-                    ("https://spdx.org/rdf/3.0.1/terms/Core/NoAssertionElement", "NoAssertionElement"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
-                ],),
+            ObjectProp(software_SoftwareArtifact, False),
             iri="https://spdx.org/rdf/3.0.1/terms/Security/assessedElement",
             compact="security_assessedElement",
         )
@@ -3826,7 +3847,7 @@  class simplelicensing_SimpleLicensingText(Element):
 # A canonical, unique, immutable identifier
 @register("https://spdx.org/rdf/3.0.1/terms/Software/ContentIdentifier", compact_type="software_ContentIdentifier", abstract=False)
 class software_ContentIdentifier(IntegrityMethod):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -4134,10 +4155,10 @@  class Annotation(Element):
             "subject",
             ObjectProp(Element, True, context=[
                     ("https://spdx.org/rdf/3.0.1/terms/Core/NoneElement", "NoneElement"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                     ("https://spdx.org/rdf/3.0.1/terms/Core/SpdxOrganization", "SpdxOrganization"),
                     ("https://spdx.org/rdf/3.0.1/terms/Core/NoAssertionElement", "NoAssertionElement"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
                 ],),
             iri="https://spdx.org/rdf/3.0.1/terms/Core/subject",
             min_count=1,
@@ -4245,7 +4266,7 @@  class Bundle(ElementCollection):
 # A mathematically calculated representation of a grouping of data.
 @register("https://spdx.org/rdf/3.0.1/terms/Core/Hash", compact_type="Hash", abstract=False)
 class Hash(IntegrityMethod):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -4366,8 +4387,8 @@  class expandedlicensing_ConjunctiveLicenseSet(simplelicensing_AnyLicenseInfo):
         cls._add_property(
             "expandedlicensing_member",
             ListProp(ObjectProp(simplelicensing_AnyLicenseInfo, False, context=[
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                     ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                 ],)),
             iri="https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/member",
             min_count=2,
@@ -4400,8 +4421,8 @@  class expandedlicensing_DisjunctiveLicenseSet(simplelicensing_AnyLicenseInfo):
         cls._add_property(
             "expandedlicensing_member",
             ListProp(ObjectProp(simplelicensing_AnyLicenseInfo, False, context=[
-                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                     ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoAssertionLicense", "expandedlicensing_NoAssertionLicense"),
+                    ("https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/NoneLicense", "expandedlicensing_NoneLicense"),
                 ],)),
             iri="https://spdx.org/rdf/3.0.1/terms/ExpandedLicensing/member",
             min_count=2,
@@ -4603,7 +4624,7 @@  class expandedlicensing_WithAdditionOperator(simplelicensing_AnyLicenseInfo):
 # A type of extension consisting of a list of name value pairs.
 @register("https://spdx.org/rdf/3.0.1/terms/Extension/CdxPropertiesExtension", compact_type="extension_CdxPropertiesExtension", abstract=False)
 class extension_CdxPropertiesExtension(extension_Extension):
-    NODE_KIND = NodeKind.BlankNode
+    NODE_KIND = NodeKind.BlankNodeOrIRI
     NAMED_INDIVIDUALS = {
     }
 
@@ -4831,7 +4852,7 @@  class security_SsvcVulnAssessmentRelationship(security_VulnAssessmentRelationshi
         )
 
 
-# Asbtract ancestor class for all VEX relationships
+# Abstract ancestor class for all VEX relationships
 @register("https://spdx.org/rdf/3.0.1/terms/Security/VexVulnAssessmentRelationship", compact_type="security_VexVulnAssessmentRelationship", abstract=True)
 class security_VexVulnAssessmentRelationship(security_VulnAssessmentRelationship):
     NODE_KIND = NodeKind.IRI
@@ -5040,13 +5061,14 @@  class security_VexAffectedVulnAssessmentRelationship(security_VexVulnAssessmentR
             "security_actionStatement",
             StringProp(),
             iri="https://spdx.org/rdf/3.0.1/terms/Security/actionStatement",
+            min_count=1,
             compact="security_actionStatement",
         )
         # Records the time when a recommended action was communicated in a VEX statement
         # to mitigate a vulnerability.
         cls._add_property(
             "security_actionStatementTime",
-            ListProp(DateTimeStampProp(pattern=r"^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ$",)),
+            DateTimeStampProp(pattern=r"^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ$",),
             iri="https://spdx.org/rdf/3.0.1/terms/Security/actionStatementTime",
             compact="security_actionStatementTime",
         )