diff --git a/requirements.txt b/requirements.txt index 644a170..87e7f99 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,13 @@ # Add here external Python modules dependencies, one per line. Module names # should match https://pypi.python.org/pypi names. For the full spec or # dependency lines, see https://pip.readthedocs.org/en/1.1/requirements.html psutil requests iso8601 pkginfo python-debian python-dateutil typing-extensions toml +packaging diff --git a/swh/loader/package/pubdev/loader.py b/swh/loader/package/pubdev/loader.py index 2a0a944..bcce138 100644 --- a/swh/loader/package/pubdev/loader.py +++ b/swh/loader/package/pubdev/loader.py @@ -1,194 +1,194 @@ # Copyright (C) 2022 The Software Heritage developers # 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 import attr +from packaging.version import parse as parse_version 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.model.model import ObjectType, Release, Sha1Git, TimestampWithTimezone from swh.storage.interface import StorageInterface @attr.s class PubDevPackageInfo(BasePackageInfo): name = attr.ib(type=str) """Name of the package""" version = attr.ib(type=str) """Current version""" last_modified = attr.ib(type=str) """Last modified date as release date""" author = attr.ib(type=Person) """Author""" description = attr.ib(type=str) """Description""" def extract_intrinsic_metadata(dir_path: Path) -> Dict[str, Any]: """Extract intrinsic metadata from pubspec.yaml file at dir_path. Each pub.dev package version has a pubspec.yaml file at the root of the archive. See https://dart.dev/tools/pub/pubspec for pubspec specifications. Args: dir_path: A directory on disk where a pubspec.yaml must be present Returns: A dict mapping from yaml parser """ pubspec_path = dir_path / "pubspec.yaml" return yaml.safe_load(pubspec_path.read_text()) class PubDevLoader(PackageLoader[PubDevPackageInfo]): visit_type = "pubdev" PUBDEV_BASE_URL = "https://pub.dev/" def __init__( self, storage: StorageInterface, url: str, **kwargs, ): super().__init__(storage=storage, url=url, **kwargs) self.url = url assert url.startswith(self.PUBDEV_BASE_URL) self.package_info_url = url.replace( self.PUBDEV_BASE_URL, f"{self.PUBDEV_BASE_URL}api/" ) def _raw_info(self) -> bytes: return api_info(self.package_info_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 def get_versions(self) -> Sequence[str]: """Get all released versions of a PubDev package Returns: A sequence of versions Example:: ["0.1.1", "0.10.2"] """ versions = list(self.info()["versions"].keys()) - versions.sort(key=LooseVersion) + versions.sort(key=parse_version) return versions def get_default_version(self) -> str: """Get the newest release version of a PubDev package Returns: A string representing a version Example:: "0.1.2" """ latest = self.info()["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()) Args: version: Package version (e.g: "0.1.0") Returns: Iterator of tuple (release_name, p_info) """ v = self.info()["versions"][version] assert v["version"] == version url = v["archive_url"] name = v["pubspec"]["name"] filename = f"{name}-{version}.tar.gz" last_modified = v["published"] if "authors" in v["pubspec"]: # TODO: here we have a list of author, see T3887 author = Person.from_fullname(v["pubspec"]["authors"][0].encode()) elif "author" in v["pubspec"] and v["pubspec"]["author"] is not None: author = Person.from_fullname(v["pubspec"]["author"].encode()) else: author = EMPTY_AUTHOR description = v["pubspec"]["description"] p_info = PubDevPackageInfo( name=name, filename=filename, url=url, version=version, last_modified=last_modified, author=author, description=description, ) yield release_name(version), p_info def build_release( self, p_info: PubDevPackageInfo, uncompressed_path: str, directory: Sha1Git ) -> Optional[Release]: # Extract intrinsic metadata from uncompressed_path/pubspec.yaml intrinsic_metadata = extract_intrinsic_metadata(Path(uncompressed_path)) name: str = intrinsic_metadata["name"] version: str = intrinsic_metadata["version"] assert version == p_info.version # author from intrinsic_metadata should not take precedence over the one # returned by the api, see https://dart.dev/tools/pub/pubspec#authorauthors author: Person = p_info.author if "description" in intrinsic_metadata and intrinsic_metadata["description"]: description = intrinsic_metadata["description"] else: description = p_info.description message = ( f"Synthetic release for pub.dev source package {name} " f"version {version}\n\n" f"{description}\n" ) return Release( name=version.encode(), author=author, date=TimestampWithTimezone.from_iso8601(p_info.last_modified), message=message.encode(), target_type=ObjectType.DIRECTORY, target=directory, synthetic=True, ) diff --git a/swh/loader/package/pubdev/tests/data/fake_pubdev.sh b/swh/loader/package/pubdev/tests/data/fake_pubdev.sh index c4c33dd..5d2f424 100644 --- a/swh/loader/package/pubdev/tests/data/fake_pubdev.sh +++ b/swh/loader/package/pubdev/tests/data/fake_pubdev.sh @@ -1,194 +1,176 @@ #!/usr/bin/env bash -# Script to generate fake pub.dev http api response and fake Dart or FLutter packages archives as .tar.gz. +# Script to generate fake Dart or FLutter packages archives as .tar.gz. set -euo pipefail # Create directories readonly TMP=tmp_dir/pubdev -readonly BASE_API=https_pub.dev readonly BASE_ARCHIVES=https_pub.dartlang.org mkdir -p $TMP -mkdir -p $BASE_API mkdir -p $BASE_ARCHIVES -# http api response as json -echo -e '''{"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"}]} -''' > $BASE_API/api_packages_authentication - -echo -e '''{"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"}]} -''' > ${BASE_API}/api_packages_Autolinker - -echo -e '''{"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"}]} -''' > ${BASE_API}/api_packages_bezier - -echo -e '''{"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"}]} -''' > ${BASE_API}/api_packages_pdf - -echo -e '''{"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"}]} -''' > ${BASE_API}/api_packages_abstract_io - # Dart package a pubspec.yaml file at thier root. Generate some of them. mkdir -p ${TMP}/packages_authentication_versions_0.0.1 echo -e '''name: authentication description: Persistent user authentication for Flutter with optional backend API integration. version: 0.0.1 author: homepage: 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 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter. flutter: # This section identifies this Flutter project as a plugin project. # The 'pluginClass' and Android 'package' identifiers should not ordinarily # be modified. They are used by the tooling to maintain consistency when # adding or updating assets for this project. plugin: platforms: # This plugin project was generated without specifying any # platforms with the `--platform` argument. If you see the `fake_platform` map below, remove it and # then add platforms following the instruction here: # https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin-platforms # ------------------- some_platform: pluginClass: somePluginClass # ------------------- # To add assets to your plugin package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg # # For details regarding assets in packages, see # https://flutter.dev/assets-and-images/#from-packages # # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. # To add custom fonts to your plugin package, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: # fonts: # - family: Schyler # fonts: # - asset: fonts/Schyler-Regular.ttf # - asset: fonts/Schyler-Italic.ttf # style: italic # - family: Trajan Pro # fonts: # - asset: fonts/TrajanPro.ttf # - asset: fonts/TrajanPro_Bold.ttf # weight: 700 # # For details regarding fonts in packages, see # https://flutter.dev/custom-fonts/#from-packages ''' > ${TMP}/packages_authentication_versions_0.0.1/pubspec.yaml mkdir -p ${TMP}/packages_autolinker_versions_0.1.1 echo -e '''name: Autolinker version: 0.1.1 author: hackcave homepage: https://github.com/hackcave description: Port of Autolinker.js to dart ''' > ${TMP}/packages_autolinker_versions_0.1.1/pubspec.yaml mkdir -p ${TMP}/packages_bezier_versions_1.1.5 echo -e '''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 ''' > ${TMP}/packages_bezier_versions_1.1.5/pubspec.yaml mkdir -p ${TMP}/packages_pdf_versions_1.0.0 echo -e '''name: pdf author: David PHAM-VAN description: A pdf producer for Dart homepage: https://github.com/davbfr/dart_pdf version: 1.0.0 environment: sdk: ">=1.8.0 <2.0.0" dependencies: meta: "^1.1.5" ttf_parser: "^1.0.0" vector_math: "^2.0.7" dev_dependencies: test: any ''' > ${TMP}/packages_pdf_versions_1.0.0/pubspec.yaml mkdir -p ${TMP}/packages_pdf_versions_3.8.2 echo -e '''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" ''' > ${TMP}/packages_pdf_versions_3.8.2/pubspec.yaml cd $TMP tar -czf packages_authentication_versions_0.0.1.tar.gz -C packages_authentication_versions_0.0.1 . tar -czf packages_Autolinker_versions_0.1.1.tar.gz -C packages_autolinker_versions_0.1.1 . tar -czf packages_bezier_versions_1.1.5.tar.gz -C packages_bezier_versions_1.1.5 . tar -czf packages_pdf_versions_1.0.0.tar.gz -C packages_pdf_versions_1.0.0 . tar -czf packages_pdf_versions_3.8.2.tar.gz -C packages_pdf_versions_3.8.2 . # Move .tar.gz archives to a servable directory mv *.tar.gz ../../$BASE_ARCHIVES # Clean up removing tmp_dir cd ../../ rm -r tmp_dir/ diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_Autolinker_versions_0.1.1.tar.gz b/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_Autolinker_versions_0.1.1.tar.gz index 5cdf2dd..ae42567 100644 Binary files a/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_Autolinker_versions_0.1.1.tar.gz and b/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_Autolinker_versions_0.1.1.tar.gz differ diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_authentication_versions_0.0.1.tar.gz b/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_authentication_versions_0.0.1.tar.gz index 4338014..953eef0 100644 Binary files a/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_authentication_versions_0.0.1.tar.gz and b/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_authentication_versions_0.0.1.tar.gz differ diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_bezier_versions_1.1.5.tar.gz b/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_bezier_versions_1.1.5.tar.gz index 5a92354..40498cb 100644 Binary files a/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_bezier_versions_1.1.5.tar.gz and b/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_bezier_versions_1.1.5.tar.gz differ diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_pdf_versions_1.0.0.tar.gz b/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_pdf_versions_1.0.0.tar.gz index d30d19f..eace6bc 100644 Binary files a/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_pdf_versions_1.0.0.tar.gz and b/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_pdf_versions_1.0.0.tar.gz differ diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_pdf_versions_3.8.2.tar.gz b/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_pdf_versions_3.8.2.tar.gz index 45e37e8..c05ec5b 100644 Binary files a/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_pdf_versions_3.8.2.tar.gz and b/swh/loader/package/pubdev/tests/data/https_pub.dartlang.org/packages_pdf_versions_3.8.2.tar.gz differ 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 index b60f1d8..824af41 100644 --- 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,29 +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" } ] -} \ 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 index 1d00f61..fdd3b7a 100644 --- 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,93 +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" } ] -} \ No newline at end of file +} diff --git a/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_audio_manager b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_audio_manager new file mode 100644 index 0000000..c3e25fd --- /dev/null +++ b/swh/loader/package/pubdev/tests/data/https_pub.dev/api_packages_audio_manager @@ -0,0 +1,1637 @@ +{ + "name": "audio_manager", + "latest": { + "version": "0.8.2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.8.2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.12.0 <3.0.0", + "flutter": ">=1.20.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + }, + "flutter_web_plugins": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + }, + "web": { + "pluginClass": "AudioManagerPlugin", + "fileName": "audio_manager_web.dart" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.8.2.tar.gz", + "archive_sha256": "6f26b61cc39e258619d0e1bc34500bb7f3926dcc4b6a8c7ea31b67c62381c931", + "published": "2021-10-05T11:25:10.278136Z" + }, + "versions": [ + { + "version": "0.0.1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.0.1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "androidPackage": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.0.1.tar.gz", + "archive_sha256": "ba1e160e0164bf0c3542ec4c337ba93c177b0c656d7fe0dd93e9353b134c3d82", + "published": "2020-01-19T04:03:08.408868Z" + }, + { + "version": "0.0.2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.0.2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "androidPackage": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.0.2.tar.gz", + "archive_sha256": "4aec6c5a7473fd9f4778037c390484a0d59d4fa7e5d2ea50e1700524394ecd41", + "published": "2020-01-20T08:17:04.286167Z" + }, + { + "version": "0.1.1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.1.1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "androidPackage": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.1.1.tar.gz", + "archive_sha256": "9b6cc5524fa4ffa946d5ef133497f0bde004cc8ef0875b66c17b36462ade2ae3", + "published": "2020-01-20T08:44:15.151981Z" + }, + { + "version": "0.1.2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.1.2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "androidPackage": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.1.2.tar.gz", + "archive_sha256": "20bbc50d15e3ba9d1d9ebe07813b1504d32118f6bd63f06ca557ac657c048dd3", + "published": "2020-01-20T10:10:05.679374Z" + }, + { + "version": "0.1.3", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.1.3", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "androidPackage": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.1.3.tar.gz", + "archive_sha256": "57d2d9ef50edbc74a0d6d23e64c65d25768e7af8c763c6636215651447e261a3", + "published": "2020-01-21T03:26:07.360220Z" + }, + { + "version": "0.1.4", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.1.4", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.1.4.tar.gz", + "archive_sha256": "53ef60933e9c61ac184f7fea38f54c8354eb74dd08f20bfc661eb9f8ae8f84de", + "published": "2020-01-28T12:49:42.158959Z" + }, + { + "version": "0.1.5", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.1.5", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.1.5.tar.gz", + "archive_sha256": "936481a34a3d8eeedcdd26689281ab52f415d50cf9b586f82da0ee2cd3bc5937", + "published": "2020-02-05T11:20:56.408153Z" + }, + { + "version": "0.2.1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.2.1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.2.1.tar.gz", + "archive_sha256": "8c673ab6837682efa92db82be185ae63743b7c85fad9af7cb389c68dc7209b80", + "published": "2020-02-10T15:34:33.966841Z" + }, + { + "version": "0.2.1+3", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.2.1+3", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.2.1%2B3.tar.gz", + "archive_sha256": "71bf59872482382826369560337ac40af099b3557ef1f2fe608e5b76aba0ba08", + "published": "2020-02-24T04:04:39.484669Z" + }, + { + "version": "0.2.1+hotfix.1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.2.1+hotfix.1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.2.1%2Bhotfix.1.tar.gz", + "archive_sha256": "27f896b81f04af7deb8605fdcc58f924805313f8ac08c47f446deb0d615052f1", + "published": "2020-02-12T13:16:52.629036Z" + }, + { + "version": "0.2.1+hotfix.2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.2.1+hotfix.2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.2.1%2Bhotfix.2.tar.gz", + "archive_sha256": "b79bf0ee5cac7d4414f0e7fe18d93467a2c0a815130a69671a8a73d1a4e97370", + "published": "2020-02-13T03:50:06.570996Z" + }, + { + "version": "0.3.1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.3.1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.3.1.tar.gz", + "archive_sha256": "0dad69cebcb80b920ae7ed3c6b479b030aa4c7cdf84aaf3eddc4e09be70e4f61", + "published": "2020-02-24T04:08:56.844608Z" + }, + { + "version": "0.3.1+1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.3.1+1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.3.1%2B1.tar.gz", + "archive_sha256": "03a1973a8b71741709d65370c5b1ece838bc62f56ea7038263cd8f0ba0d4f1c1", + "published": "2020-02-25T04:03:44.708601Z" + }, + { + "version": "0.5.1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.1.tar.gz", + "archive_sha256": "e2e9777c3712cb8aa9fc1b275ad8675b43a3e900adbcb8563624dea6b65ed877", + "published": "2020-03-09T09:17:02.774181Z" + }, + { + "version": "0.5.1+1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.1+1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.1%2B1.tar.gz", + "archive_sha256": "36ce31f26f2ccd39eb1650fc1f29879bad43439ec09b59a9fd3044843ce1d6c7", + "published": "2020-03-10T07:33:54.509246Z" + }, + { + "version": "0.5.1+2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.1+2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.1%2B2.tar.gz", + "archive_sha256": "577ac4b284c27761f96b1fc9e47c057bc34076cd84a9ffd41cdbe037917b9a8e", + "published": "2020-03-10T12:28:55.258668Z" + }, + { + "version": "0.5.1+3", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.1+3", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.1%2B3.tar.gz", + "archive_sha256": "75897f8e2e701b1fa9ad5f29846f2551450e3363981f8f03241cb5279c32b9e8", + "published": "2020-03-11T06:24:41.326411Z" + }, + { + "version": "0.5.1+4", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.1+4", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.1%2B4.tar.gz", + "archive_sha256": "b1505499de4e23e8fd9dfc03e01d98effcb330f28452c0a8d2698c159681ab3f", + "published": "2020-03-11T06:37:37.016887Z" + }, + { + "version": "0.5.1+5", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.1+5", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.1%2B5.tar.gz", + "archive_sha256": "5b1e83f1f0137b34b4a018be1282fde886beb55ba46d0b8b42f403b4ab1de551", + "published": "2020-03-12T06:24:21.642494Z" + }, + { + "version": "0.5.2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.2.tar.gz", + "archive_sha256": "cf5e1165eae2959c016abd43aca5fbef8ddc415d5e7760e7a79ae2d2058861b3", + "published": "2020-03-13T06:23:18.744917Z" + }, + { + "version": "0.5.2+1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.2+1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.2%2B1.tar.gz", + "archive_sha256": "d6faa6e6b8b10a1fd64d1ce625fa8bdf796b0d68872eeed39b476de70f6575e4", + "published": "2020-03-17T08:16:05.352849Z" + }, + { + "version": "0.5.3", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.3", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.3.tar.gz", + "archive_sha256": "f90b2ca7758bb4762da63fb44f50a749860ae650cf46a0da1f2c8a8bf64b3534", + "published": "2020-03-19T04:00:25.045092Z" + }, + { + "version": "0.5.3+1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.3+1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.3%2B1.tar.gz", + "archive_sha256": "4591f420ac5c66a02e5aa72da2c4ac1dafc45c58c20a0301b658fcb4a193ac9f", + "published": "2020-03-24T04:01:42.936272Z" + }, + { + "version": "0.5.3+2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.3+2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.3%2B2.tar.gz", + "archive_sha256": "fe236c0aace46adea45b72cb2c255a8ce0252d7c482312851c673c8a5326ba08", + "published": "2020-03-31T07:51:37.161227Z" + }, + { + "version": "0.5.3+3", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.3+3", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.3%2B3.tar.gz", + "archive_sha256": "5470cdb704ec0b0db2ef24dc6abf52a20b22838812ffd72d5fce6bd7d2301ebf", + "published": "2020-04-25T11:00:45.370666Z" + }, + { + "version": "0.5.4", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.4", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.4.tar.gz", + "archive_sha256": "659a90232b4ef8bb5209998540c851220f8bc02909e942745dd1f9dc945fb50a", + "published": "2020-04-27T08:16:54.531384Z" + }, + { + "version": "0.5.4+1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.4+1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.4%2B1.tar.gz", + "archive_sha256": "2c13b30c4a0849e4679fa3674e1cf4f37616c7317c80097b6277ac82a1d77449", + "published": "2020-04-28T08:56:53.471649Z" + }, + { + "version": "0.5.5", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.5", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.5.tar.gz", + "archive_sha256": "6afe114c088b8836cfda95e919ca7a27b194ab38a15652871cbe4a18a2614828", + "published": "2020-06-02T17:27:44.185641Z" + }, + { + "version": "0.5.5+1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.5+1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.5%2B1.tar.gz", + "archive_sha256": "fcd4c89bac8912c0a738d20e616d0c0c7d2660ed66c78d61d6d70707e11d903b", + "published": "2020-06-03T12:55:34.627592Z" + }, + { + "version": "0.5.5+2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.5+2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.5%2B2.tar.gz", + "archive_sha256": "0d8cc98dfea58b6e8c6d1d8e368ce4b78641fc1b0c67c7f6b66be71a2192131b", + "published": "2020-06-07T03:01:44.581962Z" + }, + { + "version": "0.5.5+3", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.5+3", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.5%2B3.tar.gz", + "archive_sha256": "47ae200b33f76c716c3f3cc5b9a01edbda01d4229a3e7809e83eee0ca9d3d67a", + "published": "2020-06-11T12:10:22.714748Z" + }, + { + "version": "0.5.6", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.6", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.6.tar.gz", + "archive_sha256": "999566d6723a81a6790f9211dd88a86e50ac11f576e348961db98d1d312046d9", + "published": "2020-10-22T09:34:01.825061Z" + }, + { + "version": "0.5.7", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.7", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.7.tar.gz", + "archive_sha256": "a7a4bc134d9b2654c22cbde25e9fbc5ef810940d8329072bb6eb3dc0cdb39363", + "published": "2020-10-22T14:05:29.407637Z" + }, + { + "version": "0.5.7+1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.5.7+1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.5.7%2B1.tar.gz", + "archive_sha256": "6cc3a0d629842cd6a69c6a59a90fb9b34cec377ff9ce08960dbe6e5bec5676f5", + "published": "2020-10-23T09:58:57.828463Z" + }, + { + "version": "0.6.1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.6.1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + }, + "flutter_web_plugins": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + }, + "web": { + "pluginClass": "AudioManagerPlugin", + "fileName": "audio_manager_web.dart" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.6.1.tar.gz", + "archive_sha256": "3327db1c1f065bcb434f240899d65dca3590dd28e1ab9fbdb82c79b47238055a", + "published": "2020-10-27T08:30:31.727200Z" + }, + { + "version": "0.6.2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.6.2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + }, + "flutter_web_plugins": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + }, + "web": { + "pluginClass": "AudioManagerPlugin", + "fileName": "audio_manager_web.dart" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.6.2.tar.gz", + "archive_sha256": "84240bf9f5b048c696b3d0bc2063d2f6abb60de0a7c23cf6cb8abfe299233dee", + "published": "2020-11-26T09:58:23.851983Z" + }, + { + "version": "0.7.1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.7.1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + }, + "flutter_web_plugins": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + }, + "web": { + "pluginClass": "AudioManagerPlugin", + "fileName": "audio_manager_web.dart" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.7.1.tar.gz", + "archive_sha256": "e12d6734fbe19af96f9916f31b282da8b446d1a77c75326503271730adfd7788", + "published": "2021-01-26T09:10:40.222865Z" + }, + { + "version": "0.7.2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.7.2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + }, + "flutter_web_plugins": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + }, + "web": { + "pluginClass": "AudioManagerPlugin", + "fileName": "audio_manager_web.dart" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.7.2.tar.gz", + "archive_sha256": "b343e13e074008531d03502d559543aaa0cb11ec7050431ccb2e3e5e097ff618", + "published": "2021-01-27T03:50:37.801441Z" + }, + { + "version": "0.7.3", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.7.3", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.1.0 <3.0.0", + "flutter": ">=1.12.0 <2.0.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + }, + "flutter_web_plugins": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + }, + "web": { + "pluginClass": "AudioManagerPlugin", + "fileName": "audio_manager_web.dart" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.7.3.tar.gz", + "archive_sha256": "8cfaf06e8ff49fa57ab2ef87e05ab813e50ceccffea15efee2c6b71b2c63fe18", + "published": "2021-01-27T03:57:26.848937Z" + }, + { + "version": "0.8.1", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.8.1", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.12.0 <3.0.0", + "flutter": ">=1.20.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + }, + "flutter_web_plugins": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + }, + "web": { + "pluginClass": "AudioManagerPlugin", + "fileName": "audio_manager_web.dart" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.8.1.tar.gz", + "archive_sha256": "22deaa1d72b07f84eb54fc8cdf643786ede522d3ef76d70ccb8edd3469484e7c", + "published": "2021-05-27T09:13:54.510298Z" + }, + { + "version": "0.8.2", + "pubspec": { + "name": "audio_manager", + "description": "A flutter plugin for music playback, including notification handling.", + "version": "0.8.2", + "homepage": "https://github.com/jeromexiong/audio_manager", + "environment": { + "sdk": ">=2.12.0 <3.0.0", + "flutter": ">=1.20.0" + }, + "dependencies": { + "flutter": { + "sdk": "flutter" + }, + "flutter_web_plugins": { + "sdk": "flutter" + } + }, + "dev_dependencies": { + "flutter_test": { + "sdk": "flutter" + } + }, + "flutter": { + "plugin": { + "platforms": { + "android": { + "package": "cc.dync.audio_manager", + "pluginClass": "AudioManagerPlugin" + }, + "ios": { + "pluginClass": "AudioManagerPlugin" + }, + "web": { + "pluginClass": "AudioManagerPlugin", + "fileName": "audio_manager_web.dart" + } + } + } + } + }, + "archive_url": "https://pub.dartlang.org/packages/audio_manager/versions/0.8.2.tar.gz", + "archive_sha256": "6f26b61cc39e258619d0e1bc34500bb7f3926dcc4b6a8c7ea31b67c62381c931", + "published": "2021-10-05T11:25:10.278136Z" + } + ] +} 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 index b4b312a..25ca01a 100644 --- 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,77 +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" } ] -} \ 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 index efd84a4..dacdd55 100644 --- 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,55 +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 .\nLive examples can be found at .", + "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 .\nLive examples can be found at .", + "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" } ] -} \ 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 index c015890..1541536 100644 --- 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,88 +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" } ] -} \ 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 index 0979dfd..9267c24 100644 --- a/swh/loader/package/pubdev/tests/test_pubdev.py +++ b/swh/loader/package/pubdev/tests/test_pubdev.py @@ -1,272 +1,326 @@ # Copyright (C) 2022 The Software Heritage developers # 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 pytest 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 from swh.model.hashutil import hash_to_bytes from swh.model.model import ( ObjectType, Person, Release, Snapshot, SnapshotBranch, TargetType, TimestampWithTimezone, ) EXPECTED_PACKAGES = [ { "url": "https://pub.dev/packages/Autolinker", # one version }, { "url": "https://pub.dev/packages/pdf", # multiple versions }, { "url": "https://pub.dev/packages/bezier", # multiple authors }, { "url": "https://pub.dev/packages/authentication", # empty author }, { "url": "https://pub.dev/packages/abstract_io", # loose versions names }, + { + "url": "https://pub.dev/packages/audio_manager", # loose ++ versions names + }, ] def test_get_versions(requests_mock_datadir, swh_storage): loader = PubDevLoader( swh_storage, url=EXPECTED_PACKAGES[1]["url"], ) assert loader.get_versions() == [ "1.0.0", "3.8.2", ] -def test_get_loose_versions(requests_mock_datadir, swh_storage): +def test_sort_loose_versions(requests_mock_datadir, swh_storage): """Sometimes version name does not follow semver""" loader = PubDevLoader( swh_storage, url=EXPECTED_PACKAGES[4]["url"], ) assert loader.get_versions() == ["0.1.2+4", "0.1.2+5", "0.1.2+6"] +def test_sort_loose_versions_1(requests_mock_datadir, swh_storage): + """Sometimes version name does not follow semver and mix patterns""" + loader = PubDevLoader( + swh_storage, + url=EXPECTED_PACKAGES[5]["url"], + ) + assert loader.get_versions() == [ + "0.0.1", + "0.0.2", + "0.1.1", + "0.1.2", + "0.1.3", + "0.1.4", + "0.1.5", + "0.2.1", + "0.2.1+hotfix.1", + "0.2.1+hotfix.2", + "0.2.1+3", + "0.3.1", + "0.3.1+1", + "0.5.1", + "0.5.1+1", + "0.5.1+2", + "0.5.1+3", + "0.5.1+4", + "0.5.1+5", + "0.5.2", + "0.5.2+1", + "0.5.3", + "0.5.3+1", + "0.5.3+2", + "0.5.3+3", + "0.5.4", + "0.5.4+1", + "0.5.5", + "0.5.5+1", + "0.5.5+2", + "0.5.5+3", + "0.5.6", + "0.5.7", + "0.5.7+1", + "0.6.1", + "0.6.2", + "0.7.1", + "0.7.2", + "0.7.3", + "0.8.1", + "0.8.2", + ] + + def test_get_default_version(requests_mock_datadir, swh_storage): loader = PubDevLoader( swh_storage, url=EXPECTED_PACKAGES[1]["url"], ) assert loader.get_default_version() == "3.8.2" def test_pubdev_loader_load_one_version(datadir, requests_mock_datadir, swh_storage): loader = PubDevLoader( swh_storage, url=EXPECTED_PACKAGES[0]["url"], ) load_status = loader.load() assert load_status["status"] == "eventful" assert load_status["snapshot_id"] is not None expected_snapshot_id = "245092931ba809e6c54ebda8f865fb5a969a4134" expected_release_id = "919f267ea050539606344d49d14bf594c4386e5a" assert expected_snapshot_id == load_status["snapshot_id"] expected_snapshot = Snapshot( id=hash_to_bytes(load_status["snapshot_id"]), branches={ b"releases/0.1.1": SnapshotBranch( target=hash_to_bytes(expected_release_id), target_type=TargetType.RELEASE, ), b"HEAD": SnapshotBranch( target=b"releases/0.1.1", target_type=TargetType.ALIAS, ), }, ) check_snapshot(expected_snapshot, swh_storage) stats = get_stats(swh_storage) assert { "content": 1, "directory": 1, "origin": 1, "origin_visit": 1, "release": 1, "revision": 0, "skipped_content": 0, "snapshot": 1, } == stats assert swh_storage.release_get([hash_to_bytes(expected_release_id)])[0] == Release( name=b"0.1.1", message=b"Synthetic release for pub.dev source package Autolinker version" b" 0.1.1\n\nPort of Autolinker.js to dart\n", target=hash_to_bytes("3fb6d4f2c0334d1604357ae92b2dd38a55a78194"), target_type=ObjectType.DIRECTORY, synthetic=True, author=Person( fullname=b"hackcave ", name=b"hackcave", email=b"hackers@hackcave.org", ), date=TimestampWithTimezone.from_iso8601("2014-12-24T22:34:02.534090+00:00"), id=hash_to_bytes(expected_release_id), ) assert_last_visit_matches( swh_storage, url=EXPECTED_PACKAGES[0]["url"], status="full", type="pubdev", snapshot=expected_snapshot.id, ) def test_pubdev_loader_load_multiple_versions( datadir, requests_mock_datadir, swh_storage ): loader = PubDevLoader( swh_storage, url=EXPECTED_PACKAGES[1]["url"], ) load_status = loader.load() assert load_status["status"] == "eventful" assert load_status["snapshot_id"] is not None expected_snapshot_id = "43d5b68a9fa973aa95e56916aaef70841ccbc2a0" assert expected_snapshot_id == load_status["snapshot_id"] expected_snapshot = Snapshot( id=hash_to_bytes(load_status["snapshot_id"]), branches={ b"releases/1.0.0": SnapshotBranch( target=hash_to_bytes("fbf8e40af675096681954553d737861e10b57216"), target_type=TargetType.RELEASE, ), b"releases/3.8.2": SnapshotBranch( target=hash_to_bytes("627a5d586e3fb4e7319b17f1aee268fe2fb8e01c"), target_type=TargetType.RELEASE, ), b"HEAD": SnapshotBranch( target=b"releases/3.8.2", target_type=TargetType.ALIAS, ), }, ) check_snapshot(expected_snapshot, swh_storage) stats = get_stats(swh_storage) assert { "content": 1 + 1, "directory": 1 + 1, "origin": 1, "origin_visit": 1, "release": 1 + 1, "revision": 0, "skipped_content": 0, "snapshot": 1, } == stats assert_last_visit_matches( swh_storage, url=EXPECTED_PACKAGES[1]["url"], status="full", type="pubdev", snapshot=expected_snapshot.id, ) def test_pubdev_loader_multiple_authors(datadir, requests_mock_datadir, swh_storage): loader = PubDevLoader( swh_storage, url=EXPECTED_PACKAGES[2]["url"], ) load_status = loader.load() assert load_status["status"] == "eventful" assert load_status["snapshot_id"] is not None expected_snapshot_id = "4fa9f19d1d6ccc70921c8c50b278f510db63aa36" expected_release_id = "538c98fd69a42d8d0561a7ca95b354de2143a3ab" assert expected_snapshot_id == load_status["snapshot_id"] expected_snapshot = Snapshot( id=hash_to_bytes(load_status["snapshot_id"]), branches={ b"releases/1.1.5": SnapshotBranch( target=hash_to_bytes(expected_release_id), target_type=TargetType.RELEASE, ), b"HEAD": SnapshotBranch( target=b"releases/1.1.5", target_type=TargetType.ALIAS, ), }, ) check_snapshot(expected_snapshot, swh_storage) release = swh_storage.release_get([hash_to_bytes(expected_release_id)])[0] assert release.author == Person( fullname=b"Aaron Barrett ", name=b"Aaron Barrett", email=b"aaron@aaronbarrett.com", ) def test_pubdev_loader_empty_author(datadir, requests_mock_datadir, swh_storage): loader = PubDevLoader( swh_storage, url=EXPECTED_PACKAGES[3]["url"], ) load_status = loader.load() assert load_status["status"] == "eventful" assert load_status["snapshot_id"] is not None expected_snapshot_id = "0c7fa6b9fced23c648d2093ad5597622683f8aed" expected_release_id = "7d8c05181069aa1049a3f0bc1d13bedc34625d47" assert expected_snapshot_id == load_status["snapshot_id"] expected_snapshot = Snapshot( id=hash_to_bytes(load_status["snapshot_id"]), branches={ b"releases/0.0.1": SnapshotBranch( target=hash_to_bytes(expected_release_id), target_type=TargetType.RELEASE, ), b"HEAD": SnapshotBranch( target=b"releases/0.0.1", target_type=TargetType.ALIAS, ), }, ) check_snapshot(expected_snapshot, swh_storage) release = swh_storage.release_get([hash_to_bytes(expected_release_id)])[0] assert release.author == EMPTY_AUTHOR def test_pubdev_invalid_origin(swh_storage): with pytest.raises(AssertionError): PubDevLoader( swh_storage, "http://nowhere/api/packages/42", )