diff --git a/HISTORY.rst b/HISTORY.rst index e437f689..5bccb302 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -27,6 +27,7 @@ PlatformIO Core 5 - Added new `check_prune_system_threshold `__ setting - Disabled automatic removal of unnecessary development platform packages (`issue #3708 `_, `issue #3770 `_) - Fixed an issue when unnecessary packages were removed in ``update --dry-run`` mode (`issue #3809 `_) + - Fixed a "ValueError: Invalid simple block" when uninstalling a package with a custom name and external source (`issue #3816 `_) * **PlatformIO Home** diff --git a/platformio/package/manager/library.py b/platformio/package/manager/library.py index 9f8bd28a..3f77846b 100644 --- a/platformio/package/manager/library.py +++ b/platformio/package/manager/library.py @@ -112,16 +112,11 @@ class LibraryPackageManager(BasePackageManager): # pylint: disable=too-many-anc ) def _install_dependency(self, dependency, silent=False): - 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"), - ) + spec = PackageSpec( + owner=dependency.get("owner"), + name=dependency.get("name"), + requirements=dependency.get("version"), + ) search_filters = { key: value for key, value in dependency.items() @@ -143,11 +138,12 @@ class LibraryPackageManager(BasePackageManager): # pylint: disable=too-many-anc if not silent: self.print_message("Removing dependencies...", fg="yellow") for dependency in manifest.get("dependencies"): - pkg = self.get_package( - PackageSpec( - name=dependency.get("name"), requirements=dependency.get("version") - ) + spec = PackageSpec( + owner=dependency.get("owner"), + name=dependency.get("name"), + requirements=dependency.get("version"), ) + pkg = self.get_package(spec) if not pkg: continue self._uninstall(pkg, silent=silent) diff --git a/platformio/package/meta.py b/platformio/package/meta.py index 156445d3..74af1916 100644 --- a/platformio/package/meta.py +++ b/platformio/package/meta.py @@ -107,16 +107,21 @@ class PackageSpec(object): # pylint: disable=too-many-instance-attributes def __init__( # pylint: disable=redefined-builtin,too-many-arguments self, raw=None, owner=None, id=None, name=None, requirements=None, url=None ): + self._requirements = None self.owner = owner self.id = id self.name = name - self._requirements = None self.url = url self.raw = raw if requirements: - self.requirements = requirements + try: + self.requirements = requirements + except ValueError as exc: + if not self.name or self.url or self.raw: + raise exc + self.raw = "%s=%s" % (self.name, requirements) self._name_is_custom = False - self._parse(raw) + self._parse(self.raw) def __eq__(self, other): return all( diff --git a/platformio/platform/_packages.py b/platformio/platform/_packages.py index 08c40c9b..786f1efc 100644 --- a/platformio/platform/_packages.py +++ b/platformio/platform/_packages.py @@ -18,11 +18,10 @@ from platformio.package.meta import PackageSpec class PlatformPackagesMixin(object): def get_package_spec(self, name, version=None): - version = version or self.packages[name].get("version") - if version and any(c in version for c in (":", "/", "@")): - return PackageSpec("%s=%s" % (name, version)) return PackageSpec( - owner=self.packages[name].get("owner"), name=name, requirements=version + owner=self.packages[name].get("owner"), + name=name, + requirements=version or self.packages[name].get("version"), ) def get_package(self, name, spec=None): diff --git a/tests/package/test_meta.py b/tests/package/test_meta.py index 32b3d56a..1cda6409 100644 --- a/tests/package/test_meta.py +++ b/tests/package/test_meta.py @@ -169,6 +169,15 @@ def test_spec_vcs_urls(): url="git+git@github.com:platformio/platformio-core.git", requirements="^1.2.3,!=5", ) + assert PackageSpec( + owner="platformio", + name="external-repo", + requirements="https://github.com/platformio/platformio-core", + ) == PackageSpec( + owner="platformio", + name="external-repo", + url="git+https://github.com/platformio/platformio-core", + ) def test_spec_as_dict():