diff --git a/swh/loader/package/pubdev/loader.py b/swh/loader/package/pubdev/loader.py --- a/swh/loader/package/pubdev/loader.py +++ b/swh/loader/package/pubdev/loader.py @@ -2,8 +2,8 @@ # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information + from distutils.version import LooseVersion -import json from pathlib import Path from typing import Any, Dict, Iterator, Optional, Sequence, Tuple @@ -11,13 +11,7 @@ import yaml from swh.loader.package.loader import BasePackageInfo, PackageLoader -from swh.loader.package.utils import ( - EMPTY_AUTHOR, - Person, - api_info, - cached_method, - release_name, -) +from swh.loader.package.utils import EMPTY_AUTHOR, Person, release_name from swh.model.model import ObjectType, Release, Sha1Git, TimestampWithTimezone from swh.storage.interface import StorageInterface @@ -65,24 +59,18 @@ self, storage: StorageInterface, url: str, + package_versions: Dict[str, Any], **kwargs, ): super().__init__(storage=storage, url=url, **kwargs) self.url = url - - def _raw_info(self) -> bytes: - return api_info(self.url) - - @cached_method - def info(self) -> Dict: - """Return the project metadata information (fetched from pub.dev registry)""" - # Use strict=False in order to correctly manage case where \n is present in a string - info = json.loads(self._raw_info(), strict=False) - # Arrange versions list as a new dict with `version` as key - versions = {v["version"]: v for v in info["versions"]} - info["versions"] = versions - return info + if package_versions: + # Arrange versions list as a new dict with `version` as key + package_versions["versions"] = { + v["version"]: v for v in package_versions["versions"] + } + self.package_versions = package_versions def get_versions(self) -> Sequence[str]: """Get all released versions of a PubDev package @@ -94,7 +82,7 @@ ["0.1.1", "0.10.2"] """ - versions = list(self.info()["versions"].keys()) + versions = list(self.package_versions["versions"].keys()) versions.sort(key=LooseVersion) return versions @@ -108,13 +96,13 @@ "0.1.2" """ - latest = self.info()["latest"] + latest = self.package_versions["latest"] return latest["version"] def get_package_info(self, version: str) -> Iterator[Tuple[str, PubDevPackageInfo]]: """Get release name and package information from version - Package info comes from extrinsic metadata (from self.info()) + Package info comes from extrinsic metadata (from self.package_versions) Args: version: Package version (e.g: "0.1.0") @@ -122,7 +110,7 @@ Returns: Iterator of tuple (release_name, p_info) """ - v = self.info()["versions"][version] + v = self.package_versions["versions"][version] assert v["version"] == version url = v["archive_url"] diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_Autolinker b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_Autolinker --- a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_Autolinker +++ b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_Autolinker @@ -1,2 +1,29 @@ -{"name":"Autolinker","latest":{"version":"0.1.1","pubspec":{"version":"0.1.1","homepage":"https://github.com/hackcave","description":"Port of Autolinker.js to dart","name":"Autolinker","author":"hackcave "},"archive_url":"https://pub.dartlang.org/packages/Autolinker/versions/0.1.1.tar.gz","published":"2014-12-24T22:34:02.534090Z"},"versions":[{"version":"0.1.1","pubspec":{"version":"0.1.1","homepage":"https://github.com/hackcave","description":"Port of Autolinker.js to dart","name":"Autolinker","author":"hackcave "},"archive_url":"https://pub.dartlang.org/packages/Autolinker/versions/0.1.1.tar.gz","published":"2014-12-24T22:34:02.534090Z"}]} - +{ + "name": "Autolinker", + "latest": { + "version": "0.1.1", + "pubspec": { + "version": "0.1.1", + "homepage": "https://github.com/hackcave", + "description": "Port of Autolinker.js to dart", + "name": "Autolinker", + "author": "hackcave " + }, + "archive_url": "https://pub.dartlang.org/packages/Autolinker/versions/0.1.1.tar.gz", + "published": "2014-12-24T22:34:02.534090Z" + }, + "versions": [ + { + "version": "0.1.1", + "pubspec": { + "version": "0.1.1", + "homepage": "https://github.com/hackcave", + "description": "Port of Autolinker.js to dart", + "name": "Autolinker", + "author": "hackcave " + }, + "archive_url": "https://pub.dartlang.org/packages/Autolinker/versions/0.1.1.tar.gz", + "published": "2014-12-24T22:34:02.534090Z" + } + ] +} \ No newline at end of file diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_abstract_io b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_abstract_io --- a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_abstract_io +++ b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_abstract_io @@ -1,2 +1,93 @@ -{"name":"abstract_io","latest":{"version":"0.1.2+6","pubspec":{"name":"abstract_io","description":"Abstract IO is designed to simplify and generalize saving data both localy and externaly","version":"0.1.2+6","author":"Anders Groeschel","repository":"https://github.com/AndersGroeschel/abstract_io","homepage":"https://github.com/AndersGroeschel/abstract_io","environment":{"sdk":">=2.7.0 <3.0.0"},"dependencies":{"flutter":{"sdk":"flutter"}}},"archive_url":"https://pub.dartlang.org/packages/abstract_io/versions/0.1.2%2B6.tar.gz","archive_sha256":"9557fd384730d92a046cfccdff9625f2d646657219d5a0e447cb7eb0fdf90f18","published":"2020-08-03T21:31:05.764846Z"},"versions":[{"version":"0.1.2+4","pubspec":{"name":"abstract_io","description":"Abstract IO is designed to simplify and generalize saving data both localy and externaly","version":"0.1.2+4","author":"Anders Groeschel","repository":"https://github.com/AndersGroeschel/abstract_io","homepage":"https://github.com/AndersGroeschel/abstract_io","environment":{"sdk":">=2.7.0 <3.0.0"},"dependencies":{"flutter":{"sdk":"flutter"}}},"archive_url":"https://pub.dartlang.org/packages/abstract_io/versions/0.1.2%2B4.tar.gz","archive_sha256":"df687ff2a92774db04a28167ccddbfe9c2fc1ea63c6ae05c3236552fe350bb68","published":"2020-08-03T20:14:38.116237Z"},{"version":"0.1.2+5","pubspec":{"name":"abstract_io","description":"Abstract IO is designed to simplify and generalize saving data both localy and externaly","version":"0.1.2+5","author":"Anders Groeschel","repository":"https://github.com/AndersGroeschel/abstract_io","homepage":"https://github.com/AndersGroeschel/abstract_io","environment":{"sdk":">=2.7.0 <3.0.0"},"dependencies":{"flutter":{"sdk":"flutter"}}},"archive_url":"https://pub.dartlang.org/packages/abstract_io/versions/0.1.2%2B5.tar.gz","archive_sha256":"fc9199c2f9879d3c0d140c05a2f8c537561af256d98d209b4ee102e8107ec2b9","published":"2020-08-03T21:09:20.329418Z"},{"version":"0.1.2+6","pubspec":{"name":"abstract_io","description":"Abstract IO is designed to simplify and generalize saving data both localy and externaly","version":"0.1.2+6","author":"Anders Groeschel","repository":"https://github.com/AndersGroeschel/abstract_io","homepage":"https://github.com/AndersGroeschel/abstract_io","environment":{"sdk":">=2.7.0 <3.0.0"},"dependencies":{"flutter":{"sdk":"flutter"}}},"archive_url":"https://pub.dartlang.org/packages/abstract_io/versions/0.1.2%2B6.tar.gz","archive_sha256":"9557fd384730d92a046cfccdff9625f2d646657219d5a0e447cb7eb0fdf90f18","published":"2020-08-03T21:31:05.764846Z"}]} - +{ + "name": "abstract_io", + "latest": { + "version": "0.1.2+6", + "pubspec": { + "name": "abstract_io", + "description": "Abstract IO is designed to simplify and generalize saving data both localy and externaly", + "version": "0.1.2+6", + "author": "Anders Groeschel", + "repository": "https://github.com/AndersGroeschel/abstract_io", + "homepage": "https://github.com/AndersGroeschel/abstract_io", + "environment": { + "sdk": ">=2.7.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/abstract_io/versions/0.1.2%2B6.tar.gz", + "archive_sha256": "9557fd384730d92a046cfccdff9625f2d646657219d5a0e447cb7eb0fdf90f18", + "published": "2020-08-03T21:31:05.764846Z" + }, + "versions": [ + { + "version": "0.1.2+4", + "pubspec": { + "name": "abstract_io", + "description": "Abstract IO is designed to simplify and generalize saving data both localy and externaly", + "version": "0.1.2+4", + "author": "Anders Groeschel", + "repository": "https://github.com/AndersGroeschel/abstract_io", + "homepage": "https://github.com/AndersGroeschel/abstract_io", + "environment": { + "sdk": ">=2.7.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/abstract_io/versions/0.1.2%2B4.tar.gz", + "archive_sha256": "df687ff2a92774db04a28167ccddbfe9c2fc1ea63c6ae05c3236552fe350bb68", + "published": "2020-08-03T20:14:38.116237Z" + }, + { + "version": "0.1.2+5", + "pubspec": { + "name": "abstract_io", + "description": "Abstract IO is designed to simplify and generalize saving data both localy and externaly", + "version": "0.1.2+5", + "author": "Anders Groeschel", + "repository": "https://github.com/AndersGroeschel/abstract_io", + "homepage": "https://github.com/AndersGroeschel/abstract_io", + "environment": { + "sdk": ">=2.7.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/abstract_io/versions/0.1.2%2B5.tar.gz", + "archive_sha256": "fc9199c2f9879d3c0d140c05a2f8c537561af256d98d209b4ee102e8107ec2b9", + "published": "2020-08-03T21:09:20.329418Z" + }, + { + "version": "0.1.2+6", + "pubspec": { + "name": "abstract_io", + "description": "Abstract IO is designed to simplify and generalize saving data both localy and externaly", + "version": "0.1.2+6", + "author": "Anders Groeschel", + "repository": "https://github.com/AndersGroeschel/abstract_io", + "homepage": "https://github.com/AndersGroeschel/abstract_io", + "environment": { + "sdk": ">=2.7.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/abstract_io/versions/0.1.2%2B6.tar.gz", + "archive_sha256": "9557fd384730d92a046cfccdff9625f2d646657219d5a0e447cb7eb0fdf90f18", + "published": "2020-08-03T21:31:05.764846Z" + } + ] +} \ No newline at end of file diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_authentication b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_authentication --- a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_authentication +++ b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_authentication @@ -1,2 +1,77 @@ -{"name":"authentication","latest":{"version":"0.0.1","pubspec":{"name":"authentication","description":"Persistent user authentication for Flutter with optional backend API integration.","version":"0.0.1","author":null,"homepage":null,"environment":{"sdk":">=2.7.0 <3.0.0","flutter":">=1.17.0 <2.0.0"},"dependencies":{"flutter":{"sdk":"flutter"}},"dev_dependencies":{"flutter_test":{"sdk":"flutter"}},"flutter":{"plugin":{"platforms":{"some_platform":{"pluginClass":"somePluginClass"}}}}},"archive_url":"https://pub.dartlang.org/packages/authentication/versions/0.0.1.tar.gz","archive_sha256":"0179334b346cb67e4e6e3c905e5cc5c8e488a45ebd99fd2be3a7e0476d620d99","published":"2020-08-13T04:53:34.134687Z"},"versions":[{"version":"0.0.1","pubspec":{"name":"authentication","description":"Persistent user authentication for Flutter with optional backend API integration.","version":"0.0.1","author":null,"homepage":null,"environment":{"sdk":">=2.7.0 <3.0.0","flutter":">=1.17.0 <2.0.0"},"dependencies":{"flutter":{"sdk":"flutter"}},"dev_dependencies":{"flutter_test":{"sdk":"flutter"}},"flutter":{"plugin":{"platforms":{"some_platform":{"pluginClass":"somePluginClass"}}}}},"archive_url":"https://pub.dartlang.org/packages/authentication/versions/0.0.1.tar.gz","archive_sha256":"0179334b346cb67e4e6e3c905e5cc5c8e488a45ebd99fd2be3a7e0476d620d99","published":"2020-08-13T04:53:34.134687Z"}]} - +{ + "name": "authentication", + "latest": { + "version": "0.0.1", + "pubspec": { + "name": "authentication", + "description": "Persistent user authentication for Flutter with optional backend API integration.", + "version": "0.0.1", + "author": null, + "homepage": null, + "environment": { + "sdk": ">=2.7.0 <3.0.0", + "flutter": ">=1.17.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "some_platform": { + "pluginClass": "somePluginClass" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/authentication/versions/0.0.1.tar.gz", + "archive_sha256": "0179334b346cb67e4e6e3c905e5cc5c8e488a45ebd99fd2be3a7e0476d620d99", + "published": "2020-08-13T04:53:34.134687Z" + }, + "versions": [ + { + "version": "0.0.1", + "pubspec": { + "name": "authentication", + "description": "Persistent user authentication for Flutter with optional backend API integration.", + "version": "0.0.1", + "author": null, + "homepage": null, + "environment": { + "sdk": ">=2.7.0 <3.0.0", + "flutter": ">=1.17.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "some_platform": { + "pluginClass": "somePluginClass" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/authentication/versions/0.0.1.tar.gz", + "archive_sha256": "0179334b346cb67e4e6e3c905e5cc5c8e488a45ebd99fd2be3a7e0476d620d99", + "published": "2020-08-13T04:53:34.134687Z" + } + ] +} \ No newline at end of file diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_bezier b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_bezier --- a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_bezier +++ b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_bezier @@ -1,4 +1,55 @@ -{"name":"bezier","latest":{"version":"1.1.5","pubspec":{"name":"bezier","version":"1.1.5","authors":["Aaron Barrett ","Isaac Barrett "],"description":"A 2D Bézier curve math library. Based heavily on the work of @TheRealPomax . -Live examples can be found at .","homepage":"https://github.com/aab29/bezier.dart","environment":{"sdk":">=2.0.0 <3.0.0"},"dependencies":{"vector_math":"^2.0.0"},"dev_dependencies":{"test":"^1.0.0"}},"archive_url":"https://pub.dartlang.org/packages/bezier/versions/1.1.5.tar.gz","archive_sha256":"cc5da2fa927b5d347550f78d456cd984b7df78a7f0405119cdab12111e2f9ee8","published":"2019-12-22T03:17:30.805225Z"},"versions":[{"version":"1.1.5","pubspec":{"name":"bezier","version":"1.1.5","authors":["Aaron Barrett ","Isaac Barrett "],"description":"A 2D Bézier curve math library. Based heavily on the work of @TheRealPomax . -Live examples can be found at .","homepage":"https://github.com/aab29/bezier.dart","environment":{"sdk":">=2.0.0 <3.0.0"},"dependencies":{"vector_math":"^2.0.0"},"dev_dependencies":{"test":"^1.0.0"}},"archive_url":"https://pub.dartlang.org/packages/bezier/versions/1.1.5.tar.gz","archive_sha256":"cc5da2fa927b5d347550f78d456cd984b7df78a7f0405119cdab12111e2f9ee8","published":"2019-12-22T03:17:30.805225Z"}]} - +{ + "name": "bezier", + "latest": { + "version": "1.1.5", + "pubspec": { + "name": "bezier", + "version": "1.1.5", + "authors": [ + "Aaron Barrett ", + "Isaac Barrett " + ], + "description": "A 2D Bézier curve math library. Based heavily on the work of @TheRealPomax .\nLive examples can be found at .", + "homepage": "https://github.com/aab29/bezier.dart", + "environment": { + "sdk": ">=2.0.0 <3.0.0" + }, + "dependencies": { + "vector_math": "^2.0.0" + }, + "dev_dependencies": { + "test": "^1.0.0" + } + }, + "archive_url": "https://pub.dartlang.org/packages/bezier/versions/1.1.5.tar.gz", + "archive_sha256": "cc5da2fa927b5d347550f78d456cd984b7df78a7f0405119cdab12111e2f9ee8", + "published": "2019-12-22T03:17:30.805225Z" + }, + "versions": [ + { + "version": "1.1.5", + "pubspec": { + "name": "bezier", + "version": "1.1.5", + "authors": [ + "Aaron Barrett ", + "Isaac Barrett " + ], + "description": "A 2D Bézier curve math library. Based heavily on the work of @TheRealPomax .\nLive examples can be found at .", + "homepage": "https://github.com/aab29/bezier.dart", + "environment": { + "sdk": ">=2.0.0 <3.0.0" + }, + "dependencies": { + "vector_math": "^2.0.0" + }, + "dev_dependencies": { + "test": "^1.0.0" + } + }, + "archive_url": "https://pub.dartlang.org/packages/bezier/versions/1.1.5.tar.gz", + "archive_sha256": "cc5da2fa927b5d347550f78d456cd984b7df78a7f0405119cdab12111e2f9ee8", + "published": "2019-12-22T03:17:30.805225Z" + } + ] +} \ No newline at end of file diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_pdf b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_pdf --- a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_pdf +++ b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_pdf @@ -1,2 +1,88 @@ -{"name":"pdf","latest":{"version":"3.8.2","pubspec":{"name":"pdf","description":"A pdf producer for Dart. It can create pdf files for both web or flutter.","homepage":"https://github.com/DavBfr/dart_pdf/tree/master/pdf","repository":"https://github.com/DavBfr/dart_pdf","issue_tracker":"https://github.com/DavBfr/dart_pdf/issues","version":"3.8.2","environment":{"sdk":">=2.12.0 <3.0.0"},"dependencies":{"archive":"^3.1.0","barcode":">=2.2.0 <3.0.0","crypto":"^3.0.0","image":">=3.0.1 <4.0.0","meta":">=1.3.0 <2.0.0","path_parsing":">=0.2.0 <2.0.0","vector_math":"^2.1.0","xml":">=5.1.0 <7.0.0"},"dev_dependencies":{"flutter_lints":"^1.0.4","test":">=1.16.0 <2.0.0"}},"archive_url":"https://pub.dartlang.org/packages/pdf/versions/3.8.2.tar.gz","published":"2022-07-25T11:38:25.983876Z"},"versions":[{"version":"1.0.0","pubspec":{"version":"1.0.0","name":"pdf","dependencies":{"ttf_parser":"^1.0.0","vector_math":"^2.0.7","meta":"^1.1.5"},"author":"David PHAM-VAN ","description":"A pdf producer for Dart","homepage":"https://github.com/davbfr/dart_pdf","environment":{"sdk":">=1.8.0 <2.0.0"},"dev_dependencies":{"test":"any"}},"archive_url":"https://pub.dartlang.org/packages/pdf/versions/1.0.0.tar.gz","published":"2018-07-16T21:12:28.894137Z"},{"version":"3.8.2","pubspec":{"name":"pdf","description":"A pdf producer for Dart. It can create pdf files for both web or flutter.","homepage":"https://github.com/DavBfr/dart_pdf/tree/master/pdf","repository":"https://github.com/DavBfr/dart_pdf","issue_tracker":"https://github.com/DavBfr/dart_pdf/issues","version":"3.8.2","environment":{"sdk":">=2.12.0 <3.0.0"},"dependencies":{"archive":"^3.1.0","barcode":">=2.2.0 <3.0.0","crypto":"^3.0.0","image":">=3.0.1 <4.0.0","meta":">=1.3.0 <2.0.0","path_parsing":">=0.2.0 <2.0.0","vector_math":"^2.1.0","xml":">=5.1.0 <7.0.0"},"dev_dependencies":{"flutter_lints":"^1.0.4","test":">=1.16.0 <2.0.0"}},"archive_url":"https://pub.dartlang.org/packages/pdf/versions/3.8.2.tar.gz","published":"2022-07-25T11:38:25.983876Z"}]} - +{ + "name": "pdf", + "latest": { + "version": "3.8.2", + "pubspec": { + "name": "pdf", + "description": "A pdf producer for Dart. It can create pdf files for both web or flutter.", + "homepage": "https://github.com/DavBfr/dart_pdf/tree/master/pdf", + "repository": "https://github.com/DavBfr/dart_pdf", + "issue_tracker": "https://github.com/DavBfr/dart_pdf/issues", + "version": "3.8.2", + "environment": { + "sdk": ">=2.12.0 <3.0.0" + }, + "dependencies": { + "archive": "^3.1.0", + "barcode": ">=2.2.0 <3.0.0", + "crypto": "^3.0.0", + "image": ">=3.0.1 <4.0.0", + "meta": ">=1.3.0 <2.0.0", + "path_parsing": ">=0.2.0 <2.0.0", + "vector_math": "^2.1.0", + "xml": ">=5.1.0 <7.0.0" + }, + "dev_dependencies": { + "flutter_lints": "^1.0.4", + "test": ">=1.16.0 <2.0.0" + } + }, + "archive_url": "https://pub.dartlang.org/packages/pdf/versions/3.8.2.tar.gz", + "published": "2022-07-25T11:38:25.983876Z" + }, + "versions": [ + { + "version": "1.0.0", + "pubspec": { + "version": "1.0.0", + "name": "pdf", + "dependencies": { + "ttf_parser": "^1.0.0", + "vector_math": "^2.0.7", + "meta": "^1.1.5" + }, + "author": "David PHAM-VAN ", + "description": "A pdf producer for Dart", + "homepage": "https://github.com/davbfr/dart_pdf", + "environment": { + "sdk": ">=1.8.0 <2.0.0" + }, + "dev_dependencies": { + "test": "any" + } + }, + "archive_url": "https://pub.dartlang.org/packages/pdf/versions/1.0.0.tar.gz", + "published": "2018-07-16T21:12:28.894137Z" + }, + { + "version": "3.8.2", + "pubspec": { + "name": "pdf", + "description": "A pdf producer for Dart. It can create pdf files for both web or flutter.", + "homepage": "https://github.com/DavBfr/dart_pdf/tree/master/pdf", + "repository": "https://github.com/DavBfr/dart_pdf", + "issue_tracker": "https://github.com/DavBfr/dart_pdf/issues", + "version": "3.8.2", + "environment": { + "sdk": ">=2.12.0 <3.0.0" + }, + "dependencies": { + "archive": "^3.1.0", + "barcode": ">=2.2.0 <3.0.0", + "crypto": "^3.0.0", + "image": ">=3.0.1 <4.0.0", + "meta": ">=1.3.0 <2.0.0", + "path_parsing": ">=0.2.0 <2.0.0", + "vector_math": "^2.1.0", + "xml": ">=5.1.0 <7.0.0" + }, + "dev_dependencies": { + "flutter_lints": "^1.0.4", + "test": ">=1.16.0 <2.0.0" + } + }, + "archive_url": "https://pub.dartlang.org/packages/pdf/versions/3.8.2.tar.gz", + "published": "2022-07-25T11:38:25.983876Z" + } + ] +} \ No newline at end of file diff --git a/swh/loader/package/pubdev/tests/test_pubdev.py b/swh/loader/package/pubdev/tests/test_pubdev.py --- a/swh/loader/package/pubdev/tests/test_pubdev.py +++ b/swh/loader/package/pubdev/tests/test_pubdev.py @@ -2,6 +2,9 @@ # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information + +import requests + from swh.loader.package.pubdev.loader import PubDevLoader from swh.loader.package.utils import EMPTY_AUTHOR from swh.loader.tests import assert_last_visit_matches, check_snapshot, get_stats @@ -16,29 +19,35 @@ TimestampWithTimezone, ) -EXPECTED_PACKAGES = [ - { - "url": "https://pub.dev/api/packages/Autolinker", # one version +EXPECTED_PACKAGES = { + "Autolinker": { # one version + "origin_url": "https://pub.dev/packages/Autolinker", + "api_url": "https://pub.dev/api/packages/Autolinker", }, - { - "url": "https://pub.dev/api/packages/pdf", # multiple versions + "pdf": { # multiple versions + "origin_url": "https://pub.dev/packages/pdf", + "api_url": "https://pub.dev/api/packages/pdf", }, - { - "url": "https://pub.dev/api/packages/bezier", # multiple authors + "bezier": { # multiple authors + "origin_url": "https://pub.dev/packages/bezier", + "api_url": "https://pub.dev/api/packages/bezier", }, - { - "url": "https://pub.dev/api/packages/authentication", # empty author + "authentication": { # empty author + "origin_url": "https://pub.dev/api/packages/authentication", + "api_url": "https://pub.dev/api/packages/authentication", }, - { - "url": "https://pub.dev/api/packages/abstract_io", # loose versions names + "abstract_io": { # loose versions names + "origin_url": "https://pub.dev/api/packages/abstract_io", + "api_url": "https://pub.dev/api/packages/abstract_io", }, -] +} def test_get_versions(requests_mock_datadir, swh_storage): loader = PubDevLoader( swh_storage, - url=EXPECTED_PACKAGES[1]["url"], + url=EXPECTED_PACKAGES["pdf"]["origin_url"], + package_versions=requests.get(EXPECTED_PACKAGES["pdf"]["api_url"]).json(), ) assert loader.get_versions() == [ "1.0.0", @@ -50,7 +59,10 @@ """Sometimes version name does not follow semver""" loader = PubDevLoader( swh_storage, - url=EXPECTED_PACKAGES[4]["url"], + url=EXPECTED_PACKAGES["abstract_io"]["origin_url"], + package_versions=requests.get( + EXPECTED_PACKAGES["abstract_io"]["api_url"] + ).json(), ) assert loader.get_versions() == ["0.1.2+4", "0.1.2+5", "0.1.2+6"] @@ -58,7 +70,8 @@ def test_get_default_version(requests_mock_datadir, swh_storage): loader = PubDevLoader( swh_storage, - url=EXPECTED_PACKAGES[1]["url"], + url=EXPECTED_PACKAGES["pdf"]["origin_url"], + package_versions=requests.get(EXPECTED_PACKAGES["pdf"]["api_url"]).json(), ) assert loader.get_default_version() == "3.8.2" @@ -66,7 +79,10 @@ def test_pubdev_loader_load_one_version(datadir, requests_mock_datadir, swh_storage): loader = PubDevLoader( swh_storage, - url=EXPECTED_PACKAGES[0]["url"], + url=EXPECTED_PACKAGES["Autolinker"]["origin_url"], + package_versions=requests.get( + EXPECTED_PACKAGES["Autolinker"]["api_url"] + ).json(), ) load_status = loader.load() assert load_status["status"] == "eventful" @@ -123,7 +139,7 @@ assert_last_visit_matches( swh_storage, - url=EXPECTED_PACKAGES[0]["url"], + url=EXPECTED_PACKAGES["Autolinker"]["origin_url"], status="full", type="pubdev", snapshot=expected_snapshot.id, @@ -135,7 +151,8 @@ ): loader = PubDevLoader( swh_storage, - url=EXPECTED_PACKAGES[1]["url"], + url=EXPECTED_PACKAGES["pdf"]["origin_url"], + package_versions=requests.get(EXPECTED_PACKAGES["pdf"]["api_url"]).json(), ) load_status = loader.load() @@ -180,7 +197,7 @@ assert_last_visit_matches( swh_storage, - url=EXPECTED_PACKAGES[1]["url"], + url=EXPECTED_PACKAGES["pdf"]["origin_url"], status="full", type="pubdev", snapshot=expected_snapshot.id, @@ -190,7 +207,8 @@ def test_pubdev_loader_multiple_authors(datadir, requests_mock_datadir, swh_storage): loader = PubDevLoader( swh_storage, - url=EXPECTED_PACKAGES[2]["url"], + url=EXPECTED_PACKAGES["bezier"]["origin_url"], + package_versions=requests.get(EXPECTED_PACKAGES["bezier"]["api_url"]).json(), ) load_status = loader.load() assert load_status["status"] == "eventful" @@ -228,7 +246,10 @@ def test_pubdev_loader_empty_author(datadir, requests_mock_datadir, swh_storage): loader = PubDevLoader( swh_storage, - url=EXPECTED_PACKAGES[3]["url"], + url=EXPECTED_PACKAGES["authentication"]["origin_url"], + package_versions=requests.get( + EXPECTED_PACKAGES["authentication"]["api_url"] + ).json(), ) load_status = loader.load() @@ -262,8 +283,7 @@ def test_pubdev_invalid_origin(swh_storage, requests_mock_datadir): loader = PubDevLoader( - swh_storage, - "http://nowhere/api/packages/42", + swh_storage, "http://nowhere/api/packages/42", package_versions={} ) load_status = loader.load() diff --git a/swh/loader/package/pubdev/tests/test_tasks.py b/swh/loader/package/pubdev/tests/test_tasks.py --- a/swh/loader/package/pubdev/tests/test_tasks.py +++ b/swh/loader/package/pubdev/tests/test_tasks.py @@ -14,6 +14,7 @@ "swh.loader.package.pubdev.tasks.LoadPubDev", kwargs=dict( url="some-url/api/packages/some-package", + package_versions={"latest": {}, "versions": []}, ), ) assert res