From 4f47ca57429f80006b111538769526d35eedc8d2 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 9 Sep 2020 16:13:39 +0300 Subject: [PATCH] Fixed an issue with "Invalid simple block (semantic_version)" from library dependency that refs to an external source (repository, ZIP/Tar archives) // Resolve #3658 --- HISTORY.rst | 1 + platformio/package/manager/library.py | 15 ++++++++---- tests/package/test_manager.py | 35 +++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 79af33f20b..09b762520e 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -17,6 +17,7 @@ PlatformIO Core 5 - Fixed an issue when `pio package unpublish `__ command crashes (`issue #3660 `_) - Fixed an issue when the package manager tries to install a built-in library from the registry (`issue #3662 `_) - Fixed an issue with incorrect value for C++ language standard in IDE projects when an in-progress language standard is used (`issue #3653 `_) +- Fixed an issue with "Invalid simple block (semantic_version)" from library dependency that refs to an external source (repository, ZIP/Tar archives) (`issue #3658 `_) 5.0.0 (2020-09-03) ~~~~~~~~~~~~~~~~~~ diff --git a/platformio/package/manager/library.py b/platformio/package/manager/library.py index 418774dec8..6b32cb12c7 100644 --- a/platformio/package/manager/library.py +++ b/platformio/package/manager/library.py @@ -109,11 +109,16 @@ def install_dependencies(self, pkg, silent=False): ) def _install_dependency(self, dependency, silent=False): - spec = PackageSpec( - owner=dependency.get("owner"), - name=dependency.get("name"), - requirements=dependency.get("version"), - ) + if set(["name", "version"]) <= set(dependency.keys()) and any( + c in dependency["version"] for c in (":", "/", "@") + ): + spec = PackageSpec("%s=%s" % (dependency["name"], dependency["version"])) + else: + spec = PackageSpec( + owner=dependency.get("owner"), + name=dependency.get("name"), + requirements=dependency.get("version"), + ) search_filters = { key: value for key, value in dependency.items() diff --git a/tests/package/test_manager.py b/tests/package/test_manager.py index 299b0020ca..53cd063a1e 100644 --- a/tests/package/test_manager.py +++ b/tests/package/test_manager.py @@ -230,6 +230,41 @@ def test_install_from_registry(isolated_pio_core, tmpdir_factory): tm.install("owner/unknown-package-tool", silent=True) +def test_install_lib_depndencies(isolated_pio_core, tmpdir_factory): + tmp_dir = tmpdir_factory.mktemp("tmp") + + src_dir = tmp_dir.join("lib-with-deps").mkdir() + root_dir = src_dir.mkdir("root") + root_dir.mkdir("src").join("main.cpp").write("#include ") + root_dir.join("library.json").write( + """ +{ + "name": "lib-with-deps", + "version": "2.0.0", + "dependencies": [ + { + "owner": "bblanchon", + "name": "ArduinoJson", + "version": "^6.16.1" + }, + { + "name": "external-repo", + "version": "https://github.com/milesburton/Arduino-Temperature-Control-Library.git#4a0ccc1" + } + ] +} +""" + ) + + lm = LibraryPackageManager(str(tmpdir_factory.mktemp("lib-storage"))) + lm.install("file://%s" % str(src_dir), silent=True) + installed = lm.get_installed() + assert len(installed) == 4 + assert set(["external-repo", "ArduinoJson", "lib-with-deps", "OneWire"]) == set( + p.metadata.name for p in installed + ) + + def test_install_force(isolated_pio_core, tmpdir_factory): lm = LibraryPackageManager(str(tmpdir_factory.mktemp("lib-storage"))) # install #64 ArduinoJson