Skip to content

Commit c7c31bd

Browse files
committed
Do not create empty URLs for npms #2996
Reference: #2996 Reference: aboutcode-org/scancode.io#448 Signed-off-by: Philippe Ombredanne <pombredanne@nexb.com>
1 parent 8209f03 commit c7c31bd

File tree

5 files changed

+128
-31
lines changed

5 files changed

+128
-31
lines changed

src/packagedcode/npm.py

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,7 @@ def parse(cls, location):
226226

227227
if not package.download_url:
228228
# Only add a synthetic download URL if there is none from the dist mapping.
229-
dnl_url = npm_download_url(package.namespace, package.name, package.version)
230-
package.download_url = dnl_url.strip()
229+
package.download_url = npm_download_url(package.namespace, package.name, package.version)
231230

232231
# licenses are a tad special with many different data structures
233232
lic = package_data.get('license')
@@ -781,12 +780,15 @@ def npm_homepage_url(namespace, name, registry='https://www.npmjs.com/package'):
781780
782781
>>> expected = 'https://yarnpkg.com/en/package/@ang/angular'
783782
>>> assert npm_homepage_url('@ang', 'angular', 'https://yarnpkg.com/en/package') == expected
783+
784+
>>> assert not npm_homepage_url(None, None)
784785
"""
785-
if namespace:
786-
ns_name = f'{namespace}/{name}'
787-
else:
788-
ns_name = name
789-
return f'{registry}/{ns_name}'
786+
if name:
787+
if namespace:
788+
ns_name = f'{namespace}/{name}'
789+
else:
790+
ns_name = name
791+
return f'{registry}/{ns_name}'
790792

791793

792794
def npm_download_url(namespace, name, version, registry='https://registry.npmjs.org'):
@@ -803,13 +805,15 @@ def npm_download_url(namespace, name, version, registry='https://registry.npmjs.
803805
804806
>>> expected = 'https://registry.npmjs.org/angular/-/angular-1.6.6.tgz'
805807
>>> assert npm_download_url(None, 'angular', '1.6.6') == expected
806-
"""
807-
if namespace:
808-
ns_name = f'{namespace}/{name}'
809808
810-
else:
811-
ns_name = name
812-
return f'{registry}/{ns_name}/-/{name}-{version}.tgz'
809+
>>> assert not npm_download_url(None, None, None)
810+
"""
811+
if name and version:
812+
if namespace:
813+
ns_name = f'{namespace}/{name}'
814+
else:
815+
ns_name = name
816+
return f'{registry}/{ns_name}/-/{name}-{version}.tgz'
813817

814818

815819
def npm_api_url(namespace, name, version=None, registry='https://registry.npmjs.org'):
@@ -827,20 +831,25 @@ def npm_api_url(namespace, name, version=None, registry='https://registry.npmjs.
827831
>>> assert result == 'https://registry.yarnpkg.com/@invisionag%2feslint-config-ivx'
828832
829833
>>> assert npm_api_url(None, 'angular', '1.6.6') == 'https://registry.npmjs.org/angular/1.6.6'
834+
835+
>>> assert not npm_api_url(None, None, None)
830836
"""
831-
version = version or ''
832-
if namespace:
833-
# this is a legacy wart: older registries used to always encode this /
834-
# FIXME: do NOT encode and use plain / instead
835-
ns_name = '%2f'.join([namespace, name])
836-
# there is no version-specific URL for scoped packages
837-
version = ''
838-
else:
839-
ns_name = name
837+
if name:
838+
if namespace:
839+
# this is a legacy wart: older registries used to always encode this /
840+
# FIXME: do NOT encode and use plain / instead
841+
ns_name = '%2f'.join([namespace, name])
842+
# there is no version-specific URL for scoped packages
843+
version = ''
844+
else:
845+
ns_name = name
846+
847+
if version:
848+
version = f'/{version}'
849+
else:
850+
version = ''
840851

841-
if version:
842-
version = f'/{version}'
843-
return f'{registry}/{ns_name}{version}'
852+
return f'{registry}/{ns_name}{version}'
844853

845854

846855
def is_scoped_package(name):

