Skip to content

fix: model.BomMetaData.component setter typehint #817

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cyclonedx/model/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -822,7 +822,7 @@ def __init__(
self.url = url
self.comment = comment
self.type = type
self.hashes = hashes or [] # type:ignore[assignment]
self.hashes = hashes or []

@property
@serializable.xml_sequence(1)
Expand Down
24 changes: 12 additions & 12 deletions cyclonedx/model/bom.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,14 @@ def __init__(
manufacture: Optional[OrganizationalEntity] = None,
) -> None:
self.timestamp = timestamp or _get_now_utc()
self.tools = tools or [] # type:ignore[assignment]
self.authors = authors or [] # type:ignore[assignment]
self.tools = tools or []
self.authors = authors or []
self.component = component
self.supplier = supplier
self.licenses = licenses or [] # type:ignore[assignment]
self.properties = properties or [] # type:ignore[assignment]
self.licenses = licenses or []
self.properties = properties or []
self.manufacturer = manufacturer
self.lifecycles = lifecycles or [] # type:ignore[assignment]
self.lifecycles = lifecycles or []

self.manufacture = manufacture
if manufacture:
Expand Down Expand Up @@ -179,7 +179,7 @@ def component(self) -> Optional[Component]:
return self._component

@component.setter
def component(self, component: Component) -> None:
def component(self, component: Optional[Component]) -> None:
"""
The (optional) component that the BOM describes.

Expand Down Expand Up @@ -345,12 +345,12 @@ def __init__(
self.serial_number = serial_number or uuid4()
self.version = version
self.metadata = metadata or BomMetaData()
self.components = components or [] # type:ignore[assignment]
self.services = services or [] # type:ignore[assignment]
self.external_references = external_references or [] # type:ignore[assignment]
self.vulnerabilities = vulnerabilities or [] # type:ignore[assignment]
self.dependencies = dependencies or [] # type:ignore[assignment]
self.properties = properties or [] # type:ignore[assignment]
self.components = components or []
self.services = services or []
self.external_references = external_references or []
self.vulnerabilities = vulnerabilities or []
self.dependencies = dependencies or []
self.properties = properties or []
self.definitions = definitions or Definitions()

@property
Expand Down
34 changes: 17 additions & 17 deletions cyclonedx/model/component.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,8 @@ def __init__(
licenses: Optional[Iterable[License]] = None,
copyright: Optional[Iterable[Copyright]] = None,
) -> None:
self.licenses = licenses or [] # type:ignore[assignment]
self.copyright = copyright or [] # type:ignore[assignment]
self.licenses = licenses or []
self.copyright = copyright or []

# @property
# ...
Expand Down Expand Up @@ -527,7 +527,7 @@ def __init__(
) -> None:
self.type = type
self.diff = diff
self.resolves = resolves or [] # type:ignore[assignment]
self.resolves = resolves or []

@property
@serializable.xml_attribute()
Expand Down Expand Up @@ -623,11 +623,11 @@ def __init__(
patches: Optional[Iterable[Patch]] = None,
notes: Optional[str] = None,
) -> None:
self.ancestors = ancestors or [] # type:ignore[assignment]
self.descendants = descendants or [] # type:ignore[assignment]
self.variants = variants or [] # type:ignore[assignment]
self.commits = commits or [] # type:ignore[assignment]
self.patches = patches or [] # type:ignore[assignment]
self.ancestors = ancestors or []
self.descendants = descendants or []
self.variants = variants or []
self.commits = commits or []
self.patches = patches or []
self.notes = notes

@property
Expand Down Expand Up @@ -1111,31 +1111,31 @@ def __init__(
self._bom_ref = _bom_ref_from_str(bom_ref)
self.supplier = supplier
self.manufacturer = manufacturer
self.authors = authors or [] # type:ignore[assignment]
self.authors = authors or []
self.author = author
self.publisher = publisher
self.group = group
self.name = name
self.version = version
self.description = description
self.scope = scope
self.hashes = hashes or [] # type:ignore[assignment]
self.licenses = licenses or [] # type:ignore[assignment]
self.hashes = hashes or []
self.licenses = licenses or []
self.copyright = copyright
self.cpe = cpe
self.purl = purl
self.omnibor_ids = omnibor_ids or [] # type:ignore[assignment]
self.swhids = swhids or [] # type:ignore[assignment]
self.omnibor_ids = omnibor_ids or []
self.swhids = swhids or []
self.swid = swid
self.modified = modified
self.pedigree = pedigree
self.external_references = external_references or [] # type:ignore[assignment]
self.properties = properties or [] # type:ignore[assignment]
self.components = components or [] # type:ignore[assignment]
self.external_references = external_references or []
self.properties = properties or []
self.components = components or []
self.evidence = evidence
self.release_notes = release_notes
self.crypto_properties = crypto_properties
self.tags = tags or [] # type:ignore[assignment]
self.tags = tags or []

if modified:
warn('`.component.modified` is deprecated from CycloneDX v1.3 onwards. '
Expand Down
4 changes: 2 additions & 2 deletions cyclonedx/model/contact.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,8 +296,8 @@ def __init__(
) -> None:
self.name = name
self.address = address
self.urls = urls or [] # type:ignore[assignment]
self.contacts = contacts or [] # type:ignore[assignment]
self.urls = urls or []
self.contacts = contacts or []

@property
@serializable.xml_sequence(10)
Expand Down
22 changes: 11 additions & 11 deletions cyclonedx/model/crypto.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,10 +295,10 @@ def __init__(
self.curve = curve
self.execution_environment = execution_environment
self.implementation_platform = implementation_platform
self.certification_levels = certification_levels or [] # type:ignore[assignment]
self.certification_levels = certification_levels or []
self.mode = mode
self.padding = padding
self.crypto_functions = crypto_functions or [] # type:ignore[assignment]
self.crypto_functions = crypto_functions or []
self.classical_security_level = classical_security_level
self.nist_quantum_security_level = nist_quantum_security_level

Expand Down Expand Up @@ -1107,8 +1107,8 @@ def __init__(
identifiers: Optional[Iterable[str]] = None,
) -> None:
self.name = name
self.algorithms = algorithms or [] # type:ignore[assignment]
self.identifiers = identifiers or [] # type:ignore[assignment]
self.algorithms = algorithms or []
self.identifiers = identifiers or []

@property
@serializable.xml_sequence(10)
Expand Down Expand Up @@ -1202,12 +1202,12 @@ def __init__(
esn: Optional[bool] = None,
auth: Optional[Iterable[BomRef]] = None,
) -> None:
self.encr = encr or [] # type:ignore[assignment]
self.prf = prf or [] # type:ignore[assignment]
self.integ = integ or [] # type:ignore[assignment]
self.ke = ke or [] # type:ignore[assignment]
self.encr = encr or []
self.prf = prf or []
self.integ = integ or []
self.ke = ke or []
self.esn = esn
self.auth = auth or [] # type:ignore[assignment]
self.auth = auth or []

@property
@serializable.xml_sequence(10)
Expand Down Expand Up @@ -1345,9 +1345,9 @@ def __init__(
) -> None:
self.type = type
self.version = version
self.cipher_suites = cipher_suites or [] # type:ignore[assignment]
self.cipher_suites = cipher_suites or []
self.ikev2_transform_types = ikev2_transform_types
self.crypto_refs = crypto_refs or [] # type:ignore[assignment]
self.crypto_refs = crypto_refs or []

@property
@serializable.xml_sequence(10)
Expand Down
20 changes: 10 additions & 10 deletions cyclonedx/model/definition.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,11 @@ def __init__(
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 = parent # type:ignore[assignment]
self.properties = properties or () # type:ignore[assignment]
self.external_references = external_references or () # type:ignore[assignment]
self.descriptions = descriptions or ()
self.open_cre = open_cre or ()
self.parent = parent
self.properties = properties or ()
self.external_references = external_references or ()

@property
@serializable.type_mapping(BomRef)
Expand Down Expand Up @@ -300,7 +300,7 @@ def __init__(
self.identifier = identifier
self.title = title
self.description = description
self.requirements = requirements or () # type:ignore[assignment]
self.requirements = requirements or ()

@property
@serializable.type_mapping(BomRef)
Expand Down Expand Up @@ -421,9 +421,9 @@ def __init__(
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 ()
self.levels = levels or ()
self.external_references = external_references or ()
# TODO: signature

@property
Expand Down Expand Up @@ -584,7 +584,7 @@ def __init__(
self, *,
standards: Optional[Iterable[Standard]] = None
) -> None:
self.standards = standards or () # type:ignore[assignment]
self.standards = standards or ()

@property
@serializable.xml_array(serializable.XmlArraySerializationType.NESTED, 'standard')
Expand Down
2 changes: 1 addition & 1 deletion cyclonedx/model/dependency.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class Dependency:

def __init__(self, ref: BomRef, dependencies: Optional[Iterable['Dependency']] = None) -> None:
self.ref = ref
self.dependencies = dependencies or [] # type:ignore[assignment]
self.dependencies = dependencies or []

@property
@serializable.type_mapping(BomRef)
Expand Down
2 changes: 1 addition & 1 deletion cyclonedx/model/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ def __init__(
self.name = name
self.description = description
self.source = source
self.references = references or [] # type:ignore[assignment]
self.references = references or []

@property
@serializable.xml_attribute()
Expand Down
10 changes: 5 additions & 5 deletions cyclonedx/model/release_note.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,11 @@ def __init__(
self.social_image = social_image
self.description = description
self.timestamp = timestamp
self.aliases = aliases or [] # type:ignore[assignment]
self.tags = tags or [] # type:ignore[assignment]
self.resolves = resolves or [] # type:ignore[assignment]
self.notes = notes or [] # type:ignore[assignment]
self.properties = properties or [] # type:ignore[assignment]
self.aliases = aliases or []
self.tags = tags or []
self.resolves = resolves or []
self.notes = notes or []
self.properties = properties or []

@property
@serializable.xml_sequence(1)
Expand Down
12 changes: 6 additions & 6 deletions cyclonedx/model/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,15 @@ def __init__(
self.name = name
self.version = version
self.description = description
self.endpoints = endpoints or [] # type:ignore[assignment]
self.endpoints = endpoints or []
self.authenticated = authenticated
self.x_trust_boundary = x_trust_boundary
self.data = data or [] # type:ignore[assignment]
self.licenses = licenses or [] # type:ignore[assignment]
self.external_references = external_references or [] # type:ignore[assignment]
self.services = services or [] # type:ignore[assignment]
self.data = data or []
self.licenses = licenses or []
self.external_references = external_references or []
self.services = services or []
self.release_notes = release_notes
self.properties = properties or [] # type:ignore[assignment]
self.properties = properties or []

@property
@serializable.json_name('bom-ref')
Expand Down
10 changes: 5 additions & 5 deletions cyclonedx/model/tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ def __init__(
self.vendor = vendor
self.name = name
self.version = version
self.hashes = hashes or () # type:ignore[assignment]
self.external_references = external_references or () # type:ignore[assignment]
self.hashes = hashes or ()
self.external_references = external_references or ()

@property
@serializable.xml_sequence(1)
Expand Down Expand Up @@ -207,9 +207,9 @@ def __init__(
warn('`@.tools` is deprecated from CycloneDX v1.5 onwards. '
'Please use `@.components` and `@.services` instead.',
DeprecationWarning)
self.components = components or () # type:ignore[assignment]
self.services = services or () # type:ignore[assignment]
self.tools = tools or () # type:ignore[assignment]
self.components = components or ()
self.services = services or ()
self.tools = tools or ()

@property
def components(self) -> 'SortedSet[Component]':
Expand Down
22 changes: 11 additions & 11 deletions cyclonedx/model/vulnerability.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ def __init__(
versions: Optional[Iterable[BomTargetVersionRange]] = None,
) -> None:
self.ref = ref
self.versions = versions or [] # type:ignore[assignment]
self.versions = versions or []

@property
@serializable.xml_sequence(1)
Expand Down Expand Up @@ -241,7 +241,7 @@ def __init__(
) -> None:
self.state = state
self.justification = justification
self.responses = responses or [] # type:ignore[assignment]
self.responses = responses or []
self.detail = detail
self.first_issued = first_issued
self.last_updated = last_updated
Expand Down Expand Up @@ -904,8 +904,8 @@ def __init__(
organizations: Optional[Iterable[OrganizationalEntity]] = None,
individuals: Optional[Iterable[OrganizationalContact]] = None,
) -> None:
self.organizations = organizations or [] # type:ignore[assignment]
self.individuals = individuals or [] # type:ignore[assignment]
self.organizations = organizations or []
self.individuals = individuals or []

@property
@serializable.xml_array(serializable.XmlArraySerializationType.NESTED, 'organization')
Expand Down Expand Up @@ -999,22 +999,22 @@ def __init__(
self._bom_ref = _bom_ref_from_str(bom_ref)
self.id = id
self.source = source
self.references = references or [] # type:ignore[assignment]
self.ratings = ratings or [] # type:ignore[assignment]
self.cwes = cwes or [] # type:ignore[assignment]
self.references = references or []
self.ratings = ratings or []
self.cwes = cwes or []
self.description = description
self.detail = detail
self.recommendation = recommendation
self.workaround = workaround
self.advisories = advisories or [] # type:ignore[assignment]
self.advisories = advisories or []
self.created = created
self.published = published
self.updated = updated
self.credits = credits
self.tools = tools or [] # type:ignore[assignment]
self.tools = tools or []
self.analysis = analysis
self.affects = affects or [] # type:ignore[assignment]
self.properties = properties or [] # type:ignore[assignment]
self.affects = affects or []
self.properties = properties or []

@property
@serializable.json_name('bom-ref')
Expand Down
2 changes: 1 addition & 1 deletion cyclonedx/output/xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def generate(self, force_regeneration: bool = False) -> None:
bom.validate()
xmlns = self.get_target_namespace()
with BomRefDiscriminator.from_bom(bom):
self._bom_xml = '<?xml version="1.0" ?>\n' + xml_dumps(
self._bom_xml = '<?xml version="1.0" ?>\n' + xml_dumps( # type:ignore[call-overload]
bom.as_xml( # type:ignore[attr-defined]
_view, as_string=False, xmlns=xmlns),
method='xml', default_namespace=xmlns, encoding='unicode',
Expand Down
Loading