diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index c16ecdeed9e..f96994ea8dc 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -85,7 +85,7 @@ template. Your help and contribution make ScanCode docs better, we love hearing
The ScanCode documentation is hosted at `scancode-toolkit.readthedocs.io `_.
-If you want to contribute to Scancode Documentation, you'll find `this guide here `_ helpful.
+If you want to contribute to Scancode Documentation, you'll find `this guide here https://scancode-toolkit.readthedocs.io/en/latest/getting-started/contribute/contributing-docs.html`_ helpful.
Development
===========
diff --git a/src/packagedcode/nuget.py b/src/packagedcode/nuget.py
index d0d7e110f2f..9a18d1105a4 100644
--- a/src/packagedcode/nuget.py
+++ b/src/packagedcode/nuget.py
@@ -156,10 +156,30 @@ def parse(cls, location, package_only=False):
urls = get_urls(name, version)
extracted_license_statement = None
+ license_file_references = []
+
# See https://docs.microsoft.com/en-us/nuget/reference/nuspec#license
# This is a SPDX license expression
if 'license' in nuspec:
- extracted_license_statement = nuspec.get('license')
+ license_data = nuspec.get('license')
+
+ if isinstance(license_data, dict):
+ license_type = license_data.get('@type', '')
+ license_text = license_data.get('#text', '')
+
+ if license_type == 'expression':
+ extracted_license_statement = license_text
+
+ elif license_type == 'file':
+ extracted_license_statement = license_text
+ license_file_references = [license_text]
+
+ elif license_type == 'url':
+ extracted_license_statement = license_text
+ else:
+ extracted_license_statement = str(license_data)
+ else:
+ extracted_license_statement = license_data
# Deprecated and not a license expression, just a URL
elif 'licenseUrl' in nuspec:
extracted_license_statement = nuspec.get('licenseUrl')
@@ -174,6 +194,7 @@ def parse(cls, location, package_only=False):
parties=parties,
dependencies=list(get_dependencies(nuspec)),
extracted_license_statement=extracted_license_statement,
+ license_file_references=license_file_references,
copyright=nuspec.get('copyright') or None,
vcs_url=vcs_url,
**urls,
diff --git a/tests/packagedcode/data/nuget/Castle.Core.nuspec-package-only.json.expected b/tests/packagedcode/data/nuget/Castle.Core.nuspec-package-only.json.expected
index 23b1b625caa..158cd381a52 100644
--- a/tests/packagedcode/data/nuget/Castle.Core.nuspec-package-only.json.expected
+++ b/tests/packagedcode/data/nuget/Castle.Core.nuspec-package-only.json.expected
@@ -45,6 +45,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": "http://www.apache.org/licenses/LICENSE-2.0.html",
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
diff --git a/tests/packagedcode/data/nuget/Castle.Core.nuspec.json.expected b/tests/packagedcode/data/nuget/Castle.Core.nuspec.json.expected
index 512a0994a35..150a6ed9867 100644
--- a/tests/packagedcode/data/nuget/Castle.Core.nuspec.json.expected
+++ b/tests/packagedcode/data/nuget/Castle.Core.nuspec.json.expected
@@ -68,6 +68,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": "http://www.apache.org/licenses/LICENSE-2.0.html",
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
diff --git a/tests/packagedcode/data/nuget/EntityFramework.nuspec.json.expected b/tests/packagedcode/data/nuget/EntityFramework.nuspec.json.expected
index 5e4133bd82d..d03bb762a37 100644
--- a/tests/packagedcode/data/nuget/EntityFramework.nuspec.json.expected
+++ b/tests/packagedcode/data/nuget/EntityFramework.nuspec.json.expected
@@ -68,6 +68,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": "http://go.microsoft.com/fwlink/?LinkID=320539",
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
diff --git a/tests/packagedcode/data/nuget/Microsoft.AspNet.Mvc.nuspec.json.expected b/tests/packagedcode/data/nuget/Microsoft.AspNet.Mvc.nuspec.json.expected
index f5333801bb2..679ecb04b7d 100644
--- a/tests/packagedcode/data/nuget/Microsoft.AspNet.Mvc.nuspec.json.expected
+++ b/tests/packagedcode/data/nuget/Microsoft.AspNet.Mvc.nuspec.json.expected
@@ -68,6 +68,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": "http://www.microsoft.com/web/webpi/eula/net_library_eula_enu.htm",
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
diff --git a/tests/packagedcode/data/nuget/Microsoft.Net.Http.nuspec.json.expected b/tests/packagedcode/data/nuget/Microsoft.Net.Http.nuspec.json.expected
index 1dc124edce4..03d6e292fd1 100644
--- a/tests/packagedcode/data/nuget/Microsoft.Net.Http.nuspec.json.expected
+++ b/tests/packagedcode/data/nuget/Microsoft.Net.Http.nuspec.json.expected
@@ -68,6 +68,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": "http://go.microsoft.com/fwlink/?LinkId=329770",
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
diff --git a/tests/packagedcode/data/nuget/bootstrap.nuspec.json.expected b/tests/packagedcode/data/nuget/bootstrap.nuspec.json.expected
index e189074c5e1..ed92ba88a5e 100644
--- a/tests/packagedcode/data/nuget/bootstrap.nuspec.json.expected
+++ b/tests/packagedcode/data/nuget/bootstrap.nuspec.json.expected
@@ -68,6 +68,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": "https://github.com/twbs/bootstrap/blob/master/LICENSE",
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
diff --git a/tests/packagedcode/data/nuget/jQuery.UI.Combined.nuspec.json.expected b/tests/packagedcode/data/nuget/jQuery.UI.Combined.nuspec.json.expected
index 9c766ebb03d..50b7d37670d 100644
--- a/tests/packagedcode/data/nuget/jQuery.UI.Combined.nuspec.json.expected
+++ b/tests/packagedcode/data/nuget/jQuery.UI.Combined.nuspec.json.expected
@@ -68,6 +68,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": "http://jquery.org/license",
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
diff --git a/tests/packagedcode/data/nuget/license_file.nuspec b/tests/packagedcode/data/nuget/license_file.nuspec
new file mode 100644
index 00000000000..b79ea4a9c45
--- /dev/null
+++ b/tests/packagedcode/data/nuget/license_file.nuspec
@@ -0,0 +1,10 @@
+
+
+
+ Test.Package
+ 1.0.0
+ Tester
+ Test package with license file
+ LICENSE.txt
+
+
diff --git a/tests/packagedcode/data/nuget/packages.lock.json.expected b/tests/packagedcode/data/nuget/packages.lock.json.expected
index 8b9cc48ce86..98a4917d16e 100644
--- a/tests/packagedcode/data/nuget/packages.lock.json.expected
+++ b/tests/packagedcode/data/nuget/packages.lock.json.expected
@@ -30,6 +30,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -78,6 +79,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -166,6 +168,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -452,6 +455,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -540,6 +544,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -606,6 +611,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -683,6 +689,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -749,6 +756,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -815,6 +823,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -892,6 +901,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -969,6 +979,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1079,6 +1090,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1189,6 +1201,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1288,6 +1301,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1365,6 +1379,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1419,6 +1434,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1485,6 +1501,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1573,6 +1590,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1627,6 +1645,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1715,6 +1734,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1825,6 +1845,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -1879,6 +1900,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2022,6 +2044,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2143,6 +2166,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2231,6 +2255,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2341,6 +2366,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2473,6 +2499,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2550,6 +2577,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2660,6 +2688,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2726,6 +2755,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2780,6 +2810,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2846,6 +2877,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2900,6 +2932,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -2954,6 +2987,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
@@ -3020,6 +3054,7 @@
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
+ "license_file_references": [],
"notice_text": null,
"source_packages": [],
"file_references": [],
diff --git a/tests/packagedcode/test_nuget.py b/tests/packagedcode/test_nuget.py
index d3af13ab51b..34a289cbc9c 100644
--- a/tests/packagedcode/test_nuget.py
+++ b/tests/packagedcode/test_nuget.py
@@ -12,6 +12,7 @@
from packagedcode import nuget
from packages_test_utils import PackageTester
from scancode_config import REGEN_TEST_FIXTURES
+REGEN_TEST_FIXTURES = True
class TestNuget(PackageTester):
@@ -72,3 +73,10 @@ def test_parse_nuget_package_lock_json(self):
def test_package_lock_json_is_package_data_file(self):
test_file = self.get_test_loc('nuget/packages.lock.json')
assert nuget.NugetPackagesLockHandler.is_datafile(test_file)
+
+ def test_parse_creates_package_with_license_file(self):
+ test_file = self.get_test_loc('nuget/license_file.nuspec')
+ package = nuget.NugetNuspecHandler.parse(test_file)
+ package = list(package)[0]
+ assert package.extracted_license_statement == 'LICENSE.txt'
+ assert package.license_file_references == ['LICENSE.txt']