tests/packagedcode/data/npm/private-and-yarn/scan.expected.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,7 @@
786786
"parties": [],
787787
"keywords": [],
788788
"homepage_url": null,
789-
"download_url": "https://registry.npmjs.org/None/-/None-None.tgz",
789+
"download_url": null,
790790
"size": null,
791791
"sha1": null,
792792
"md5": null,
@@ -813,9 +813,9 @@
813813
"resolved_package": {}
814814
}
815815
],
816-
"repository_homepage_url": "https://www.npmjs.com/package/None",
817-
"repository_download_url": "https://registry.npmjs.org/None/-/None-None.tgz",
818-
"api_data_url": "https://registry.npmjs.org/None",
816+
"repository_homepage_url": null,
817+
"repository_download_url": null,
818+
"api_data_url": null,
819819
"datasource_id": "npm_package_json",
820820
"purl": null
821821
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"private": true,
3+
"scripts": {
4+
"prepare": "lerna run prepare",
5+
"rebuild:browser": "theia rebuild:browser",
6+
"rebuild:electron": "theia rebuild:electron"
7+
},
8+
"devDependencies": {
9+
"lerna": "3.13.0"
10+
},
11+
"workspaces": [
12+
"ballerina-extension", "browser-app", "electron-app"
13+
]
14+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
{
2+
"dependencies": [
3+
{
4+
"purl": "pkg:npm/lerna",
5+
"extracted_requirement": "3.13.0",
6+
"scope": "devDependencies",
7+
"is_runtime": false,
8+
"is_optional": true,
9+
"is_resolved": false,
10+
"resolved_package": {},
11+
"dependency_uid": "pkg:npm/lerna?uuid=fixed-uid-done-for-testing-5642512d1758",
12+
"for_package_uid": null,
13+
"datafile_path": "package.json",
14+
"datasource_id": "npm_package_json"
15+
}
16+
],
17+
"packages": [],
18+
"files": [
19+
{
20+
"path": "package.json",
21+
"type": "file",
22+
"package_data": [
23+
{
24+
"type": "npm",
25+
"namespace": null,
26+
"name": null,
27+
"version": null,
28+
"qualifiers": {},
29+
"subpath": null,
30+
"primary_language": "JavaScript",
31+
"description": null,
32+
"release_date": null,
33+
"parties": [],
34+
"keywords": [],
35+
"homepage_url": null,
36+
"download_url": null,
37+
"size": null,
38+
"sha1": null,
39+
"md5": null,
40+
"sha256": null,
41+
"sha512": null,
42+
"bug_tracking_url": null,
43+
"code_view_url": null,
44+
"vcs_url": null,
45+
"copyright": null,
46+
"license_expression": null,
47+
"declared_license": [],
48+
"notice_text": null,
49+
"source_packages": [],
50+
"file_references": [],
51+
"extra_data": {},
52+
"dependencies": [
53+
{
54+
"purl": "pkg:npm/lerna",
55+
"extracted_requirement": "3.13.0",
56+
"scope": "devDependencies",
57+
"is_runtime": false,
58+
"is_optional": true,
59+
"is_resolved": false,
60+
"resolved_package": {}
61+
}
62+
],
63+
"repository_homepage_url": null,
64+
"repository_download_url": null,
65+
"api_data_url": null,
66+
"datasource_id": "npm_package_json",
67+
"purl": null
68+
}
69+
],
70+
"for_packages": [],
71+
"scan_errors": []
72+
}
73+
]
74+
}

tests/packagedcode/data/npm/with_name/package.json.expected

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"parties": [],
1313
"keywords": [],
1414
"homepage_url": null,
15-
"download_url": "https://registry.npmjs.org/bson/-/bson-None.tgz",
15+
"download_url": null,
1616
"size": null,
1717
"sha1": null,
1818
"md5": null,
@@ -35,7 +35,7 @@
3535
"extra_data": {},
3636
"dependencies": [],
3737
"repository_homepage_url": "https://www.npmjs.com/package/bson",
38-
"repository_download_url": "https://registry.npmjs.org/bson/-/bson-None.tgz",
38+
"repository_download_url": null,
3939
"api_data_url": "https://registry.npmjs.org/bson",
4040
"datasource_id": "npm_package_json",
4141
"purl": "pkg:npm/bson"

0 commit comments

Comments
 (0)