@@ -671,6 +671,28 @@ def _get_spdx_extracted_licenses(license_expressions):
671671 return extracted_licenses
672672
673673
674+ def get_dependency_as_spdx_relationship (dependency , document_spdx_id , packages_as_spdx ):
675+ """Return a spdx.Relationship crafted from the provided ``dependency`` instance."""
676+ if dependency .for_package : # Package dependency
677+ parent_id = dependency .for_package .spdx_id
678+ else : # Project dependency
679+ parent_id = document_spdx_id
680+
681+ if dependency .is_resolved_to_package : # Resolved to a Package
682+ child_id = dependency .resolved_to_package .spdx_id
683+ else : # Not resolved to a Package (only package_url value is available)
684+ dependency_as_package = dependency .as_spdx_package ()
685+ packages_as_spdx .append (dependency_as_package )
686+ child_id = dependency_as_package .spdx_id
687+
688+ spdx_relationship = spdx .Relationship (
689+ spdx_id = child_id ,
690+ related_spdx_id = parent_id ,
691+ relationship = "DEPENDENCY_OF" ,
692+ )
693+ return spdx_relationship
694+
695+
674696def to_spdx (project , include_files = False ):
675697 """
676698 Generate output for the provided ``project`` in SPDX document format.
@@ -682,6 +704,7 @@ def to_spdx(project, include_files=False):
682704 discoveredpackage_qs = get_queryset (project , "discoveredpackage" )
683705 discovereddependency_qs = get_queryset (project , "discovereddependency" )
684706
707+ document_spdx_id = f"SPDXRef-DOCUMENT-{ project .uuid } "
685708 packages_as_spdx = []
686709 license_expressions = []
687710 relationships = []
@@ -692,15 +715,12 @@ def to_spdx(project, include_files=False):
692715 license_expressions .append (license_expression )
693716
694717 for dependency in discovereddependency_qs :
695- packages_as_spdx .append (dependency .as_spdx_package ())
696- if dependency .for_package :
697- relationships .append (
698- spdx .Relationship (
699- spdx_id = dependency .spdx_id ,
700- related_spdx_id = dependency .for_package .spdx_id ,
701- relationship = "DEPENDENCY_OF" ,
702- )
703- )
718+ spdx_relationship = get_dependency_as_spdx_relationship (
719+ dependency ,
720+ document_spdx_id ,
721+ packages_as_spdx ,
722+ )
723+ relationships .append (spdx_relationship )
704724
705725 files_as_spdx = []
706726 if include_files :
@@ -710,6 +730,7 @@ def to_spdx(project, include_files=False):
710730 ]
711731
712732 document = spdx .Document (
733+ spdx_id = document_spdx_id ,
713734 name = f"scancodeio_{ project .name } " ,
714735 namespace = f"https://scancode.io/spdxdocs/{ project .uuid } " ,
715736 creation_info = spdx .CreationInfo (tool = f"ScanCode.io-{ scancodeio_version } " ),
0 commit comments