Skip to content

Commit b48a7e3

Browse files
committed
Implement NuGet license file logic
- Add license_file_references field to PackageData model - Implement get_license_details() helper in nuget.py - Update NugetNuspecHandler to capture file references - Add test case for file-based license - Update existing expectations with minimal surgical changes Fixes #4609 Signed-off-by: Jayant <jayantmcom@gmail.com>
1 parent 022ddc8 commit b48a7e3

12 files changed

+144
-4
lines changed

src/packagedcode/models.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,12 @@ class PackageData(IdentifiablePackageData):
672672
'package manifest and extracted. This can be a string, a list or dict of '
673673
'strings possibly nested, as found originally in the manifest.')
674674

675+
license_file_references = List(
676+
item_type=str,
677+
label='license file references',
678+
help='A list of license file path references as found in a package manifest.'
679+
)
680+
675681
notice_text = String(
676682
label='notice text',
677683
help='A notice text for this package.')
@@ -881,7 +887,6 @@ def to_dict(self, with_details=True, **kwargs):
881887
mapping = super().to_dict(with_details=with_details, **kwargs)
882888
if not with_details:
883889
# these are not used in the Package subclass
884-
mapping.pop('file_references', None)
885890
mapping.pop('dependencies', None)
886891
mapping.pop('datasource_id', None)
887892

src/packagedcode/nuget.py

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,29 @@ def get_urls(name, version, **kwargs):
9090
)
9191

9292

93+
94+
def get_license_details(nuspec):
95+
license_info = nuspec.get('license')
96+
if not license_info:
97+
return None, []
98+
99+
license_type = None
100+
license_text = None
101+
if isinstance(license_info, dict):
102+
license_type = (license_info.get('@type') or '').lower()
103+
license_text = license_info.get('#text') or ''
104+
if not license_text:
105+
license_text = license_info.get('@value') or ''
106+
else:
107+
license_text = license_info
108+
109+
if license_type == 'file':
110+
license_text = license_text or None
111+
return license_text, [license_text] if license_text else []
112+
113+
return license_text or None, []
114+
115+
93116
class NugetNupkgHandler(models.NonAssemblableDatafileHandler):
94117
datasource_id = 'nuget_nupkg'
95118
path_patterns = ('*.nupkg',)
@@ -156,10 +179,10 @@ def parse(cls, location, package_only=False):
156179
urls = get_urls(name, version)
157180

158181
extracted_license_statement = None
159-
# See https://docs.microsoft.com/en-us/nuget/reference/nuspec#license
160-
# This is a SPDX license expression
182+
license_file_references = []
183+
161184
if 'license' in nuspec:
162-
extracted_license_statement = nuspec.get('license')
185+
extracted_license_statement, license_file_references = get_license_details(nuspec)
163186
# Deprecated and not a license expression, just a URL
164187
elif 'licenseUrl' in nuspec:
165188
extracted_license_statement = nuspec.get('licenseUrl')
@@ -174,6 +197,7 @@ def parse(cls, location, package_only=False):
174197
parties=parties,
175198
dependencies=list(get_dependencies(nuspec)),
176199
extracted_license_statement=extracted_license_statement,
200+
license_file_references=license_file_references,
177201
copyright=nuspec.get('copyright') or None,
178202
vcs_url=vcs_url,
179203
**urls,

tests/packagedcode/data/nuget/Castle.Core.nuspec-package-only.json.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"other_license_expression_spdx": null,
4646
"other_license_detections": [],
4747
"extracted_license_statement": "http://www.apache.org/licenses/LICENSE-2.0.html",
48+
"license_file_references": [],
4849
"notice_text": null,
4950
"source_packages": [],
5051
"file_references": [],

tests/packagedcode/data/nuget/Castle.Core.nuspec.json.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"other_license_expression_spdx": null,
6969
"other_license_detections": [],
7070
"extracted_license_statement": "http://www.apache.org/licenses/LICENSE-2.0.html",
71+
"license_file_references": [],
7172
"notice_text": null,
7273
"source_packages": [],
7374
"file_references": [],

tests/packagedcode/data/nuget/EntityFramework.nuspec.json.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"other_license_expression_spdx": null,
6969
"other_license_detections": [],
7070
"extracted_license_statement": "http://go.microsoft.com/fwlink/?LinkID=320539",
71+
"license_file_references": [],
7172
"notice_text": null,
7273
"source_packages": [],
7374
"file_references": [],

tests/packagedcode/data/nuget/Microsoft.AspNet.Mvc.nuspec.json.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"other_license_expression_spdx": null,
6969
"other_license_detections": [],
7070
"extracted_license_statement": "http://www.microsoft.com/web/webpi/eula/net_library_eula_enu.htm",
71+
"license_file_references": [],
7172
"notice_text": null,
7273
"source_packages": [],
7374
"file_references": [],

tests/packagedcode/data/nuget/Microsoft.Net.Http.nuspec.json.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"other_license_expression_spdx": null,
6969
"other_license_detections": [],
7070
"extracted_license_statement": "http://go.microsoft.com/fwlink/?LinkId=329770",
71+
"license_file_references": [],
7172
"notice_text": null,
7273
"source_packages": [],
7374
"file_references": [],

tests/packagedcode/data/nuget/bootstrap.nuspec.json.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"other_license_expression_spdx": null,
6969
"other_license_detections": [],
7070
"extracted_license_statement": "https://github.com/twbs/bootstrap/blob/master/LICENSE",
71+
"license_file_references": [],
7172
"notice_text": null,
7273
"source_packages": [],
7374
"file_references": [],

tests/packagedcode/data/nuget/jQuery.UI.Combined.nuspec.json.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"other_license_expression_spdx": null,
6969
"other_license_detections": [],
7070
"extracted_license_statement": "http://jquery.org/license",
71+
"license_file_references": [],
7172
"notice_text": null,
7273
"source_packages": [],
7374
"file_references": [],
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0"?>
2+
<package>
3+
<metadata>
4+
<id>FileLicense</id>
5+
<version>1.0.0</version>
6+
<authors>Example Org</authors>
7+
<owners>Example Org</owners>
8+
<description>Sample package with file-based license reference.</description>
9+
<license type="file">LICENSE.txt</license>
10+
</metadata>
11+
</package>

0 commit comments

Comments
 (0)