diff --git a/swh/loader/package/npm/loader.py b/swh/loader/package/npm/loader.py --- a/swh/loader/package/npm/loader.py +++ b/swh/loader/package/npm/loader.py @@ -89,7 +89,16 @@ # metadata, using the version number that the API claims this package # has. extrinsic_version = a_metadata['version'] - date = self.info['time'][extrinsic_version] + + if 'time' in self.info: + date = self.info['time'][extrinsic_version] + else: + artifact_name = os.path.basename(a_metadata['dist']['tarball']) + raise ValueError( + 'Origin %s: Cannot determine upload time for artifact %s.' % + (self.url, artifact_name) + ) + date = iso8601.parse_date(date) date = normalize_timestamp(int(date.timestamp())) diff --git a/swh/loader/package/npm/tests/data/https_replicate.npmjs.com/jammit-no-time b/swh/loader/package/npm/tests/data/https_replicate.npmjs.com/jammit-no-time new file mode 100644 --- /dev/null +++ b/swh/loader/package/npm/tests/data/https_replicate.npmjs.com/jammit-no-time @@ -0,0 +1,76 @@ +{ + "_id": "jammit-express", + "_rev": "1-ffa3f96992e5e31dd29df779dc771e84", + "name": "jammit-express", + "description": "Jammit Helpers for Express.js", + "dist-tags": { + "latest": "0.0.1" + }, + "versions": { + "0.0.1": { + "name": "jammit-express", + "version": "0.0.1", + "description": "Jammit Helpers for Express.js", + "author": { + "name": "Eric Abouaf", + "email": "eric.abouaf@mail.com" + }, + "bugs": { + "web": "http://github.com/neyric/jammit-express/issues" + }, + "os": [ + "darwin", + "linux" + ], + "contributors": [ + { + "name": "Eric Abouaf", + "email": "eric.abouaf@mail.com", + "url": "http://neyric.com" + } + ], + "engines": { + "node": ">=0.2.0" + }, + "directories": { + "lib": "lib" + }, + "main": "./init", + "bin": null, + "dependencies": null, + "licenses": [ + { + "type": "BSD" + } + ], + "repository": { + "type": "git", + "url": "http://github.com/neyric/jammit-express.git" + }, + "_id": "jammit-express@0.0.1", + "_nodeSupported": true, + "_npmVersion": "0.2.7-2", + "_nodeVersion": "v0.3.1-pre", + "dist": { + "tarball": "https://registry.npmjs.org/jammit-express/-/jammit-express-0.0.1.tgz", + "shasum": "10927257f0512af082200a91e24d9ec9cccedbba" + } + } + }, + "maintainers": [ + { + "name": "neyric", + "email": "eric.abouaf@mail.com" + } + ], + "author": { + "name": "Eric Abouaf", + "email": "eric.abouaf@mail.com" + }, + "repository": { + "type": "git", + "url": "http://github.com/neyric/jammit-express.git" + }, + "readme": "", + "readmeFilename": "" +} diff --git a/swh/loader/package/npm/tests/test_npm.py b/swh/loader/package/npm/tests/test_npm.py --- a/swh/loader/package/npm/tests/test_npm.py +++ b/swh/loader/package/npm/tests/test_npm.py @@ -533,3 +533,26 @@ origin_visit = list(loader.storage.origin_visit_get(url))[-1] assert origin_visit['status'] == 'full' assert origin_visit['type'] == 'npm' + + +def test_npm_artifact_with_no_upload_time(swh_config, requests_mock_datadir): + """With no time upload, artifact is skipped + + """ + package = 'jammit-no-time' + url = package_url(package) + loader = NpmLoader(url) + + actual_load_status = loader.load() + assert actual_load_status['status'] == 'failed' + + # no branch as one artifact without any intrinsic metadata + expected_snapshot = { + 'id': '1a8893e6a86f444e8be8e7bda6cb34fb1735a00e', + 'branches': {}, + } + check_snapshot(expected_snapshot, loader.storage) + + origin_visit = list(loader.storage.origin_visit_get(url))[-1] + assert origin_visit['status'] == 'partial' + assert origin_visit['type'] == 'npm'