diff --git a/platformio/package/manifest/parser.py b/platformio/package/manifest/parser.py index 689de80b..8949f43e 100644 --- a/platformio/package/manifest/parser.py +++ b/platformio/package/manifest/parser.py @@ -662,6 +662,7 @@ class PackageJsonManifestParser(BaseManifestParser): data["keywords"] = self.str_to_list(data["keywords"], sep=",") data = self._parse_system(data) data = self._parse_homepage(data) + data = self._parse_repository(data) return data @staticmethod @@ -682,3 +683,14 @@ class PackageJsonManifestParser(BaseManifestParser): data["homepage"] = data["url"] del data["url"] return data + + @staticmethod + def _parse_repository(data): + if isinstance(data.get("repository", {}), dict): + return data + data["repository"] = dict(type="git", url=str(data["repository"])) + if data["repository"]["url"].startswith(("github:", "gitlab:", "bitbucket:")): + data["repository"]["url"] = "https://{0}.com/{1}".format( + *(data["repository"]["url"].split(":", 1)) + ) + return data diff --git a/platformio/util.py b/platformio/util.py index aeeaf55b..f950a364 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -28,8 +28,8 @@ import click from platformio import __version__, exception, proc from platformio.compat import PY2, WINDOWS -from platformio.fs import cd # pylint: disable=unused-import -from platformio.fs import load_json # pylint: disable=unused-import +from platformio.fs import cd, load_json # pylint: disable=unused-import +from platformio.package.version import pepver_to_semver # pylint: disable=unused-import from platformio.proc import exec_command # pylint: disable=unused-import diff --git a/tests/package/test_manifest.py b/tests/package/test_manifest.py index 9dd5b878..426cbdf1 100644 --- a/tests/package/test_manifest.py +++ b/tests/package/test_manifest.py @@ -672,6 +672,20 @@ def test_package_json_schema(): ) assert mp.as_dict()["system"] == ["darwin_x86_64"] + # shortcut repository syntax (npm-style) + contents = """ +{ + "name": "tool-github", + "version": "1.2.0", + "repository": "github:user/repo" +} +""" + raw_data = parser.ManifestParserFactory.new( + contents, parser.ManifestFileType.PACKAGE_JSON + ).as_dict() + data = ManifestSchema().load_manifest(raw_data) + assert data["repository"]["url"] == "https://github.com/user/repo.git" + def test_parser_from_dir(tmpdir_factory): pkg_dir = tmpdir_factory.mktemp("package")